Великий и ужасный МТ4 навсегда (или как грамотно выработать стратегию перехода) - страница 26

 
fxsaber:

Скорее всего, внутри такого флага нет.

видимо, нет.

но я думаю, MQ вполне могут его сделать, тем более это будет один флаг на терминал, т.е. для всех программ.

 
Artyom Trishkin:
Скорее всего предложу. Но много позже. По субъективным обстоятельствам. К сожалению. Пока же можете считать демагогом. Не возбраняется.

Еще актуально? Ваш вариант решения будет?

 
Igor Makanu:

Еще актуально? Ваш вариант решения будет?

Вы же процитировали мой пост, где написано "много позже". Для меня "много позже" - это не раньше, чем через год минимум. Не потому, что это время требуется на поиск решения, а просто из-за субъективных обстоятельств, к сожалению.

 
Artyom Trishkin:

 это не раньше, чем через год минимум.

ОК, значит не актуально

 
Наверное, еще можно придумать простые по условию задачи, решения которых вызывает неожиданные трудности.
 
fxsaber:
Наверное, еще можно придумать простые по условию задачи, решения которых вызывает неожиданные трудности.

Скрипт следит за превышением риска: если суммарно позиций и отложек больше двух - сообщаем и выходим.


Лаконичный код:

void OnStart()
{
  while (!IsStopped())
    if ((PositionsTotal() + OrdersTotal() > 2)) // Если (риск превышен) число отложек/позиций больше двух,
    {
      Alert("Risk exceeded!");                  // сообщаем      
      ExpertRemove();                           // и выходим.
    }
}


Смотрим на поведение скрипта, в зависимости от действий руками. Перед этим (до запуска скрипта) обозначим количество позиций на счете PosTotal, ордеров - OrdTotal.

Сценарий PosTotal/OrdTotal Действие Результат скрипта
01 0/0 Открытие позиции. Работает.
02 0/0 Выставление отложки. Работает.
03 0/1 Выставление отложки. Работает.
04 0/1 Открытие позиции. Алерт (не всегда).
05 0/1 Удаление отложки. Работает.
06 1/0 Выставление отложки. Работает.
07 1/0 Открытие позиции. Алерт (не всегда).
08 1/0 Закрытие позиции. Работает.
09 1/1 Удаление отложки. Работает.
10 1/1 Закрытие позиции. Алерт.
11 0/2 Удаление отложки. Работает.
12 2/0 Закрытие позиции. Алерт.


Вроде, очень простая задача, но алертит. Какие варианты решения?


ЗЫ Скорее всего, вот на таких простых задачах и нужно отрабатывать понимание MT5.

 
fxsaber:

Скрипт следит за превышением риска: если суммарно позиций и отложек больше двух - сообщаем и выходим.


Лаконичный код:


Смотрим на поведение скрипта, в зависимости от действий руками. Перед этим (до запуска скрипта) обозначим количество позиций на счете PosTotal, ордеров - OrdTotal.

Сценарий PosTotal/OrdTotal Действие Результат скрипта
01 0/0 Открытие позиции. Работает.
02 0/0 Выставление отложки. Работает.
03 0/1 Выставление отложки. Работает.
04 0/1 Открытие позиции. Алерт (не всегда).
05 0/1 Удаление отложки. Работает.
06 1/0 Выставление отложки. Работает.
07 1/0 Открытие позиции. Алерт (не всегда).
08 1/0 Закрытие позиции. Работает.
09 1/1 Удаление отложки. Работает.
10 1/1 Закрытие позиции. Алерт.
11 0/2 Удаление отложки. Работает.
12 2/0 Закрытие позиции. Алерт.


Вроде, очень простая задача, но алертит. Какие варианты решения?


ЗЫ Скорее всего, вот на таких простых задачах и нужно отрабатывать понимание MT5.

При чём тут MQ5? Условие выхода из цикла: IsStopped и ордеров не более двух. Дальше работает скрипт, а если условие не работает, то и скрипт тоже. 

 
Алексей Тарабанов:

При чём тут MQ5? Условие выхода из цикла: IsStopped и ордеров не более двух. Дальше работает скрипт, а если условие не работает, то и скрипт тоже. 

Код даже снабжен комментариями.

 
fxsaber:

Скрипт следит за превышением риска: если суммарно позиций и отложек больше двух - сообщаем и выходим.

Лаконичный код:


Вроде, очень простая задача, но алертит. Какие варианты решения?


ЗЫ Скорее всего, вот на таких простых задачах и нужно отрабатывать понимание MT5.

наверное что то такое нужно делать:

void OnStart()
{
   while (!IsStopped())
   {
      //--- посчитаем ордера
      int orders = 0;
      for(int i = 0; i < OrdersTotal(); i++)
         if(OrderGetTicket(i) > 0 && OrderGetInteger(ORDER_TYPE) < ORDER_TYPE_CLOSE_BY) orders++;
      
      if(orders + PositionsTotal() > 2) break;     // выходим
   }
   if(!_StopFlag) Alert("Risk exceeded!");         // сообщаем
}
 
Igor Makanu:

наверное что то такое нужно делать:

Безусловно, нужно фильтровать ордера. Сделать это непросто.

ЗЫ Интересная ситуация на форуме. Активно отвечают на вопросы. Здесь, видимо, другое.
Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам
Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам
  • 2016.11.09
  • www.mql5.com
В этой ветке я хочу начать свою помощь тем, кто действительно хочет разобраться и научиться программированию на новом MQL4 и желает легко перейти н...
Причина обращения: