Что должен делать советник:
- на каждом тике проверять размер бара
- как только размер бара станет равным или превысит заданный размер то: если свеча бычья - значит покупка, если свеча медвежья - значит продажа
- проверка результатов открытия позиции - если позиция открыта, то ставим флаг и выходим до момента рождения нового бара
- на новом баре снова начинаем работать на каждом тике и проверять размер свечи и как только размер бара станет равным или превысит заданный размер то: если свеча бычья и у нас открыта позиция Buy - значит ещё покупка, если свеча медвежья и у нас открыта позиция Buy - значит закрываем позицию/позиции Buy; если свеча медвежья и у нас открыта позиция Sell - значит ещё продажа, если свеча бычья и у нас открыта позиция Sell - значит закрываем позицию/позиции Sell.
- получать цены открытия и закрытия свечи
- открывать позиции и проверять результат торговой операции
- получать время открытия бара и определять момент рождения нового бара
- работать с позициями
- закрывать позиции
Владимир, заказывать нужно здесь
Или вы хотите чтоб вам энтузиаст написал?
Вы неправильно поняли - я сам напишу и по шагам покажу :). А интузизисты повыводились - у всех (почти всех) теперь:
А вот тут действительно покажите как можно шире, как написать советник, не используя сторонние файлы в виде стандартной библиотеки, и прочей шелухи.
Покажите всё стандартными функциями с полным описанием и выводом всех торговых ошибок.
Шаг первый: создаём шаблон будущего советника (пример взят из редактора MetaEditor - в редакторе MetaEditor:
Далее путь MetaEditor/Мастер MQL4/MQL5/Создание шаблонов советников):
Также справка доступна здесь: Создание шаблонов советников.
Имя для будущего советника, на этапе задания имени", задайте как "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" и выберите команду "Отправить изменение в Хранилище":
В комментариях укажите номер версии:
Всё. Теперь Ваш файл сохранён в Хранилище.
Шаг третий: начинаем редактировать - добавим описание.
После создания шаблона я очень настоятельно рекомендую сразу добавлять описание - во-первых это позволит сконцентрироваться на целях и задах советника, во-вторых описание потом поможет вспомнить Вам, что именно делает этот советник.
Итак, для описания нужен параметр
Описание вставим после параметра "version":
#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:
Управление |
|
Обновляет данные по символу | |
Обновляет котировки по символу | |
Свойства |
|
Получает/устанавливает наименование финансового инструмента | |
Цены спроса |
|
Получает текущую цену Bid | |
Цены предложения |
|
Получает текущую цену Ask | |
Квантование |
|
Получает количество знаков после десятичной точки | |
Получает значение одного пункта | |
Сервисные функции |
|
Нормализует цену с учетом свойств символа |
Для того, чтобы использовать текущие (не устаревшие) цены, перед торговой операцией нужно обновлять котировки. Для удобства уже написана такая простая функция, как "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 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 установить наименование финансового инструмента:
//+------------------------------------------------------------------+
//| 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" - вывод информации на график.
Результат работы:
- на графике на каждом тике цены выводятся правильно.
и как всегда, увеличиваем версию файла - теперь он 1.03.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Что должен делать советник:
Шаг первый: создаём шаблон будущего советника
Шаг второй: подключаем Хранилище
Шаг третий: начинаем редактировать - добавим описание
Шаг четвёртый. Получение информации об используемом символе
Проверка работы: выведем отображение цен на график
Шаг пятый. Подготовка переменных к проверке размера бара
Шаг шестой: момент рождения нового бара
Шаг седьмой: получение цены открытия бара и цены закрытия бара
Шаг восемь: подготовка к торговле
Шаг девять: CTrade - класс для упрощенного доступа к торговым функциям
Шаг десять: CPositionInfo - класс для для упрощенного доступа к свойствам открытой рыночной позиции
Шаг 11: Работаем только на hedge-счетах
...