Параметры советника при обрыве связи

Программирование прибыли: от азов к секретам мастерства. Читайте, спрашивайте, делитесь опытом.
Бонус за сообщение 0.5$
Ответственный Модератор - Haos

Параметры советника при обрыве связи

Сообщение Haos » 21 май 2017, 09:04

При работе советниками и, в том числе, на удаленном сервере нужно ориентироваться на то, что связь будет так или иначе прервана и советник будут заново запущен. Т.е. произойдет пере-инициализация переменных. Практически всегда изменения произошедшие за работу советника до разрыва связи играют важную роль. Поэтому разработчик должен позаботиться о том, чтобы эти разрывы не имели значения для правильной дальнейшей работы советника.
Как это выглядит на примере? Рассмотрим случай, когда для работы советника важно значение количества открытых позиций на покупку и продажу.
Открытие и закрытие позиций может происходить как при поступлении очередного тика, так и при открытии очередного бара. В первом случае код для анализа ситуации прописывается в функции OnTick(), а во втором случае - в функции, посвященной выполнению команд при открытии нового бара. Реализация такой функции рассмотрена в статье Как определить наступление нового бара?. В случае, когда речь идет о коде внутри функции OnTick(), мы должны инициализировать значения переменных кол-ва покупок и продаж следующим образом:
Код: выделить все
void OnTick()
{
   // количество открытых покупок и продаж:
   int    intBuys = f_GetNumberOfPositions("0", OP_BUY,  intMagic);
   int    intSels = f_GetNumberOfPositions("0", OP_SELL, intMagic);
...
}

Функция f_GetNumberOfPositions() - пользовательская и рассматривалась в статье Как определить количество открытых позиций в MQL4. Она возвращает кол-во позиций по указанному символу с учетом параметра intMagic.
Далее, в коде обычно используется условный оператор if для определения необходимых действий, зависящих от кол-ва открытых позиций. Это выглядит примерно так:
Код: выделить все
void OnTick()
{
   // количество открытых покупок и продаж:
   int    intBuys = f_GetNumberOfPositions("0", OP_BUY,  intMagic);
   int    intSels = f_GetNumberOfPositions("0", OP_SELL, intMagic);
   if(intSels > 0)  // ... выполняем необходимые действия
   if(intBuys == 0)
   {
      // ... выполняем необходимые действия
   }
   ...
}

Также определяются и другие параметры, претерпевшие изменения со времени работы советника и значения которых были потеряны при разрыве связи.
Например, если нам нужно чтобы советник "знал" какой тип позиции был открыт с минимальным лотом, то запускается соответствующая пользовательская функция по определению этого параметра. Если нужно определить какой тип был у последней позиции - также нужно использовать соответствующую функцию.
Здесь сложности даже не в самой разработке кода, а в том, чтобы разработчик не упускал эти важные процедуры для правильного функционирования своего творения.
Аватар пользователя
Haos
Специалист MQL
 
Сообщений: 24699
Зарегистрирован: 29 мар 2014, 16:07
Средств на руках: 193.70 Доллар
Группа: Главные модераторы
Благодарил (а): 3379 раз.
Поблагодарили: 8200 раз.

Вернуться в MQL – теория и практика

Кто сейчас на форуме?

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 90

Права доступа к форуму

Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения