Bom dia, eu já tenho um EA que opero faz 1 ano, mas agora estou aprimorando ele e gostaria de saber qual o jeito "correto" de abrir um ordem de tipo Pending (TRADE_ACTION_PENDING), Limit e Filling Return.
Eu uso o MqlTradeRequest e MqlTradeResult mas ainda ocorrem alguns erros em relação a erros que ocorrem na hora da ordem, como por exemplo o volume diminui na hora da minha ordem (eu checo o volume antes), ou algum erro de conexão, ou o preço muda, etc...
Se alguém pudesse me falar qual a melhor maneira pra abrir ordens eu agradeceria muito.
Obrigado
Esse fenômeno de ele abrir a ordem com volume menor que o programado é bem estranho.
Talvez seja por você não ter margem suficiente alocada junto à corretora. Em algumas corretoras, não adianta simplesmente você ter as garantias depositadas, às vezes é necessário você alocar explicitamente as garantias para o tipo de operação que você vai fazer e/ou para a plataforma que vai usar (por exemplo, na Clear você tem que fazer a alocação de garantia especificamente para operações day trade, senão ela não permite a operação, mesmo q vc tenha 1 milhão de reais depositados na conta-corrente, já na Modalmais, você tem que alocar garantia específica para minicontratos, etc.).
Mas mesmo assim eu acho estranho, pois o comportamento que eu sempre observei no Metatrader quando faltam garantias para a operação é que a ordem não é colocada. Nunca vi ser colocada uma ordem com volume menor.
Verifique se esse fenômeno de abrir ordem com volume menor acontece também em conta demo (na conta demo não há exigência de garantias, qualquer ordem que você enviar será acatada, desde que enviada corretamente).
Quanto à forma correta de abrir a ordem, sugiro que você comece testando o exemplo de ordem pendente que está na documentação do MQL5 (neste link) e que certamente vai funcionar. Daí você vai modificando aos poucos, um atributo de cada vez, até ficar do jeito que você precisa. Fazendo uma modificação de cada vez a partir de um exemplo que funciona, você vai descobrir exatamente o que você está fazendo errado.
Sugiro que comece a partir do exemplo abaixo, que é um dentre os disponíveis na documentação e que funciona perfeitamente:
#property description "Example of placing pending orders" #property script_show_inputs #define EXPERT_MAGIC 123456 // MagicNumber of the expert input ENUM_ORDER_TYPE orderType=ORDER_TYPE_BUY_LIMIT; // order type //+------------------------------------------------------------------+ //| Placing pending orders | //+------------------------------------------------------------------+ void OnStart() { //--- declare and initialize the trade request and result of trade request MqlTradeRequest request={0}; MqlTradeResult result={0}; //--- parameters to place a pending order request.action =TRADE_ACTION_PENDING; // type of trade operation request.symbol =Symbol(); // symbol request.volume =0.1; // volume of 0.1 lot request.deviation=2; // allowed deviation from the price request.magic =EXPERT_MAGIC; // MagicNumber of the order int offset = 50; // offset from the current price to place the order, in points double price; // order triggering price double point=SymbolInfoDouble(_Symbol,SYMBOL_POINT); // value of point int digits=SymbolInfoInteger(_Symbol,SYMBOL_DIGITS); // number of decimal places (precision) //--- checking the type of operation if(orderType==ORDER_TYPE_BUY_LIMIT) { request.type =ORDER_TYPE_BUY_LIMIT; // order type price=SymbolInfoDouble(Symbol(),SYMBOL_ASK)-offset*point; // price for opening request.price =NormalizeDouble(price,digits); // normalized opening price } else if(orderType==ORDER_TYPE_SELL_LIMIT) { request.type =ORDER_TYPE_SELL_LIMIT; // order type price=SymbolInfoDouble(Symbol(),SYMBOL_BID)+offset*point; // price for opening request.price =NormalizeDouble(price,digits); // normalized opening price } else if(orderType==ORDER_TYPE_BUY_STOP) { request.type =ORDER_TYPE_BUY_STOP; // order type price =SymbolInfoDouble(Symbol(),SYMBOL_ASK)+offset*point; // price for opening request.price=NormalizeDouble(price,digits); // normalized opening price } else if(orderType==ORDER_TYPE_SELL_STOP) { request.type =ORDER_TYPE_SELL_STOP; // order type price=SymbolInfoDouble(Symbol(),SYMBOL_BID)-offset*point; // price for opening request.price =NormalizeDouble(price,digits); // normalized opening price } else Alert("This example is only for placing pending orders"); // if not pending order is selected //--- send the request if(!OrderSend(request,result)) PrintFormat("OrderSend error %d",GetLastError()); // if unable to send the request, output the error code //--- information about the operation PrintFormat("retcode=%u deal=%I64u order=%I64u",result.retcode,result.deal,result.order); } //+------------------------------------------------------------------+
Boa tarde @LucasHeise,
Acredito que o problema que você está enfrentando é por causa do tipo de execução da ordem, ou seja, ordem Return.
Veja detalhes em https://www.mql5.com/en/docs/constants/tradingconstants/orderproperties#enum_order_type_filling
Alguns comentários sobre o tipo de execução:
- FOK, Fill or Kill (tudo ou nada): executa o volume total da ordem ou não executa nada. Sempre sabemos o que esperar da execução;
- IOC, Immediate or Cancel (tudo ou parcial): executa o volume disponível no book e cancela o resto, ou seja, a ordem pode não ser executada completamente, na verdade nunca sabemos o quanto vai ser executado. Este tipo de execução deve sempre ser verificado após o envio da ordem;
- Return (Retorna): executa o volume disponível no book e aguarda até executar o volume restante ou até o prazo de expiração da ordem, ou seja, a ordem pode ser executada em várias partes, pode demorar para ser completada e pode ainda nunca ser executada completamente. Este preenchimento também deve ser verificado após a execução.
Espero ter ajudado
- www.mql5.com
- 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
Bom dia, eu já tenho um EA que opero faz 1 ano, mas agora estou aprimorando ele e gostaria de saber qual o jeito "correto" de abrir um ordem de tipo Pending (TRADE_ACTION_PENDING), Limit e Filling Return.
Eu uso o MqlTradeRequest e MqlTradeResult mas ainda ocorrem alguns erros em relação a erros que ocorrem na hora da ordem, como por exemplo o volume diminui na hora da minha ordem (eu checo o volume antes), ou algum erro de conexão, ou o preço muda, etc...
Se alguém pudesse me falar qual a melhor maneira pra abrir ordens eu agradeceria muito.
Obrigado