Скачать MetaTrader 5

Ошибка открытия ордера.

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Следи за новостями. Заходи на официальный канал нашей компании!
Robas1000
89
Robas1000 2015.11.08 14:19 

Здравствуйте.

При запуске советника (MQL5) на тестирование появляется следующая ошибка: 

 

 failed instant buy 0.10 USDRUR at 63.87550 sl: 63.67550 tp: 63.89550 [Invalid request]
Ошибка открытия ордера = 4756
Код результата операции - 10013

 

Почему возникает такая ошибка ?

 

И почему в таком коде:

 

//+------------------------------------------------------------------+
//|                                          20_200_pips_MQL5_v1.mq5 |
//|                                    Copyright 2010, Павел Смирнов |
//|                                                                  |
//+------------------------------------------------------------------+

#property copyright "Copyright 2010, Смирнов Павел"
#property link      "http://www.autoforex.ru"
#property version   "1.00"

//Объявляем внешние переменные. Они будут доступны извне и их значения можно будет менять перед запуском тестера

input int      TakeProfit=50000;
input int      StopLoss=5000;
input int      TradeTime=18;
input int      t1=7;
input int      t2=2;
input int      delta=70;
input double   lot=0.1;

bool cantrade=true;// флаг для разрешения или запрета торговли.
double Ask; // здесь будем хранить цену Ask для нового тика (так удобней)
double Bid; // здесь будем хранить цену Bid для нового тика (так удобней)

//Функция открытия длинной (Long) позиции. Указываем также значения переменных по умолчанию
int OpenLong(double volume=0.1,int slippage=10,string comment="EUR/USD 20 pips expert (Long)",int magic=0)
  {
   MqlTradeRequest my_trade;//объявляем структуру типа MqlTradeRequest для формирования запроса
   MqlTradeResult my_trade_result;//в этой структуре будет ответ сервера на запрос.

   //далее заполняеем все НЕОБХОДИМЫЕ поля структуры запроса.
   my_trade.action=TRADE_ACTION_DEAL;//Установить торговый ордер на немедленное совершение сделки с указанными 
                                     //параметрами (поставить рыночный ордер)
   my_trade.symbol=Symbol();//указываем в качестве валютной пары - текущую валютную пару 
                            //(ту, на которой запущен советник)
   my_trade.volume=NormalizeDouble(volume,1);//размер лота
   my_trade.price=NormalizeDouble(Ask,_Digits);//Цена, при достижении которой ордер должен быть исполнен. 
   //В нашем случае для TRADE_ACTION_DEAL это текущая цена и ее, согласно инструкции указывать не обязательно.
   my_trade.sl=NormalizeDouble(Ask-StopLoss*_Point,_Digits);//стоплосс ордера (цена при которой следует закрыть 
                                                            //убыточную сделку)
   my_trade.tp=NormalizeDouble(Ask+TakeProfit*_Point,_Digits);//тейкпрофит (цена при которой следует закрыть
                                                              // прибыльную сделку)
   my_trade.deviation=slippage;//проскальзывание в пунктах (при тестировании особой роли не играет, т.к. 
                               //проскальзывания не бывает на тестах)
   my_trade.type=ORDER_TYPE_BUY;//тип рыночного ордера (покупаем)
   my_trade.type_filling=ORDER_FILLING_AON;//Указываем как исполнять ордер. (All Or Nothing - все или ничего) 
   //Сделка может быть совершена исключительно в указанном объеме и по цене равной или лучше указанной в ордере.
   my_trade.comment=comment;//комментарий ордера
   my_trade.magic=magic;//магическое число ордера

   ResetLastError();//обнуляем код последней ошибки 
   if(OrderSend(my_trade,my_trade_result))//отправляем запрос на открытие позиции. При этом проверяем 
                                          //успешно ли прошла отправка запроса
     {
      // Если сервер принял ордер то смортрим на результат 
      Print("Код результата операции - ",my_trade_result.retcode);
     }
   else
     {
      //Сервер не принял ордер в нем есть ошибки, выводим их в журнал
      Print("Код результата операции - ",my_trade_result.retcode);
      Print("Ошибка открытия ордера = ",GetLastError());
     }
return(0);// Выходим из функции открытия ордера     
}

