Добрый день уважаемые трейдеры!
Пытаюсь сделать торгового советника (mt5), посмотрел несколько видео на Ютубе, поискал здесь и на других ресурсах, но не нашел казалось-бы простой и давно уже сделанной кем-то вещи, а именно "советника на внешнем индикаторе".
Наверняка все знают о TradeLikeaPro, посмотрел видео от него на ютубе - но зачем он там определяет тренд? зачем делает открытие сделок только по закрытым барам? зачем столько лишних условий? - ведь нужно делать открытия и закрытия именно по показаниям внешнего индикатора, а индикатор может изменить свои показания пока формируется бар.
Короче, есть много разных решений - но все они с какими-то причудами.
Поделитесь пожалуйста (у кого есть) готовым советником, который открывает и закрывает сделки по показаниям внешнего индикатора, показания берутся из буфера индикатора.
Индикатор в советнике будет использоваться этот "PA_oscillator" (https://www.mql5.com/ru/code/14332)
Нужно чтобы советник открывал BUY если зеленый столбик стал выше - 3, закрывал если красный столбик стал ниже - 2. Для SELL - аналогично, только наоборот.
За ранее большое спасибо за помощь!
Открытие сделок только по закрытым барам, это условие стратегии. Если в вашей стратегии этого условия нет, то и определять открытие нового бара не надо и все проблемы решены.
Чтобы открывать сделки по данным индикатора, нужно в OnInit() получить хендл этого индикатора через функцию iCustom() и в коде советника копировать данные индикатора, сравнивать их с предыдущими показаниями и принимать решение.
И ещё об открытии нового бара: А если в какой-то момент условие будет выполнено, а затем цена пойдёт так, что столбик индикатора уменьшится по высоте, а сделка уже открылась? Ведь условие было выполнено в какой-то момент…
Открытие сделок только по закрытым барам, это условие стратегии. Если в вашей стратегии этого условия нет, то и определять открытие нового бара не надо и все проблемы решены.
Чтобы открывать сделки по данным индикатора, нужно в OnInit() получить хендл этого индикатора через функцию iCustom() и в коде советника копировать данные индикатора, сравнивать их с предыдущими показаниями и принимать решение.
И ещё об открытии нового бара: А если в какой-то момент условие будет выполнено, а затем цена пойдёт так, что столбик индикатора уменьшится по высоте, а сделка уже открылась? Ведь условие было выполнено в какой-то момент…
Большое спасибо за ответ! но я не так силен в программировании, понимаю общие принципы, но самостоятельно написать не получается даже по урокам.
Года два назад собрал советника на mt4, на форумах спрашивал что к чему - в итоге кусками кода собрал. Сейчас пытаюсь этот же советник собрать на mt5, вот код:
но как его под mt5 переделать??? не получается у меня
//+------------------------------------------------------------------+ //| My_Expert.mq4 | //| Copyright 2017, xbms, http://mql.su | //| mailto:xbms@mail.ru | //+------------------------------------------------------------------+ #property copyright "Copyright 2017, xbms" #property link "http://mql.su" #property version "1.00" #property strict //+------------------------------------------------------------------+ extern bool AllPositions = True; // Управлять всеми позициями extern bool ProfitTrailing = True; // Если True то тралить только профит extern int TrailingStop = 150; // Фиксированный размер трала extern int TrailingStep = 30; // Шаг трала extern bool UseSound = False; // Использовать звуковой сигнал extern string NameFileSound="expert.wav"; // Наименование звукового файла //+------------------------------------------------------------------+ extern double Lots = 0.01; extern int StopLoss = 100; extern int TakeProfit = 300; extern int Magic = 123; extern int Slippage = 5; extern string comment = "Robot-1"; //+------------------------------------------------------------------+ extern int MA_Period = 100; extern double MACDOpenLevel = 5; extern int fast_ema_period = 8; // период быстрой средней extern int slow_ema_period = 16; // период медленной средней extern int signal_period = 9; // период сигнальной линии //+------------------------------------------------------------------+ double BuySignal, SellSignal, BuySignalClose, SellSignalClose, SL, TP; int ticket; bool res; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { if (Digits == 3 || Digits == 5) { StopLoss *= 10; TakeProfit *= 10; Slippage *= 10; } return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ //================================================================ // (1, 0); - 1-е значение лот в индикаторе, 2-е значение бар // Путь к индюкам C:\Users\Begemot\AppData\Roaming\MetaQuotes\Terminal\287469DEA9630EA94D0715D755974F1B\MQL4\Indicators //========================== ОТКРЫТИЕ ОРДЕРОВ ================================================================ void OnTick() { if (CountBuy() == 0) { // Получаем сигнал на закрытие SELL BuySignalClose = (iCustom(NULL, 0, "t27_OsMA%", 7, 6, 13, 5, 0, 0)) > -80 && // t27_OsMA% больше -80 (iCustom(NULL, 0, "t27_OsMA%", 7, 6, 13, 5, 0, 0)) > (iCustom(NULL, 0, "t27_OsMA%", 7, 6, 13, 5, 0, 1)) ; if (BuySignalClose > 0) { // закрываем открытые ордера SELL CloseSell(); } // =======================открытие ордера BUY========================== BuySignal = (iCustom(NULL, 0, "CCI(6)", 0, 0)) > 70 && // CCI больше 30 //(iCustom(NULL, 0, "CCI(6)", 0, 0)) > (iCustom(NULL, 0, "CCI(6)", 0, 1)) && // CCI направлен вверх (iCustom(NULL, 0, "PA_Oscillator", 2, 0)) > 0.0020 && // зеленые // PA_Oscillator зеленый больше 0.0030 (iCustom(NULL, 0, "PA_Oscillator", 2, 0)) < 0.1 && // зеленые // PA_Oscillator меньше своего верхнего предела (iCustom(NULL, 0, "t27_OsMA%", 7, 6, 13, 5, 0, 0)) > -10 && // t27_OsMA% больше -30 (вверху) //(iCustom(NULL, 0, "Market\\CPM Extended", 1, "EUR", "EUR", "EURUSD.ffx", 1, 0)) > 5 && // Сила валюты больше 7 (iCustom(NULL, 0, "TMA_56", 0, 0)) > (iCustom(NULL, 0, "TMA_56", 0, 5)) && // тренд восходящий ( ((iCustom(NULL, 0, "Gator", 1, -5)) > 0.0001) || // Gator больше 0.00015 на -5-ом баре ((iCustom(NULL, 0, "Gator", 2, -5)) > 0.0001) || // Gator больше 0.00015 на -5-ом баре ((iCustom(NULL, 0, "Gator", 4, -5)) < -0.0001)|| // Gator меньше -0.00015 на -5-ом баре ((iCustom(NULL, 0, "Gator", 5, -5)) < -0.0001) // Gator меньше -0.00015 на -5-ом баре ) ; // если есть сигнал индикатора if (BuySignal > 0) { // закрываем открытые ордера SELL CloseSell(); // Open buy order // открываем ордер на покупку ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, comment, Magic, 0, Blue); // если ордер был успешно открыт, if (ticket > 0) { // то его необходимо выбрать, для дальнейшей установки ему StopLoss и TakeProfit if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES)) { // рассчитываем StopLoss и нормализуем цену SL = NormalizeDouble(Ask-StopLoss*Point, Digits); // рассчитываем TakeProfit и нормализуем цену TP = NormalizeDouble(Ask+TakeProfit*Point, Digits); // попытаемся установить ордеру рассчитанные уровни StopLoss и TakeProfit res = OrderModify(OrderTicket(), OrderOpenPrice(), SL, TP, 0); if (!res) // и если не удалось, то выведем сообщение в журнал регистрации для дальнейшего анализа причин Print("Ошибка модификации ордера на покупку, ASK=" + DoubleToStr(Ask) + ", SL=" + DoubleToStr(SL) + ", TP=" + DoubleToStr(TP)); } } } } if (CountSell() == 0) { // Получаем сигнал на закрытие BUY SellSignalClose = (iCustom(NULL, 0, "t27_OsMA%", 7, 6, 13, 5, 0, 0)) < -20 && // t27_OsMA% меньше -80 (внизу) (iCustom(NULL, 0, "t27_OsMA%", 7, 6, 13, 5, 0, 0)) < (iCustom(NULL, 0, "t27_OsMA%", 7, 6, 13, 5, 0, 1)) ; if (SellSignalClose > 0) { // закрываем открытые ордера BUY CloseBuy(); } // ==============================открытие ордера SELL============================== SellSignal = (iCustom(NULL, 0, "CCI(6)", 0, 0)) < -70 && // CCI меньше -30 //(iCustom(NULL, 0, "CCI(6)", 0, 0)) < (iCustom(NULL, 0, "CCI(6)", 0, 1)) && // CCI направлен вниз (iCustom(NULL, 0, "PA_Oscillator", 3, 0)) < -0.0020 && // красные // PA_Oscillator красный меньше -0.0020 (iCustom(NULL, 0, "PA_Oscillator", 3, 0)) > -0.1 && // красные // PA_Oscillator меньше своего нижнего предела (iCustom(NULL, 0, "t27_OsMA%", 7, 6, 13, 5, 0, 0)) < -90 && // t27_OsMA% меньше -80 (внизу) //(iCustom(NULL, 0, "Market\\CPM Extended", 1, "EUR", "EUR", "EURUSD.ffx", 1, 0)) < 5 && // Сила валюты меньше 4 (iCustom(NULL, 0, "TMA_56", 0, 0)) < (iCustom(NULL, 0, "TMA_56", 0, 5)) && // тренд нисходящий ( ((iCustom(NULL, 0, "Gator", 1, -5)) > 0.0001) || // Gator больше 0.00015 на -5-ом баре ((iCustom(NULL, 0, "Gator", 2, -5)) > 0.0001) || // Gator больше 0.00015 на -5-ом баре ((iCustom(NULL, 0, "Gator", 4, -5)) < -0.0001)|| // Gator меньше -0.00015 на -5-ом баре ((iCustom(NULL, 0, "Gator", 5, -5)) < -0.0001) // Gator меньше -0.00015 на -5-ом баре ) ; if (SellSignal > 0) { CloseBuy(); ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, comment, Magic, 0, Red); if (ticket > 0) { if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES)) { SL = NormalizeDouble(Bid+StopLoss*Point, Digits); TP = NormalizeDouble(Bid-TakeProfit*Point, Digits); res = OrderModify(OrderTicket(), OrderOpenPrice(), SL, TP, 0); if (!res) Print("Ошибка модификации ордера на продажу, BID=" + DoubleToStr(Bid) + ", SL=" + DoubleToStr(SL) + ", TP=" + DoubleToStr(TP)); } } } } } //========================== ЗАКРЫТИЕ ОРДЕРОВ ================================================================ //+------------------------------------------------------------------+ //| Фукнция закрывает все ордера на покупку, находящиеся в рынке | //+------------------------------------------------------------------+ void CloseBuy() { // объявляем цикл, в котором выполним перебор все ордеров // находящихся в рынке for(int index = OrdersTotal()-1; index >= 0; index--) { // если удалось выбрать рыночный ордер if (OrderSelect(index, SELECT_BY_POS, MODE_TRADES)) { // если валютная пара ордера, магический номер ордера и тип ордера совпадают // с тем, что нам необходимо, if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_BUY) // то пробуем закрыть ордер по рыночной цене if (!OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), Slippage, Black)) // иначе выводим в журнал регистрации сообщение об ошибке Print("Ошибка закрытия ордера на покупку, ticket = " + DoubleToStr(OrderTicket())); } } } //+------------------------------------------------------------------+ //| Фукнция закрывает все ордера на продажу, находящиеся в рынке | //+------------------------------------------------------------------+ void CloseSell() { // объявляем цикл, в котором выполним перебор все ордеров // находящихся в рынке for(int index = OrdersTotal()-1; index >= 0; index--) { // если удалось выбрать рыночный ордер if (OrderSelect(index, SELECT_BY_POS, MODE_TRADES)) { // если валютная пара ордера, магический номер ордера и тип ордера совпадают // с тем, что нам необходимо, if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_SELL) if (!OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), Slippage, Black)) Print("Ошибка закрытия ордера на продажу, ticket = " + DoubleToStr(OrderTicket())); } } } //+------------------------------------------------------------------+ //| Функция возвращает количество ордеров на покупку | //| находящихся в рынке | //+------------------------------------------------------------------+ int CountBuy() { // объявляем переменную, в которой будем хранить количество ордеров // с типом OP_BUY int count = 0; // Объявляем цикл с перебором ордеров for (int trade = OrdersTotal() - 1; trade >= 0; trade--) { // Если удалось выбрать ордер, находящийся в рынке if (OrderSelect(trade, SELECT_BY_POS, MODE_TRADES)) { // у этого ордера совпадает валютная пара и его магический номер if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic) { // а также ордер является ордером на покупку, if (OrderType() == OP_BUY) // то увеличиваем значение счётчика count на единицу count++; } } } // возвращаем количество ордеров на покупку return (count); } //+------------------------------------------------------------------+ //| Функция возвращает количество ордеров на продажу | //| находящихся в рынке | //+------------------------------------------------------------------+ int CountSell() { int count = 0; for (int trade = OrdersTotal() - 1; trade >= 0; trade--) { if (OrderSelect(trade, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic) { if (OrderType() == OP_SELL) count++; } } } //---------------------------------------------код трала------------------------------------------------ for(int i=0; i<OrdersTotal(); i++) { if(OrderSelect(i,SELECT_BY_POS, MODE_TRADES)) { if(AllPositions || OrderSymbol()==Symbol()) { TrailingPositions(); } } } return (count); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| Сопровождение позиции простым тралом | //+------------------------------------------------------------------+ void TrailingPositions() { double pBid,pAsk,pp; pp=MarketInfo(OrderSymbol(),MODE_POINT); if(OrderType()==OP_BUY) { pBid=MarketInfo(OrderSymbol(),MODE_BID); if(!ProfitTrailing || (pBid-OrderOpenPrice())>TrailingStop*pp) { if(OrderStopLoss()<pBid-(TrailingStop+TrailingStep-1)*pp) { ModifyStopLoss(pBid-TrailingStop*pp); return; } } } if(OrderType()==OP_SELL) { pAsk=MarketInfo(OrderSymbol(),MODE_ASK); if(!ProfitTrailing || OrderOpenPrice()-pAsk>TrailingStop*pp) { if(OrderStopLoss()>pAsk+(TrailingStop+TrailingStep-1)*pp || OrderStopLoss()==0) { ModifyStopLoss(pAsk+TrailingStop*pp); return; } } } } //+------------------------------------------------------------------+ //| Перенос уровня StopLoss | //| Параметры: | //| ldStopLoss - уровень StopLoss | //+------------------------------------------------------------------+ void ModifyStopLoss(double ldStopLoss) { bool fm; fm=OrderModify(OrderTicket(),OrderOpenPrice(),ldStopLoss,OrderTakeProfit(),0,CLR_NONE); if(fm && UseSound) PlaySound(NameFileSound); } //+------------------------------------------------------------------+ //----------------------------------конец кода трала------------------------------------
в вышеприведённом коде для mt4 всё понятно, в нужных местах просто прописываются индикаторы и их параметры при которых происходит открытие и закрытие, а вот подобного советника для mt5 я не могу найти, так чтобы прописать название индикаторов и указать параметры - такого нет
Ну почему нет? Вот мой код. Это из OnInit() получение хендлов индикаторов.
handle.ATR=iATR(_Symbol,workingPeriod,period_ATR); handle.MA_ATR=iMA(_Symbol,workingPeriod,period_MA_ATR,0,MODE_SMA,handle.ATR); handle.MA_CHART=iMA(_Symbol,workingPeriod,period_MA_CHART,0,MODE_SMA,PRICE_CLOSE);
Разница только в том, что в этом советнике используются стандартные индикаторы, а вам нужен пользовательский. Но и такие в CodeBase имеются в огромном количестве.
Дальше в OnTick() получаем значения индикаторов
CopyBuffer(handle.ATR, 0, 0, 3, ind_date.ATR); CopyBuffer(handle.MA_ATR, 0, 0, 3, ind_date.MA_ATR); CopyBuffer(handle.MA_CHART, 0, 0, 3, ind_date.MA_CHART);
Добрый день уважаемые трейдеры!
Пытаюсь сделать торгового советника (mt5), посмотрел несколько видео на Ютубе, поискал здесь и на других ресурсах, но не нашел казалось-бы простой и давно уже сделанной кем-то вещи, а именно "советника на внешнем индикаторе".
Наверняка все знают о TradeLikeaPro, посмотрел видео от него на ютубе - но зачем он там определяет тренд? зачем делает открытие сделок только по закрытым барам? зачем столько лишних условий? - ведь нужно делать открытия и закрытия именно по показаниям внешнего индикатора, а индикатор может изменить свои показания пока формируется бар.
Короче, есть много разных решений - но все они с какими-то причудами.
Поделитесь пожалуйста (у кого есть) готовым советником, который открывает и закрывает сделки по показаниям внешнего индикатора, показания берутся из буфера индикатора.
Индикатор в советнике будет использоваться этот "PA_oscillator" (https://www.mql5.com/ru/code/14332)
Нужно чтобы советник открывал BUY если зеленый столбик стал выше - 3, закрывал если красный столбик стал ниже - 2. Для SELL - аналогично, только наоборот.
За ранее большое спасибо за помощь!
Поделитесь пожалуйста (у кого есть) готовым советником, который открывает и закрывает сделки по показаниям внешнего индикатора, показания берутся из буфера индикатора.
Индикатор в советнике будет использоваться этот "PA_oscillator" (https://www.mql5.com/ru/code/14332)
Нужно чтобы советник открывал BUY если зеленый столбик стал выше - 3, закрывал если красный столбик стал ниже - 2. Для SELL - аналогично, только наоборот.
Найдите в маркете мой бесплатный CommunityPower EA, он умеет работать с кастумными индикаторами.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Добрый день уважаемые трейдеры!
Пытаюсь сделать торгового советника (mt5), посмотрел несколько видео на Ютубе, поискал здесь и на других ресурсах, но не нашел казалось-бы простой и давно уже сделанной кем-то вещи, а именно "советника на внешнем индикаторе".
Наверняка все знают о TradeLikeaPro, посмотрел видео от него на ютубе - но зачем он там определяет тренд? зачем делает открытие сделок только по закрытым барам? зачем столько лишних условий? - ведь нужно делать открытия и закрытия именно по показаниям внешнего индикатора, а индикатор может изменить свои показания пока формируется бар.
Короче, есть много разных решений - но все они с какими-то причудами.
Поделитесь пожалуйста (у кого есть) готовым советником, который открывает и закрывает сделки по показаниям внешнего индикатора, показания берутся из буфера индикатора.
Индикатор в советнике будет использоваться этот "PA_oscillator" (https://www.mql5.com/ru/code/14332)
Нужно чтобы советник открывал BUY если зеленый столбик стал выше - 3, закрывал если красный столбик стал ниже - 2. Для SELL - аналогично, только наоборот.
За ранее большое спасибо за помощь!