Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Пиши статьи и зарабатывай. Мы платим за них 200 USD!
k25rt
35
k25rt 2012.03.17 13:20 

Выкладываю код советника, который торгует на демо счете в реальном времени. Советник выставляет отложенные ордера STOP и Limit используя уровни фракталов, затем тралит их. На демо счете все выглядит хорошо, но на реальном счете все сливает за неделю. В журнале советника постоянно всплывают какие то ошибки, из за чего трал работает по своему настроению) ГДЕ ОШИБКА?????

int init;  
extern double OtsBSSS=100;
extern double Lots_New=1;


extern int Stop_Los_BSSS=100;
extern double OtsBLSL=100;
extern int Stop_Los_BLSL=100;
double Lots;
extern int Percent=5;
extern int b=200;
extern double UrFiltr=1000;// Мертвая зона
   double ma2;
   double ma8;
   extern int ma2priod=2;// период короткой скользящей
   extern int ma8priod=8;  // период длинной скользящей
   int Order_tiket_Buy;
   int Order_tiket_Sell;
int start ()
{   
   string Symb=Symbol();
   double v1[];// массивы индикатора
   double v2[];
   double val1;
   double val2;
   int i;  
   double Sup=v1[i];  // поддержка из Support & res
   double Res=v2[i];  // сопротивление из S&Rint TipSell;
   i = Bars;  
   double h;// ширина канала
   Comment (val1);
   double BS;
   double BL;
   double SS;
   double SL;
// блок обработки торговой информации 
double Dist_SL=MarketInfo(Symbol(),MODE_STOPLEVEL)+20*Point;
      Comment(Dist_SL);
   double One_Lot=MarketInfo(Symb,MODE_MARGINREQUIRED);//Стоим. 1 лота
   double Min_Lot=MarketInfo(Symb,MODE_MINLOT);// Мин. размер. лотов
   double Step   =MarketInfo(Symb,MODE_LOTSTEP);//Шаг изменен размера
   double Free   =AccountFreeMargin();         // Свободные средства
//--------------------------------------------------------------- 3 --
   if (Lots_New>0)                                 // Лоты заданы явно..
     {                                         // ..проверим это
      double Money=Lots_New*One_Lot;               // Стоимость ордера
      if(Money<=AccountFreeMargin())           // Средств хватает..
         Lots=Lots_New;                        // ..принимаем заданное
      else                                     // Если не хватает..
         Lots=MathFloor(Free/One_Lot/Step)*Step;// Расчёт лотов
     }
//--------------------------------------------------------------- 4 --
   else                                        // Если лоты не заданы
     {                                         // ..то берём процент
      if (Percent > 100)                       // Задано ошибочно ..
         Percent=100;                          // .. то не более 100
      if (Percent==0)                          // Если установлен 0 ..
         Lots=Min_Lot;                     // ..то минимальный лот
      else                                     // Желаем. колич.лотов:
         Lots=MathFloor(Free*Percent/100/One_Lot/Step)*Step;//Расч
     }
//--------------------------------------------------------------- 5 --
   if (Lots < Min_Lot)                     // Если меньше допуст..
      Lots=Min_Lot;                        // .. то миниамальный
   if (Lots*One_Lot > AccountFreeMargin()) // Не хватает даже..
     {                                         // ..на минимальн. лот:(
         
      return(false);                           // ..и выход 
     }  
      
// блок формирования торгового сигнала
      while(i >= 0)// формирует точки входа в рынок
         {   
             val1 = iFractals(NULL, 0, MODE_UPPER, i);
             //----
            if(val1 > 0) 
            {
               v1[i] = High[i];
                double a=High[i];
                
            }else
             {
                v1[i] = v1[i+1];
             }
             val2 = iFractals(NULL, 0, MODE_LOWER, i);
  
             //----
             if(val2 > 0) 
            {
                v2[i] = Low[i];
                double c=Low[i];
                
            }else
            {
                v2[i] = v2[i+1]; 
                            
                }            
             i--;
             double H=(a-c)/100;
          
             }    // кнц блока формурующего точки входа в рынок 
                         // Финанс. инструмент
  
//--------------------------------------------------------------- 2 --
   for(int t=1; t<=OrdersTotal(); t++)          // Цикл перебора ордер
     {
      if (OrderSelect(t-1,SELECT_BY_POS)==true) // Если есть следующий
        {                                       // Анализ ордеров:
         int Tip=OrderType();                   // Тип ордера
         if(OrderSymbol()!=Symb)continue;// Не наш ордер
          if (OrderType()==0)// если ордер является открытым ордероm Buy
            {
               if (OrderOpenPrice()+Dist_SL<Bid)//Цена выше чем уровень безубыточнгости
               {
                  if (OrderStopLoss()<Bid-Dist_SL)
                  {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Dist_SL,0,0); 
                     
                  } 
                  
               }  //кнц.Цена выше чем уровень безубыточнгости
                Order_tiket_Buy=OrderTicket();
                BS=1;
                BL=1;
                
             }// если ордер является открытым ордероm Buy
          if (OrderType()==1)// если ордер является открытым ордероm Sell
            {               
             
               if (OrderOpenPrice()-Dist_SL>Ask)//если текущая цена больше чем уровень безубыточности
               {
                  if (OrderSelect(OrderTicket(),SELECT_BY_TICKET)==true)
                  {
                     if (OrderStopLoss()>Ask+Dist_SL)
                     {
                        OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Dist_SL,0,0);
                        
                    
                  }//кнц.если цена ниже чем расчетный уровень лося
              
               }//кнц.если текущая цена больше чем уровень безубыточности
               
            }// если ордер является открытым ордероm Sell
            
            Order_tiket_Sell=OrderTicket();
               SS=1;
               SL=1;
               
               
            }            
            }//цикл перебора

if (OrderType()==OP_BUYSTOP)
            {
                BS=1;
           
      
            }
            if (OrderType()==OP_SELLLIMIT)
            {
                SL=1;
            
    
            }
            if (OrderType()==OP_BUYLIMIT)
            {
                BL=1;
            
     
            }
            if (OrderType()==OP_SELLSTOP)
            {
                SS=1;                                 
         }// Анализ ордеров:
      }// Цикл перебора ордер
      // установка отложенных ордеров
      
 //---------МА__ФИЛЬТР-----------------
   
    double s;
    ma2=iMA(NULL,0,ma2priod,0,MODE_EMA,PRICE_MEDIAN,0);
    ma8=iMA(NULL,0,ma8priod,0,MODE_EMA,PRICE_MEDIAN,0);
    s=(ma2-ma8)/Point;
    Comment("\r\n","\r\n","\r\n","\r\n","\r\n","\r\n","\r\n","\r\n","\r\n","\r\n","Разница мувингов....",s,"\r\n","Ширина Канала....",(a/Point)-(c/Point),"pt");
    
    
//--------кнц МА_ФИЛЬТРА--------------
 if (UrFiltr>s&&s>-UrFiltr)//Если канал
   {
if ((a/Point)-(c/Point)>b)
{

   if (BS==0)
   {
      OrderSend(Symbol(),OP_BUYSTOP,Lots,a+OtsBSSS*Point+20*Point,5,a+OtsBSSS*Point-Stop_Los_BSSS*Point,0,0);//Low[1]
   }else
   {
    for(int q=1; q<=OrdersTotal(); q++)          // Цикл перебора ордер
                 {
                  if (OrderSelect(q-1,SELECT_BY_POS)==true) // Если есть следующий
                     {                                       // Анализ ордеров: 
                     if (OrderType()==OP_BUYSTOP)
                     {
                        if (OrderOpenPrice()>a+OtsBSSS*Point)
                        {
                        OrderModify(OrderTicket(),a+OtsBSSS*Point,a+OtsBSSS*Point-Stop_Los_BSSS*Point,0,0);
                        }
                     }
                    }
                   } 
}
if (SL==0)
{
OrderSend(Symbol(),OP_SELLLIMIT,Lots,a-OtsBLSL*Point,5,a-OtsBLSL*Point+Stop_Los_BLSL*Point,0,0);

}else
{
  for(int e=1; e<=OrdersTotal(); e++)          // Цикл перебора ордер
                 {
                  if (OrderSelect(e-1,SELECT_BY_POS)==true) // Если есть следующий
                     {                                       // Анализ ордеров: 
                     if (OrderType()==OP_SELLLIMIT)
                     {
                        if (OrderOpenPrice()>a-OtsBLSL*Point)
                        {
                        OrderModify(OrderTicket(),a-OtsBLSL*Point,a-OtsBLSL*Point+Stop_Los_BLSL*Point,0,0);
                        }
                     }
                    }
                   }  
}
if (BL==0)
{
OrderSend(Symbol(),OP_BUYLIMIT,Lots,c+OtsBLSL*Point,5,c+OtsBLSL*Point-Stop_Los_BLSL*Point,0,0);

}else
{
   for(int d=1; d<=OrdersTotal(); d++)          // Цикл перебора ордер
                 {
                  if (OrderSelect(d-1,SELECT_BY_POS)==true) // Если есть следующий
                     {                                       // Анализ ордеров: 
                     if (OrderType()==OP_BUYLIMIT)
                     {
                        if (OrderOpenPrice()<c+OtsBLSL*Point)
                        {
                        OrderModify(OrderTicket(),c+OtsBLSL*Point,c-Stop_Los_BLSL*Point,0,0);
                        }
                     }
                    }
                   }  
}
if (SS==0)
{
OrderSend(Symbol(),OP_SELLSTOP,Lots,c-OtsBSSS*Point,5,c-OtsBSSS*Point+Stop_Los_BSSS*Point,0,0);//High[1]+10*Point

 } else
 {
 for(int x=1; x<=OrdersTotal(); x++)          // Цикл перебора ордер
                 {
                  if (OrderSelect(x-1,SELECT_BY_POS)==true) // Если есть следующий
                     {                                       // Анализ ордеров: 
                     if (OrderType()==OP_SELLSTOP)
                     {
                        if (OrderOpenPrice()<c-OtsBSSS*Point)
                        {
                        OrderModify(OrderTicket(),c-OtsBSSS*Point,c-OtsBSSS*Point+Stop_Los_BSSS*Point,0,0);
                        }
                     }
                    }
                   }  
 }
 }
 }else
{
   for(int z=1; z<=OrdersTotal(); z++)          // Цикл перебора ордер
                 {
                  if (OrderSelect(z-1,SELECT_BY_POS)==true) // Если есть следующий
                     {                                       // Анализ ордеров: 
                     if (OrderType()==OP_SELLLIMIT)
                     {
                        OrderDelete(OrderTicket());
                     }
                     if (OrderType()==OP_BUYLIMIT)
                     {
                     OrderDelete(OrderTicket());
                     }
                    }
                   }  

}
             
   
return;
}             
Файлы:
DmitriyN
2316
DmitriyN 2012.03.17 13:58  
k25rt:

