Ставь лайки и следи за новостями
Поставь на него ссылку - пусть другие тоже оценят
Оцени его работу в терминале MetaTrader 5
Simple Trailing 2 - эксперт для MetaTrader 5
- Просмотров:
- 2447
- Рейтинг:
- Опубликован:
- 2019.12.09 07:34
- Нужен робот или индикатор на основе этого кода? Закажите его на бирже фрилансеров Перейти на биржу
Описание трейлинга
Главное: трейлинг начинает работать ТОЛЬКО ДЛЯ ПРИБЫЛЬНЫХ ПОЗИЦИЙ!
Параметры:
Trailing, in seconds
пауза между очередной проверкой на возможность трейлинга, в секундах; при установке значения менее 10 - трейлинг будет проводится только на новом баре
Trailing Stop
минимальное итоговое расстояние от текущей цены до StopLoss, в pips (1.00045-1.00055=1 pips)
Trailing Step
шаг трейлинга, в pips (1.00045-1.00055=1 pips)
Deviation
допустимое максимальное проскальзывание, in points (1.00045-1.00055=10 points)
Print log
вывод подробного логирования
Принцип работы:
Для сокращения кода и большей наглядности используются следующие торговые классы из Стандартной библиотеки: CPositionInfo (Класс для работы со свойствами открытой позиции), CTrade (Класс для совершения торговых операций) и CSymbolInfo (Класс для работы со свойствами торгового инструмента).
Соответственно для работы в "шапке" программы объявляются объекты этих классов
#include <Trade\PositionInfo.mqh> #include <Trade\Trade.mqh> #include <Trade\SymbolInfo.mqh> //--- CPositionInfo m_position; // object of CPositionInfo class CTrade m_trade; // object of CTrade class CSymbolInfo m_symbol; // object of CSymbolInfo class //--- input parameters
Также в "шапке" объявляются служебные переменные - для хранения значений трейлинга пересчитанного в double, а также для хранения времени последнего трейлинга и времени бара
double m_trailing_stop = 0.0; // Trailing Stop -> double double m_trailing_step = 0.0; // Trailing Step -> double double m_adjusted_point; // point value adjusted for 3 or 5 points datetime m_last_trailing = 0; // "0" -> D'1970.01.01 00:00'; datetime m_prev_bars = 0; // "0" -> D'1970.01.01 00:00';
Переходим в OnInit
Первым делом исключаем возможную ошибку во входных параметрах - когда трейлинг включён ("Trailing Stop" больше нуля), а шаг трейлинга ("Trailing Step") равен нулю:
if(InpTrailingStop!=0 && InpTrailingStep==0) { string err_text=(TerminalInfoString(TERMINAL_LANGUAGE)=="Russian")? "Трейлинг невозможен: параметр \"Trailing Step\" равен нулю!": "Trailing is not possible: parameter \"Trailing Step\" is zero!"; //--- when testing, we will only output to the log about incorrect input parameters if(MQLInfoInteger(MQL_TESTER)) { Print(__FILE__," ",__FUNCTION__,", ERROR: ",err_text); return(INIT_FAILED); } else // if the Expert Advisor is run on the chart, tell the user about the error { Alert(__FILE__," ",__FUNCTION__,", ERROR: ",err_text); return(INIT_PARAMETERS_INCORRECT); } }
Инициализируем объект m_symbol и сразу обновляем все параметры и цены по символу
if(!m_symbol.Name(Symbol())) // sets symbol name { Print(__FILE__," ",__FUNCTION__,", ERROR: CSymbolInfo.Name"); return(INIT_FAILED); } RefreshRates();
Инициализируем объект m_trade
m_trade.SetMarginMode(); m_trade.SetTypeFillingBySymbol(m_symbol.Name()); m_trade.SetDeviationInPoints(InpDeviation);
Проводим настройки в зависимости от количества знаков символа
//--- tuning for 3 or 5 digits int digits_adjust=1; if(m_symbol.Digits()==3 || m_symbol.Digits()==5) digits_adjust=10; m_adjusted_point=m_symbol.Point()*digits_adjust; m_trailing_stop = InpTrailingStop * m_adjusted_point; m_trailing_step = InpTrailingStep * m_adjusted_point;
Переходим к OnTick
Сначала проверяется ситуация когда пауза между трейлингом равна или больше 10 секунд
if(InpTrailingFrequency>=10) // trailing no more than once every 10 seconds { datetime time_current=TimeCurrent(); if(time_current-m_last_trailing>10) { double level; if(FreezeStopsLevels(level)) Trailing(level); else return; m_last_trailing=time_current; } }
если пауза задана менее 10 секунд - значит трейлинг работает только на новом баре:
//--- we work only at the time of the birth of new bar datetime time_0=iTime(m_symbol.Name(),Period(),0); if(time_0==m_prev_bars) return; m_prev_bars=time_0; if(InpTrailingFrequency<10) // trailing only at the time of the birth of new bar { double level; if(FreezeStopsLevels(level)) Trailing(level); }
В обоих случаях объявляется переменная level в которую записывается результат выполнения функции FreezeStopsLevels.
Функция FreezeStopsLevels проверяет три параметра: дистанцию заморозки торговых операций (метод FreezeLevel), минимальный отступ для ордеров (метод StopsLevel) и текущий спред (спред вычисляется как разница между ценой Ask и Bid). В конечном итоге выбирается максимальное значение из трёх параметров и (для подстраховки) умножается на 3.0.
//+------------------------------------------------------------------+ //| Check Freeze and Stops levels | //+------------------------------------------------------------------+ bool FreezeStopsLevels(double &level) { //--- check Freeze and Stops levels /* Type of order/position | Activation price | Check ------------------------|--------------------|-------------------------------------------- Buy Limit order | Ask | Ask-OpenPrice >= SYMBOL_TRADE_FREEZE_LEVEL Buy Stop order | Ask | OpenPrice-Ask >= SYMBOL_TRADE_FREEZE_LEVEL Sell Limit order | Bid | OpenPrice-Bid >= SYMBOL_TRADE_FREEZE_LEVEL Sell Stop order | Bid | Bid-OpenPrice >= SYMBOL_TRADE_FREEZE_LEVEL Buy position | Bid | TakeProfit-Bid >= SYMBOL_TRADE_FREEZE_LEVEL | | Bid-StopLoss >= SYMBOL_TRADE_FREEZE_LEVEL Sell position | Ask | Ask-TakeProfit >= SYMBOL_TRADE_FREEZE_LEVEL | | StopLoss-Ask >= SYMBOL_TRADE_FREEZE_LEVEL Buying is done at the Ask price | Selling is done at the Bid price ------------------------------------------------|---------------------------------- TakeProfit >= Bid | TakeProfit <= Ask StopLoss <= Bid | StopLoss >= Ask TakeProfit - Bid >= SYMBOL_TRADE_STOPS_LEVEL | Ask - TakeProfit >= SYMBOL_TRADE_STOPS_LEVEL Bid - StopLoss >= SYMBOL_TRADE_STOPS_LEVEL | StopLoss - Ask >= SYMBOL_TRADE_STOPS_LEVEL */ if(!RefreshRates() || !m_symbol.Refresh()) return(false); //--- FreezeLevel -> for pending order and modification double freeze_level=m_symbol.FreezeLevel()*m_symbol.Point(); if(freeze_level==0.0) freeze_level=(m_symbol.Ask()-m_symbol.Bid())*3.0; //--- StopsLevel -> for TakeProfit and StopLoss double stop_level=m_symbol.StopsLevel()*m_symbol.Point(); if(stop_level==0.0) stop_level=(m_symbol.Ask()-m_symbol.Bid())*3.0; if(freeze_level<=0.0 || stop_level<=0.0) return(false); level=(freeze_level>stop_level)?freeze_level:stop_level; double spread=m_symbol.Spread()*m_symbol.Point()*3.0; level=(level>spread)?level:spread; //--- return(true); }
Главная функция - Trailing
Для работы с позицией, эту позицию сначала нужно выбрать. Чтобы выбрать позицию нужно обойти все позиции
for(int i=PositionsTotal()-1; i>=0; i--) // returns the number of open positions if(m_position.SelectByIndex(i)) if(m_position.Symbol()==m_symbol.Name())
Торговая панель, с возможностью использования в тестере.
Bollinger Band Two MA and Zig-Zag 2Модификация первой версии "Bollinger Band Two MA and Zig-Zag"
Трейлинг по Equity. Расчёты в деньгах депозита (не в процентах!). Работа с глобальными переменными терминала
Currency v1.0Скрипт формирует массив всех возможный торговых пар из 182 сочетаний валют