Помогите с трейлингом - страница 2

 
ты не штурмуй сразу "Джомолумгму" попробуй сначала преодолевать небольшие холмики, проще это сделать на скриптах.
 
extern int Length=2;
extern double NBars=5;
extern int TakeProfit=200;
//extern int TrailingStop=20;
//extern int StopLoss=30;
double Lots=1.0;
double Slippage=0.0;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//---- TODO: Add your code here.

//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//---- TODO: Add your code here.

//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//---- TODO: Add your code here.
   datetime prevtime;
   //double Tail=2.0, AverageCur=0.0, AveragePre=0.0, Total=0.0;
   int cnt=0;
   double SLSell=0.0,SLBuy=0.0;
   if ((Bars<200) || (TakeProfit<10)) return(0); // на графике менее 200 баров - выходим
                                                 // неверные параметры тейкпрофита
   if (OrdersTotal()==1) return(0);  // нет ни одного открытого ордера
   if (AccountFreeMargin()<1000) return(0);  // денег нет - выходим

до сюда посмотрел и поправил , неиспользуемые переменные закомментировал

 

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

Каким образом изменен? В словаре вроде также.


МТ3:
Highest(type,beginbar,periods)

МТ4:
int Highest( string symbol, int timeframe, int type, int count=WHOLE_ARRAY, int start=0)

Обратите внимание на два последних аргумента.


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

В реале будет текущая цена - она и будет Close.

Это гарантирует проблемы при тестировании, точнее, это значит,что при тестировании вам придется все проверять гораздо тщательнее...


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

Здесь можно поподробнее, выход по какому return?

Перед этой (последней) строчкой есть несколько if, которые, если удовлетворены, завершаются return'ом. И соответственно, последняя строка не достигается.
 
в названиях индикаторов лучше не использовать кирилицу, тем более с пробелами

Спасибо, все исправлю на английский.
ты не штурмуй сразу "Джомолумгму" попробуй сначала преодолевать небольшие холмики, проще это сделать на скриптах.

Если можно в качестве примера приведи что нибудь, не совсем понимаю что выполняют скрипты.
до сюда посмотрел и поправил , неиспользуемые переменные закомментировал

И за это спасибо, если не закоментированные переменные не используются, что в этом страшного?
 

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

Каким образом изменен? В словаре вроде также.


МТ3:
Highest(type,beginbar,periods)

МТ4:
int Highest( string symbol, int timeframe, int type, int count=WHOLE_ARRAY , int start=0)

Обратите внимание на два последних аргумента.

Я понимаю так: находит максимальный из int type(MODE_HIGH, MODE_LOW,...) за int count=WHOLE_ARRAY периодов, начиная с int start=0.


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

В реале будет текущая цена - она и будет Close.

Это гарантирует проблемы при тестировании, точнее, это значит,что при тестировании вам придется все проверять гораздо тщательнее...

Исправил на Close[1]. Так верно будет?


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

Здесь можно поподробнее, выход по какому return?

Перед этой (последней) строчкой есть несколько if, которые, если удовлетворены, завершаются return'ом. И соответственно, последняя строка не достигается.


Перетащил prevtime = Time[0]; в начало кода получилось
if (prevtime==Time[0]) return(0);
            prevtime = Time[0];


Так правильно будет?

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

Скопировал код, удалил индюк с кирилицей в названии, создал новый пользовательский индикатор с английским названием, вставил текст. Индикатор вроде работает, но в Экперте при тестировании пишет Cannot open file. Что не так, не пойму, обьясните, пожалуйста кто знает.
 
ты наверняка не везде подправил (см. советник), у меня в исправленном мною виде (т.к. показывал раньше все нормально отрабатывает) , имеется в виду использование русских названий.
//---- input parameters
extern int Length=2;
extern double NBars=5;
extern int TakeProfit=200;
//extern int TrailingStop=20;
//extern int StopLoss=30;
double Lots=1.0;
double Slippage=0.0;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//---- TODO: Add your code here.

//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//---- TODO: Add your code here.

//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//---- TODO: Add your code here.
   datetime prevtime;
   //double Tail=2.0, AverageCur=0.0, AveragePre=0.0, Total=0.0;
   int cnt=0;
   double SLSell=0.0,SLBuy=0.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,"EKC", 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*Point,"Вечерняя звезда",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,"EKC", Length,1,4))
      && (Close[1] > Close[3]))
      {
      OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,SLBuy,Ask+TakeProfit*Point,"Утренняя звезда",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);
  }
 
ты наверняка не везде подправил (см. советник), у меня в исправленном мною виде (т.к. показывал раньше все нормально отрабатывает) , имеется в виду использование русских названий.

Исправил везде, ошибка в коде индикатора. Опять рисует замечательно, но стоит вывести через коммент, получается что считает с 1 бара, на нулевом баре равно 0, хотя и нарисовано в окне индикатора, и в окне данных информация тоже есть.
 
Давай тогда с начала и по порядку.
1. Будем использовать наименования переменных "общепринятые" (всем будет легче разбираться, не надо изобретать велосипед)
Length    ->   Range
pos    ->   cb (от current bar)
ExtCountedBars    ->   CountedBars

жмем Ctrl+H и делаем в индикаторе соответствующие изменения,
теперь алгоритм расчета твоего индикатора, я внес комментарии чтобы было более понятно что делает твой код на каждом шагу, посмотри и ответь ты этого хотел?

int start()
  {
   int CountedBars=IndicatorCounted();
   double sum=0;
   int i,cb=Bars-CountedBars-1;
//---- initial accumulation
   if(cb<Range) cb=Range;
   for(i=1;i<Range;i++,cb--)
      sum+=MathAbs(Open[cb]-Close[cb]); //складываем предыдущие тела - 7 штук от {1...7}
   while(cb>=0) //цикл пройдет два раза , значение 1 и 0
     {
      sum+=MathAbs(Open[cb]-Close[cb]); //прибавляем тело [1], во втором цикле [0]
      Buffer[cb]=(sum/Range)*10000; 
      // предыдущее значение индюка равно=сумма тел {1...7}+[1] деленная на range и умноженная на 10000
      // на втором цикле значение индюка на последнем баре равно=сумма тел {1...7}+[1]+[0] 
      // минус тело [8] деленная на range и умноженная на 10000
      sum-=MathAbs(Open[cb+Range-1]-Close[cb+Range-1]);//вычитаем тело [8]
      Comment(Buffer[cb]);
      cb--;
     }
//----
   return(0);
  }


если да, то зачем пересчитывать и менять значения для предпоследнего бара (первый проход цикла while применительно указанного по умолчанию Range?).

Исправил везде, ошибка в коде индикатора. Опять рисует замечательно, но стоит вывести через коммент, получается что считает с 1 бара, на нулевом баре равно 0, хотя и нарисовано в окне индикатора, и в окне данных информация тоже есть.
Если ставишь комент после последнего cb-- , тогда правильно выдает 0 (на баре с индексом -1, а не нулевой как ты говоришь), если до него тогда выдает посчитанное значение (у меня так показывает во всяком случае)

 
Если ставишь комент после последнего cb-- , тогда правильно выдает 0 (на баре с индексом -1, а не нулевой как ты говоришь), если до него тогда выдает посчитанное значение (у меня так показывает во всяком случае)

Ошибка в этом была, благодарен за помощь, спасибо.
Причина обращения: