Stop móvel

 

Olá pessoal


Criei uma função de stop móvel que é acionada a cada tick, para verificar se precisará ou não modificar a posição da ordem, porém verifiquei que em alguns casos, a função PositionsTotal() retorna zerada, mesmo com a posição aberta mesmo, não acionando assim a verificação do tralling. O que poderia fazer para evitar essa situação?


void TrailingStop(CTrade &trade, double price, double STEP_TRAILING, double gatilhoTS){

for(int i = PositionsTotal()-1; i>=0; i--)
         {
            string symbol = PositionGetSymbol(i);
            ulong magic = PositionGetInteger(POSITION_MAGIC);
            if(symbol == _Symbol)
               {
                  ulong PositionTicket = PositionGetInteger(POSITION_TICKET);
                  double StopLossCorrente = PositionGetDouble(POSITION_SL);
                  double TakeProfitCorrente = PositionGetDouble(POSITION_TP);
                  if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
                     {
                        if(price >= (StopLossCorrente + STEP_TRAILING) )
                           {
                              double novoSL = NormalizeDouble(StopLossCorrente + STEP_TRAILING, _Digits);
                              if(trade.PositionModify(PositionTicket, novoSL, TakeProfitCorrente))
                                 {
                                    Print("TrailingStop - sem falha. ResultRetcode: ", trade.ResultRetcode(), ", RetcodeDescription: ", trade.ResultRetcodeDescription());
                                 }
                              else
                                 {
                                    Print("TrailingStop - com falha. ResultRetcode: ", trade.ResultRetcode(), ", RetcodeDescription: ", trade.ResultRetcodeDescription());
                                 }
                           }
                     }
                  else if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
                     {
                        if(price <= (StopLossCorrente - gatilhoTS) )
                           {
                              double novoSL = NormalizeDouble(StopLossCorrente - STEP_TRAILING, _Digits);
                              if(trade.PositionModify(PositionTicket, novoSL, TakeProfitCorrente))
                                 {
                                    Print("TrailingStop - sem falha. ResultRetcode: ", trade.ResultRetcode(), ", RetcodeDescription: ", trade.ResultRetcodeDescription());
                                 }
                              else
                                 {
                                    Print("TrailingStop - com falha. ResultRetcode: ", trade.ResultRetcode(), ", RetcodeDescription: ", trade.ResultRetcodeDescription());
                                 }
                           }
                     }
               }
         }
 
Felipe Lisboa:

Olá pessoal


Criei uma função de stop móvel que é acionada a cada tick, para verificar se precisará ou não modificar a posição da ordem, porém verifiquei que em alguns casos, a função PositionsTotal() retorna zerada, mesmo com a posição aberta mesmo, não acionando assim a verificação do tralling. O que poderia fazer para evitar essa situação?


Eu tive um caso semelhante numa corretora no qual ela abria a posicao e a confirmacao da mesma parecia levar quase 2 minutos pra chegar. Isso fazia abrir multiplas operacoes no ativo, nao tem o que fazer infelizmente quanto ao PositionsTotal(). No meu caso mesmo o OrderStatus nao mudava pra filled. Acabei fazendo uma estrutura auxiliar e colocando um tempo de timeout nos dados que tavam nessa fila. Nao eh a solucao otima, mas ja atendeu o suficiente.
 
Ricardo Rodrigues Lucca #:
Eu tive um caso semelhante numa corretora no qual ela abria a posicao e a confirmacao da mesma parecia levar quase 2 minutos pra chegar. Isso fazia abrir multiplas operacoes no ativo, nao tem o que fazer infelizmente quanto ao PositionsTotal(). No meu caso mesmo o OrderStatus nao mudava pra filled. Acabei fazendo uma estrutura auxiliar e colocando um tempo de timeout nos dados que tavam nessa fila. Nao eh a solucao otima, mas ja atendeu o suficiente.

Muito obrigado pelo feedback. Não tinha pensado nesse atraso da corretora


Vou criar uma estrutura parecida com suporte do evento de confirmação da execução da ordem, e ir modificando enquanto ela ainda estiver aberta, sem precisar dessa  PositionsTotal() por enquanto.

 
Ricardo Rodrigues Lucca #:
Eu tive um caso semelhante numa corretora no qual ela abria a posicao e a confirmacao da mesma parecia levar quase 2 minutos pra chegar. Isso fazia abrir multiplas operacoes no ativo, nao tem o que fazer infelizmente quanto ao PositionsTotal(). No meu caso mesmo o OrderStatus nao mudava pra filled. Acabei fazendo uma estrutura auxiliar e colocando um tempo de timeout nos dados que tavam nessa fila. Nao eh a solucao otima, mas ja atendeu o suficiente.

Uma saida interessante! No caso voce fez de forma assíncrona? 

 
Felipe Machado #:

Uma saida interessante! No caso voce fez de forma assíncrona? 

Nao, eu espero o envio ter sido bem sucedido e dai ja insiro na lista pra nao ter nova operacao. Nao me preocupa se foi executada ou nao.