Советники: Тоннельный метод

 

Тоннельный метод:

Нарисовал код к известному "тоннельному методу Вегаса". Нужно было протестировать, но в базе кодов такого не оказалось.

Author: Sergey Kolesnik

 

Энное количество Лет тому назад, прочитав статью о туннельном методе Вегас, по моему алгоритму попросил (сам не программист) написать советник, но по принципу отката.

В коде есть ошибка, не удаляет отложенники.....а так при портфельном варианте работы, рубил по маленьку.

Код выставляю, может поправите?....

extern double Lots1=0.05;
extern double Lots2=0.1;
extern double Lots3=0.2;
extern double Lots4=0.4;
extern int       RiskModel=5;
extern int       MA1=144;
extern int       MA2=169;
//datetime TimeN, TimeC;
double BidP;
bool Stavim1, Stavim2;
int cnt, t;
double digits;
int init()
{
BidP=0;
Stavim1=false;
Stavim2=false;
t=-1;
digits=MarketInfo(Symbol(),MODE_DIGITS);
}
int start()
  {
  //if(AccountNumber()!=123) return(0);
  //TimeC=Time[0];
  double s=MarketInfo(Symbol(),MODE_SPREAD)*Point;
  
  double MA_1=NormalizeDouble(iMA(NULL,0,MA1,0,MODE_EMA,PRICE_CLOSE,0),digits);
  double MA_2=NormalizeDouble(iMA(NULL,0,MA2,0,MODE_EMA,PRICE_CLOSE,0),digits);
  double MA_1v1, MA_1v2, MA_1v3, MA_1v4, MA_1n1, MA_1n2, MA_1n3, MA_1n4;
  double MA_2v1, MA_2v2, MA_2v3, MA_2v4, MA_2n1, MA_2n2, MA_2n3, MA_2n4;
  double SL1, SL2, SL3, SL4, TP1, TP2, TP3, TP4;
         if(RiskModel==1)
         {
            MA_1v1=MA_1+34*Point;
            MA_1v2=MA_1+55*Point;
            MA_1v3=MA_1+89*Point;
            
            MA_1n1=MA_1-34*Point;
            MA_1n2=MA_1-55*Point;
            MA_1n3=MA_1-89*Point;
            
            MA_2v1=MA_2+34*Point;
            MA_2v2=MA_2+55*Point;
            MA_2v3=MA_2+89*Point;
            MA_2n1=MA_2-34*Point;
            MA_2n2=MA_2-55*Point;
            MA_2n3=MA_2-89*Point;
            SL1=21*Point; TP1=21*Point;
            SL2=34*Point; TP2=21*Point;
            SL3=55*Point; TP3=34*Point;
         }
         if(RiskModel==2)
         {
            MA_1v1=MA_1+55*Point;
            MA_1v2=MA_1+89*Point;
            MA_1v3=MA_1+144*Point;
            
            MA_1n1=MA_1-55*Point;
            MA_1n2=MA_1-89*Point;
            MA_1n3=MA_1-144*Point;
            
            MA_2v1=MA_2+55*Point;
            MA_2v2=MA_2+89*Point;
            MA_2v3=MA_2+144*Point;
            MA_2n1=MA_2-55*Point;
            MA_2n2=MA_2-89*Point;
            MA_2n3=MA_2-144*Point;
            SL1=34*Point; TP1=21*Point;
            SL2=55*Point; TP2=34*Point;
            SL3=89*Point; TP3=55*Point;
         }
         if(RiskModel==3)
         {
            MA_1v1=MA_1+89*Point;
            MA_1v2=MA_1+144*Point;
            MA_1v3=MA_1+233*Point;
            
            MA_1n1=MA_1-89*Point;
            MA_1n2=MA_1-144*Point;
            MA_1n3=MA_1-233*Point;
            
            MA_2v1=MA_2+89*Point;
            MA_2v2=MA_2+144*Point;
            MA_2v3=MA_2+233*Point;
            MA_2n1=MA_2-89*Point;
            MA_2n2=MA_2-144*Point;
            MA_2n3=MA_2-233*Point;
            SL1=55*Point; TP1=34*Point;
            SL2=89*Point; TP2=55*Point;
            SL3=144*Point; TP3=89*Point;
         }
         if(RiskModel==4)
         {
            MA_1v1=MA_1+144*Point;
            MA_1v2=MA_1+233*Point;
            MA_1v3=MA_1+377*Point;
            
            MA_1n1=MA_1-144*Point;
            MA_1n2=MA_1-233*Point;
            MA_1n3=MA_1-377*Point;
            
            MA_2v1=MA_2+144*Point;
            MA_2v2=MA_2+233*Point;
            MA_2v3=MA_2+377*Point;
            MA_2n1=MA_2-144*Point;
            MA_2n2=MA_2-233*Point;
            MA_2n3=MA_2-377*Point;
            SL1=89*Point; TP1=55*Point;
            SL2=144*Point; TP2=89*Point;
            SL3=233*Point; TP3=144*Point;
         }
         if(RiskModel==5)
         {
            MA_1v1=MA_1+89*Point;
            MA_1v2=MA_1+144*Point;
            MA_1v3=MA_1+233*Point;
            MA_1v4=MA_1+377*Point;
            
            MA_1n1=MA_1-89*Point;
            MA_1n2=MA_1-144*Point;
            MA_1n3=MA_1-233*Point;
            MA_1n4=MA_1-377*Point;
            
            MA_2v1=MA_2+89*Point;
            MA_2v2=MA_2+144*Point;
            MA_2v3=MA_2+233*Point;
            MA_2v4=MA_2+377*Point;
            MA_2n1=MA_2-89*Point;
            MA_2n2=MA_2-144*Point;
            MA_2n3=MA_2-233*Point;
            MA_2n4=MA_2-377*Point;
            SL1=55*Point; TP1=34*Point;
            SL2=89*Point; TP2=55*Point;
            SL3=144*Point; TP3=89*Point;
            SL4=233*Point; TP4=144*Point;
         }
   int ticket1=0, ticket2=0, ticket3=0, ticket4=0, ticket5=0, ticket6=0, ticket7=0, ticket8=0, total=0;
   bool CB=false, CS=false;
   if(RiskModel!=5)
   {
     for(cnt=0;cnt<OrdersTotal();cnt++)
     {
       OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
       if(OrderSymbol()==Symbol())
       {
       if(OrderMagicNumber()==1703091) {ticket1++; if(OrderType()==OP_SELL) CB=true;}
       if(OrderMagicNumber()==1703092) {ticket2++; if(OrderType()==OP_SELL) CB=true;}
       if(OrderMagicNumber()==1703093) {ticket3++; if(OrderType()==OP_SELL) CB=true;}
       if(OrderMagicNumber()==1703094) {ticket4++; if(OrderType()==OP_BUY) CS=true;}
       if(OrderMagicNumber()==1703095) {ticket5++; if(OrderType()==OP_BUY) CS=true;}
       if(OrderMagicNumber()==1703096) {ticket6++; if(OrderType()==OP_BUY) CS=true;}
       }       
     }   
     total=ticket1+ticket2+ticket3+ticket4+ticket5+ticket6;
     if(CB==true && ticket1+ticket2+ticket3!=0) CloseBuy();
     if(CS==true && ticket4+ticket5+ticket6!=0) CloseSell();
     if(((BidP<MA_1 && Bid>=MA_1) || (BidP>MA_1 && Bid<=MA_1)) && BidP!=0 && total==0 && !Stavim2) Stavim1=true;
     if(Stavim1 && ticket1==0) OrderSend(Symbol(),OP_SELLLIMIT,Lots1,MA_1v1,3,MA_1v1+SL1+s,MA_1v1-TP1+s,"B",1703091,0,Blue);
     if(Stavim1 && ticket2==0) OrderSend(Symbol(),OP_SELLLIMIT,Lots2,MA_1v2,3,MA_1v2+SL2+s,MA_1v2-TP2+s,"B",1703092,0,Blue);
     if(Stavim1 && ticket3==0) OrderSend(Symbol(),OP_SELLLIMIT,Lots3,MA_1v3,3,MA_1v3+SL3+s,MA_1v3-TP3+s,"B",1703093,0,Blue);
     
     if(Stavim1 && ticket4==0) OrderSend(Symbol(),OP_BUYLIMIT,Lots1,MA_1n1+s,3,MA_1n1-SL1,MA_1n1+TP1,"B",1703094,0,Red);
     if(Stavim1 && ticket5==0) OrderSend(Symbol(),OP_BUYLIMIT,Lots2,MA_1n2+s,3,MA_1n2-SL2,MA_1n2+TP2,"B",1703095,0,Red);
     if(Stavim1 && ticket6==0) t=OrderSend(Symbol(),OP_BUYLIMIT,Lots3,MA_1n3+s,3,MA_1n3-SL3,MA_1n3+TP3,"B",1703096,0,Red);
     if(((BidP<MA_2 && Bid>=MA_2) || (BidP>MA_2 && Bid<=MA_2)) && BidP!=0 && total==0 && !Stavim1) Stavim2=true;
     if(Stavim2 && ticket1==0) OrderSend(Symbol(),OP_SELLLIMIT,Lots1,MA_2v1,3,MA_2v1+SL1+s,MA_2v1-TP1+s,"B",1703091,0,Blue);
     if(Stavim2 && ticket2==0) OrderSend(Symbol(),OP_SELLLIMIT,Lots2,MA_2v2,3,MA_2v2+SL2+s,MA_2v2-TP2+s,"B",1703092,0,Blue);
     if(Stavim2 && ticket3==0) OrderSend(Symbol(),OP_SELLLIMIT,Lots3,MA_2v3,3,MA_2v3+SL3+s,MA_2v3-TP3+s,"B",1703093,0,Blue);
     
     if(Stavim2 && ticket4==0) OrderSend(Symbol(),OP_BUYLIMIT,Lots1,MA_2n1+s,3,MA_2n1-SL1,MA_2n1+TP1,"B",1703094,0,Red);
     if(Stavim2 && ticket5==0) OrderSend(Symbol(),OP_BUYLIMIT,Lots2,MA_2n2+s,3,MA_2n2-SL2,MA_2n2+TP2,"B",1703095,0,Red);
     if(Stavim2 && ticket6==0) t=OrderSend(Symbol(),OP_BUYLIMIT,Lots3,MA_2n3+s,3,MA_2n3-SL3,MA_2n3+TP3,"B",1703096,0,Red);
   if(t>0) {Stavim1=false; Stavim2=false;}
   }
   else
   {
     for(cnt=0;cnt<OrdersTotal();cnt++)
     {
       OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
       if(OrderSymbol()==Symbol())
       {
       if(OrderMagicNumber()==1703091) {ticket1++; if(OrderType()==OP_SELL) CB=true;}
       if(OrderMagicNumber()==1703092) {ticket2++; if(OrderType()==OP_SELL) CB=true;}
       if(OrderMagicNumber()==1703093) {ticket3++; if(OrderType()==OP_SELL) CB=true;}
       if(OrderMagicNumber()==1703097) {ticket7++; if(OrderType()==OP_SELL) CB=true;}
       if(OrderMagicNumber()==1703094) {ticket4++; if(OrderType()==OP_BUY) CS=true;}
       if(OrderMagicNumber()==1703095) {ticket5++; if(OrderType()==OP_BUY) CS=true;}
       if(OrderMagicNumber()==1703096) {ticket6++; if(OrderType()==OP_BUY) CS=true;}
       if(OrderMagicNumber()==1703098) {ticket8++; if(OrderType()==OP_BUY) CS=true;}
       }       
     }   
     total=ticket1+ticket2+ticket3+ticket4+ticket5+ticket6+ticket7+ticket8;
     if(CB==true && ticket1+ticket2+ticket3+ticket7!=0) CloseBuy();
     if(CS==true && ticket4+ticket5+ticket6+ticket8!=0) CloseSell();
     if(((BidP<MA_1 && Bid>=MA_1) || (BidP>MA_1 && Bid<=MA_1)) && BidP!=0 && total==0 && !Stavim2) Stavim1=true;
     if(Stavim1 && ticket1==0) OrderSend(Symbol(),OP_SELLLIMIT,Lots1,MA_1v1,3,MA_1v1+SL1+s,MA_1v1-TP1+s,"B",1703091,0,Blue);
     if(Stavim1 && ticket2==0) OrderSend(Symbol(),OP_SELLLIMIT,Lots2,MA_1v2,3,MA_1v2+SL2+s,MA_1v2-TP2+s,"B",1703092,0,Blue);
     if(Stavim1 && ticket3==0) OrderSend(Symbol(),OP_SELLLIMIT,Lots3,MA_1v3,3,MA_1v3+SL3+s,MA_1v3-TP3+s,"B",1703093,0,Blue);
     if(Stavim1 && ticket7==0) OrderSend(Symbol(),OP_SELLLIMIT,Lots4,MA_1v4,3,MA_1v4+SL4+s,MA_1v4-TP4+s,"B",1703097,0,Blue);
     
     if(Stavim1 && ticket4==0) OrderSend(Symbol(),OP_BUYLIMIT,Lots1,MA_1n1+s,3,MA_1n1-SL1,MA_1n1+TP1,"B",1703094,0,Red);
     if(Stavim1 && ticket5==0) OrderSend(Symbol(),OP_BUYLIMIT,Lots2,MA_1n2+s,3,MA_1n2-SL2,MA_1n2+TP2,"B",1703095,0,Red);
     if(Stavim1 && ticket6==0) OrderSend(Symbol(),OP_BUYLIMIT,Lots3,MA_1n3+s,3,MA_1n3-SL3,MA_1n3+TP3,"B",1703096,0,Red);
     if(Stavim1 && ticket8==0) t=OrderSend(Symbol(),OP_BUYLIMIT,Lots4,MA_1n4+s,3,MA_1n4-SL4,MA_1n4+TP4,"B",1703098,0,Red);
     if(((BidP<MA_2 && Bid>=MA_2) || (BidP>MA_2 && Bid<=MA_2)) && BidP!=0 && total==0 && !Stavim1) Stavim2=true;
     if(Stavim2 && ticket1==0) OrderSend(Symbol(),OP_SELLLIMIT,Lots1,MA_2v1,3,MA_2v1+SL1+s,MA_2v1-TP1+s,"B",1703091,0,Blue);
     if(Stavim2 && ticket2==0) OrderSend(Symbol(),OP_SELLLIMIT,Lots2,MA_2v2,3,MA_2v2+SL2+s,MA_2v2-TP2+s,"B",1703092,0,Blue);
     if(Stavim2 && ticket3==0) OrderSend(Symbol(),OP_SELLLIMIT,Lots3,MA_2v3,3,MA_2v3+SL3+s,MA_2v3-TP3+s,"B",1703093,0,Blue);
     if(Stavim2 && ticket7==0) OrderSend(Symbol(),OP_SELLLIMIT,Lots4,MA_2v4,3,MA_2v4+SL4+s,MA_2v4-TP4+s,"B",1703097,0,Blue);
     if(Stavim2 && ticket4==0) OrderSend(Symbol(),OP_BUYLIMIT,Lots1,MA_2n1+s,3,MA_2n1-SL1,MA_2n1+TP1,"B",1703094,0,Red);
     if(Stavim2 && ticket5==0) OrderSend(Symbol(),OP_BUYLIMIT,Lots2,MA_2n2+s,3,MA_2n2-SL2,MA_2n2+TP2,"B",1703095,0,Red);
     if(Stavim2 && ticket6==0) OrderSend(Symbol(),OP_BUYLIMIT,Lots3,MA_2n3+s,3,MA_2n3-SL3,MA_2n3+TP3,"B",1703096,0,Red);
     if(Stavim2 && ticket8==0) t=OrderSend(Symbol(),OP_BUYLIMIT,Lots4,MA_2n4+s,3,MA_2n4-SL4,MA_2n4+TP4,"B",1703098,0,Red);
   if(t>0) {Stavim1=false; Stavim2=false;}
   }
   BidP=Bid;
   return(0);
  }
  
void CloseBuy()
{
   for(cnt=0;cnt<OrdersTotal();cnt++)
   {
     if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
     {
      if(OrderSymbol()==Symbol() && OrderType()==OP_BUYLIMIT)
        {
         while(true)
           {
            bool result=OrderDelete(OrderTicket());
            if(result!=TRUE)
            {
            Print("LastError = ",GetLastError());
            if(GetLastError()==135) RefreshRates();
            }
            else break;
           }
        }
     }
   }
}
  
void CloseSell()
{
   for(cnt=0;cnt<OrdersTotal();cnt++)
   {
     if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
     {
      if(OrderSymbol()==Symbol() && OrderType()==OP_SELLLIMIT)
        {
         while(true)
           {
            bool result=OrderDelete(OrderTicket());
            if(result!=TRUE)
            {
            Print("LastError = ",GetLastError());
            if(GetLastError()==135) RefreshRates();
            }
            else break;
           }
        }
     }
   }
}
 
Bihkul:

Энное количество Лет тому назад, прочитав статью о туннельном методе Вегас, по моему алгоритму попросил (сам не программист) написать советник, но по принципу отката.

В коде есть ошибка, не удаляет отложенники.....а так при портфельном варианте работы, рубил по маленьку.


Да, непростой код. Кажется все случаи жизни предусмотрены. Попробую откорректировать на выходных, сейчас занят немного.
 
kwadrad:
Bihkul:

Энное количество Лет тому назад, прочитав статью о туннельном методе Вегас, по моему алгоритму попросил (сам не программист) написать советник, но по принципу отката.

В коде есть ошибка, не удаляет отложенники.....а так при портфельном варианте работы, рубил по маленьку.


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

Смотрел код, тестировал на истории, не понял почему вы говорите, что не удаляет отложенники. По коду при наступлении сигнала на Буй и срабатывании одного отложенника БуйЛимит удаляются отложенники СеллЛимит, и наоборот.

Необходимо Ваше уточнение теоретической схемы работы данной торговой системы,

т.е. при каких сигналах какие отложенники удалять?

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