//функция открытия короткой (Short) позиции. Аналогична функции открытия длинной позиции.
int OpenShort(double volume=0.1,int slippage=10,string comment="EUR/USD 20 pips expert (Short)",int magic=0)
  {
   MqlTradeRequest my_trade;
   MqlTradeResult my_trade_result;
   my_trade.action=TRADE_ACTION_DEAL;
   my_trade.symbol=Symbol();
   my_trade.volume=NormalizeDouble(volume,1);
   my_trade.price=NormalizeDouble(Bid,_Digits);
   my_trade.sl=NormalizeDouble(Bid+StopLoss*_Point,_Digits);
   my_trade.tp=NormalizeDouble(Bid-TakeProfit*_Point,_Digits);
   my_trade.deviation=slippage;
   my_trade.type=ORDER_TYPE_SELL;
   my_trade.type_filling=ORDER_FILLING_AON;
   my_trade.comment=comment;
   my_trade.magic=magic;

   ResetLastError();
   if(OrderSend(my_trade,my_trade_result))
     {
      Print("Код результата операции - ",my_trade_result.retcode);
     }
   else
     {
      Print("Код результата операции - ",my_trade_result.retcode);
      Print("Ошибка открытия ордера = ",GetLastError());
      }
return(0);
}

int OnInit()
  {
   return(0);
  }


void OnDeinit(const int reason){}

void OnTick()
   {
   double Open[];//массив где будут храниться цены открытия баров (включая Open[t1] и Open[t2])
   MqlDateTime mqldt;//в этой структуре храним текущее время.
   TimeCurrent(mqldt);//обновляем данные о текущем времени.
   int len;//переменная определяющая длинну массива Open[].

   MqlTick last_tick;//Здесь будут храниться цены последнего пришедшего тика
   SymbolInfoTick(_Symbol,last_tick);//заполняем структуру last_tick последними ценами текущего символа.
   Ask=last_tick.ask;//Обновляем переменные Ask и Bid для дальнейшего использования
   Bid=last_tick.bid;

   ArraySetAsSeries(Open,true);//для удобства работы определяем массив Open[] как таймсерию.

   //далее определим длину массива такую, чтобы обязательно вошли значения Open[t1] и Open[t2]
   if (t1>=t2)len=t1+1;//t1 и t2 - номера баров на которых сравниваются цены. Берем большее из них
   else len=t2+1;      //и добавляем 1 (т.к. есть еще и нулевой бар)

   CopyOpen(_Symbol,PERIOD_H1,0,len,Open);//заполняем массив Open[] актуальными значениями

   //Переключаем флаг cantarde на true, т.е. разрешим советнику снова открывать позиции
   if(((mqldt.hour)>TradeTime)) cantrade=true;

   // проверяем возможность встать в позицию:
   if(!PositionSelect(_Symbol))// Если еще нет открытой позиции
   {
      if((mqldt.hour==TradeTime) && (cantrade))//Если пришло время торговать
        {
         if(Open[t1]>(Open[t2]+delta*_Point))//Проверяем условие для открытия короткой сделки (продажи)
           {
               OpenShort(lot,10,"EUR/USD 20 pips expert (Short)",1234);//открываем позицию Short 
               cantrade=false;// Переключаем флаг (запрещаем торговать), чтобы не откывал больше позиций
               //до следующего дня
               return;//выходим
           }
         if((Open[t1]+delta*_Point)<Open[t2])//Проверяем условие для открытия длинной сделки (покупки)
           {
               OpenLong(lot,10,"EUR/USD 20 pips expert (Long)",1234);//открываем позицию Long
               cantrade=false;// Переключаем флаг (запрещаем торговать), чтобы не откывал больше позиций
               //до следующего дня
               return;//выходим
           }
        }
   }
   return;
  }
//+-------------------------------------------------------------

Стоп лосс при задании SL 50000 всего 2 копейки получается ? (см ошибку). 

Как можно сделать что-бы было 4 знака после запятой, а не 5 ? Откуда берется дополнительный разряд фз, все перепроверил уже.

Всем спасибо.  

Yury Kirillov
3276
Yury Kirillov 2015.11.08 19:16  
Брокер (ДЦ) какой?
Robas1000
89
Robas1000 2015.11.09 09:08  

Брокер (ДЦ) какой?

 

Альфа форекс 

Maxim Dmitrievsky
13914
Maxim Dmitrievsky 2015.11.09 09:17  

Цитирую 

"Потому что с тех пор как был написан советник произошли изменения в языке. поставьте в этой строке вместо _filling=ORDER_FILLING_AON; _filling=ORDER_FILLING_FOK; и будет вам счастье. Хотя можете просто 0 поставить _filling=0; тоже покатит."

https://www.mql5.com/ru/forum/1111/page825#comment_294145

Попробуйте, может в этом причина.

Robas1000
89
Robas1000 2015.11.09 12:17  

Hallo Maxim. 

AON на FOK я исправил.

Со стоплоссом и тейкпрофитом ситуация улучшилась, по выдается такая ошибка:

2015.11.09 14:13:02.095 2015.11.05 18:00:00   failed instant sell 0.10 USDRUR at 63.10300 sl: 63.60300 tp: 58.10300 [Invalid request]
Думаю что это из-за того что используется структура MqlTick last_tick; которая неправильно работает на исторических данных. 
Maxim Dmitrievsky
13914
Maxim Dmitrievsky 2015.11.09 12:36  
Robas1000:

Hallo Maxim. 

AON на FOK я исправил.

Со стоплоссом и тейкпрофитом ситуация улучшилась, по выдается такая ошибка:

Думаю что это из-за того что используется структура MqlTick last_tick; которая неправильно работает на исторических данных. 
Да, могут быть с ней проблемы, лучше просто текущие цены через маркет инфо получать, пока полноценно не реализована возможность тестирования на тиковых данных. Еще может быть спред в тестере большой, а стопы короткие.. там иногда до 2-х рублей скачет, нужно проверять в тестере.
Robas1000
89
Robas1000 2015.11.09 14:49  

Да, LastTick imho лучше не использовать. Цены открытия и закрытия более или менее нормально работают.

Пытаюсь сделать код для изменения стоплосса и тейкпрофита у открытого ордера, не подскажет кто-нибудь сслыки на примеры ?

Не могу пока разобратся где указывать TRADE_ACTION_SLTP что-бы было изменение, т.е. к какой функции этот параметр и каким кодом его выполнить...

Alexey Kozitsyn
6438
Alexey Kozitsyn 2015.11.10 12:20  
Robas1000:

Да, LastTick imho лучше не использовать. Цены открытия и закрытия более или менее нормально работают.

Пытаюсь сделать код для изменения стоплосса и тейкпрофита у открытого ордера, не подскажет кто-нибудь сслыки на примеры ?

Не могу пока разобратся где указывать TRADE_ACTION_SLTP что-бы было изменение, т.е. к какой функции этот параметр и каким кодом его выполнить...

Читайте примеры в документации. Структуры запроса и результата должны быть обнулены перед использованием!

Исправьте с:

MqlTradeRequest my_trade;
MqlTradeResult my_trade_result;

на:

MqlTradeRequest my_trade = {0};
MqlTradeResult my_trade_result = {0};
Alexey Kozitsyn
6438
Alexey Kozitsyn 2015.11.10 12:27  
Robas1000:

Да, LastTick imho лучше не использовать. Цены открытия и закрытия более или менее нормально работают.

Пытаюсь сделать код для изменения стоплосса и тейкпрофита у открытого ордера, не подскажет кто-нибудь сслыки на примеры ?

Не могу пока разобратся где указывать TRADE_ACTION_SLTP что-бы было изменение, т.е. к какой функции этот параметр и каким кодом его выполнить...

Документация по MQL5: Торговые функции / OrderSend
Документация по MQL5: Торговые функции / OrderSend
  • www.mql5.com
Торговые функции / OrderSend - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
Vasyl Nosal
18557
Vasyl Nosal 2015.11.11 09:53  

Не хочу флудить, но это то про что я говорил.

mql5 не торговый язык.

Mikhail Filimonov
5931
Mikhail Filimonov 2015.11.11 15:02  
Vasyl Nosal:

Не хочу флудить, но это то про что я говорил.

mql5 не торговый язык.

А какой торговый?
12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий