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

 
Hexen:
Подскажите, пожалуйста, как сделать, чтобы OnCalculate индикатора вызывалась не каждый тик, а только с новым баром?
Данная функция будет вызываться каждый тик, но можно сделать контроль нового бара внутри функции.
 
Victor Nikolaev:
Данная функция будет вызываться каждый тик, но можно сделать контроль нового бара внутри функции.

Спасибо, разобрался более менее. Сравнивая prev_calculated и rates_total видно появление новых баров. А в советнике сложнее с новым баром - проверка времени и т.п. 

 

Не надо их сравнивать, это не очень надёжный способ: переменная prev_calculated при некоторых условиях может быть обнулена. Запоминайте время текущего бара и проверяйте его изменение при следующем вызове:

// в самом начале функции OnCalculate()
bool bNewBar = false;

static datetime dtLastBarTime = time[rates_total-1];

if(time[rates_total-1] > dtLastBarTime)
{
   bNewBar = true;
   dtLastBarTime = time[rates_total-1];
}

 PS. Это пример для МТ5. В четвёрке (и в пятёрке, если массив time[] cделан таймсерией) заменить time[rates_total-1] на time[0].

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

решил создать простого советника, прочитав статью: "Пошаговое руководство по написанию
MQL5-советников для начинающих".(https://www.mql5.com/ru/articles/100)

Протестировав эксперта на истории подумал, как его можно улучшить?
Первое что пришло в голову , не считая оптимизации-
применить трейлинг стоп-лосс . Есть хорошая статья по зтому вопросу:
"Как создать свой Trailing Stop - Статьи по MQL5".
(https://www.mql5.com/ru/articles/134) .     Однако, возникла
проблема , советник приложенный к статье не рабочий...то есть
(my_first_ea_sartrailing.ex5) компилируется , но не торгует
в журнале пишет:
2015.11.28 22:54:38.973    2015.02.04 17:00:00   Alert: Запрос на установку ордера Sell не выполнен - код ошибки:4756
2015.11.28 22:54:38.973    2015.02.04 17:00:00   failed instant sell 0.10 EURUSD at 1.14051 sl: 1.17051 tp: 1.04051 [Invalid request]
Помогите разобраться.
 
Sergei Vladimirov:

 PS. Это пример для МТ5. 

Спасибо!
 

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

 

 Скажите, пожалуйста, какой самый быстрый и правильный способ удалить все существующие ордера, выставленные советником? Неужели создавать массив с номерами ордеров и удалять каждый? Получить список активных ордеров тоже нельзя?

 
Антон:

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

 

 Скажите, пожалуйста, какой самый быстрый и правильный способ удалить все существующие ордера, выставленные советником? Неужели создавать массив с номерами ордеров и удалять каждый? Получить список активных ордеров тоже нельзя?

Не надо массив. Какой терминал?

 
Sergei Vladimirov:

Не надо массив. Какой терминал?

MT5

Да, стоило сказать, что реализовать это нужно в советнике.

Нашел скрипт на mql4 - для 5 не актуально? Пару дней назад где-то видел строку с функцией что-то вроде "orderscancelbymagicnumber", но в документации ничего не получается найти... Запутался.

 
#include <Trade/Trade.mqh>

void DeletePendingOrders(const string sSymbol, const ulong nMagic)
{
   CTrade oTrade;

   for(int i = OrdersTotal() - 1; i >= 0; i--)
   {
      ulong nOrderTicket = OrderGetTicket(i);
      
      if(nOrderTicket > 0)
      {
         if(OrderGetString(ORDER_SYMBOL) == sSymbol && OrderGetInteger(ORDER_MAGIC) == nMagic)
         {
            // удаляем только отложенники
            ENUM_ORDER_TYPE eType = (ENUM_ORDER_TYPE)OrderGetInteger(ORDER_TYPE);
            
            if(eType == ORDER_TYPE_BUY_STOP  || eType == ORDER_TYPE_SELL_STOP ||
               eType == ORDER_TYPE_BUY_LIMIT || eType == ORDER_TYPE_SELL_LIMIT ||
               eType == ORDER_TYPE_BUY_STOP_LIMIT || eType == ORDER_TYPE_SELL_STOP_LIMIT)
            {
               oTrade.OrderDelete(nOrderTicket);
            }
         }
      }
   }
}

Скрипт для МТ4 в пятёрке работать не будет, там совсем другие торговые функции.

 
Sergei Vladimirov:

Скрипт для МТ4 в пятёрке работать не будет, там совсем другие торговые функции.

Спасибо, как раз собирался с trade.mqh разобраться.