Индикаторы: RSI. Просто RSI.

 

RSI. Просто RSI.:

Классическая реализация индикатора на основе формулы из книги Ч.Лебо и Д.Лукаса "Компьютерный анализ фьючерсных рынков".

Author: Лёха

 

Набросал простого советника торговля только одним ордером, без доливок и мартинов и прогнал по истории за этот год минимальным лотом ( azzx_ema_rsi_1_0), результат положительный, автору Респект и оценка 10+


 
BeerGod:

Набросал простого советника торговля только одним ордером, без доливок и мартинов и прогнал по истории за этот год минимальным лотом ( azzx_ema_rsi_1_0), результат положительный, автору Респект и оценка 10+

Рад, что понравилось, хотя качество моделирования, имхо, совсем уж никакое для H1.
 
BeerGod:

Набросал простого советника торговля только одним ордером, без доливок и мартинов и прогнал по истории за этот год минимальным лотом ( azzx_ema_rsi_1_0), результат положительный, автору Респект и оценка 10+

А можно этого советника посмотреть ? Можете например в кометах его выложить, если он не большой.
 
BeerGod:

Набросал простого советника торговля только одним ордером, без доливок и мартинов и прогнал по истории за этот год минимальным лотом ( azzx_ema_rsi_1_0), результат положительный, автору Респект и оценка 10+



а в советнике только этот индикатор используется?

 
excelf:
BeerGod:

Набросал простого советника торговля только одним ордером, без доливок и мартинов и прогнал по истории за этот год минимальным лотом ( azzx_ema_rsi_1_0), результат положительный, автору Респект и оценка 10+

А можно этого советника посмотреть ? Можете например в кометах его выложить, если он не большой.


присоединяюсь к просьбе...
 
vdemon:
excelf:
BeerGod:

Набросал простого советника торговля только одним ордером, без доливок и мартинов и прогнал по истории за этот год минимальным лотом ( azzx_ema_rsi_1_0), результат положительный, автору Респект и оценка 10+

А можно этого советника посмотреть ? Можете например в кометах его выложить, если он не большой.


присоединяюсь к просьбе...

Поделиться советником невопрос, только на первом результате качество моделирования всего 25%, с более точным моделированием результат отличается, с начала лета советник топчется на месте, что будет с сентября неизвестно.


 

Сам код советника, на реал очень не рекомендую, настройки по умолчанию под 4х знак, может общими усилиями что то и получится толковое ? оптимально на EUR-USD H1

#property copyright "Scam Laboratory 2012" 
#property link      "http://www.forex4you.org/?affid=bdbda7b"
//=============== Меню ===============================================
extern string Name="RSI (12.08.2012)";
extern string MM = "Если risk>0, ММ от FreeMargin";
extern double risk = 0;                 // ММ 0.01 - итд.
extern int balans = 100;                // баланс реинвестирования, на каждую 100 депо будет умножатся лот на риск
extern double Lots = 0.01;              // теперь можно и микролоты 0.01 при этом если стоит 0.1 то следующий лот в серии будет 0.16
extern string Indicators="Параметры индикаторов";
extern int RSImax=60;
extern int RSImin=40;
extern string TradeManagement="Управление торговлей";
extern bool BUY = true;                 // разрешить BUY
extern bool SELL = true;                // разрешить SELL
extern int TakeProfit = 135;            // фиксированный профит
extern int StopLoss = 15;               // фиксированный стоп
extern int MinTP = 5;                   // минимальный виртуальный тейк профит 
extern int MinSL = 5;                   // минимальный виртуальный стоп лосс
extern string TradeTime="Время торговли (по ДЦ)";
extern int MondayStart = 0;             // открытие первой сделки в понедельник не раньше этого времени по ДЦ
extern int FridayStop = 20;             // не открываем позиции в пятницу после это времени по ДЦ, но закрываем
extern int FridayClose = 22;            // закрытие прибыльных позиций в пятницу в это время по ДЦ
extern string Magic="Магическое число";
extern int mn=888;                      // "магический номер" для отличия своих ордеров от чужих
extern string Server="Параметры сервера";
extern int Slippage=3;                  // допустимое проскальзование цены
extern int Pause = 5000;                // пауза в миллисекундах между запросами на сервер
//============== Переменные ==========================================
double RSI;                             // величина индикатора "azzx_ema_rsi_1_0"
double NewBuy;                          // сигнал открытия покупки
double NewSell;                         // сигнал открытия продажи
string GetNameOP="RSI";                 // комментарии в открытом ордере
double Trade;                           // разрешение или запрет работы
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
{
   if (!IsTesting())
   {
      if (IsExpertEnabled())
      {
         Comment("Советник будет запущен следующим тиком");
      }
      else 
      {
         Comment("Отжата кнопка \"Разрешить запуск советников\"");
      }
   }
      
   return (0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
{//0
//======== получение данных с индикатора =============================
{//1
RSI=iCustom(NULL,0,"azzx_ema_rsi_1_0",0,0);
RefreshRates();
}//1   
// ================= Обработка сигналов ==============================
{//2
if ((RSI<RSImin)&&(Minute()==15)) NewBuy=1; else NewBuy=0;
if ((RSI>RSImax)&&(Minute()==15)) NewSell=1; else NewSell=0;
// ======= вычисляем время торговли ======
// (воскресенье-0,1,2,3,4,5,6)
if((DayOfWeek() == 1 && Hour() >= MondayStart) ||DayOfWeek() == 2 || DayOfWeek() == 3 || DayOfWeek() == 4 || (DayOfWeek() == 5 && Hour() < FridayStop)) Trade = 1; else Trade = 0;
}//2
// ================= Открытие сделки =================================
{//3
// открытие BUY
if ((NewBuy == 1) && (ExistPositions() == false) && (Trade == 1) && (BUY==true))
   {
      OrderSend(Symbol(),OP_BUY,GetLots(),Ask,Slippage,0,0,GetNameOP,mn,0,Blue);
      Sleep (Pause);
      OrderModify(GetTicketLastPos(),OrderOpenPrice(),(Ask-Point*StopLoss),(Ask+Point*TakeProfit),0,Red);
   }
// открытие Sell
if ((NewSell == 1) && (ExistPositions() == false) && (Trade == 1) && (SELL==true))
   {
      OrderSend(Symbol(),OP_SELL,GetLots(),Bid,Slippage,0,0,GetNameOP,mn,0,OrangeRed);
      Sleep (Pause);
      OrderModify(GetTicketLastPos(),OrderOpenPrice(),(Bid+Point*StopLoss),(Bid-Point*TakeProfit),0,Red);
   }
}//3
// ================= Закрытие сделки ==================================
{//4
if (NewBuy == 1) 
   {
      ClossAllProfitSell ();
      ClossAllLossSell();
      Sleep(Pause);
   }
if (NewSell == 1) 
   {
      ClossAllProfitBuy ();
      ClossAllLossBuy();
      Sleep(Pause);
   }
if (DayOfWeek() == 5 && Hour() >= FridayClose) // закрываем в пятницу вечером все прибыльные ордера
   {
      ClossAllProfitBuy ();
      ClossAllProfitSell ();
      Sleep(Pause);
   }
}//4
// ====== Получение данных по истории пунктов закрытых позиций ========
{//5
   {
      if (!IsTesting())
         if (OrdClose_b() != 0) // исключаем деление на ноль
        { 
           int OrdClose=OrdClose_b();
           double PointProfit=PointProfit_b()/1;
           double OrdPoint=NormalizeDouble(PointProfit/OrdClose,1);
        }
   }
}//5
// ================= Комментарии ======================================
{//6
if (!IsTesting())
   {
     Comment("BrokerTime=", Hour() + ":" + Minute()," Market-ордеров=",OrdClose," шт."," Общая прибыль=",PointProfit," пп."," Удельная прибыль=",OrdPoint," пп./орд.");    // Комментарий в угол окна  
   }
}//6
//-END
   return(0);
}//0
//+-------------------------------------------------------------------+
// ================= Функции ==========================================
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 06.03.2008                                                     |
//|  Описание : Возвращает флаг существования позиций                          |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//|    ot - время открытия             ( 0   - любое время открытия)           |
//+----------------------------------------------------------------------------+
bool ExistPositions(string sy="", int op=-1, datetime ot=0) {
  int i, k=OrdersTotal();
 
  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (ot<=OrderOpenTime()) return(True);
            }
          }
        }
      }
    }
  }
  return(False);
}
//END
//+------------------------------------------------------------------+
//|                 Закрыть прибыльные ордера                        |
//+------------------------------------------------------------------+
// ====================== Закрыть BUY в профите ===============================
double ClossAllProfitBuy ()
{
   int Profit1=MinTP;
   int col1=Lime;
   int ask1, bid1, open1;
   double point1;
   for (int i1=OrdersTotal()-1; i1>=0; i1--)
   {
      if (!OrderSelect(i1,SELECT_BY_POS,MODE_TRADES)) break;
      if ((OrderType()==OP_BUY) && (OrderMagicNumber()==mn))
      {
         point1=MarketInfo(Symbol(),MODE_POINT);
         if (point1==0) break;
         bid1=MathRound(MarketInfo(OrderSymbol(),MODE_BID)/point1);
         open1=MathRound(OrderOpenPrice()/point1);
         if (bid1-open1<Profit1) continue;
         OrderClose(OrderTicket(),OrderLots(),bid1*point1,Slippage,col1);
      }
   }
}
// End
// ====================== Закрыть SELL в профите ===============================
double ClossAllProfitSell ()
{
   int Profit2=MinTP;
   int col2=Lime;
   int ask2, bid2, open2;
   double point2;
   for (int i2=OrdersTotal()-1; i2>=0; i2--)
   {
      if (!OrderSelect(i2,SELECT_BY_POS,MODE_TRADES)) break;
      if ((OrderType()==OP_SELL) && (OrderMagicNumber()==mn))
      {
         point2=MarketInfo(Symbol(),MODE_POINT);
         if (point2==0) break;
         ask2=MathRound(MarketInfo(OrderSymbol(),MODE_ASK)/point2);
         open2=MathRound(OrderOpenPrice()/point2);
         if (open2-ask2<Profit2) continue;
         OrderClose (OrderTicket(),OrderLots(),ask2*point2,Slippage,col2) ;
      }
   }
}
// End
//+------------------------------------------------------------------+
//|                 Закрыть убыточные ордера                         |
//+------------------------------------------------------------------+
// ====================== Закрыть BUY в убытке ===============================
double ClossAllLossBuy()
{
   int Stop4=MinSL;
   int ask4, bid4, open4;
   double point4;
   for (int i4=OrdersTotal()-1; i4>=0; i4--)
   {
      if (!OrderSelect(i4,SELECT_BY_POS,MODE_TRADES)) break;
      if ((OrderType()==OP_BUY) && (OrderMagicNumber()==mn))
      {
         point4=MarketInfo(Symbol(),MODE_POINT);
         if (point4==0) break;
         bid4=MathRound(MarketInfo(Symbol(),MODE_BID)/point4);
         open4=MathRound(OrderOpenPrice()/point4);
         if (open4-bid4<Stop4) continue;
         OrderClose(OrderTicket(),OrderLots(),bid4*point4,Slippage,Red);
      }
   }
}
// End
// ====================== Закрыть SELL в убытке ===============================
double ClossAllLossSell()
{
   int Stop5=MinSL;
   int ask5, bid5, open5;
   double point5;
   for (int i5=OrdersTotal()-1; i5>=0; i5--)
   {
      if (!OrderSelect(i5,SELECT_BY_POS,MODE_TRADES)) break;
      if ((OrderType()==OP_SELL) && (OrderMagicNumber()==mn))
      {
         point5=MarketInfo(Symbol(),MODE_POINT);
         if (point5==0) break;
         ask5=MathRound(MarketInfo(Symbol(),MODE_ASK)/point5);
         open5=MathRound(OrderOpenPrice()/point5);
         if (ask5-open5<Stop5) continue;
         OrderClose (OrderTicket(),OrderLots(),ask5*point5,Slippage,Red);
      }
   }
}
// End
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает тикет последней открытой позиции или -1             |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
int GetTicketLastPos(string sy="", int op=-1) {
  datetime o;
  int      i, k=OrdersTotal(), r=-1;
  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (o<OrderOpenTime()) {
                o=OrderOpenTime();
                r=OrderTicket();
              }
            }
          }
        }
      }
    }
  }
  return(r);
}
// END
//+------------------------------------------------------------------+
//|    ММ Изменяем лот от свободных средств                          |
//+------------------------------------------------------------------+
double GetLots() {
double minlot = MarketInfo(Symbol(), MODE_MINLOT);
double maxlot = MarketInfo(Symbol(), MODE_MAXLOT);
if(risk!=0)
 {
 double lot = NormalizeDouble(AccountFreeMargin() * risk /100 / balans, 2);
 if(lot < minlot) lot = minlot; if(lot > maxlot) lot = maxlot;
 }
else lot=Lots; return(lot);} 
//=============== Подсчет количества пунтков ===============================//
//                                                                          //
//   int OrdClose=OrdClose_b();                                             //
//   double PointProfit=PointProfit_b();                                    //
//   double OrdPoint=NormalizeDouble(PointProfit/OrdClose,1);               //
//                                                                          //
//==========================================================================//
double PointProfit_b()
 {
  int i;
  double OrdOpenPrice=0;
  double OrdClosePrice=0;
  double OrdPrice=0;
  double MarketPoint=0;
  double PointProfit=0;  
  string SMB;
    
  for(i=OrdersHistoryTotal()-1;i>=0;i--)
   {
    if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) == true)
     {
      if((OrderType()==OP_BUY || OrderType()==OP_SELL) && (OrderMagicNumber()==mn))
       {
        if(OrdOpenPrice<OrderOpenPrice())
         {
          OrdOpenPrice=OrderOpenPrice();
         } 
        if(OrdClosePrice<OrderClosePrice())
         {
          OrdClosePrice=OrderClosePrice();
         } 
        if(OrderType()==OP_BUY) OrdPrice=OrdClosePrice-OrdOpenPrice;
        if(OrderType()==OP_SELL) OrdPrice=OrdOpenPrice-OrdClosePrice;
        SMB=OrderSymbol();
        MarketPoint=MarketInfo(SMB,MODE_POINT);
        PointProfit+=NormalizeDouble(OrdPrice/MarketPoint,0);
       }          
     }
    OrdOpenPrice=0;
    OrdClosePrice=0;
    OrdPrice=0; 
    MarketPoint=0;
   }
  return(PointProfit);
 }
 
int OrdClose_b()
 {
  int OrdClose=0;
  int i;
  for(i=OrdersHistoryTotal()-1;i>=0;i--)
   {
    if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) == true)
     {
      if((OrderType()==OP_BUY || OrderType()==OP_SELL) && (OrderMagicNumber()==mn))
       {
        OrdClose++;
       }          
     }
   }
  return(OrdClose);
 }
 //END
 

Пока что на демке так, но сделок мало ещё...


 
BeerGod:

Сам код советника, на реал очень не рекомендую, настройки по умолчанию под 4х знак, может общими усилиями что то и получится толковое ? оптимально на EUR-USD H1

Забавно. Это как раз мой "любимый" таймфрейм и пара. :) В основном проверку идей веду здесь, хотя на реале вот недавно поставил советники на M13 и M30 ещё - профит-фактор у них достаточный, чтобы приятно сгладить эквити (риск к депо, конечно, меньше, чем для H1).

А про сам индикатор - к сожалению, у меня нет достойных идей, как его задействовать. То, что демонстрирует ваш советник - это задействование в режиме "фильтра", а не базовой системы. Сомневаюсь, что вам удастся найти хоть мало-мальски устойчивые параметры советника (хотя код не смотрел, каюсь - слишком сложно для тестового советника, имхо).

 

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


//+------------------------------------------------------------------+
//|                                                     RSILight.mq4 |
//|                        Copyright 2012, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright 2012, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"
//=============== Меню ===============================================
extern double Lot = 0.01;
extern int RSImax=60;
extern int RSImin=40;
extern int TakeProfit = 20;
extern int StopLoss = 10;
//============== Переменные ==========================================
double RSI;
double NewBuy;
double NewSell;
string GetNameOP="RSI";
int t;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
{
//======== получение данных с индикатора =============================
   {//1
      RSI=iCustom(NULL,0,"azzx_ema_rsi_1_0",0,0);
      RefreshRates();
   }//1 
// ================= Обработка сигналов ==============================
   {//2
      if ((RSI<RSImin)&&(Minute()==15)) NewBuy=1; else NewBuy=0;
      if ((RSI>RSImax)&&(Minute()==15)) NewSell=1; else NewSell=0;
   }//2
// ================= Открытие сделки =================================
   {//3
// открытие BUY
      if (NewBuy == 1 && OrdersTotal() == 0)
         {
            t=OrderSend(Symbol(),OP_BUY,Lot,Ask,3,0,0,"RSI",0,0,Blue);
            Sleep (5000);
            OrderModify (t,OrderOpenPrice(),(Ask-Point*StopLoss),(Ask+Point*TakeProfit),0,Red);
         }
// открытие Sell
      if (NewSell == 1 && OrdersTotal()==0)
         {
            t=OrderSend(Symbol(),OP_SELL,Lot,Bid,3,0,0,"RSI",0,0,OrangeRed);
            Sleep (5000);
            OrderModify (t,OrderOpenPrice(),(Bid+Point*StopLoss),(Bid-Point*TakeProfit),0,Red);
          }
   }//3 
//END
return(0);
}
//+------------------------------------------------------------------+
Причина обращения: