Поделитесь пожалуйста советником на внешнем индикаторе (mt5).

 

Добрый день уважаемые трейдеры!

Пытаюсь сделать торгового советника (mt5), посмотрел несколько видео на Ютубе, поискал здесь и на других ресурсах, но не нашел казалось-бы простой и давно уже сделанной кем-то вещи, а именно "советника на внешнем индикаторе".

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

Короче, есть много разных решений - но все они с какими-то причудами.

Поделитесь пожалуйста (у кого есть) готовым советником, который открывает и закрывает сделки по показаниям внешнего индикатора, показания берутся из буфера индикатора.

Индикатор в советнике будет использоваться этот "PA_oscillator" (https://www.mql5.com/ru/code/14332)

Нужно чтобы советник открывал BUY если зеленый столбик стал выше - 3, закрывал если красный столбик стал ниже - 2. Для SELL - аналогично, только наоборот.

За ранее большое спасибо за помощь!

PA_Oscillator
PA_Oscillator
  • www.mql5.com
Простейший осциллятор, показывающий скорость изменения индикатора MACD, выполненный в виде двухцветной гистограммы.
 
Санек:

Добрый день уважаемые трейдеры!

Пытаюсь сделать торгового советника (mt5), посмотрел несколько видео на Ютубе, поискал здесь и на других ресурсах, но не нашел казалось-бы простой и давно уже сделанной кем-то вещи, а именно "советника на внешнем индикаторе".

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

Короче, есть много разных решений - но все они с какими-то причудами.

Поделитесь пожалуйста (у кого есть) готовым советником, который открывает и закрывает сделки по показаниям внешнего индикатора, показания берутся из буфера индикатора.

Индикатор в советнике будет использоваться этот "PA_oscillator" (https://www.mql5.com/ru/code/14332)

Нужно чтобы советник открывал BUY если зеленый столбик стал выше - 3, закрывал если красный столбик стал ниже - 2. Для SELL - аналогично, только наоборот.

За ранее большое спасибо за помощь!

Открытие сделок только по закрытым барам, это условие стратегии. Если в вашей стратегии этого условия нет, то и определять открытие нового бара не надо и все проблемы решены.

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

И ещё об открытии нового бара: А если в какой-то момент условие будет выполнено, а затем цена пойдёт так, что столбик индикатора уменьшится по высоте, а сделка уже открылась? Ведь условие было выполнено в какой-то момент…

 
Alexey Viktorov #:

Открытие сделок только по закрытым барам, это условие стратегии. Если в вашей стратегии этого условия нет, то и определять открытие нового бара не надо и все проблемы решены.

Чтобы открывать сделки по данным индикатора, нужно в 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 я не могу найти, так чтобы прописать название индикаторов и указать параметры - такого нет
 
Санек #:
в вышеприведённом коде для 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, он умеет работать с кастумными индикаторами.

Причина обращения: