BreakEvem Erro invaldi stops, como resolver?

 
Amigos eu uso uma função para chamar meu BreakEven, ele já funciona se ultrapassa meu gatilho, porém eu tb quero que le acione o BreakEven se ultrapassar 20minutos até consigo fazer um if para acionar após 20 minutos porem aparece um erro invalidi stops.
já olhei o código umas 30x e não estou entendendo onde está errado. Favor me ajudem, agradeço rsrsr


void BreakEven(double preco)
   {
   

      
   
      for(int i = PositionsTotal()-1; i>=0; i--)
         {
            ulong magic = PositionGetInteger(POSITION_MAGIC);
            if(PositionSelect(_Symbol) && magic == magicNum && !beAtivo)
               {
                  ulong PositionTicket = PositionGetInteger(POSITION_TICKET);
                  double PrecoEntrada = NormalizeDouble(PositionGetDouble(POSITION_PRICE_OPEN),_Digits);
                  double TakeProfitCorrente = NormalizeDouble(PositionGetDouble(POSITION_TP),_Digits);
                   double StopLossCorrente = NormalizeDouble(PositionGetDouble(POSITION_SL),_Digits);
                  
                  double novoSL = PrecoEntrada ;  // MOVE NOVO STOP LOSS PARA PREÇO DE ENTRADA 
                  double novoTP = TakeProfitCorrente ; // NOVO TAKE PROFIT PERMANECE O MESMO
                  
                // aciona se ultrapassa 1200 segundos 20minutos - stop no zeroXzero
                  if(horaCandleOrdem+1200 == TimeCurrent() && PrecoEntrada != StopLossCorrente ){
                     
                     
                      if(trade.PositionModify(PositionTicket, novoSL , novoTP )){
                                    Print("BreakEven - sem falha. ResultRetcode: ", trade.ResultRetcode(), ", RetcodeDescription: ", trade.ResultRetcodeDescription());
                                    beAtivo = true;
                                 }else{
                                    Print("BreakEven - com falha. ResultRetcode: ", trade.ResultRetcode(), ", RetcodeDescription: ", trade.ResultRetcodeDescription());
                                 }
                  
                              
  
                    
                  }
                  
                  
 
               }
         }
   }
ERRO: 
2021.05.26 08:36:06.403 2021.05.07 15:22:00   failed modify #92 sell 1 WINM21 sl: 121495, tp: 121160 -> sl: 121240, tp: 121160 [Invalid stops]

 
Kleuton Novais:
Amigos eu uso uma função para chamar meu BreakEven, ele já funciona se ultrapassa meu gatilho, porém eu tb quero que le acione o BreakEven se ultrapassar 20minutos até consigo fazer um if para acionar após 20 minutos porem aparece um erro invalidi stops.
já olhei o código umas 30x e não estou entendendo onde está errado. Favor me ajudem, agradeço rsrsr


ERRO: 
2021.05.26 08:36:06.403 2021.05.07 15:22:00   failed modify #92 sell 1 WINM21 sl: 121495, tp: 121160 -> sl: 121240, tp: 121160 [Invalid stops]

Olá Kleuton,

logo no inicio tem um problema, você está pegando um MAGIC NUMBER lixo, pois não leu a posição SelectByIndex(), nem quero saber o motivo de dar certo quando a lista tem size  1(um)....

Tenho uma indagação e uma sugestão para fazer.

Se você está me modo NETTING não precisar percorrer a lista de posições abertas, porque você só tem uma posição para cada ativo, então o PositionSelect( _Symbol ) já resolve o problema e testar o MAGIC NUMBER é uma redundância.

Quanto aos stops verifique se estão  coerentes com ASK / BUY,  dá um print desses valores para verificar.

 -> sl: 121240 >=  ASK      tp: 121160 <= BID


if(PositionSelect(_Symbol) && !beAtivo)
  {
   ulong PositionTicket = PositionGetInteger(POSITION_TICKET);
   double PrecoEntrada = NormalizeDouble(PositionGetDouble(POSITION_PRICE_OPEN), _Digits);
   double TakeProfitCorrente = NormalizeDouble(PositionGetDouble(POSITION_TP), _Digits);
   double StopLossCorrente = NormalizeDouble(PositionGetDouble(POSITION_SL), _Digits);
   double novoSL = PrecoEntrada ;  // MOVE NOVO STOP LOSS PARA PREÇO DE ENTRADA
   double novoTP = TakeProfitCorrente ; // NOVO TAKE PROFIT PERMANECE O MESMO
// aciona se ultrapassa 1200 segundos 20minutos - stop no zeroXzero
   if(horaCandleOrdem + 1200 == TimeCurrent() && PrecoEntrada != StopLossCorrente)
     {
      if(trade.PositionModify(PositionTicket, novoSL, novoTP))
        {
         Print("BreakEven - sem falha. ResultRetcode: ", trade.ResultRetcode(), ", RetcodeDescription: ", trade.ResultRetcodeDescription());
         beAtivo = true;
        }
      else
        {
         Print("BreakEven - com falha. ResultRetcode: ", trade.ResultRetcode(), ", RetcodeDescription: ",
               trade.ResultRetcodeDescription());
        }
     }
  }
 
Rogerio Giannetti Torres:

Olá Kleuton,

logo no inicio tem um problema, você está pegando o MAGIC NUMBER lixo, pois não leu a posição, nem quero saber o motivo de dar certo quando a lista só tem size  1(um).... Tenho uma indagação e uma sugestão para fazer.

Se você está me modo NETTING não precisar percorrer a lista de posições abertas, porque você só tem uma posição para cada ativo, então o PositionSelect( _Symbol ) já resolve o problema e testar o MAGIC NUMBER é uma redundância.

