[Архив!] ПИШЕМ СОВЕТНИКА ВМЕСТЕ!!! - страница 3

 
dmmikl86 >>:

можно открываться на дневках и потом поддягивать стоп по нижним фракталам меньшего ТФ

Поигрался)

добавил трейлинг по фракталам.


еще немного и грааль :D

Файлы:
gena.mq4  5 kb
 


//+-----------------------------------------------------------------------+
//|                                                              Gena.mq4 |
//+-----------------------------------------------------------------------+
// Описание ТС
// 1. Открытие позиций происходит при пробитии High или Low предыдущего дня
//    SL ставиться на High или Low текущего дня, TP выставляется во внешних переменных, 
//    единственная оговорка не более 1 позиции в день в переменной LastTradeTime 
//    если в ней нет необходимост смело сносите /RomanS/
// 2.
// 3.
// 4.
// 5.
 
// Внешние переменные
extern double TakeProfit = 4000;

extern string vybor_perioda ="1;5;15;30;60;240;1440";
extern int period = 1440;

extern int Fractals_TF = 240;
//extern
double Lots = 0.1;
// Глобальные переменные
int LastTradeTime = 0;      // Время последней открытой сделки
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
  // Поехали... :)
int start() 
 {
//+----фсяки разны значения, индикаторы и т.д. и т.п. :)
double SL=0,TP=0,
Spread=Ask-Bid,
StopLevel=Point*MarketInfo(Symbol(),MODE_STOPLEVEL);
int per;
switch(period)
{
case 1440:  per=PERIOD_D1; 	break;
case 240:   per=PERIOD_H4; 	break;
case 60:    per=PERIOD_H1; 	break;
case 30:    per=PERIOD_M30; 	break;
case 15:    per=PERIOD_M15; 	break;
case 5:     per=PERIOD_M5; 	break;
case 1:     per=PERIOD_M1; 	break;
default:    per=0; 		break;
}

HighD1=iHigh(Symbol(),per,1),
LowD1=iLow(Symbol(),per,1);
//----Критерии открытия позиций
bool Open_Bay=false,Open_Sell=false;
if(Bid > HighD1+0.5*Point) Open_Bay = true; 
if(Bid < LowD1-0.5*Point) Open_Sell = true;
//----Проверяем нужно ли торговать :)// Закрытие позиции// Модификация ордера
int Ticket,cnt,Total=0;
for(cnt=0;cnt<OrdersTotal();cnt++)
   {
   OrderSelect(cnt,SELECT_BY_POS);
   if(OrderSymbol()==Symbol())
      {
      Total++;
      if(OrderType()==OP_BUY)// long position is opened
         {
         SL=LowerFractal();
         if(SL-0.5*Point>OrderStopLoss()
         && SL-0.5*Point>OrderOpenPrice()
         && Bid-SL>StopLevel+0.5*Point)
            {
            OrderModify(OrderTicket(),OrderOpenPrice(),SL,OrderTakeProfit(),0);
            return(0);
            }
         }
//--------
      if(OrderType()==OP_SELL)// Short position is opened
         {
         SL=UpperFractal();
         if(SL+0.5*Point<OrderStopLoss()
         && SL+0.5*Point<OrderOpenPrice()
         && SL-Ask>StopLevel+0.5*Point)
            {
            OrderModify(OrderTicket(),OrderOpenPrice(),SL,OrderTakeProfit(),0);
            return(0);
            }
         }
      }
   }
//+----Открытие позиций
int TradeTime=TimeDay(TimeCurrent());
if(Total<1 && LastTradeTime!=TradeTime)
   {
   if(Open_Bay)
      {      
      //SL = LowerFractal();
      SL = iLow(NULL,PERIOD_D1,0);
      if(TakeProfit>0) TP = Ask + TakeProfit*Point;
      if(Bid-SL<StopLevel-0.5*Point) return(0);  // проверяем минимальный уровень стопов
      //Alert("Пробуем открыть Buy ",SYMBOL, " по ",ASK, SL, TP);         
      Ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,20,SL,TP);
      if (Ticket > 0)                                                  
         {            
         //Alert ("Открыт ордер Buy ",Ticket);
         LastTradeTime=TradeTime; // задаем время сделки, чтобы сегодня больше не торговать 
         }     
      return(0);
      }
//+----
   if(Open_Sell)
      {      
      //SL = UpperFractal()+Spread;
      SL = iHigh(NULL,PERIOD_D1,0)+Spread;
      if(TakeProfit>0) TP = Bid - TakeProfit*Point;
      if (SL-Ask<StopLevel-0.5*Point) return(0); // проверяем минимальный уровень стопов
      Ticket = OrderSend(Symbol(),OP_SELL,Lots,Bid,20,SL,TP);
      if (Ticket > 0)                                                  
         { 
         //Alert ("Открыт ордер Sell ",Ticket);
         LastTradeTime=TradeTime;  // задаем время сделки, чтобы сегодня больше не торговать
         }         
      }
   }
  return(0);
 }