В журнале советника постоянно всплывают какие то ошибки, из за чего трал работает по своему настроению) ГДЕ ОШИБКА?????

Какие конкретно ошибки всплывают?
Коды ошибок.
Sceptic Philozoff
Модератор
17849
Sceptic Philozoff 2012.03.17 14:39  

k25rt, выложите код в читаемом виде, чтобы был похож на код. Наверняка в редакторе есть какие-то отступы. Так разобраться очень сложно.

Как это сделать - смотрите здесь.

Название темы также должно быть осмысленным. Я подправил.

k25rt
35
k25rt 2012.03.18 06:03  
Mathemat:

k25rt, выложите код в читаемом виде, чтобы был похож на код. Наверняка в редакторе есть какие-то отступы. Так разобраться очень сложно.

Как это сделать - смотрите здесь.

Название темы также должно быть осмысленным. Я подправил.

Спасибо. Сделаю.
DmitriyN:
Какие конкретно ошибки всплывают?
Коды ошибок.

Ошибка 130, 4063. Ошибки связанные с модификацией ордеров. Либо советник просто не двигает стоп лос, хотя все условия выполняются.
k25rt
35
k25rt 2012.03.18 06:08  

Замысел советника такой: 1. Расчитать уровни фракталов;

2. Расчитать ширину канала (верхний фрактал - нижний);

3. Если канал больше заданного количесвта пунктов разместить отложенные ордера;

4. При открытие ордеров тралить их на минимальной дистанции.

Логика простая, но перевести эту стратегию в програмный код ни как не получается. Может у кого есть похожие советники, поделитесь опытом.

Роман
7939
Роман 2012.03.18 06:12  
k25rt:
Спасибо. Сделаю.
Ошибка 130, 4063. Ошибки связанные с модификацией ордеров. Либо советник просто не двигает стоп лос, хотя все условия выполняются.


ошибка 130 - неправильные стопы.

Cм. последнюю ф-ию здесь, не забывая делать все необходимые проверки + к этому уточни у своего ДЦ - какой тип исполнения ордеров, не исключено, что ставить СРАЗУ стопы и тейки НЕЛЬЗЯ, т.е. сначала установка ордера с их нулевыми значениями, после открытия ордера уже их модификация на нужные Вам уровни.

Роман
7939
Роман 2012.03.18 06:14  
k25rt:

Замысел советника такой: 1. Расчитать уровни фракталов;

2. Расчитать ширину канала (верхний фрактал - нижний);

3. Если канал больше заданного количесвта пунктов разместить отложенные ордера;

4. При открытие ордеров тралить их на минимальной дистанции.

Логика простая, но перевести эту стратегию в програмный код ни как не получается. Может у кого есть похожие советники, поделитесь опытом.


см. библу - правь под свои условия - там есть трал по фракталу. Траль им отложенники и все.

Файлы:
k25rt
35
k25rt 2012.03.18 06:41  
Вот это очень полезно!) Спасибо, щас замутим конструктор лего))
/
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий