Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Пиши статьи, помогай другим разработчикам и зарабатывай
blade_runner
69
blade_runner 2016.08.21 17:21 
Я хотел бы прицепить сигналы RSI в советнике.

При пробитии уровня 30 снизу-вверх, на закрытии свечи[1] - покупка
При пробитии уровня 70 сверху вниз, на закрытии свечи[1] - продажа

Вот часть кода, который я нашёл в другом эксперте по RSI
double RSI0  = iRSI(NULL,0,period_RSI,PRICE_OPEN,0);
double RSI1  = iRSI(NULL,0,period_RSI,PRICE_OPEN,1);
if (RSI0 > buy_level && RSI1 < buy_level)
     OrderSend(Symbol(),OP_BUY,Lot,Ask,3,Open[1],0,NULL,0,0,clrRed);

if (RSI0 < sell_level && RSI1 > sell_level)
     OrderSend(Symbol(),OP_SELL,Lot,Bid,3,Open[1],0,NULL,0,0,clrBlue);

Скажите пожалуйста, будет ли он работать, сам недавно изучаю mql4, не сталкивался ещё с индикаторами)Спасибо
     
Vitalie Postolache
11622
Vitalie Postolache 2016.08.21 18:07  
Так прицепите к советнику и испытайте, вроде код работоспособный. Только в такой простой стратегии рыбы не будет, больше половины сигналов будут ложными или стоплосс сработает первым до достижения прибыли.
steemandlinux
32
steemandlinux 2016.08.21 18:18  
Этот iRSI максимум может коэффициент к вероятности сделки добавить или быть подтверждением.
blade_runner
69
blade_runner 2016.08.21 19:11  
evillive:
Так прицепите к советнику и испытайте, вроде код работоспособный. Только в такой простой стратегии рыбы не будет, больше половины сигналов будут ложными или стоплосс сработает первым до достижения прибыли.
я не только по нему буду открывать позицию,я его сделал как фильтр, если выложу код полностью, вы не посмотрите пожалуйста его, может посоветуйте что-нибудь
blade_runner
69
blade_runner 2016.08.21 19:52  
evillive:
Так прицепите к советнику и испытайте, вроде код работоспособный. Только в такой простой стратегии рыбы не будет, больше половины сигналов будут ложными или стоплосс сработает первым до достижения прибыли.
//Советник основан на медвежьем или бычьем поглощении свечного паттерна. Так же учитываеются объёмы и показания RSI




//+===============Внешние переменные====================+//

extern int    BeginHour    = 7;  //время начала работы советника
extern int    EndHour      = 19; //время окончания работы советника
extern int    Period_RSI   = 2;  //период RSI
extern int    slippage     = 0;  //проскальзывание
extern int    buy_level    = 30; //уровень покупки при пересечении линии по RSI
extern int    sell_level   = 70; //уровень продажи при пересечении линии по RSI
extern double Lot          = 0.1; //объём лота

//+=====================================================+//


//+===============Глобальные переменные================+//
int ticket1 = 0; //тикет ордера на покупку
int ticket2 = 0; //тикет ордера на продажу
double bullCandleSize1 = NormalizeDouble(Close[1] - Open[1],Digits()); // размер тела бычьей свечи по индексу 1
double bullCandeSize2 = NormalizeDouble(Close[2] - Open[2], Digits()); //размер телаа бычьей свечи по индексу 2
double bearCandleSize1 = NormalizeDouble(Open[1] - Close[1], Digits()); //размер тела медвежьей свечи по индексу 1
double bearCandleSize2 = NormalizeDouble(Open[2] - Close[2], Digits()); //размер тела медвежьей свечи по индексу 2
double RSI0  = iRSI(NULL,0,Period_RSI,PRICE_OPEN,0);
double RSI1  = iRSI(NULL,0,Period_RSI,PRICE_OPEN,1);
//+====================================================+//

void OnTick()
{
   
   //Начало работы советника
   if(Hour() >= BeginHour && Hour() < EndHour){ //Если наступает время работы советника, то можно работать
      //Проверяем условие на покупку
      if(Close[1] > Open[1] &&   //если свеча по индексу 1 бычья и...
         Close[2] < Open[2] &&   //если предыдущая свеча по индексу 2 медвежья и...
         bullCandleSize1 > bearCandleSize2 &&    //если размер тела бычьей свечи по индексу 1 больше размера медвежьей свечи по индексу 2 и..
         Volume[1] > Volume[2] &&              //если объём бычьей свечи по индексу 1 больше объёма медвежьей по индексу 2 и...
         (RSI0 > buy_level && RSI1 < buy_level)){  //если RSI пробивает уровень 30 снизу вверх на закрытии свечи 1
            //если настало время открытия новой свечи с индексом 0
            if(newBar()){
               ticket1 = OrderSend(Symbol(),OP_BUY,Lot,Ask,slippage,Open[1],0,NULL,0,0,clrRed); //открываем ордер на покупку
               if(ticket1 < 0)
                 Print("Ошибка открытия ордера");
               else
                 Print("Ордер успешно открыт");
            }
                
         }
      
      //Проверяем условие на продажу
      if(Close[1] < Open[1] &&   //если свеча по индексу 1 медвежье и..
         Close[2] > Open[2] &&   //если предыдущая свеча по индексу 2 бычья и...
         bearCandleSize1 > bullCandleSize1 &&   //если размер тела медвежьей свечи по индексу 1 больше размера бычьей свечи по индексу 2 и...
         Volume[1] > Volume[2] &&   //если объём медвежьей свечи по индексу 1 больше объёма бычьей по индексу 2 и...
         (RSI0 < sell_level && RSI1 > sell_level)){ //если RSI пробивает уровень 70 сверху вниз на закрытии свечи 1
            //если настало время открытия новой свечи с индексом 0
            if(newBar()){
               ticket2 = OrderSend(Symbol(), OP_SELL,Lot,Bid,slippage,Open[1],0,NULL,0,0,clrBlue); //открываем ордер на продажу
            if(ticket1 < 0)
               Print("Ошибк открытия ордера");
            else
               Print("Ордер успешно открыт");
            }
            
           
         }
   } 
   
}
    
   
//+============================================================================+//



//+=================================Начало функции newBar()=============================================================+//
//Данная функция распознаёт, когда открывается новая свеча с индексом 0
bool newBar()
{
 static datetime lastbar = 0;
  datetime curbar = Time[0];
   bool ret = lastbar != curbar;
   if(ret)
    lastbar = curbar;
   return(ret);
}
//+======================================================================================================================+//
Vitalie Postolache
11622
Vitalie Postolache 2016.08.21 20:58  

blade_runner: вы не посмотрите пожалуйста его, может посоветуйте что-нибудь

  1. Если результаты расчётов не будут применяться  в качестве котировки в ордере, нормализация не требуется.
  2. Советник не знает, когда закрываться по профиту. Или будете сидеть мониторить вручную? 
  3. Если предыдущая цена открытия примерно равна цене открытия текущей свечи (в пределах спреда), то ордер очень быстро закроется по стоплоссу, так и задумано?

blade_runner
69
blade_runner 2016.08.21 21:21  
evillive:

  1. Если результаты расчётов не будут применяться  в качестве котировки в ордере, нормализация не требуется.
  2. Советник не знает, когда закрываться по профиту. Или будете сидеть мониторить вручную? 
  3. Если предыдущая цена открытия примерно равна цене открытия текущей свечи (в пределах спреда), то ордер очень быстро закроется по стоплоссу, так и задумано?

Насчет первого не совсем понял 

Тейк профита я думал не ставить, так как не известно, сколько пройдёт свеча, сделка закрывается, когда закрывается свечка, на которой мы открывали ордер, то есть когда свеча[0] становится свечой[1].

 Ннет, так не задумано, я просто алгоритм придумал, надо его дорабатывать ещё..

Сколько же мелочей разных и нюансов))

Можно с вами в личке общаться,или только так?

Vitalie Postolache
11622
Vitalie Postolache 2016.08.22 20:33  
blade_runner:

Насчет первого не совсем понял 

Тейк профита я думал не ставить, так как не известно, сколько пройдёт свеча, сделка закрывается, когда закрывается свечка, на которой мы открывали ордер, то есть когда свеча[0] становится свечой[1].

 Ннет, так не задумано, я просто алгоритм придумал, надо его дорабатывать ещё..

Сколько же мелочей разных и нюансов))

Можно с вами в личке общаться,или только так?

Насчет первого в  строках

double bullCandleSize1 = NormalizeDouble(Close[1] - Open[1],Digits()); // размер тела бычьей свечи по индексу 1
...
double bearCandleSize2 = NormalizeDouble(Open[2] - Close[2], Digits()); //размер тела медвежьей свечи по индексу 2

  NormalizeDouble - вовсе не обязателен, результат ведь идет на сравнение, а не в ордер.

 Лишние функции - зло, тормозят исполнение, особенно когда кода не десяток строчек, а по паре тысяч.

А насчет закрытия сделки по закрытию свечи, в коде этого не было, потому и написал.

 Общаться лучше не форуме, может у кого ещё умные мысли появятся. 

/
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий