Помогите с трейлингом

 
Не могу разобраться с трейлингом, почему то не работает. Хочу чтобы он двигался на Лоу предыдущего бара, если Бай, и предыдущая свеча белая. И наоборот, на Хай - если Селл и свеча черная.
Вот что у меня есть:
extern int Length=2;
extern double NBars=5;
extern double TakeProfit=200;
extern double TrailingStop=20;
double Lots=1.0;
extern double StopLoss=30;
double Points;
double Slippage=0;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//---- TODO: Add your code here.
   Points = MarketInfo (Symbol(), MODE_POINT);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//---- TODO: Add your code here.
  Comment(""); 
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//---- TODO: Add your code here.
   double prevtime=0,Tail=2,AverageCur=0,AveragePre=0,Total=0;
   int cnt=0;
   double SLSell=0,SLBuy=0;
   if ((Bars<200) || (TakeProfit<10)) return(0); // на графике менее 200 баров - выходим
                                             // неверные параметры тейкпрофита
   if (OrdersTotal()==1)return(0);  // нет ни одного открытого ордера
   if (AccountFreeMargin()<1000) return(0);  // денег нет - выходим
   
   if (prevtime==Time[0]) return(0);
      
   SLSell=High[Highest(NULL,0,MODE_HIGH,NBars,0)];
   SLBuy=Low[Lowest(NULL,0,MODE_LOW,NBars,0)];
   
   if ((Close[3] > Open[3])
      && ((Close[3] - Open[3]) > iCustom(NULL,0,"Среднее тело бара", Length,1,0)) 
      && (MathMin(Close[2],Open[2])>=Close[3]) 
      && (Close[1] < Open[1]) 
      && (High[3]<High[2])
      && (MathAbs(Open[3]-Close[3])>MathAbs(Open[2]-Close[2]))
      && (Close[1] < Close[3]))
      {
      OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,SLSell,Bid-TakeProfit*Points,"Вечерняя звезда",003,0,Green);
      SetIndexArrow(0,226);
      return(0);
      }
   if ((Close[3] < Open[3]) 
      //&& ((Open[3] - Close[3]) > 0.0010)    
      && (MathMax(Close[2],Open[2]) <= Close[3]) 
      && (Close[1] > Open[1]) 
      && (Low[3]>Low[2])
      //&& (MathAbs(Open[3]-Close[3])>MathAbs(Open[2]-Close[2]))
      && (MathAbs(Open[3]-Close[3])>iCustom(NULL,0,"Среднее тело бара", Length,1,4))
      && (Close[1] > Close[3]))
      {
      OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,SLBuy,Ask+TakeProfit*Points,"Утренняя звезда",006,0,Purple);
      SetIndexArrow(0,225);
      return(0);
      }
   for(cnt=1;cnt<=OrdersTotal();cnt++)
      {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if (OrderType()<=OP_SELL && // это открытая позиция? OP_BUY или OP_SELL 
         OrderSymbol()==Symbol())    // инструмент совпадает?
         {
         if (OrderType()==OP_BUY)   // открыта длинная позиция
            {
            if (Open[1]<Close[1])
               {
               OrderModify(OrderTicket(),Ask,Low[1],OrderTakeProfit(),0,Blue);
               return(0);
               }
            }   
      else
        {
         if (Open[1]>Close[1])
            {
            OrderModify(OrderTicket(),Bid,High[1],OrderTakeProfit(),0,Blue);
            return(0);
            }
         }
      }
   }
prevtime = Time[0]; 
//----
   return(0);
  }
     
  



Это используемый индикатор:

#property indicator_separate_window
#property indicator_minimum 0.0000
#property indicator_maximum 50
extern int Length=8;

#property indicator_color1 Plum

double Buffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_HISTOGRAM);
   SetIndexBuffer(0,Buffer);
   
   SetIndexDrawBegin(0,Length);
   SetIndexShift(0,0);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//---- 
       
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int ExtCountedBars=0;
   ExtCountedBars=IndicatorCounted();
   double sum=0;
   int    i,pos=Bars-ExtCountedBars-1;
//---- initial accumulation
   if(pos<Length) pos=Length;
   for(i=1;i<Length;i++,pos--)
      sum+=MathAbs(Open[pos]-Close[pos]);
   while(pos>=0)
     {
      sum+=MathAbs(Open[pos]-Close[pos]);
      Buffer[pos]=(sum/Length)*10000;
	   sum-=MathAbs(Open[pos+Length-1]-Close[pos+Length-1]);
 	   pos--;
     }
//----
   return(0);
  }
 
С ходу ошибка - не знаю, правда, в ней ли дело:
for(cnt=1;cnt<=OrdersTotal();cnt++)
замените на
for(cnt=0;cnt<OrdersTotal();cnt++)
 
