Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 1237

Здравствуйте. Решил попробовать освоить и язык mql5 и платформу мт5. Вопрос по тестеру. По котировкам. Поставил пару audcad, на платформе от Велтрейд. У меня в советнике есть небольшое информационное табло. В режиме визуализации вижу, что спреды не соответствуют действительности (очень маленькие, похожие на спреды eurusd). Обратился в техподдержку компании (Велтрейд) - разные ли спреды для мт4 и мт5. Ответили, что одинаковые. Тогда как понимать такое не соответствие в тестере?  Далее. Попробовал оптимизировать по генетическому коду. Загрузка процессора 100% и после нескольких минут работы копм вырубается (процессор phenom II x4 955 (4 ядра, 3.2 ГГц), кулер стоит с запасом). После двух раз, решил больше не рисковать. Как такое понимать? Потом, при тестировании без визуализации вообще ни какой информации по сделкам, только график. Это так и есть, или я делаю что-то не так. Да в режиме визуализации с информативностью туговато. Собственно меня больше всего беспокоит не соответствие спредов. Короче, первое впечатление - полное разочарование. Но сбрасываю на то, что еще не разобрался.
Youri Lazurenko:
Здравствуйте. Решил попробовать освоить и язык mql5 и платформу мт5. Вопрос по тестеру. По котировкам. Поставил пару audcad, на платформе от Велтрейд. У меня в советнике есть небольшое информационное табло. В режиме визуализации вижу, что спреды не соответствуют действительности (очень маленькие, похожие на спреды eurusd). Обратился в техподдержку компании (Велтрейд) - разные ли спреды для мт4 и мт5. Ответили, что одинаковые. Тогда как понимать такое не соответствие в тестере?  Далее. Попробовал оптимизировать по генетическому коду. Загрузка процессора 100% и после нескольких минут работы копм вырубается (процессор phenom II x4 955 (4 ядра, 3.2 ГГц), кулер стоит с запасом). После двух раз, решил больше не рисковать. Как такое понимать? Потом, при тестировании без визуализации вообще ни какой информации по сделкам, только график. Это так и есть, или я делаю что-то не так. Да в режиме визуализации с информативностью туговато. Собственно меня больше всего беспокоит не соответствие спредов. Короче, первое впечатление - полное разочарование. Но сбрасываю на то, что еще не разобрался.

Поставьте тестирование на основе реальных тиков. Тогда у вас пропадут все сомнения в действительности спреда.


Alexey Viktorov:

Поставьте тестирование на основе реальных тиков. Тогда у вас пропадут все сомнения в действительности спреда.


Спасибо, сейчас попробую. А что посоветуете на счет оптимизации. Меня больше интересует скорость. Качество можно подкорректировать потом, при тестировании.

P.S. Сделал как вы советовали, спреды те же. Перед этим специально проверил тип счета. По спецификации спред на  audcad 4.1 (плавающий). На этом же счете (демо график) 4.7 (плавающий). В тестере же, мт5, максимум 2.8 (плавающий в еще меньшую сторону).  

Youri Lazurenko:

Спасибо, сейчас попробую. А что посоветуете на счет оптимизации. Меня больше интересует скорость. Качество можно подкорректировать потом, при тестировании.

Ничего не могу посоветовать. Я не пользуюсь оптимизацией. Считаю это шарлатанством.

Alexey Viktorov:

Ничего не могу посоветовать. Я не пользуюсь оптимизацией. Считаю это шарлатанством.

Не согласен. Оптимизация, на мой взгляд, подбор наиболее подходящих, для данной пары и стратегии, параметров. 

P.S. Теперь пошли вроде бы нормальные спреды. 

Youri Lazurenko:

Не согласен.

Я вас не агитировал. Просто высказал личное мнение.)))

Alexey Viktorov:

Я вас не агитировал. Просто высказал личное мнение.)))

Быть может мое мнение ошибочно. Я тоже не агитирую. 

Здравствуйте. Нужна помощь. Нужно ограничить жизнь отложенного ордера, лучше в количествах баров. В mql4 пользовался функцией:

datetime DateExp()                                 
{
   datetime expDate = 0;
   
   if(Period() == PERIOD_M1)
      expDate = TimeCurrent() + ExpDate*60;
      
   if(Period() == PERIOD_M5)
      expDate = TimeCurrent() + ExpDate*5*60;
    
   if(Period() == PERIOD_M15)
      expDate = TimeCurrent() + ExpDate*15*60;
    
   if(Period() == PERIOD_M30)
      expDate = TimeCurrent() + ExpDate*30*60;
    
   if(Period() == PERIOD_H1)
      expDate = TimeCurrent() + ExpDate*60*60;
    
   if(Period() == PERIOD_H4)
      expDate = TimeCurrent() + ExpDate*4*60*60;
   
   if(Period() == PERIOD_D1)
      expDate = TimeCurrent() + ExpDate*24*60*60;      
    
   if(Period() == PERIOD_W1) 
      expDate = TimeCurrent() + ExpDate*7*24*60*60; 
   
   if(Period() == PERIOD_MN1)
      expDate = TimeCurrent() + ExpDate*30*24*60*60;
          
   return(expDate);  
}

 где 

extern int    ExpDate            = 6;                 //количество баров жизни ордера

Все работало.

Попробовал подобное в mql5:

datetime DateExp()                                 
{
   datetime expDate = 0;
   
   if(Period() == PERIOD_M1)
      expDate = TimeCurrent() + PeriodSeconds(PERIOD_M1)*ExpDate;
      
   if(Period() == PERIOD_M2)
      expDate = TimeCurrent() + PeriodSeconds(PERIOD_M2)*ExpDate;
   
   if(Period() == PERIOD_M3)
      expDate = TimeCurrent() + PeriodSeconds(PERIOD_M3)*ExpDate;
   
   if(Period() == PERIOD_M4)
      expDate = TimeCurrent() + PeriodSeconds(PERIOD_M4)*ExpDate;
      
   if(Period() == PERIOD_M5)
      expDate = TimeCurrent() + PeriodSeconds(PERIOD_M5)*ExpDate;
   
   if(Period() == PERIOD_M6)
      expDate = TimeCurrent() + PeriodSeconds(PERIOD_M6)*ExpDate;
   
   if(Period() == PERIOD_M10)
      expDate = TimeCurrent() + PeriodSeconds(PERIOD_M10)*ExpDate;
   
   if(Period() == PERIOD_M12)
      expDate = TimeCurrent() + PeriodSeconds(PERIOD_M12)*ExpDate;
    
   if(Period() == PERIOD_M15)
      expDate = TimeCurrent() + PeriodSeconds(PERIOD_M15)*ExpDate;
   
   if(Period() == PERIOD_M20)
      expDate = TimeCurrent() + PeriodSeconds(PERIOD_M20)*ExpDate;
    
   if(Period() == PERIOD_M30)
      expDate = TimeCurrent() + PeriodSeconds(PERIOD_M30)*ExpDate;
    
   if(Period() == PERIOD_H1)
      expDate = TimeCurrent() + PeriodSeconds(PERIOD_H1)*ExpDate;
   
   if(Period() == PERIOD_H2)
      expDate = TimeCurrent() + PeriodSeconds(PERIOD_H2)*ExpDate;
   
   if(Period() == PERIOD_H3)
      expDate = TimeCurrent() + PeriodSeconds(PERIOD_H3)*ExpDate;
    
   if(Period() == PERIOD_H4)
      expDate = TimeCurrent() + PeriodSeconds(PERIOD_H4)*ExpDate;
   
   if(Period() == PERIOD_H6)
      expDate = TimeCurrent() + PeriodSeconds(PERIOD_H6)*ExpDate;
   
   if(Period() == PERIOD_H8)
      expDate = TimeCurrent() + PeriodSeconds(PERIOD_H8)*ExpDate;
   
   if(Period() == PERIOD_H12)
      expDate = TimeCurrent() + PeriodSeconds(PERIOD_H12)*ExpDate;
   
   if(Period() == PERIOD_D1)
      expDate = TimeCurrent() + PeriodSeconds(PERIOD_D1)*ExpDate;      
    
   if(Period() == PERIOD_W1) 
      expDate = TimeCurrent() + PeriodSeconds(PERIOD_W1)*ExpDate; 
   
   if(Period() == PERIOD_MN1)
      expDate = TimeCurrent() + PeriodSeconds(PERIOD_MN1)*ExpDate;
          
   return(expDate);  
}

где

input int    ExpDate            = 6;                           //количество баров жизни ордера

Далее попробовал ее (выше приведенную функцию) использовать при выставлении отложенного ордера, например на покупку

               request.action       = TRADE_ACTION_PENDING;                                         
               request.magic        = Magic;                                                       
               request.symbol       = _Symbol;                                                      
               request.volume       = GetLots();                                                    
               request.price        = openBuy;                                                      
               request.sl           = slBuy;                                                        
               request.tp           = tpBuy;                                                        
               request.type         = ORDER_TYPE_BUY_STOP;                                          
               request.type_filling = ORDER_FILLING_FOK;                                           
               request.expiration   = DateExp();                                                    
               request.deviation    = SG; 

Отложенный ордер выставляется, но живет пока не активируется (в тестере). Пробовал в request.expiration ставить просто число, ни чего не помогает. В гугле информации не нашел. Что у меня не так? Почему ордер не удаляется через определенный промежуток времени?

P.S. При выведении в Comment функция DateExp() показывает дату, время.

Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства ордеров
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства ордеров
  • www.mql5.com
Приказы на проведение торговых операций оформляются ордерами. Каждый ордер имеет множество свойств для чтения, информацию по ним можно получать с помощью функций Идентификатор позиции, который ставится на ордере при его исполнении. Каждый исполненный ордер порождает сделку, которая открывает новую или изменяет уже существующую позицию...
Youri Lazurenko:


Забыли указать:

struct MqlTradeRequest
  {
   ENUM_TRADE_REQUEST_ACTIONS    action;           // Тип выполняемого действия
   ulong                         magic;            // Штамп эксперта (идентификатор magic number)
   ulong                         order;            // Тикет ордера
   string                        symbol;           // Имя торгового инструмента
   double                        volume;           // Запрашиваемый объем сделки в лотах
   double                        price;            // Цена 
   double                        stoplimit;        // Уровень StopLimit ордера
   double                        sl;               // Уровень Stop Loss ордера
   double                        tp;               // Уровень Take Profit ордера
   ulong                         deviation;        // Максимально приемлемое отклонение от запрашиваемой цены
   ENUM_ORDER_TYPE               type;             // Тип ордера
   ENUM_ORDER_TYPE_FILLING       type_filling;     // Тип ордера по исполнению
   ENUM_ORDER_TYPE_TIME          type_time;        // Тип ордера по времени действия
   datetime                      expiration;       // Срок истечения ордера (для ордеров типа ORDER_TIME_SPECIFIED)
   string                        comment;          // Комментарий к ордеру
   ulong                         position;         // Тикет позиции
   ulong                         position_by;      // Тикет встречной позиции
  };
Vladimir Karputov:

Забыли указать:

Спасибо, уже сам нашел, хотел писать что вопрос снимается. Перед эти ставил, но ставил, получается, не верный параметр request.type_time    = ORDER_TIME_GTC; Исправил на request.type_time    = ORDER_TIME_SPECIFIED; и все работает. Но за отзыв и подсказку огромное спасибо.