Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Узнай, как пользоваться виджетами на MQL5.community
Олег
84
Олег 2012.02.29 08:29 
У ДЦ 5 знаков после запятой. Как перенастроить эксперта, чтобы корректно работал?
Левитин Сергей В.
5155
Левитин Сергей В. 2012.02.29 09:21  
aleks-tomsk:
У ДЦ 5 знаков после запятой. Как перенастроить эксперта, чтобы корректно работал?

Правильно написаный эксперт не нуждается в перенастройке. А с неправильными все идивидуально, от просто умножить стоплосс и тейкпрофит на 10, до "перетряски" всего кода.
Alexey Volchanskiy
14124
Alexey Volchanskiy 2012.02.29 09:23  

Исходный код эксперта есть, надеюсь? Вот код с кучей проверок и учетом 4-х и 5-знаков. Выглядит монструозно :)), но я предпочитаю перестраховаться. Не сделана только проверка на разрешение ДЦ выставлять стопы и тейки при открытии ордера, надо доделать

// открывает ордер с проверкой, нормализацией данных и возвратом измененных данных
int OpenOrderWithCheck(string symbol, int cmd, double& volume, double& price, int slippage, double &stoploss, double &takeprofit,
                          string comment, int magic, datetime expiration, color arrow_color)
{
   int dig = MarketInfo(symbol, MODE_DIGITS);
   
   double minlot = MarketInfo(symbol, MODE_MINLOT);   // Минимальный размер лота
   double lotstep = MarketInfo(symbol, MODE_LOTSTEP); // Шаг изменения размера лота 
   double maxlot = MarketInfo(symbol, MODE_MAXLOT);   //Максимальный размер лота 
   
   int lot = volume/lotstep; // округлили до целого числа шагов изменения лота
   volume = lot * lotstep;
   
   if(volume < minlot)
   {
      volume = minlot;
      Alert("OpenOrder()", "Объем меньше минимального, задаю минимальное значение = ", volume, " лот(а)");
   }
   if(volume > maxlot)
   {
      volume = maxlot;
      Alert("OpenOrder()", "Объем больше максимального, задаю максимальное значение = ", volume, " лот(а)");
   }
   
   // При открытии рыночного ордера (OP_SELL или OP_BUY) в качестве цены открытия могут использоваться 
   // только самые последние цены Bid (для продажи) или Ask (для покупки). 
   if(cmd == OP_BUY )
      price = MarketInfo(symbol, MODE_ASK);
   if(cmd == OP_SELL)
      price = MarketInfo(symbol, MODE_BID);
   
   takeprofit = NormalizeDouble(takeprofit, dig); // надо округлять до 4 или 5 знаков после запятой
   stoploss = NormalizeDouble(stoploss, dig);
   price = NormalizeDouble(price, dig);
   
   int ticket = OrderSend(symbol, cmd, volume, price, slippage, stoploss, takeprofit, comment, magic, expiration, arrow_color);

   if(ticket < 0)
   {
      string err = GetMyLastError2();
      Print("Ошибка открытия ордера, ", err);
   }
   else
   {
      bool os = OrderSelect(ticket, SELECT_BY_TICKET);
      if(os == true)
         price = OrderOpenPrice();
   }   
   return (ticket);
}
Олег
84
Олег 2012.02.29 14:33  
VDev:

Исходный код эксперта есть, надеюсь? Вот код с кучей проверок и учетом 4-х и 5-знаков. Выглядит монструозно :)), но я предпочитаю перестраховаться. Не сделана только проверка на разрешение ДЦ выставлять стопы и тейки при открытии ордера, надо доделать


Спасибо!!! Буду разбираться.
/
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий