Торговый советник на основе одной МА и цены

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

Торговый советник на основе одной МА и цены

Сообщение Haos » 16 июн 2017, 18:41

Это завершающая статья из ряда статей, рассмотревших последовательное создание советника на основе пересечения скользящую среднюю ценою.
Прошлая статья Определение тренда на основе одной МА и цены.

1. Введем две глобальные переменные советника (размер торгового лота и величину проскальзывания):
Код: выделить все
input double   dblQ0 = 0.1;   // Размер торгового лота
input int      intSI = 3;     // Проскальзывание цены (slippage) (пнт.)


2. Ниже объявления глобальных переменных советника введем идентификатор советника:
Код: выделить все
int intMagic = 13062017; // Идентификатор эксперта

Он необходим для однозначной идентификации сделок, открытых данным советником. Это необходимо для того, чтобы во-первых можно было торговать вручную на активе, на котором работает советник и во-вторых, советник только отслеживал сделки открытые им.
Идентификатор задается переменной типа int и для удобства я задаю эту переменную в виде набора цифр календарной даты, когда советник начал создаваться. Таким образом, исключается совпадения идентификаторов различных экспертов, так как маловероятно что за один день можно создать больше одного эксперта да еще забыть о том, что нужно присвоить им разные значения переменной.

3. Поскольку советник работает на открытие очередного бара (осуществляется проверка на возможность входа в сделку на основе данных цены закрытия прошлого бара и значения скользящей средней), то нужно не на каждом тике грузить советник лишними проверками на выполнение торговых условий, упомянутых выше, а делать их только один раз при открытии бара.
Для этого нужно:
3.1 Разместить в коде советника функцию которая контролирует наступление нового бара:

Код: выделить все
bool f_IsNewBar()
{
// Функция определяет факт наступления нового бара
   static datetime dtm_LastTime = 0;
   if(Time[0] == dtm_LastTime)
   {
      return (false);
   }
   dtm_LastTime = Time[0];

return(true);
}


3.2 В коде функции OnTick() прописать условный оператор,
Код: выделить все
if(f_IsNewBar())
{
//.........   
 }

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

Этот вопрос рассмотрен подробно в статье Как определить наступление нового бара

4. Определяем количество открытых покупок и продаж (см. статью Как определить количество открытых позиций в MQL4 ):
Код: выделить все
// количество открытых покупок и продаж
int intBuys  = f_GetNumberOfPositions("0", OP_BUY,  intMagic);
int intSells = f_GetNumberOfPositions("0", OP_SELL, intMagic);

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

Re: Торговый советник на основе одной МА и цены

Сообщение Haos » 16 июн 2017, 18:55

5. Прописываем уже имеющиеся две строчки прошлой разработки в функции OnTick():
Код: выделить все
   double dblPrice   = Close[1];
   string strTrend = f_MATrend("0", 0, intMAPe, intMASh, intMAMe, intMAAp, 0, dblPrice);

6. Далее осуществляем проверку условий на необходимые торговые действия:
Код: выделить все
      if(strTrend == "UP")
      {
         if(intSells > 0)  f__ClosePositions("0", OP_SELL, intMagic, intSI);
         if(intBuys == 0)
         {
            // открыть покупку:
            f_OpenPosition("0", OP_BUY, dblQ0, 0, 0, intMagic, intSI, "");
         }
      }     
      if(strTrend == "DN")
      {
         if(intBuys > 0)  f__ClosePositions("0", OP_BUY, intMagic, intSI);
         if(intSells == 0)
         {
            // открыть продажу:
            f_OpenPosition("0", OP_SELL, dblQ0, 0, 0, intMagic, intSI, "");
         }   
      }

Вначале проверяется какой имеет место тренд (при открытии очередного бара). Если "UP", т.е. бычий, то проверяется условие на наличие открытой продажи и если таковая имеется, то она закрывается:
Код: выделить все
      if(strTrend == "UP")
      {
         if(intSells > 0)  f__ClosePositions("0", OP_SELL, intMagic, intSI);
         ...


Далее проверяется количество открытых покупок и если их нет, то открывается сделка на покупку:
Код: выделить все
         if(intBuys == 0)
         {
            // открыть покупку:
            f_OpenPosition("0", OP_BUY, dblQ0, 0, 0, intMagic, intSI, "");
         }

Аналогичная проверка осуществляется и на предмет медвежьего тренда "DN".
Полный текст функции OnTick():
Код: выделить все
void OnTick()
{
   if(f_IsNewBar())
   {
      // выполняется в начале каждого нового бара
      // количество открытых покупок и продаж:
      int intBuys  = f_GetNumberOfPositions("0", OP_BUY,  intMagic);
      int intSells = f_GetNumberOfPositions("0", OP_SELL, intMagic);
      double dblPrice   = Close[1];
      string strTrend = f_MATrend("0", 0, intMAPe, intMASh, intMAMe, intMAAp, 0, dblPrice);
     
      if(strTrend == "UP")
      {
         if(intSells > 0)  f__ClosePositions("0", OP_SELL, intMagic, intSI);
         if(intBuys == 0)
         {
            // открыть покупку:
            f_OpenPosition("0", OP_BUY, dblQ0, 0, 0, intMagic, intSI, "");
         }
      }     
      if(strTrend == "DN")
      {
         if(intBuys > 0)  f__ClosePositions("0", OP_BUY, intMagic, intSI);
         if(intSells == 0)
         {
            // открыть продажу:
            f_OpenPosition("0", OP_SELL, dblQ0, 0, 0, intMagic, intSI, "");
         }   
      }
   }
}

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

Re: Торговый советник на основе одной МА и цены

Сообщение Haos » 16 июн 2017, 19:04

Замечание: в данном советнике в качестве примера приведена рассмотренная ранее пользовательская функция f_MATrend(), которая возвращает тип текущего тренда. Однако, более оптимально следует использовать функцию не на наличие тренда а на появление сигнала пересечения ценой скользящей средней. Однако, поскольку была ранее рассмотрена функция именно на наличие тренда в данной реализации советника не имеет значение какую функцию использовать. Это так, потому, что нет ни СЛ ни ТП, а значит сделка не может закрыться до тех пор, пока тренд не закончится. Т.е. сделка начнется когда тренд сменится и будет закрыты только при очередном смене тренда.
Тем не менее дальше мы рассмотрим функцию, выдающую сигнал именно на вход в рынок по пересечению ценой скользящей средней.
Также следует отметить, что для закрытия позиции в коде использована пользовательская функция f__ClosePositions(), которая и осуществляет закрытие позиций. При этом она использует другие функции для перехвата и обработки возможных ошибок при закрытии позиций и т.д.

Весь код советник можно скачать ниже.
Вложения
EA-Example_MA&Price-v1.mq4
(33.55 KB) Скачиваний: 93
Аватар пользователя
Haos
Специалист MQL
 
Сообщений: 24699
Зарегистрирован: 29 мар 2014, 16:07
Средств на руках: 193.70 Доллар
Группа: Главные модераторы
Благодарил (а): 3379 раз.
Поблагодарили: 8200 раз.

Re: Торговый советник на основе одной МА и цены

Сообщение Haos » 16 июн 2017, 19:06

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


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

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

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

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

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