Смотри, как бесплатно скачать роботов
Ищи нас в Telegram!
Ставь лайки и следи за новостями
Ставь лайки и следи за новостями
Интересный скрипт?
Поставь на него ссылку - пусть другие тоже оценят
Поставь на него ссылку - пусть другие тоже оценят
Понравился скрипт?
Оцени его работу в терминале MetaTrader 5
Оцени его работу в терминале MetaTrader 5
Code Block for "Trailing Stop" based on current market price. (Ask / Bid) - эксперт для MetaTrader 5
- Просмотров:
- 92
- Рейтинг:
- Опубликован:
-
Нужен робот или индикатор на основе этого кода? Закажите его на бирже фрилансеров Перейти на биржу
Этот блок кода работает, если вы используете либо стоп-лосс, либо нет.
Требования
- Вам необходимо включить файл "Trade.mqh" , чтобы получить доступ к классу CTrade, который позволяет работать с позициями и ордерами.
#include <Trade\Trade.mqh> // <<------------------------------------------ Включите этот файл "Trade.mqh" для доступа к классу CTrade
- Вам необходимо задать входной параметр, чтобы настроить расстояние трейлинга по своему усмотрению. Это не обязательно, но для удобства.
input double Traling_Step = 3.0;
- Для класса CTrade необходимо определить экземпляр. Имя может быть любым. Лучше всего поместить его после обработчика события OnInt .
- Затем нужно создать оператор if, который будет проверять, запущена ли в данный момент какая-либо позиция. Этот оператор вызывает функцию Check_TrailingStop(); для каждого тика. Это важно, так как советник должен отслеживать резкие и плавные движения. Не забудьте поместить это утверждение в начало обработчика события OnTick для корректной работы.
//+------------------------------------------------------------------+ //| Функция инициализации эксперта| //+------------------------------------------------------------------+ int OnInit() { //--- создайте таймер EventSetTimer(60); //--- return(INIT_SUCCEEDED); } CTrade trade; // <<------------------------------------------ Объявляем вызов "CTrade". Вы можете заменить "trade" win любым именем, которое вам нужно
void OnTick() { if(PositionsTotal() > 0) // вызывает функцию трейлинг-стопа для каждого тика, если есть/есть работающие позиции. { Check_TralingStop(); } }
- Вам нужно объявить пользовательскую функцию Check_TrailingStop(); ( в данном случае) , чтобы сделать все остальное. Вы можете использовать любое имя.
- Пользовательская функция перебирает все открытые позиции и отслеживает их на требуемое расстояние.
void Check_TralingStop() { int totalPositions = PositionsTotal(); for(int count =0; count < totalPositions; count++) { ulong TicketNo = PositionGetTicket(count); // Получите номер билета позиции, используя "индекс" позиции. if(PositionSelectByTicket(TicketNo)) // Выберите позицию, используя номер билета (мы уже выбрали номер билета). { if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY) // Проверка позиции Тип. { double openPrice = PositionGetDouble(POSITION_PRICE_OPEN); double stopLoss = PositionGetDouble(POSITION_SL); // <<-------------------Get Position Current Stop Loss double takeProfit = PositionGetDouble(POSITION_TP); double bidPrice = SymbolInfoDouble(_Symbol,SYMBOL_BID); ulong ticket = PositionGetTicket(count); double trailingLevel = NormalizeDouble(bidPrice - (Traling_Step * Point()),_Digits); if(stopLoss < openPrice) // Нет стоп-лосса - это правда. { if(bidPrice > openPrice && trailingLevel > openPrice) // Выполняется только один раз для каждой позиции. Устанавливает первый SL. trade.PositionModify(ticket,trailingLevel,takeProfit); // Измените трейлинг-стоп с помощью "CTrade.trade" } if(bidPrice > openPrice && trailingLevel > stopLoss) // проверьте, что трейлинг-уровень выше предыдущего уровня. { trade.PositionModify(ticket,trailingLevel,takeProfit); // Измените трейлинг-стоп с помощью "CTrade.trade" } } if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL) { double openPrice = PositionGetDouble(POSITION_PRICE_OPEN); double stopLoss = PositionGetDouble(POSITION_SL); double takeProfit = PositionGetDouble(POSITION_TP); double bidPrice = SymbolInfoDouble(_Symbol,SYMBOL_BID); double askPrice = SymbolInfoDouble(_Symbol,SYMBOL_ASK); ulong ticket = PositionGetTicket(count); double trailingLevel = NormalizeDouble(askPrice + (Traling_Step * Point()),_Digits); if(stopLoss < openPrice) // Нет стоп-лосса - это правда. { if(askPrice < openPrice && trailingLevel < openPrice) // Выполняется только один раз для каждой позиции. Устанавливает первый SL. trade.PositionModify(ticket,trailingLevel,takeProfit); // Измените трейлинг-стоп с помощью "CTrade.trade" } if(askPrice < openPrice && trailingLevel < stopLoss) // проверьте, что трейлинг-уровень выше предыдущего уровня. { trade.PositionModify(ticket,trailingLevel,takeProfit); // Измените трейлинг-стоп с помощью "CTrade.trade" } } } } }
Перевод с английского произведен MetaQuotes Ltd.
Оригинальная публикация: https://www.mql5.com/en/code/49021
ConvertServerTime
Функция для преобразования времени сервера из одного часового пояса брокера в другой.
Bollinger Bands Squeeze
Он сигнализирует о том, что период низкой волатильности на рынке скоро закончится, предвещая значительное движение цены.
Simple Code for Detect A "New Bar or New Candle " Received
Этот блок кода обнаруживает новый бар или новую свечу, когда он получен.
Logarithmic Moving Average
Логарифмическая скользящая средняя постоянно рассчитывает среднее логарифмическое значение самой высокой и самой низкой цены за период.