Пример MQL5. Простой советник. Проверка размера бара. Покупка/продажа

 

Что должен делать советник: 

  • на каждом тике проверять размер бара
  • как только размер бара станет равным или превысит заданный размер то: если свеча бычья - значит покупка, если свеча медвежья - значит продажа
    Bull Buy

  • проверка результатов открытия позиции - если позиция открыта, то ставим флаг и выходим до момента рождения нового бара
  • на новом баре снова начинаем работать на каждом тике и проверять размер свечи и как только размер бара станет равным или превысит заданный размер то: если свеча бычья и у нас открыта позиция Buy - значит ещё покупка, если свеча медвежья и у нас открыта позиция Buy - значит закрываем позицию/позиции Buy; если свеча медвежья и у нас открыта позиция Sell - значит ещё продажа, если свеча бычья и у нас открыта позиция Sell - значит закрываем позицию/позиции Sell.
Таким образом научимся:

  • получать цены открытия и закрытия свечи
  • открывать позиции и проверять результат торговой операции
  • получать время открытия бара и определять момент рождения нового бара
  • работать с позициями
  • закрывать позиции

Шаг первый: создаём шаблон будущего советника 

Шаг второй: подключаем Хранилище 

Шаг третий: начинаем редактировать - добавим описание

Шаг четвёртый. Получение информации об используемом символе 

Проверка работы: выведем отображение цен на график 

Шаг пятый. Подготовка переменных к проверке размера бара 

Шаг шестой: момент рождения нового бара 

Шаг седьмой: получение цены открытия бара и цены закрытия бара 

Шаг восемь: подготовка к торговле 

Шаг девять: CTrade - класс для упрощенного доступа к торговым функциям 

Шаг десять: CPositionInfo - класс для для упрощенного доступа к свойствам открытой рыночной позиции 

Шаг 11: Работаем только на hedge-счетах 

...
 
Vladimir Karputov:

Что должен делать советник: 

  • на каждом тике проверять размер бара
  • как только размер бара станет равным или превысит заданный размер то: если свеча бычья - значит покупка, если свеча медвежья - значит продажа


  • проверка результатов открытия позиции - если позиция открыта, то ставим флаг и выходим до момента рождения нового бара
  • на новом баре снова начинаем работать на каждом тике и проверять размер свечи и как только размер бара станет равным или превысит заданный размер то: если свеча бычья и у нас открыта позиция Buy - значит ещё покупка, если свеча медвежья и у нас открыта позиция Buy - значит закрываем позицию/позиции Buy; если свеча медвежья и у нас открыта позиция Sell - значит ещё продажа, если свеча бычья и у нас открыта позиция Sell - значит закрываем позицию/позиции Sell.
Таким образом научимся:

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

Владимир, заказывать нужно здесь

Или вы хотите чтоб вам энтузиаст написал? 

 
Vitaly Muzichenko:

Владимир, заказывать нужно здесь

Или вы хотите чтоб вам энтузиаст написал? 

Вы неправильно поняли - я сам напишу и по шагам покажу :). А интузизисты повыводились - у всех (почти всех) теперь:

Деньги затмили разум 

 
Vladimir Karputov:

Вы неправильно поняли - я сам напишу и по шагам покажу :). А интузизисты повыводились - у всех (почти всех) теперь:

А вот тут действительно покажите как можно шире, как написать советник, не используя сторонние файлы в виде стандартной библиотеки, и прочей шелухи.

Покажите всё стандартными функциями с полным описанием и выводом всех торговых ошибок. 

 
С каких это пор стандартная поставка стала сторонними файлами? Также полное описание кодов есть в справке - если нужно читайте. 
 

Шаг первый: создаём шаблон будущего советника (пример взят из редактора MetaEditor - в редакторе MetaEditor:

MetaEditor Help 

Далее путь MetaEditor/Мастер MQL4/MQL5/Создание шаблонов советников):

Creating Templates of Expert Advisors 

Также справка доступна здесь: Создание шаблонов советников.

Имя для будущего советника, на этапе задания имени", задайте как "Simple EA BUY and SELL".
 

В итоге получим такой шаблон советника "Simple EA BUY and SELL" (версия 1.00):

//+------------------------------------------------------------------+
//|                                       Simple EA BUY and SELL.mq5 |
//|                              Copyright © 2017, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2017, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
  
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
  
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
  
  }
//+------------------------------------------------------------------+
Файлы:
 

Шаг второй: подключаем Хранилище.

Хранилище подключается так - Подключение Хранилища

Хранилище позволит сохранять версии одного и того-же файла, а так-же просто хранить все Ваши коды. При использовании Хранилища Вы можете не беспокоится о сохранности и восстановлении своих наработок и кодов - даже если Ваш компьютер поломается Вы всегда сможете в любой момент подключится к Хранилищу и восстановить свои наработки.

 

Итак, Хранилище подключено, сохраним версию 1.00:

Сделайте правый клик на любом месте файла "Simple_EA_BUY_and_SELL.mq5" и выберите команду "Отправить изменение в Хранилище":

Send change in Storage


В комментариях укажите номер версии:

Add comment

Всё. Теперь Ваш файл сохранён в Хранилище. 

 

Шаг третий: начинаем редактировать - добавим описание.

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

Итак, для описания нужен параметр

Описание вставим после параметра "version":

#property version   "1.00"
#property description "Check of the size of bar"
#property description "If the size of bar is more, than the set parameter - that BUY OR SELL"

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()

и изменим версию на 1.01. Не забываем при отправке изменений заполнять поле "Комментарий".

Изменения сразу фиксируем в Хранилище. 

Файлы:
 

Шаг четвёртый. Получение информации об используемом символе.

Для получения информации о свойствах символа используем торговый класс Стандартной Библиотеки - Класс CSymbolInfo:

Класс CSymbolInfo является классом для упрощенного доступа к свойствам символа.

Описание

Класс CSymbolInfo обеспечивает доступ к свойствам символа.

Заголовок

   #include <Trade\SymbolInfo.mqh>


В частности будут использоваться такие методы класса CSymbolInfo:

Управление

 

Refresh

Обновляет данные по символу

RefreshRates

Обновляет котировки по символу

Свойства

 

Name

Получает/устанавливает наименование финансового инструмента

Цены спроса

 

Bid

Получает текущую цену Bid

Цены предложения

 

Ask

Получает текущую цену Ask

Квантование

 

Digits

Получает количество знаков после десятичной точки

Point

Получает значение одного пункта

Сервисные функции

 

NormalizePrice

Нормализует цену с учетом свойств символа


Для того, чтобы использовать текущие (не устаревшие) цены, перед торговой операцией нужно обновлять котировки. Для удобства уже написана такая простая функция, как "bool RefreshRates()" (не забывайте, что Символ должен быть предварительно выбран методом Name):

//+------------------------------------------------------------------+
//| Refreshes the symbol quotes data                                 |
//+------------------------------------------------------------------+
bool RefreshRates()
  {
//--- refresh rates
   if(!m_symbol.RefreshRates())
      return(false);

//--- protection against the return value of "zero"
   if(m_symbol.Ask()==0 || m_symbol.Bid()==0)
      return(false);

//---
   return(true);
  }

Эта функция работает в два этапа. Этап первый: обновление котировок и если метод вернул "false" - то выходим и возвращаем "false". Этап второй - страхуемся от получения нулевых цен - проверяем текущую цену Bid и текущую цену Ask на наличие в них нулевого значения.

Функцию "bool RefreshRates()" размещаем в самом конце нашего советника (кстати, не забывайте после вставки пользоваться Стилизатором: Стилизатор - Работа с исходным кодом - Разработка программ - MetaEditor):

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---

  }
//+------------------------------------------------------------------+
//| Refreshes the symbol quotes data                                 |
//+------------------------------------------------------------------+
bool RefreshRates()
  {
//--- refresh rates
   if(!m_symbol.RefreshRates())
      return(false);
//--- protection against the return value of "zero"
   if(m_symbol.Ask()==0 || m_symbol.Bid()==0)
      return(false);
//---
   return(true);
  }

//+------------------------------------------------------------------+

Но что-бы это работало, нужно ещё в "шапке" программы подключить торговый класс CSymbolInfo:

#property version   "1.02"
#property description "Check of the size of bar"
#property description "If the size of bar is more, than the set parameter - that BUY OR SELL"
#include <Trade\SymbolInfo.mqh>  
CSymbolInfo    m_symbol;                     // symbol info object

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()

Теперь можно, в OnInit(), при помощи метода Name установить наименование финансового инструмента:

CSymbolInfo    m_symbol;                     // symbol info object
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   m_symbol.Name(Symbol());                  // sets symbol name
   if(!RefreshRates())
     {
      Print("Error RefreshRates. Bid=",DoubleToString(m_symbol.Bid(),Digits()),
            ", Ask=",DoubleToString(m_symbol.Ask(),Digits()));
      return(INIT_FAILED);
     }

   m_symbol.Refresh();
//---
   return(INIT_SUCCEEDED);
  }

обновить текущие цены и обновить данные по символу (количество знаков после десятичной точки, значение одного пункта и тому подобное). Таким образом в "шапке" подключен торговый класс, в OnInit() указываем название финансового инструмента, а также сразу обновляем текущие цены по финансовому инструменту и обновляем данные по финансовому инструменту.
 

и сразу редактируем версию на 1.02 и сохраняем в Хранилище.

Файлы:
 

Проверка работы: выведем отображение цен на график.

На предыдущих шагах мы подключили Класс CSymbolInfo, в OnInit() установили название финансового инструмента, а также вставили специальную функцию "bool RefreshRates()".

 

Для вывода цен в OnTick() пропишем пару строк:

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(!RefreshRates())
      return;

   Comment("Bid=",DoubleToString(m_symbol.Bid(),m_symbol.Digits()),"\n",
           ",Ask=",DoubleToString(m_symbol.Ask(),m_symbol.Digits()));

  }

два этапа: первый этап - обновление цен, если обновление удачно - то будет выполнена команда "Comment" - вывод информации на график.

Результат работы:

Test

- на графике на каждом тике цены выводятся правильно. 

и как всегда, увеличиваем версию файла - теперь он 1.03. 

Файлы:
Причина обращения: