Olá, boa tarde!!
Acredito que algum dos exemplos abaixo pode lhe trazer alguma luz com a sua dúvida...
O primeiro exemplo verifica se já existe posição aberta antes de enviar nova ordem:
//--- Local variables int Cnt, pos_nr = 0; ulong TICKET; //--- Checks positions for(Cnt = PositionsTotal() - 1; Cnt >= 0; Cnt --) { //--- Gets the ticket and selects the position TICKET = PositionGetTicket(Cnt); if(TICKET == 0) { Print("Failed to get position ticket..."); return; } if(PositionGetString(POSITION_SYMBOL) == _Symbol && PositionGetInteger(POSITION_MAGIC) == MAGIC) { //--- Increase the positions number pos_nr ++; break; } } // . . . //--- Open position - Buy if(pos_nr == 0) { if(!m_trade.Buy(Lot, _Symbol, ASK, SL, TP, COMMENT)) { Print(m_trade.ResultRetcode(), " ", m_trade.ResultRetcodeDescription()); return; } } // . . . //--- Open position - Sell if(pos_nr == 0) { if(!m_trade.Sell(Lot, _Symbol, BID, SL, TP, COMMENT)) { Print(m_trade.ResultRetcode(), " ", m_trade.ResultRetcodeDescription()); return; } } }
Fórum de negociação, sistemas de negociação automatizados e testes de estratégias de negociação
Como garantir que o EA não fará mais de uma operação no mesmo Candle operando no M1
Vinicius de Oliveira, 2022.09.28 22:58
Boa tarde!!
Pra esse caso em que o sinal pode ocorrer a qualquer momento (e não apenas na abertura de nova barra), uma forma bem simples de saber se já foi aberta posição na barra atual seria armazenando iTime(0) sempre que uma posição for aberta, e verificando essa informação antes de abrir nova posição...
//--- Global datetime open_time = 0; . . . //--- Open position if(open_time != iTime(_Symbol, PERIOD_CURRENT, 0)) { if(!m_trade.Buy(Lot, _Symbol, ASK, SL, TP, COMMENT)) { Print(m_trade.ResultRetcode(), " ", m_trade.ResultRetcodeDescription()); return; } open_time = iTime(_Symbol, PERIOD_CURRENT, 0); }
Acho que essa solução deve funcionar se o EA não for encerrado e reiniciado durante a execução da mesma barra... Para um maior controle (independente de encerramento/reinício do EA), verifique o horário de abertura da última posição no histórico de operações (por exemplo).
. . .
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso
Prezados, boa tarde!
Estou com um problema no meu EA.
O loop que verifica o sinal e envia a ordem estava ocorrendo mais rápido que a própria execução da ordem a mercado e em algumas situações a ordem era enviada novamente, ficando duplicada.
Para corrigir isso fiz um loop while que vai ficar "preso" enquanto a ordem não for executada.
Esse loop vai entrar na função posicao() que verifica se está comprado ou vendido e seta a variável tipo_posicao. Se estiver posicionado, a ordem foi enviada corretamente e ele vai sair do while.
Isso resolveu o meu problema. Tanto na conta real como na simulação, o EA está enviando apenas uma ordem.
Minha dúvida é a seguinte: e se a ordem for rejeita, por exemplo? O EA vai ficar preso no while. Eu tentei algumas soluções para sair do while mas não deram certo.
Alguém poderia me sugerir uma implementação que funcione nesta situação?
Obrigado desde já.