Quanto aos stops verifique se estão  coerentes com ASK / BUY,  dá um print desses valores para verificar.

Rogerio entendi seu posicionamento, porém fiquei com mais duvida ainda, Sim minha conta é NETTING porém as vezes eu rodo 2 ou mais EA diferente no mesmo Mt5 ai eu preciso separar as ordem com MagicNum=XXXX pois depois eu exibo o histórico separado de cada EA exibido em um painel: Controls\Dialog.mqh.
Seu eu usar somente PositionSelect() é possível usar em conjunto com o magicNum ? ou não precisa ?

Estou mandando o Print (EM ANEXO) do Erro do BREAKEaver , interessante que o mesmo código funciona quando uso o BreakEaver pegando um gatilho que ultrapassa o preço, porém quando eu uso o recuso de Sotp no Tempo Zero a Zero pelo Time de 20m, o mesmo código não funciona.

Arquivos anexados:
BREAKEVEN.png  80 kb
 
conseguir fazer por outra alternativa, não muito boa mas foi a solução, 
o que acham? 

if(TimeCurrent() >= horaEntradaPosicao+1200 && PRC == precoEntradaPosicao ){
         
        /// Chama função que encerra a posição atual
         FechaPosicao();
         Print("## Fechar Posição no Zero a Zero - Limite de Horário para o take");
       } 
 
Kleuton Novais:
conseguir fazer por outra alternativa, não muito boa mas foi a solução, 
o que acham? 

Bom dia!


Em relação ao primeiro código, o que pode está ocorrendo também é de a posição estar negativa e o EA tenta mover SL pro zero-a-zero. O preço atual deve ser verificado também.

 
Kleuton Novais:

Rogerio entendi seu posicionamento, porém fiquei com mais duvida ainda, Sim minha conta é NETTING porém as vezes eu rodo 2 ou mais EA diferente no mesmo Mt5 ai eu preciso separar as ordem com MagicNum=XXXX pois depois eu exibo o histórico separado de cada EA exibido em um painel: Controls\Dialog.mqh.
Seu eu usar somente PositionSelect() é possível usar em conjunto com o magicNum ? ou não precisa ?

Estou mandando o Print (EM ANEXO) do Erro do BREAKEaver , interessante que o mesmo código funciona quando uso o BreakEaver pegando um gatilho que ultrapassa o preço, porém quando eu uso o recuso de Sotp no Tempo Zero a Zero pelo Time de 20m, o mesmo código não funciona.

Kleuton

o fato de ser na mesma instância (MT5) não importa, o que importa é a CONTA e o SERVIDOR, outra coisa, você tem mais de um EA rodando ao mesmo tempo sobre o mesmo ativo (?). Isso não nada comum e complica os EA(S), né!!!

....  Seu eu usar somente PositionSelect() é possível usar em conjunto com o magicNum ? ou não precisa ?

Já que você roda sobre o mesmo ativo mais de um EA  ao mesmo tempo, então  você precisa identificar o EA.

.....  eu exibo o histórico separado de cada EA exibido em um painel

Sim, aqui o uso do MagicNumber é importante, pois você identifica o EA e avalia o resultado.

.... Estou mandando o Print (EM ANEXO) do Erro do BREAKEaver , interessante que o mesmo código funciona quando uso o BreakEaver pegando um gatilho que ultrapassa o preço, porém quando eu uso o recuso de Sotp no Tempo Zero a Zero pelo Time de 20m, o mesmo código não funciona.

Verifique se os stops estão coerentes com ASK / BUY,  dá um PRINT desses valores pois  o  SL de 121240 tem ser  >=  ASK   e o   TP de 121160 tem que ser <= BID



 
Vinicius de Oliveira:

Bom dia!


Em relação ao primeiro código, o que pode está ocorrendo também é de a posição estar negativa e o EA tenta mover SL pro zero-a-zero. O preço atual deve ser verificado também.

tem razão

 
Rogerio Giannetti Torres:

Kleuton

o fato de ser na mesma instância (MT5) não importa, o que importa é a CONTA e o SERVIDOR, outra coisa, você tem mais de um EA rodando ao mesmo tempo sobre o mesmo ativo (?). Isso não nada comum e complica os EA(S), né!!!

....  Seu eu usar somente PositionSelect() é possível usar em conjunto com o magicNum ? ou não precisa ?

Já que você roda sobre o mesmo ativo mais de um EA  ao mesmo tempo, então  você precisa identificar o EA.

.....  eu exibo o histórico separado de cada EA exibido em um painel

Sim, aqui o uso do MagicNumber é importante, pois você identifica o EA e avalia o resultado.

.... Estou mandando o Print (EM ANEXO) do Erro do BREAKEaver , interessante que o mesmo código funciona quando uso o BreakEaver pegando um gatilho que ultrapassa o preço, porém quando eu uso o recuso de Sotp no Tempo Zero a Zero pelo Time de 20m, o mesmo código não funciona.

Verifique se os stops estão coerentes com ASK / BUY,  dá um PRINT desses valores pois  o  SL de 121240 tem ser  >=  ASK   e o   TP de 121160 tem que ser <= BID



Eu costumo usa mais de uma EA na conta demo  pois eu faço testes diferentes, as vezes em ativo diferentes também, mas é mais no Painel que o magicNum ajuda, já na conta Real somente 1 EA.
Entendi perfeitamente o seu posicionamento, faz muito sentido inclusive isso enxuga o código, vou rever isso já. Agradeço

TÓPICO RESOLVIDO - Deste já Obrigado.

Razão: