Discussão do artigo "Biblioteca para desenvolvimento fácil e rápido de programas MetaTrader (parte VII): Eventos de ativação da ordem StopLimit, preparação da funcionalidade para os eventos"

 

Novo artigo Biblioteca para desenvolvimento fácil e rápido de programas MetaTrader (parte VII): Eventos de ativação da ordem StopLimit, preparação da funcionalidade para os eventos de modificação de ordens e posições foi publicado:

Nos artigos anteriores, nós começamos a criar uma grande biblioteca multi-plataforma, simplificando o desenvolvimento de programas para as plataformas MetaTrader 5 e MetaTrader 4. Na sexta parte, nós treinamos a biblioteca para trabalhar com as posições nas contas netting. Aqui, nós implementaremos o monitoramento da ativação das ordens StopLimit e prepararemos uma funcionalidade para o monitoramento de eventos de modificação de ordens e posições.

Para testar as melhorias implementadas, nós usaremos o EA do artigo anterior. Basta renomear o EA TestDoEasyPart06.mq5 da pasta \MQL5\Experts\TestDoEasy\Part06 para TestDoEasyPart07.mq5 e salvá-lo na nova subpasta \MQL5\Experts\TestDoEasy\ Part07.

Compile o EA, inicie-o no testador, coloque uma ordem StopLimit e aguarde a sua ativação:

Autor: Artyom Trishkin

 

Eu gostaria de ver a implementação de vários TCs usando essa biblioteca e outras alternativas.

E uma análise comparativa, é claro. Em particular, o desempenho no Testador/Otimizador, o tamanho do código e a velocidade de sua escrita.

 
fxsaber:

Eu gostaria de ver a implementação de vários TCs usando essa biblioteca e alternativas.

E uma análise comparativa, é claro. Em particular, o desempenho no Tester/Optimizer, o tamanho do código e a velocidade de sua escrita.

Ainda é cedo. No momento, ainda não preparamos a funcionalidade necessária para concretizar a simplicidade declarada de criar nossos próprios programas. A base necessária ainda está sendo criada. Na oitava parte, a funcionalidade para rastrear outros eventos, como a modificação de ordens e posições e seus níveis de parada, foi implementada e descrita. O próximo artigo está sendo preparado, o qual iniciará a finalização para compatibilidade com a MQL4. A próxima etapa será criar classes de negociação completas e, em seguida, trabalhar com símbolos e contas. Em seguida, criaremos funções de caso de usuário para acesso fácil e rápido a todos os dados coletados e controlados pela biblioteca. E esse não será o estágio final, pois está sendo preparado um conjunto de possibilidades de uso de novos objetos gráficos integrados à biblioteca, com acesso a eles como objetos padrão. Ou seja, a biblioteca terá a capacidade de criar seus próprios objetos gráficos e terá seu próprio shell gráfico na tela + a possibilidade de criar, a partir desse conjunto, seus próprios elementos gráficos para seus programas. Isso foi planejado anteriormente, mas ainda há planos para a implementação.

E a realização do TC será possível, especialmente após a criação de funções de caso de usuário. Embora, é claro, seja possível fazer algo mesmo agora, mas não de forma rápida e fácil, porque isso requer acesso direto a listas e objetos de biblioteca por ponteiros, e isso não é "pegar e obter", no entanto, esse acesso é parcialmente organizado nos exemplos de consultores anexados aos artigos.

 
Artyom Trishkin:

... E esse não será o estágio final, pois um conjunto de possibilidades de uso de novos objetos gráficos integrados à biblioteca está sendo preparado, com o acesso normal a eles - como aos objetos padrão. Ou seja, a biblioteca terá a capacidade de criar seus próprios objetos gráficos e terá seu próprio shell gráfico na tela + a capacidade de criar, a partir desse conjunto, seus próprios elementos gráficos para seus programas....

Você escreverá uma biblioteca gráfica no kanvas?
 
Реter Konow:
Você escreverá uma biblioteca de gráficos em canvas?

Sim, claro que sim. Não somente nela. Alguns objetos "compostos" do conjunto de objetos gráficos padrão estarão disponíveis para criação, além disso, serão oferecidos formulários para a criação de sua própria GUI com acesso total a todos os dados coletados e controlados pela biblioteca - um conjunto de objetos prontos, além da possibilidade de criar sua própria GUI a partir deles. Naturalmente, tudo é feito de modo que o usuário tenha acesso total a todas as necessidades de uma biblioteca - "fora da caixa", por assim dizer. Conecte uma biblioteca e você terá toda a funcionalidade necessária para criar totalmente qualquer um dos seus desejos, sem precisar procurar as soluções necessárias escritas e publicadas em algum lugar.

 
Artyom Trishkin:

Sim, é claro. Não apenas nela. Estarão disponíveis para criação alguns objetos "compostos" a partir do conjunto de objetos gráficos padrão, além de serem oferecidos formulários para a criação de sua própria GUI com acesso total a todos os dados coletados e controlados pela biblioteca - um conjunto de objetos prontos, além da possibilidade de criar sua própria GUI a partir deles. Naturalmente, tudo é feito de modo que o usuário tenha acesso total a todas as necessidades de uma biblioteca - "fora da caixa", por assim dizer. Conecte uma biblioteca e você terá toda a funcionalidade necessária para criar totalmente qualquer um dos seus desejos, sem precisar procurar as soluções necessárias escritas e publicadas em algum lugar.

Ou seja, você criará um ambiente de software multiplataforma com um conjunto completo de possibilidades para criar qualquer EA. Biblioteca universal para ambas as plataformas, com gráficos em tela.

Uma ideia em grande escala. Será interessante ver a implementação da última parte. O gráfico anterior. A biblioteca foi escrita durante um ano e meio, mas como já existe uma base séria, talvez seja mais rápido.
 
Реter Konow:
Ou seja, você criará um ambiente de software multiplataforma com um conjunto completo de possibilidades para a criação de quaisquer EAs. Biblioteca universal para ambas as plataformas com gráficos em tela.

Uma ideia em grande escala. Será interessante ver a implementação da última parte. O gráfico anterior. A biblioteca foi escrita durante um ano e meio, mas como já existe uma base séria, talvez seja mais rápido.
Tudo será feito. Mas gradualmente - passo a passo. Afinal, não foi planejada apenas uma biblioteca, mas um material educacional. Você sempre poderá não apenas usá-lo, mas também ler e entender como tudo é feito.
 
Artyom Trishkin:

...sem encontrar as soluções necessárias escritas e publicadas em algum lugar.

Isso significa que a biblioteca se tornará uma biblioteca de funcionários?
 
Реter Konow:
Isso significa que a biblioteca se tornará uma biblioteca de funcionários?
Não. Isso significa que uma biblioteca será suficiente.
 
Artyom Trishkin:
Não. Isso significa que uma biblioteca será suficiente.
Boa sorte.
 

Artem, obrigado!

No método:

//+------------------------------------------------------------------+
//|| Atualiza a lista de pedidos|
//+------------------------------------------------------------------+
void CMarketCollection::Refresh(void)

Uma "ordem de mercado" é criada dinamicamente

#else 
//--- Posições
   int total_positions=::PositionsTotal();
   for(int i=0; i<total_positions; i++)
     {
      ulong ticket=::PositionGetTicket(i);
      if(ticket==0) continue;
      CMarketPosition *position=new CMarketPosition(ticket);
      if(position==NULL) continue;
      //--- Adicionar um objeto de posição à lista de ordens de mercado e posições
      if(!this.AddToListMarket(position))
         continue;
      //--- Obter o índice da ordem de controle por tíquete e identificador de posição
      int index=this.IndexControlOrder(ticket,position.PositionID());
      //--- Se a ordem não estiver na lista de ordens de controle - adicione-a
      if(index==WRONG_VALUE)
        {
         if(!this.AddToListControl(position))
           {
            ::Print(DFUN_ERR_LINE,TextByLanguage("Failed to add control position" (Falha ao adicionar a posição de controle),"Failed to add a control position "),position.TypeDescription()," #",position.Ticket());
           }
        }
      //--- Se a ordem já existir na lista de ordens de controle - verifique se há alterações de propriedade
      else if(index>WRONG_VALUE)
        {
         this.OnChangeEvent(position,index);
        }
     }
//--- Ordens
   int total_orders=::OrdersTotal();
   for(int i=0; i<total_orders; i++)
     {
      ulong ticket=::OrderGetTicket(i);
      if(ticket==0) continue;
      ENUM_ORDER_TYPE type=(ENUM_ORDER_TYPE)::OrderGetInteger(ORDER_TYPE);
      //--- Ordem de mercado
      if(type<ORDER_TYPE_BUY_LIMIT)
        {
         CMarketOrder *order=new CMarketOrder(ticket);
         if(order==NULL) continue;
         //--- Adicionar objeto de ordem de mercado à lista de ordens de mercado e posições
         if(!this.AddToListMarket(order))
            continue;
        }
      //--- Ordem pendente
      else
        {
         CMarketPending *order=new CMarketPending(ticket);
         if(order==NULL) continue;
         //--- Adicionar um objeto de ordem pendente à lista de ordens de mercado e posições
         if(!this.AddToListMarket(order))
            continue;
         //--- Obter o índice da ordem de controle por tíquete e identificador de posição
         int index=this.IndexControlOrder(ticket,order.PositionID());
         //--- Se a ordem não estiver na lista de ordens de controle - adicione-a
         if(index==WRONG_VALUE)
           {
            if(!this.AddToListControl(order))
              {
               ::Print(DFUN_ERR_LINE,TextByLanguage("Failed to add control order" (Falha ao adicionar a ordem de controle),"Failed to add a control order "),order.TypeDescription()," #",order.Ticket());
              }
           }
         //--- Se a ordem já existir na lista de ordens de controle - verifique se há alterações de propriedade
         else if(index>WRONG_VALUE)
           {
            this.OnChangeEvent(order,index);
           }
        }
     }
#endif 

Em seguida, ela é passada por referência para o método:

         //--- Adicionar objeto de ordem de mercado à lista de ordens de mercado e posições
         if(!this.AddToListMarket(order))
            continue;

No método"AddToListMarket", a ordem de mercado não é levada em consideração no hash_sum "hash_sum", então por que precisamos inseri-la e controlá-la?
Explique por que precisamos dela, se podemos encontrar todas as informações da posição ou da ordem pendente?