Мы, конечно, проверим ваш случай.
Но вообще функция OrderSend работает в соответствии со справкой.
Возвращаемое значение
В случае успешной базовой проверки структур (проверка указателей) возвращается true - это не свидетельствует об успешном выполнении торговой операции. Для получения более подробного описания результата выполнения функции следует анализировать поля структуры result.
- www.mql5.com
Мы, конечно, проверим ваш случай.
Но вообще функция OrderSend работает в соответствии со справкой.
Да нет, я не жалуюсь, просто понять хочу. Может в другом месте напортачил... Поля структуры result также анализуруются там, где посчитал нужным [как и учили :)].
Но, как я понимаю, по крайней мере, предполагается, что переход к следующему оператору должен происходить только после полной обработки терминалом функции OrderSend() [включая получение и обработку полей структуры result]?
(Извиняюсь, в предыдущем вопросе допустил опечатку: вместо result указал request)
Первые сутки чемпионата показали, что мой эксперт работает не так, как задумано, а именно: вместо одного отложенного ордера выставляет несколько однонаправленных отложенных ордеров. При этом используется примерно такая конструкция:
Вопрос: дожидается ли терминал окончания обработки функции OrderSend() из первого блока [т.е. дожидается ли получения request], или после отправки торгового запроса на сервер сразу же переходит к следующему оператору (блоку)?Подтверждаю проблему. После установки OrderSend() отложенного ордера OrdersTotal не всегда его видит.
Я установил паузу после OrderSend(). Но сегодня роботу на чемпионате она не помогла :)
Коллекция ссылок на обсуждение в другой ветке:
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 (про асинхронность)
https://www.mql5.com/ru/forum/2236/page14/#comment_27552
- www.mql5.com
Добрый день, All.
Пытаюсь сделать программку, которая бы просто открывала ордер по рынку. т.е. отправляю туда Символ, Объем и Тип ордера, в цикле до тех пор пока Позиция с нужным мне направлением не появится.
Журнал выдает
2012.01.09 16:08:42 Trades '9066293' : failed instant buy 1.00 EURUSD at 0.0000 (deviation: 103117312) [Invalid stops]
Так если я по рынку открываюсь, зачем мне цену открытия указывать? И стопы мне не нужны.
По F9 все замечательно открывается.
Подскажите, где я косячу или какой-нибудь код для открытия ордера.
Вот таким минимумом наполняю структуру:
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 = "";Весь тест эксперта на открытие позиции в файле.
Добрый день, All.
Пытаюсь сделать программку, которая бы просто открывала ордер по рынку. т.е. отправляю туда Символ, Объем и Тип ордера, в цикле до тех пор пока Позиция с нужным мне направлением не появится.
И что-то выдает = Invalid Stops, а мне никакие стопы для рыночного ордера не требуются. Уж и не знаю где косячу...
Весь тест эксперта на открытие позиции в файле.
держите должно все работать
//+------------------------------------------------------------------+ //| 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; } //+------------------------------------------------------------------+
держите должно все работать
Спасибо. Работает. И настолько быстро, что не успевает обновится информация о Позиции.
В результате выставляется 2 ордера.
Лечится с помощью паузы в 1 миллисекунду !
if(zOrderSend(_Symbol,0.1,ORDER_TYPE_BUY)==10009) // 10009 TRADE_RETCODE_DONE Заявка выполнена { Sleep (1); Alert("Купили!"); } else Alert("Не купили...."); }
... не успевает обновится информация о Позиции.
В результате выставляется 2 ордера.
Лечится с помощью паузы в 1 миллисекунду !
Учтите только, что пауза - не панацея:
Учтите только, что пауза - не панацея:
Функция проверки выставления ордера от KimV не поможет?
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Первые сутки чемпионата показали, что мой эксперт работает не так, как задумано, а именно: вместо одного отложенного ордера выставляет несколько однонаправленных отложенных ордеров. При этом используется примерно такая конструкция:
Вопрос: дожидается ли терминал окончания обработки функции OrderSend() из первого блока [т.е. дожидается ли получения request], или после отправки торгового запроса на сервер сразу же переходит к следующему оператору (блоку)?