Iremos, claro, verificar o seu caso.
Mas, em geral, a função OrderSend funciona de acordo com a ajuda.
Возвращаемое значение
Em caso deverificação básica de estruturas bem sucedida (verificação pontual), a mesma retorna verdadeira - não indica a execução bem sucedida da operação comercial. Para obter uma descrição mais detalhada do resultado da função, devemos analisar os campos da estrutura de resultados.

- www.mql5.com
Iremos, claro, verificar o seu caso.
Mas em geral, a função OrderSend funciona de acordo com a ajuda.
Não, não estou a queixar-me, só quero compreender. Talvez tenha feito asneira noutro sítio qualquer... Também analisei campos de estrutura de resultados onde achava que deveriam estar [como me foi ensinado :)] .
Mas, tanto quanto sei, pelo menos é suposto que a passagem para o próximo operador só deve ser feita após o terminal tratar completamente a função OrderSend() [incluindo os campos de obtenção e tratamento da estrutura de resultados]?
(Desculpe, na pergunta anterior fiz uma gralha: especifiquei o pedido em vez do resultado)
O primeiro dia do Campeonato mostrou que o meu Conselheiro Especialista não funciona como pretendido, nomeadamente, em vez de uma única ordem pendente, coloca várias ordens pendentes unidireccionais. Esta é aproximadamente a mesma estrutura:
Pergunta: O terminal aguarda a função OrderSend() do primeiro bloco para terminar o processamento [ou seja, espera que o pedido seja recebido], ou muda imediatamente para o operador seguinte (bloco) depois de enviar um pedido comercial para o servidor?Confirmo o problema. Após definir a OrderSend() de uma ordem pendente, a OrderTotal nem sempre a vê.
Estabeleço uma pausa após a OrderSend(). Mas isso não ajudou o robô no campeonato de hoje :)
Uma colecção de links para uma discussão num outro fio:
https://www.mql5.com/ru/forum/2236/page13/#comment_27472
https://www.mql5.com/ru/forum/2236/page13/#comment_27486
https://www.mql5.com/ru/forum/2236/page13/#comment_27503
https://www.mql5.com/ru/forum/2236/page14/#comment_27531(sobre assíncronia)
https://www.mql5.com/ru/forum/2236/page14/#comment_27552

- www.mql5.com
Boa tarde a todos.
Estou a tentar fazer um programa que apenas abra uma ordem de acordo com o mercado. ou seja, envio um Símbolo, Volume e Tipo de Ordem para lá, em loop, até aparecer uma Posição com a direcção que eu quero.
O registo dá
2012.01.09 16:08:42 Comércios '9066293' : compra instantânea falhada 1,00 EURUSD a 0,0000 (desvio: 103117312) [Paragens inválidas].
Então se eu abro no mercado, porque é que preciso de especificar o preço de abertura? Não preciso de paragens.
Eu abriria por F9.
Por favor, informe-me onde fiz asneira ou escreva algum código para abrir uma encomenda.
Estou a encher a estrutura com um tal mínimo:
uint zOrderSend (string zSymbol, double zVolume, string zORDER_TYPE) { zSymbol = "EURUSD"; zVolume = 1; zORDER_TYPE ="Buy"; Alert ("*****************", zSymbol," ", zVolume," ", zORDER_TYPE); //--- готовим запрос MqlTradeRequest request; request.action=TRADE_ACTION_DEAL; // request.magic=0; request.symbol=zSymbol; // request.volume=zVolume; request.volume=zVolume; // request.price=0; // request.sl=0; // request.tp=0; // request.deviation=SymbolInfoInteger("EURUSD",SYMBOL_SPREAD); // slippage // request.deviation=50; //--- сформируем тип ордера if (zORDER_TYPE == "Buy" ) {request.type = ORDER_TYPE_BUY ;} // тип ордера = 0 if (zORDER_TYPE == "Sell") {request.type = ORDER_TYPE_SELL;} // тип ордера = 1 Alert ("Тип ордера: request.type = ",request.type); request.type_filling = ORDER_FILLING_FOK; request.type_time = ORDER_TIME_GTC; // request.comment = "";Todo o teste do Expert Advisor para a abertura de uma posição está no ficheiro.
Boa tarde a todos.
Estou a tentar fazer um programa que apenas abra uma ordem de mercado, ou seja, envio para lá um Símbolo, Volume e Tipo de Ordem, num laço até aparecer uma Posição com a direcção que eu quero.
E algo me dá = Paragens Inválidas, enquanto eu não preciso de nenhuma Paragem para uma ordem de mercado. Não sei onde é que estou a ir mal...
O teste completo do Conselheiro Especialista para abrir uma posição está no ficheiro.
Aqui está, deve funcionar.
//+------------------------------------------------------------------+ //| Deal.mq5 | //| Copyright 2012, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2012, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- create timer EventSetTimer(1); //--- return(0); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- destroy timer EventKillTimer(); } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- if(zOrderSend(_Symbol,0.1,ORDER_TYPE_BUY)==10009) // 10009 TRADE_RETCODE_DONE Заявка выполнена { Alert("Купили!"); } else Alert("Не купили...."); } //+------------------------------------------------------------------+ //| Timer function | //+------------------------------------------------------------------+ void OnTimer() { //--- } //+------------------------------------------------------------------+ uint zOrderSend(string zSymbol,double zVolume,ENUM_ORDER_TYPE zORDER_TYPE) { MqlTradeRequest request; MqlTradeCheckResult ch_result; MqlTradeResult result; // обнулим структуру запроса перед заполнением ZeroMemory(request); Alert("*****************",zSymbol," ",zVolume," ",zORDER_TYPE); // заполняем структуру request.action=TRADE_ACTION_DEAL; request.type_filling=ORDER_FILLING_AON; request.symbol=zSymbol; request.type=zORDER_TYPE; request.deviation=30; request.sl=0.0; request.tp=0.0; request.volume=zVolume; if(zORDER_TYPE==ORDER_TYPE_BUY)request.price=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits); if(zORDER_TYPE==ORDER_TYPE_SELL)request.price=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits); // выводим на печать заполненную структуру торгового запроса Alert(" ENUM_TRADE_REQUEST_ACTIONS request.action; // Тип выполняемого действия =",request.action,"="); Alert(" ulong request.magic; // Штамп эксперта (идентификатор magic number) =", request.magic, "=" ); Alert(" ulong request.order; // Тикет ордера =", request.order, "=" ); Alert(" string request.symbol; // Имя торгового инструмента =", request.symbol, "=" ); Alert(" double request.volume; // Запрашиваемый объем сделки в лотах =", request.volume, "=" ); Alert(" double request.price; // Цена =", request.price, "=" ); Alert(" double request.stoplimit; // Уровень StopLimit ордера =", request.stoplimit, "=" ); Alert(" double request.sl; // Уровень Stop Loss ордера =", request.sl, "=" ); Alert(" double request.tp; // Уровень Take Profit ордера =", request.tp, "=" ); Alert(" ulong request.deviation; // Максимально приемлемое отклонение от запрашиваемой цены =", request.deviation, "=" ); Alert(" ENUM_ORDER_TYPE request.type; // Тип ордера =", request.type, "=" ); Alert(" ENUM_ORDER_TYPE_FILLING request.type_filling; // Тип ордера по исполнению =", request.type_filling, "=" ); Alert(" ENUM_ORDER_TYPE_TIME request.type_time; // Тип ордера по времени действия =", request.type_time, "=" ); Alert(" datetime request.expiration; // Срок истечения ордера (для ордеров типа ORDER_TIME_SPECIFIED) =", request.expiration, "=" ); Alert(" string request.comment; // Комментарий к ордеру =", request.comment, "=" ); // отправляем структуру запроса на проверку if(OrderCheck(request,ch_result)==false) { Alert("OrderCheck выявил ошибку: "+IntegerToString(ch_result.retcode)+"/"+ch_result.comment); return ch_result.retcode; } // отправляем запрос на торговый сервер if(OrderSend(request,result)==false) { Alert("OrderSend возвратил ошибку: "+IntegerToString(result.retcode)+"/"+result.comment); return result.retcode; } // выводим на печать структуру ответа сервера Alert("Код результата операции сервера: " + IntegerToString(result.retcode)); Alert("deal Тикет сделки " + IntegerToString(result.deal)); Alert("order Тикет ордера " + IntegerToString(result.order)); Alert("volume Объем сделки " + DoubleToString (result.volume)); Alert("price Цена в сделке " + DoubleToString (result.price)); Alert("bid(цены реквоты) " + DoubleToString (result.bid)); Alert("ask(цены реквоты) " + DoubleToString (result.ask)); Alert("Комментарий: "+result.comment); return result.retcode; } //+------------------------------------------------------------------+
Aí está, deve funcionar.
Obrigado. Está a funcionar. E tão depressa que não tem tempo para actualizar a informação da Posição.
Como resultado, são feitas 2 encomendas.
Pode ser fixado com uma pausa de 1 milissegundo !
if(zOrderSend(_Symbol,0.1,ORDER_TYPE_BUY)==10009) // 10009 TRADE_RETCODE_DONE Заявка выполнена { Sleep (1); Alert("Купили!"); } else Alert("Не купили...."); }
... não tem tempo para actualizar a informação da posição.
Como resultado, são feitas 2 encomendas.
Isto pode ser resolvido com uma pausa de 1 milissegundo !
Tenha em mente que a pausa não é uma panaceia:
Tenha em mente que a pausa não é uma panaceia:
A função de verificação de encomendas da KimV não ajuda?

- 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
O primeiro dia do Campeonato mostrou que o meu Conselheiro Especialista não funciona como pretendido, nomeadamente, em vez de uma única ordem pendente, coloca várias ordens pendentes unidireccionais. Esta é aproximadamente a seguinte estrutura:
Pergunta: O terminal aguarda a função OrderSend() do primeiro bloco para terminar o processamento [ou seja, espera que o pedido seja recebido], ou passa imediatamente ao operador seguinte (bloco) depois de enviar um pedido comercial ao servidor?