//+------------------------------------------------------------------+
double LowerFractal()
   {
   for(int i=3;i<iBars(NULL,Fractals_TF)-3;i++)
      {
      double Fractal=iFractals(NULL,Fractals_TF,MODE_LOWER,i);
      if(Fractal!=0.0) return(Fractal);
      }
   }
//+-----
double UpperFractal()
   {
   for(int i=3;i<iBars(NULL,Fractals_TF)-3;i++)
      {
      double Fractal=iFractals(NULL,Fractals_TF,MODE_UPPER,i);
      if(Fractal!=0.0) return(Fractal);
      }
   }
//+-----
 
gince >>:

Только наверное Fractals_TF  должен именятся

 
gince >>:

Только наверное Fractals_TF  должен именятся

//+-----------------------------------------------------------------------+
//|                                                              Gena.mq4 |
//+-----------------------------------------------------------------------+
// ???????? ??
// 1. ???????? ??????? ?????????? ??? ???????? High ??? Low ??????????? ???
//    SL ????????? ?? High ??? Low ???????? ???, TP ???????????? ?? ??????? ??????????, 
//    ???????????? ???????? ?? ????? 1 ??????? ? ???? ? ?????????? LastTradeTime 
//    ???? ? ??? ??? ???????????? ????? ??????? /RomanS/
// 2.
// 3.
// 4.
// 5.
 
// ??????? ??????????
extern double TakeProfit = 4000;

extern string vybor_perioda ="1;5;15;30;60;240;1440";
extern int period = 1440;

extern int fract = 240;
//extern
double Lots = 0.1;
// ?????????? ??????????
int LastTradeTime = 0;      // ????? ????????? ???????? ??????
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
  // ???????... :)
int start() 
 {
//+----????? ????? ????????, ?????????? ? ?.?. ? ?.?. :)
double SL=0,TP=0,
Spread=Ask-Bid,
StopLevel=Point*MarketInfo(Symbol(),MODE_STOPLEVEL);
int per;
switch(period)
{
case 1440:  per=PERIOD_D1; fract=240;break;
case 240:   per=PERIOD_H4; fract=60;break;
case 60:    per=PERIOD_H1; fract=30;break;
case 30:    per=PERIOD_M30;fract=15;break;
case 15:    per=PERIOD_M15;fract=5;break;
case 5:     per=PERIOD_M5; fract=1;break;
default:    per=0; 		break;
}

double _High=iHigh(Symbol(),per,1);
double _Low=iLow(Symbol(),per,1);
//----???????? ???????? ???????
bool Open_Bay=false,Open_Sell=false;
if(Bid > _High+0.5*Point) Open_Bay = true; 
if(Bid < _Low-0.5*Point) Open_Sell = true;
//----????????? ????? ?? ????????? :)// ???????? ???????// ??????????? ??????
int Ticket,cnt,Total=0;
for(cnt=0;cnt<OrdersTotal();cnt++)
   {
   OrderSelect(cnt,SELECT_BY_POS);
   if(OrderSymbol()==Symbol())
      {
      Total++;
      if(OrderType()==OP_BUY)// long position is opened
         {
         SL=LowerFractal(fract);
         if(SL-0.5*Point>OrderStopLoss()
         && SL-0.5*Point>OrderOpenPrice()
         && Bid-SL>StopLevel+0.5*Point)
            {
            OrderModify(OrderTicket(),OrderOpenPrice(),SL,OrderTakeProfit(),0);
            return(0);
            }
         }
//--------
      if(OrderType()==OP_SELL)// Short position is opened
         {
         SL=UpperFractal(fract);
         if(SL+0.5*Point<OrderStopLoss()
         && SL+0.5*Point<OrderOpenPrice()
         && SL-Ask>StopLevel+0.5*Point)
            {
            OrderModify(OrderTicket(),OrderOpenPrice(),SL,OrderTakeProfit(),0);
            return(0);
            }
         }
      }
   }
//+----???????? ???????
int TradeTime=TimeDay(TimeCurrent());
if(Total<1 && LastTradeTime!=TradeTime)
   {
   if(Open_Bay)
      {      
      //SL = LowerFractal();
      SL = iLow(NULL,PERIOD_D1,0);
      if(TakeProfit>0) TP = Ask + TakeProfit*Point;
      if(Bid-SL<StopLevel-0.5*Point) return(0);  // ????????? ??????????? ??????? ??????
      //Alert("??????? ??????? Buy ",SYMBOL, " ?? ",ASK, SL, TP);         
      Ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,20,SL,TP);
      if (Ticket > 0)                                                  
         {            
         //Alert ("?????? ????? Buy ",Ticket);
         LastTradeTime=TradeTime; // ?????? ????? ??????, ????? ??????? ?????? ?? ????????? 
         }     
      return(0);
      }
//+----
   if(Open_Sell)
      {      
      //SL = UpperFractal()+Spread;
      SL = iHigh(NULL,PERIOD_D1,0)+Spread;
      if(TakeProfit>0) TP = Bid - TakeProfit*Point;
      if (SL-Ask<StopLevel-0.5*Point) return(0); // ????????? ??????????? ??????? ??????
      Ticket = OrderSend(Symbol(),OP_SELL,Lots,Bid,20,SL,TP);
      if (Ticket > 0)                                                  
         { 
         //Alert ("?????? ????? Sell ",Ticket);
         LastTradeTime=TradeTime;  // ?????? ????? ??????, ????? ??????? ?????? ?? ?????????
         }         
      }
   }
  return(0);
 }
//+------------------------------------------------------------------+
double LowerFractal(int fract)
   {
int Fractals_TF;
 Fractals_TF=fract;
   for(int i=3;i<iBars(NULL,Fractals_TF)-3;i++)
      {
      double Fractal=iFractals(NULL,Fractals_TF,MODE_LOWER,i);
      if(Fractal!=0.0) return(Fractal);
      }
   }
//+-----
double UpperFractal(int fract)
   {
   int Fractals_TF;
 Fractals_TF=fract;
   for(int i=3;i<iBars(NULL,Fractals_TF)-3;i++)
      {
      double Fractal=iFractals(NULL,Fractals_TF,MODE_UPPER,i);
      if(Fractal!=0.0) return(Fractal);
      }
   }
//+-----
 
sayfuji >>:

думаю, корректно опираться на следующие вещи:

- характер движения внутри пробойного диапазона, и настроения перед пробоем(что менее важно)

- общая тенденция, возможно на большем ТФ.

Касаемо последнего, попробуйте сплясать от Параболика, может поможет.

Написал... Результат оказался хуже изначальнго.... проф. фактор всего 1,31 после оптимизации :(

Думаю в данной системе более целесообразно использовать осцилляторы

//+-----------------------------------------------------------------------+
//|                                                     Крокодил ГЕНА.mq4 |
//|                                                         Крокодил ГЕНА |
//+-----------------------------------------------------------------------+
// Описание ТС
// 1. Открытие позиций происходит при пробитии High или Low предыдущего дня
//    SL ставиться на High или Low текущего дня, TP выставляется во внешних переменных, 
//    единственная оговорка не более 1 позиции в день в переменной LastTradeTime 
//    если в ней нет необходимости смело сносите /RomanS/
// 2. Добавил к условию открытия трендовый параболик + трал. стоп по нему же на М5. 
//    Результат оказался хуже :( /RomanS/
// 3.
// 4.
// 5.
 
  // Внешние переменные
  extern double TakeProfit = 900;
  extern double SAR_steep  = 0.0005;
  extern double Lot        = 1;    
  extern string SYMBOL     = "EURUSD";
  
  // Глобальные переменные
  int LastTradeTime = 0;      // Время последней открытой сделки
  
  // Поехали... :)
  int start() 
  {  
     int Ticket;
  double BID,
         ASK,
         SL=0,
         TP=0;                                  
    bool Trade     = true,
         Open_Bay  = false,
         Open_Sell = false;

  // Проверяем можно ли торговать
  if (Trade==true) 
   {
   
  // Критерии открытия позиций
    ASK = MarketInfo(SYMBOL,10);
    BID = MarketInfo(SYMBOL,9);
    if (BID > iHigh (SYMBOL,PERIOD_D1,1) && iSAR(SYMBOL,PERIOD_M5,SAR_steep,0.2,0)<BID) Open_Bay = true; 
    if (BID < iLow (SYMBOL,PERIOD_D1,1) && iSAR(SYMBOL,PERIOD_M5,SAR_steep,0.2,0)>BID) Open_Sell = true;
        
  // Открытие позиций
      if (Open_Bay == true && OrdersTotal()==0 && TimeDay(TimeCurrent())!=LastTradeTime)                                           
        {      
         RefreshRates(); 
          SL = iLow(SYMBOL,PERIOD_D1,0);
          TP = ASK + TakeProfit*Point;
          if ((ASK-SL)/Point<MarketInfo(SYMBOL,14)) return;  // проверяем минимальный уровень стопов
          Alert("Пробуем открыть Buy ",SYMBOL, " по ",ASK, SL, TP);         
          Ticket=OrderSend(SYMBOL,OP_BUY,Lot,ASK,20,SL,TP);         
           if (Ticket > 0)                                                  
            {            
             Alert ("Открыт ордер Buy ",Ticket);
             LastTradeTime=TimeDay(TimeCurrent()); // задаем время сделки, чтобы сегодня больше не торговать 
             return;                                                       
            }         
        }
     if (Open_Sell == true && OrdersTotal()==0 && TimeDay(TimeCurrent())!=LastTradeTime)                                             
        {      
         RefreshRates();                                             
          SL = iHigh (SYMBOL,PERIOD_D1,0);
          TP = BID - TakeProfit*Point;
          if ((SL-BID)/Point<MarketInfo(SYMBOL,14)) return; // проверяем минимальный уровень стопов
          Ticket = OrderSend(SYMBOL,OP_SELL,Lot,BID,20,SL,TP);         
           if (Ticket > 0)                                                  
             { 
              Alert ("Открыт ордер Sell ",Ticket);
              LastTradeTime=TimeDay(TimeCurrent());  // задаем время сделки, чтобы сегодня больше не торговать
              return;                                   
             }         
          return;                                                       
        }
   
   // Закрытие позиции
   // .......
   
   // Модификация ордера
    for(int i=0; i<=OrdersTotal(); i++)      
      {  
       if (OrderSelect(i,SELECT_BY_POS)==true)     
         {                                       
         if (OrderSymbol()!=SYMBOL) continue;    
          if (OrderType() == 0)                                                    
            {               
             double TralStop = iSAR(SYMBOL,PERIOD_M5,SAR_steep,0.2,0);
             if (SL < TralStop)                   
               {
                SL=TralStop;                                   
                 bool Ans=OrderModify(OrderTicket(),OrderOpenPrice(),SL,OrderTakeProfit(),0); 
                 if (Ans == true)                                       
                  {               
                //   Alert ("Ордер Bay ","EURUSD"," №",Ticket," модифицирован. Новый Stop Loss ", SL);               
                   break;                                             
                  }   
               }
            }
          if (OrderType() == 1)               
            {  
             TralStop = iSAR(SYMBOL,PERIOD_M5,SAR_steep,0.2,0);
              if (SL > TralStop)  
               {
                SL=TralStop;  
                if ((SL-ASK)/Point<MarketInfo("EURUSD",14)) break;                  
                Ans=OrderModify(OrderTicket(),OrderOpenPrice(),SL,OrderTakeProfit(),0); 
                 if (Ans == true)                                       
                   {               
                  //  Alert ("Ордер Sell ","EURUSD"," №",Ticket," модифицирован. Новый Stop Loss ", SL);               
                    break;                                             
                    }         
               }
            }
         }
      }
   }
  return;       
  }
 

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

Хотелось кое-что проверить, а именно. Главной моей целью является (не хотел сначала говорить но чую ветка потухнет) выяснить как система которую улучшаешь на историческом периоде (допустим последние пол года), будет вести себя на прошлых периодах. В начале я уже говорил что это система 50/50 в долгосрочке, т.е. вытянув систему в 2009г. в максимальную профитность, будет ли она лучше работать и в прошлом... Допустим мы ее выводим на уровень пр.ф. 2,0 или выше... станет ли она работать лучше к примеру с 2000г. ??? 

Я предпологаю (и только предпологаю!!!), что чем лучше она будет работать сегодня, тем хуже она отработает в долгосрочке. Т.е. сегодня мы дабиваемся макс. профита, а на истории это система уже не даст 1,0 а наверное упадет к 0,9

Но это только предположения... Я пока ни чего не пытаюсь доказать.... И честно говоря, надеюсь что я не прав.

 

Я если честно не понимаю, зачем пытаться понять как будет вести себя система в прошлом. Лучше уже в будущее смотреть. Рынок меняется, и это никуда не денешь. Даже если 

Я предпологаю (и только предпологаю!!!), что чем лучше она будет работать сегодня, тем хуже она отработает в долгосрочке. 

и так, то что с этого?

Лично моё предположение (и только предположение))), что никакой зависимости нет, а сказав (даже доказав) это для одной системы, та даже для тысячи систем, не факт, что это будет закономерно для абсолютно всех систем.

Есть такая хорошая поговорка - не надо искать счастья там, где его нет.

 
sayfuji >>:

Лично моё предположение (и только предположение))), что никакой зависимости нет 

Вот я и хочу убедиться в этом...

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

Большое спасибо Swan и gince за то что проявили интерес. А вы бы лучше sayfuji предложили бы что-нить.... например как закрыть позицию не по т.п. может и толк был бы...

 
RomanS >>:

Просто открываемся на пробитие High/Low предыдущего дня с фиксированным т.профитом и со стопом на High/Low сегоднешнего дня. Почему именно так? Да потому что во-первых, такая система не использует ни одного индикатора...

Моя идея 100% такая же)) только на H4 Результаты тестера..

Единственное... у меня направление выберается по предидущей свече, а стоп ставится по меньшему из двух - текущего/ предидущего хая/лоу..



 
ALex2008 >>:

Моя идея 100% такая же)) только на H4 Результаты тестера..

Единственное... у меня направление выберается по предидущей свече, а стоп ставится по меньшему из двух - текущего/ предидущего хая/лоу..



Отличная идея... стоит попробовать и от нее потанцевать...

По ссылке смотрел, период маловат.. не пробовал с 2000? может такая же проблема будет.... 50/50???