Dois EA´s, dois Profit´s

 

Prezados,

Estou testando dois EA´s da biblioteca, um no WIN e outro no WDO. Coloquei a linha abaixo para que ao atingir um X valor de lucro as posições sejam fechadas. Nos Input´s dos dois EA´s tem o InpLucroTrade a ser preenchido:

if(m_account.Profit()>=InpLucroTrade

         CloseAllPositions();


Porém, quando coloco os dois EA´s o resultado financeiro de um se mistura com o do outro, ou melhor, a conta (ACCOUNT) mostra os dois resultados variando na coluna lucro na aba <negociação>. Até aí está correto pois a função m_account.Profit() avalia o resultado financeiro da conta como um todo. O que eu queria é que cada EA fechasse somente as suas respectivas ordens (CloseAllPositions()) quando atingisse o seu resultado financeiro próprio, sem que o resultado financeiro do segundo EA interfira nisso. Daí fiz esta inclusão abaixo (m_position,Magic):

 if(m_account.Profit()>=InpLucroTrade && m_position.Magic()==m_magic)

         CloseAllPositions();


Mas não deu certo. Continuou um 'atrapalhando' o outro. Qual a forma mais simples que eu possa incluir no código para cada EA agir conforme seu próprio resultado financeiro ?


Grato

 
sergiomt:

Prezados,

Estou testando dois EA´s da biblioteca, um no WIN e outro no WDO. Coloquei a linha abaixo para que ao atingir um X valor de lucro as posições sejam fechadas. Nos Input´s dos dois EA´s tem o InpLucroTrade a ser preenchido:

if(m_account.Profit()>=InpLucroTrade

         CloseAllPositions();


Porém, quando coloco os dois EA´s o resultado financeiro de um se mistura com o do outro, ou melhor, a conta (ACCOUNT) mostra os dois resultados variando na coluna lucro na aba <negociação>. Até aí está correto pois a função m_account.Profit() avalia o resultado financeiro da conta como um todo. O que eu queria é que cada EA fechasse somente as suas respectivas ordens (CloseAllPositions()) quando atingisse o seu resultado financeiro próprio, sem que o resultado financeiro do segundo EA interfira nisso. Daí fiz esta inclusão abaixo (m_position,Magic):

 if(m_account.Profit()>=InpLucroTrade && m_position.Magic()==m_magic)

         CloseAllPositions();


Mas não deu certo. Continuou um 'atrapalhando' o outro. Qual a forma mais simples que eu possa incluir no código para cada EA agir conforme seu próprio resultado financeiro ?


Grato

Olá  sergiomt, a resposta é simples: você deve criar funções próprias para analisar suas posições e ordens pendentes discriminadas por ativo e até mesmo por número mágico.
Para isso, recomendo o artigo seguinte, com vários exemplos nesse sentido: https://www.mql5.com/pt/articles/211
Minha recomendação final é que, antes de você colocar um robô em conta real a partir do codebase, não esquecer que grande parte deles foi desenvolvido para o mercado Forex, e com algoritmos de segurança (quando existem) focados nesse mercado, portanto é importante fazer um checklist como em  https://www.mql5.com/pt/forum/23409 para evitar problemas na B3.
Sds.,
Rogério Figurelli

Ordens, posições e negócios no MetaTrader 5
Ordens, posições e negócios no MetaTrader 5
  • www.mql5.com
O maior objetivo de um comerciante é extrair lucros através dos meios de operações de negociação nos mercados financeiros. Esse artigo descreve os termos e processos da plataforma de negociação MetaTrader 5, o conhecimento necessário para uma compreensão adequada do desenvolvimento das funções comerciais da linguagem MQL5. Ordens — são as...
 

Valeu Rogério, fico grato pelas valiosas indicações de leitura e pesquisa


Mas se alguém ler este tópico e souber (puder e quiser) revelar como seria o código eu agradeço pois conseguirei prosseguir com meus estudos de mercado

 
sergiomt:

Valeu Rogério, fico grato pelas valiosas indicações de leitura e pesquisa


Mas se alguém ler este tópico e souber (puder e quiser) revelar como seria o código eu agradeço pois conseguirei prosseguir com meus estudos de mercado

Olá  sergiomt, complementando minha resposta, dá uma olhada nesse script pronto em  https://www.mql5.com/pt/code/17943 pois ele leva em conta o símbolo do gráfico, evitando um EA interferir no outro, pelo menos para essa função específica.
Sds.,
Rogério Figurelli

CloseAllPositions
CloseAllPositions
  • www.mql5.com
ClosePositionsBySymbol O script fecha todas as posições para o símbolo atual. Background_StreamСCandles_HTF O indicador desenha velas de um período de tempo maior como retângulos coloridos usando...
 

Legal Rogério, vou tentar entender o código dele


Grato

 

Voltando ao tema. Estou estudando um EA que opera dois ativos ao mesmo tempo identificados como Symbol0 e Symbol1 no trecho do código abaixo. Minha intenção é abrir compras somente naquele em que o seu Profit esteja abaixo de zero (dando prejuízo). Lá em cima nos inputs eu coloquei double pos_profit0=0; e double pos_profit1=0; e coloquei também o bloco abaixo GET SYMBOL PROPERTIES. Mas não funciona, não abre ordem. Se eu não colocar o pos_profit aí volta a abrir ordens.  Como corrijo isso ? 


 if(Use_Symbol0 && && pos_profit0<0)

         OpenPosition(m_symbols0.Name(),PosType,Symbol0_Lot);

 if(Use_Symbol1 && && pos_profit1<0)

         OpenPosition(m_symbols1.Name(),PosType,Symbol1_Lot);


//+------------------------------------------------------------------+

//| GETTING SYMBOL PROPERTIES                                        |

//+------------------------------------------------------------------+

void GetPositionProperties()

  {

   if(Use_Symbol0)

   pos_profit0 =PositionGetDouble(POSITION_PROFIT);


   if(Use_Symbol1)

   pos_profit1 =PositionGetDouble(POSITION_PROFIT);

  }

//+------------------------------------------------------------------+

 
sergiomt:

Voltando ao tema. Estou estudando um EA que opera dois ativos ao mesmo tempo identificados como Symbol0 e Symbol1 no trecho do código abaixo. Minha intenção é abrir compras somente naquele em que o seu Profit esteja abaixo de zero (dando prejuízo). Lá em cima nos inputs eu coloquei double pos_profit0=0; e double pos_profit1=0; e coloquei também o bloco abaixo GET SYMBOL PROPERTIES. Mas não funciona, não abre ordem. Se eu não colocar o pos_profit aí volta a abrir ordens.  Como corrijo isso ? 


 if(Use_Symbol0 && && pos_profit0<0)

         OpenPosition(m_symbols0.Name(),PosType,Symbol0_Lot);

 if(Use_Symbol1 && && pos_profit1<0)

         OpenPosition(m_symbols1.Name(),PosType,Symbol1_Lot);


//+------------------------------------------------------------------+

//| GETTING SYMBOL PROPERTIES                                        |

//+------------------------------------------------------------------+

void GetPositionProperties()

  {

   if(Use_Symbol0)

   pos_profit0 =PositionGetDouble(POSITION_PROFIT);


   if(Use_Symbol1)

   pos_profit1 =PositionGetDouble(POSITION_PROFIT);

  }

//+------------------------------------------------------------------+

Com esses 4 & seguidos aí não vai nem compilar.

Fica difícil ajudar se vc não postar o código original que compila e não funciona.

Vc verificou se o profit está mesmo negativo? Coloque um print antes do if e poste o código original com o resultado do print 

Razão: