Discussão do artigo "Criando um algoritmo de market making no MQL5"

 

Novo artigo Criando um algoritmo de market making no MQL5 foi publicado:

Como funcionam os market makers no mercado? Vamos explorar isso e criar um algoritmo simples de market making.

Muitos pensam que o market maker não corre riscos. Mas não é assim. O principal risco do market maker é o risco de inventário, ou inventory risk. Isso ocorre quando há uma acumulação repentina de posições em uma direção sem possibilidade de concretizá-las e lucrar com o spread. Por exemplo, quando a multidão vende um ativo sem parar e o market maker tem que comprar toda a oferta, a queda do preço leva o market maker ao prejuízo. 

As empresas tentam evitar esse risco usando fórmulas especiais para centralizar o spread e determinar o preço ideal de compra e venda. Mas isso nem sempre é possível: mesmo que o preço não seja ótimo, sua função é fornecer liquidez ao mercado, mesmo que isso signifique operar com prejuízo temporário.

Autor: Yevgeniy Koshtenko

 

Obrigado, Eugene, pelo artigo! Muitas lacunas no quebra-cabeça do meu conhecimento sobre o mercado de moedas foram quase totalmente preenchidas.

Há uma única nuance: alguns leitores do seu artigo podem não iniciar o Expert Advisor no testador de estratégia se o par de moedas que está sendo testado tiver um sufixo ou prefixo. Eles devem levar isso em consideração e especificá-lo nas configurações dos parâmetros do Expert Advisor.

Mas, de qualquer forma, tudo é SUPER!!!

Abraços, Vladimir.

 
MrBrooklin #:

Obrigado, Eugene, pelo artigo! Muitas lacunas no quebra-cabeça do meu conhecimento sobre o mercado de moedas foram quase completamente preenchidas.

Há uma única nuance: alguns leitores do seu artigo podem não iniciar o Expert Advisor no testador de estratégia se o par de moedas que está sendo testado tiver um sufixo ou prefixo. Eles devem levar isso em conta e especificá-lo nas configurações dos parâmetros do Expert Advisor.

Caso contrário, está tudo ótimo!!!

Atenciosamente, Vladimir.

Muito obrigado! Vou verificar amanhã com os prefixos em outra corretora. Se for o caso, farei um acréscimo)

 

Eugene, ontem eu não examinei atentamente o código do Expert Advisor, pois estava mais interessado na parte do texto do artigo e, portanto, não fiz uma pergunta sobre a parte do código destacada em amarelo:

//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
int CountOrders(string symb,ENUM_ORDER_TYPE type)
  {
   int count=0;

   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(OrderGetTicket(i)))
        {
         if(OrderGetInteger(ORDER_TYPE)==type && PositionGetString(POSITION_SYMBOL)==symb && PositionGetInteger(POSITION_MAGIC)==Magic)
            count++;
        }
     }
   return(count);
  }

Prestei atenção ao seu aviso imediatamente: Aqui estão as funções para contar ordens abertas e posições abertas. CountOrders e CountTrades tratam da contagem de ordens e posições abertas para um determinado símbolo, levando em conta o número mágico do EA. Na verdade, elas ainda não são usadas no código, mas serão usadas em versões futuras, quando eu finalmente escrever uma função normal para centralizar o spread entre limites....

Mas não entendi muito bem: a ideia foi sua ou deveria ser diferente?

Atenciosamente, Vladimir.

 
MrBrooklin posições abertas. CountOrders e CountTrades tratam da contagem de ordens e posições abertas para um determinado símbolo, levando em conta o número mágico do EA. Na verdade, elas ainda não são usadas no código, mas serão usadas em versões futuras, quando eu finalmente escrever uma função normal para centralizar o spread entre limites....

Mas não entendi muito bem - a ideia foi sua ou deveria ser diferente?

Atenciosamente, Vladimir.

Foi intencional - caso contrário, o Expert Advisor pode começar a confundir as ordens de seu mágico com outras). A Symb pretende criar uma versão multimoeda do Expert Advisor no futuro. Ainda não consegui fazer isso)))))

 
Yevgeniy Koshtenko #:

Isso se deve ao fato de que, caso contrário, o EA pode começar a confundir as ordens de seu mágico com as de outros). Por símbolo, pretende-se criar uma versão multimoeda do EA no futuro. Ainda não consegui criá-la)))))

Tudo está claro com relação às ordens, mas por que as posições do símbolo e do mágico são verificadas nessa função? ))

Atenciosamente, Vladimir.

 

Isso é uma vergonha para a MQ, não um artigo. Como é possível permitir a publicação de uma coisa dessas?

//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
int CountTrades(string symb)
  {
   int count=0;

   for(int i=PositionsTotal()-1; i>=0; i--)
     {
      if(PositionSelectByTicket(PositionGetTicket(i)))
        {
         if(PositionGetString(POSITION_SYMBOL)==symb && PositionGetInteger(POSITION_MAGIC)==Magic)
           {
            count++;
           }
        }
     }
   return(count);
  }

PositionGetTicket(i), de acordo com a documentação,"A função retorna um tíquete de uma posição por índice na lista de posições abertas e seleciona automaticamente essa posição para trabalhar mais com ela...". E por que selecionar uma posição por seu tíquete usando a função PositionSelectByTicket se ela já está selecionada? Você está ensinando aos novatos como não fazer isso?

A observação de Vladimir é bastante justa. E sua resposta não tem nada a ver com isso... Por que verificar o símbolo e a mágica POSITION se trabalhamos com ordens????

 

Além do código, também não gostei da parte do texto.

É um lixo, nada mais é do que um pedaço de papel.

É um tópico interessante, sem discussão.

Que tipo de criação de mercado estamos criando, qual é o objetivo?

O fato de não ter sido possível criá-lo é um fato, porque faltou matriz ao autor.

E há muitas delas por aí.

É preciso pensar nisso por pelo menos mais ...dez anos, talvez consigamos fazer.

como um começo e como uma forma de melhorar - ok, nisso eu apoio.

 

Renat Akhtyamov #:

Que tipo de criação de mercado estamos criando, qual é o objetivo?

O fato de não ter sido possível criá-lo é um fato, pois o autor não tinha a matriz necessária

Você deve ler oartigo não na diagonal, mas do início ao fim, ou seja, completamente, para que essas perguntas não surjam.

Concordo plenamente com a crítica de Alexey Viktorov sobre o uso da funçãoPositionSelectByTicket() quando um bilhete já foi selecionado sem ela. A propósito, eu mesmo não prestei atenção a isso.

Mas, de qualquer forma, obrigado pelo artigo!

Saudações, Vladimir.

 
MrBrooklin #:

Oartigo não deve ser lido na diagonal, mas do começo ao fim, ou seja, completamente, para que não surjam dúvidas.

Concordo plenamente com a crítica de Alexey Viktorov sobre o uso da função PositionSelectByTicket () quando um bilhete já foi selecionado sem ela. A propósito, eu mesmo não prestei atenção a isso.

Mas, de qualquer forma, obrigado pelo artigo!

Saudações, Vladimir.

Não é selecionado um tíquete, mas uma posição é selecionada para trabalhar com suas propriedades por meio das funções correspondentes.

 
Alexey Viktorov #:

Não é selecionado um tíquete, mas uma posição é selecionada para trabalhar com suas propriedades por meio das funções apropriadas.

Olá Alexei, obrigado pelo esclarecimento. )) Quando escrevi minha mensagem, me baseei na mesma documentação (destacada em amarelo):

Функция возвращает тикет позиции по индексу в списке открытых позиций и автоматически выбирает эту позицию для дальнейшей работы с ней 
при помощи функций PositionGetDouble, PositionGetInteger, PositionGetString.

ulong  PositionGetTicket(
   int  index      // número na lista de itens
   );

Параметры

index

[in]  Индекс позиции в списке открытых позиций, начиная с 0.

Возвращаемое значение

Тикет позиции. В случае неудачного выполнения возвращает 0.

Atenciosamente, Vladimir.