Еще:
Highest(NULL,0,MODE_HIGH,NBars,0)];
В МТ4 изменили порядок аргументов.

sum+=MathAbs(Open[pos]-Close[pos]);
вы ведь используете Close нулевого бара - в реале, у вас его не будет

prevtime = Time[0];
не достигается, если раньше выход по return

if(pos<Length) pos=Length;
for(i=1;i<Length;i++,pos--)
sum+=MathAbs(Open[pos]-Close[pos]);
while(pos>=0)
{
sum+=MathAbs(Open[pos]-Close[pos]);
Buffer[pos]=(sum/Length)*10000;
sum-=MathAbs(Open[pos+Length-1]-Close[pos+Length-1]);
pos--;
}
что-то подозрительное, но пальцем указать не могу :)
 
OrderModify(OrderTicket(),Ask,Low[1],OrderTakeProfit(),0,Blue);


bool OrderModify( int ticket, double price, double stoploss, double takeprofit, datetime expiration, color arrow_color=CLR_NONE) 


Функция модифицирует (изменяет) параметры ранее открытых позиций или отложенных ордеров Возвращает ИСТИНА при успешном завершении функции. Возвращает ЛОЖЬ при неудачном завершении функции. Для того чтобы получить информацию об ошибке, вызовите GetLastError(). 

Параметры

ticket   -   Уникальный порядковый номер ордера. 
price   -   Новая цена открытия (только для отложенных ордеров). 
stoploss   -   Новый уровень ограничения убытка (stoploss). 
takeprofit   -   Новый уровень получения прибыли (profit-taking). 
expiration   -   Дата/серверное время истечения ордера (только для отложенных ордеров). 
arrow_color   -   Цвет стрелки на графике.Если параметр отсутствует или его значение равно CLR_NONE, то символ стрелки на графике не отображается. 



Новую цену (второй параметр) можно устанавливать только для отложенных ордеров, а ты пытаешься изменить цену сделки тогда , когда она уже совершена. Вместо Ask поставь OrderOpenPrice( ) или наверняка можно пропустить этот параметр т.е. просто две запятые подряд, или поставить 0 (попробуй).

 
вообще в логах должно писаться почему не изменен ордер, почитай
 
С ходу ошибка - не знаю, правда, в ней ли дело:
for(cnt=1;cnt<=OrdersTotal();cnt++)
замените на
for(cnt=0;cnt<OrdersTotal();cnt++)


Да, это верно, исправил.
Еще:
Highest(NULL,0,MODE_HIGH,NBars,0)];
В МТ4 изменили порядок аргументов.

Каким образом изменен? В словаре вроде также.
sum+=MathAbs(Open[pos]-Close[pos]);
вы ведь используете Close нулевого бара - в реале, у вас его не будет

В реале будет текущая цена - она и будет Close.
prevtime = Time[0];
не достигается, если раньше выход по return

Здесь можно поподробнее, выход по какому return?
if(pos<Length) pos=Length;
for(i=1;i<Length;i++,pos--)
sum+=MathAbs(Open[pos]-Close[pos]);
while(pos>=0)
{
sum+=MathAbs(Open[pos]-Close[pos]);
Buffer[pos]=(sum/Length)*10000;
sum-=MathAbs(Open[pos+Length-1]-Close[pos+Length-1]);
pos--;
}
что-то подозрительное, но пальцем указать не могу :)

Здесь вроде все верно, индикатор нормально работает. Это я в Moving Average подглядел.
 

Новую цену (второй параметр) можно устанавливать только для отложенных ордеров, а ты пытаешься изменить цену сделки тогда , когда она уже совершена. Вместо Ask поставь OrderOpenPrice( ) или наверняка можно пропустить этот параметр т.е. просто две запятые подряд, или поставить 0 (попробуй).

Попробовал, не помогает. В тестере трейлинг должен ведь работать?
 
А в лог что пишет?
трейлинг работает, впрочем это выражение не верно т.к. встроенного трейлинга в советнике нет, а код должен отрабатывать за исключением объявленных ограничений
 
А в лог что пишет?
трейлинг работает, впрочем это выражение не верно т.к. встроенного трейлинга в советнике нет, а код должен отрабатывать за исключением объявленных ограничений

В логах ничего не нашел, каким образом он работает, у меня что есть этот код, что нет - один, извините, хрен да редька.
 
if (OrdersTotal()==1) return(0);  // нет ни одного открытого ордера


ты артист однако, вначале старт сразу выкидываешь советника, конечно ни о каких трейлингах не может быть речи, т.к.
1. коммент не верный (если есть один ордер)
2. при его наличии советник прекращает работу, а он у тебя после первогй сработки старт единственный
и дальше ты его всегда return(0)

 
в названиях индикаторов лучше не использовать кирилицу, тем более с пробелами
Причина обращения: