Как написать советник.

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

Как написать советник.

Сообщение Рэндом » 29 апр 2016, 07:37

Сложная тема. Советники могут быть очень не похож друг на друга, но есть общии принципы.
Первый принцип. Если вы используете глобальные переменные. Т.е. переменные вынесенные за границы функций. Так вот эти переменные обнуляются при закрытии терминала. Это может нарушить работу советника. Но есть выход. Глобальные переменные терминала. Это специальные переменные которые сохраняют свои значения даже если терминал был выключен.

Второй принцип. Как правило нужно чтобы одновременно была открыта лишь одна позиция.
Ест специальная функция OrdersTotal. Если эта функция возвращает 0, то можно открывать позицию. Но если вы используете отложенные ордера, а вам надо проверить есть ли открытые позиции, то надо писать специальную функцию. Так как OrdersTotal возвращает количество всех ордеров.

Третий принцип. Если помимо ордеров советника предполагается использовать другие ордера, то нужно использовать магический номер.

Далее будут рассмотрены некоторые полезные функции.
Аватар пользователя
Рэндом
Специалист MQL
 
Сообщений: 13700
Зарегистрирован: 18 июл 2013, 08:05
Средств на руках: 31.45 Доллар
Группа: Администраторы
Благодарил (а): 1131 раз.
Поблагодарили: 3174 раз.
Каждый заблуждается в меру своих возможностей.

Re: Как написать советник.

Сообщение Рэндом » 02 май 2016, 05:54

Код: выделить все
int OT()
{
   int ot=0;
   int t=OrdersTotal();
   for(int i=0;i<t;i++)
   {
      int rez=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
      if(OrderMagicNumber()==Magic) ot++;
   }
   return ot;
}

Эта функция считает как открытые позиции, так и отложенные ордера с магик номером. Давайте рассмотрим как она работает.
input int Magic=123; Прежде всего в параметрах советника задается переменная Magic. Это нужно для настройки работы нескольких советников на одном счете. Все такие советники должны иметь магик и он должен быть уникален.
int ot=0; Задаем переменную в которой будем считать количество ордеров с магиком.
int t=OrdersTotal(); Получаем общее количество ордеров.
Далее идет цикл по перебору ордеров.
Первое что мы должны в нем сделать это выбрать ордер int rez=OrderSelect(i,SELECT_BY_POS,MODE_TRADES); Это нужно для функций получение информации об ордерах.
if(OrderMagicNumber()==Magic) ot++; Сравниваем магик ордера с магиком заданным в настройках, и если они равны то увеличиваем количество ордеров ot++.
return ot; Возвращаем количество ордеров.
Пример использования функции:
Код: выделить все
if(OT()==0)
      {
         rez=OrderSend(Symbol(),OP_BUYSTOP,Lot,Bid+Flat*Point,Slippage,0,0,NULL,Magic);
         rez=OrderSend(Symbol(),OP_SELLSTOP,Lot,Bid-Flat*Point,Slippage,0,0,NULL,Magic);
      }
Аватар пользователя
Рэндом
Специалист MQL
 
Сообщений: 13700
Зарегистрирован: 18 июл 2013, 08:05
Средств на руках: 31.45 Доллар
Группа: Администраторы
Благодарил (а): 1131 раз.
Поблагодарили: 3174 раз.
Каждый заблуждается в меру своих возможностей.

Re: Как написать советник.

Сообщение Рэндом » 05 май 2016, 10:04

Код: выделить все
int OT()
{
   int ot=0;
   int t=OrdersTotal();
   for(int i=0;i<t;i++)
   {
      int rez=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
      if(OrderType()==OP_BUY || OrderType()==OP_SELL) ot++;
   }
   return ot;
}


Так можно проверить количество открытых позиций. По такому же принципу строятся остальные проверки.
Здесь интересна эта строка if(OrderType()==OP_BUY || OrderType()==OP_SELL). Расшифровать ее можно так: Если тип ордера равен OP_BUY или тип ордера равен OP_SELL, то ot++.
|| этот оператор называется логическое "или". Для того чтобы понять как они работают, достаточно почитать справку.
И еще учитесь пользоваться справкой. Без этого вы не сможете писать код на MQL.

Далее будет рассмотрена общая структура советника.
Аватар пользователя
Рэндом
Специалист MQL
 
Сообщений: 13700
Зарегистрирован: 18 июл 2013, 08:05
Средств на руках: 31.45 Доллар
Группа: Администраторы
Благодарил (а): 1131 раз.
Поблагодарили: 3174 раз.
Каждый заблуждается в меру своих возможностей.

Re: Как написать советник.

Сообщение Рэндом » 06 май 2016, 05:47

Код: выделить все
//+------------------------------------------------------------------+
//|                                                      Shablon.mq4 |
//|                                                           Рэндом |
//|                                       http://www.investforum.ru/forum/ |
//+------------------------------------------------------------------+
#property copyright "Рэндом"
#property link      "http://www.investforum.ru/forum/"
#property version   "1.00"
#property strict
//--- input parameters
input int      Magic=123;// Переменные которые можно задать через терминал.
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
// Здесь могут быть глобальные переменые.
int OnInit()
  {
//---
  // Загрузка глобальных переменных из терминала
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
    // Сохранение глобальных переменных в терминале.
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
    // Тело советника. Вызывается каждый тик.
  }
//+------------------------------------------------------------------+
// Здесь могут быть дополнительные функции.

Все должно быть понятно из комментариев. Если не понятно, спрашивайте.
Далее будет рассмотрена работа советника по ценам открытия.
Аватар пользователя
Рэндом
Специалист MQL
 
Сообщений: 13700
Зарегистрирован: 18 июл 2013, 08:05
Средств на руках: 31.45 Доллар
Группа: Администраторы
Благодарил (а): 1131 раз.
Поблагодарили: 3174 раз.
Каждый заблуждается в меру своих возможностей.

Re: Как написать советник.

Сообщение Рэндом » 11 май 2016, 05:57

Код: выделить все
void OnTick()
  {
//---
    if(Volume[0]>1) return;
    // Тело советника. Вызывается каждый тик.
  }

Вот способ сделать советник по ценам открытия.
if(Volume[0]>1) return; Если тиковый объем больше 1, то выход.
Делать советник по ценам открытия необходимо для того чтобы результаты тестирования по ценам открытия соответствовали торговле советника. Тестирование по ценам открытия это самый надежный способ тестирования. И еще при работе советника по ценам открытия индикаторы как правило расчитываются для предпоследнего бара. И вообще весь анализ просходит начиная с предпоследнего бара.
Аватар пользователя
Рэндом
Специалист MQL
 
Сообщений: 13700
Зарегистрирован: 18 июл 2013, 08:05
Средств на руках: 31.45 Доллар
Группа: Администраторы
Благодарил (а): 1131 раз.
Поблагодарили: 3174 раз.
Каждый заблуждается в меру своих возможностей.


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

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

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

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

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