Minha EA faz uma entrada dupla - página 9

 

Hi

Esta abordagem só funciona se o tamanho da posição atual for zero e o novo comércio for executado com sucesso com o tamanho da posição desejada.

Ver código:

#include <Trade\Trade.mqh>

//--- global variables
CTrade trade;
bool position_opened=false;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {
   bool conditions_to_open;
   ENUM_ORDER_TYPE order_type;
   double lot;
   double price,sl,tp;

//---...set variables

//--- inside OnTick()
   if(conditions_to_open && !position_opened) //-- Or position_opened==false
     {
      if(trade.PositionOpen(_Symbol,order_type,lot,price,sl,tp,"comment")
         && 
         (trade.ResultRetcode()==10009 || trade.ResultRetcode()==10008)) //-- Or others condition according to your needs
        {
         //--- set the global variable to true to avoid duplicate orders
         position_opened=true;
         Print("Success!");
        }
      else
        {
         Print("Error = ",GetLastError(), "trade error = ", trade.ResultRetcode());
         //--- Sets the global variable to false
         // position_opened=false;                                         //-- Not needed as position_opened is already false
         return;
        }

     }
//--- 
  }


Mas e se sua EA estiver girando a posição: de uma posição LONGA para uma posição CURTA ou vice-versa e esta ação for executada em 2 negócios diferentes?

Após a primeira negociação, o booleano "position_opened" é definido como "TRUE" e o EA não pode abrir a negociação 2e porque a condição é verificar"if(conditions_to_open && !position_opened)", então a segunda negociação será bloqueada.

E se o tamanho da posição for aberto apenas parcialmente? Você precisa de uma segunda negociação para obter o tamanho de sua posição no tamanho correto.


No final, para resumir "uma longa história", você sempre precisa da função PositionSelect(Symbol()) para calcular o tamanho da posição CURRENT e foi aqui que todo o problema começou (e este tópico do fórum).

No momento crítico, quando o EA está chamando o PositionSelect(Symbol()), o terminal ainda não atualizou o tamanho da posição CURRENT e o EA está trabalhando com o tamanho de posição errado e envia uma nova ordem dupla para o servidor comercial.


Eu acho que a abordagem de(figuralli) é melhor porque você é forçado a esperar até que o EA tenha atualizado a função PositionSelect(Symbol()) para o tamanho de posição correto.


bool fatalError=false; // atention: declare this as global

....

if(fatalError == false) 
      {
      if(m_Trade.PositionOpen(Symbol(), ORDER_TYPE_BUY, LotSize, Price, 0, 0)) 
            {
            Print("Position opened in ", Symbol());
            int maxTimeout=0;
            while(!PositionSelect(Symbol())) 
                     {
                     Sleep(100);
                     maxTimeout++;
                     if(maxTimeout > 100) 
                           {
                           Print("### PositionSelect fatal error!");
                           fatalError = true;
                           break;
                           }
                     }
            Print("--> PositionSelect delay=",maxTimeout * 100);
            break;
            }
      }
 
snelle_moda:

Hi

Esta abordagem só funciona se o tamanho da posição atual for zero e o novo comércio for executado com sucesso com o tamanho da posição desejada.

Ver código:


Mas e se sua EA estiver girando a posição: de uma posição LONGA para uma posição CURTA ou vice-versa e esta ação for executada em 2 negócios diferentes?

Após a primeira negociação, o booleano "position_opened" é definido como "TRUE" e o EA não pode abrir a negociação 2e porque a condição é verificar"if(conditions_to_open && !position_opened)", então a segunda negociação será bloqueada.

E se o tamanho da posição for aberto apenas parcialmente? Você precisa de uma segunda negociação para obter o tamanho de sua posição no tamanho correto.


No final, para resumir "uma longa história", você sempre precisa da função PositionSelect(Symbol()) para calcular o tamanho da posição CURRENT e foi aqui que todo o problema começou (e este tópico do fórum).

No momento crítico, quando o EA está chamando o PositionSelect(Symbol()), o terminal ainda não atualizou o tamanho da posição CURRENT e o EA está trabalhando com o tamanho de posição errado e envia uma nova ordem dupla para o servidor comercial.


Eu acho que a abordagem de(figurelli) é melhor porque você é forçado a esperar até que o EA tenha atualizado a função PositionSelect(Symbol())


Você está certo, ambas as abordagens têm limitações.

A origem desta questão está agora claramente identificada. Cada um tem que adaptar seu código de acordo com sua estratégia. Não creio que haja um método geral que possa ser aplicado em todos os casos.

 
Precisamos de uma Biblioteca para o Grande e Poderoso mql5?
 
Ubzen:
Precisamos de uma Biblioteca para o Grande e Poderoso mql5?
Eu não acho que o sarcasmo possa ser de ajuda. Embora seja claramente um projeto ruim que leva a tal complexidade.
 
angevoyageur:

Você está certo, ambas as abordagens têm limitações.

A origem desta questão está agora claramente identificada. Cada um tem que adaptar seu código, dependendo de sua estratégia. Não creio que haja um método geral que possa ser aplicado em todos os casos.


Ou temos que esperar por uma "declaração oficial" dos próprios caras das Metaquotes.

Já existe uma resposta da central de serviço?

 
angevoyageur: Eu não acho que o sarcasmo possa ser de ajuda. Embora seja claramente um projeto ruim que leva a tal complexidade.

Se eu concordasse com você, você consideraria isso inútil? .

Eu apenas ensinei que a solução de Dormir até Terminar o Comércio me lembrava a OrderSendReliable(). Ensinei que estas teriam sido abordadas de forma mais elegante.

Também me lembrava do manuseio dos velhos_documentos... para onde ele vai { e todas as negociações deveriam ser interrompidas }.

De qualquer forma, as desculpas não significavam implicar com o mql5.

 
snelle_moda:


Ou temos que esperar por uma "declaração oficial" dos próprios caras das Metaquotes.

Já existe uma resposta da central de serviço?

Não. Eu só estava pensando nisso... Seria provavelmente útil se todas as pessoas envolvidas escrevessem um bilhete para o ServiceDesk sobre este assunto. Entretanto, estou muito cético se a MQ estiver disposta a mudar este projeto. Mas nós podemos tentar.

As pessoas podem escrever para o ServiceDesk e relatar o ticket# aqui. O meu é

Erros, MetaTrader 5 MQL, Open, Start: 2013.12.23 19:08, #916435
Get in touch with developers using Service Desk!
Get in touch with developers using Service Desk!
  • www.mql5.com
We therefore attach great importance to all user reports about issues in our programs and try to answer each one of them.
 
Ubzen:

Se eu concordasse com você, você consideraria se não fosse útil? .

Acabo de ensinar que a solução de Dormir até Terminar o Comércio me lembrou a OrderSendReliable(). Ensinei que estas teriam sido abordadas de forma mais elegante.

Também me lembrava do manuseio dos velhos_documentos ... para onde vai { e todas as negociações deveriam ser interrompidas }.

De qualquer forma, as desculpas não significavam implicar com o mql5.

Pergunto-me se uma questão semelhante não pode existir também no mql4, li pelo menos 2 tópicos nos últimos meses no fórum do mql4 de usuários que reclamam sobre negócios duplos. Não tenho certeza se está relacionado, mas pode valer a pena verificar estes tópicos. Você também lê estes tópicos?
 
angevoyageur: Pergunto-me se uma questão semelhante não pode existir também no mql4, li pelo menos 2 tópicos nos últimos meses no fórum do mql4 de usuários que reclamam de dupla negociação. Não tenho certeza se está relacionado, mas pode valer a pena verificar estes tópicos. Você também lê estes tópicos?

Sim, mas é difícil dizer se é por causa de uma má codificação. A dupla troca era um problema mesmo antes do fio comercial múltiplo. A forma como é tradicionalmente manipulada é a forma como o snelle_moda lida com ela.

 
Ubzen:

Sim, mas é difícil dizer se é por causa de uma má codificação. A dupla troca era um problema mesmo antes do fio comercial múltiplo. A forma como é tradicionalmente manipulada é a forma como o snelle_moda lida com ela.

Não tenho certeza se entendo o que você quer dizer. Esta questão que estamos falando neste tópico não é causada por uma má codificação, mas por um mau design em mql5 (é minha opinião, ou talvez seja simplesmente um bug?). O que você quer dizer com "múltiplos fios comerciais"?
Get in touch with developers using Service Desk!
Get in touch with developers using Service Desk!
  • www.mql5.com
We therefore attach great importance to all user reports about issues in our programs and try to answer each one of them.