[(трал работает по своему настроению) ГДЕ ОШИБКА?] Помогите довести до ума!!!!

 

Выкладываю код советника, который торгует на демо счете в реальном времени. Советник выставляет отложенные ордера 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;
}             
Файлы:
 
k25rt:

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

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

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

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

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

 
Mathemat:

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

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

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

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

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

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

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

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

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

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

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


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

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

 
k25rt:

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

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

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

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

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


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

Файлы:
 
Вот это очень полезно!) Спасибо, щас замутим конструктор лего))
Причина обращения: