Нужна помошь: советник с кастомным индикатором не торгует по сигналам индикатора!

 
Есть индикатор Stop_reversal, создаёт на графике стрелочки зеленая ниже графика показывает вверх - сигнал на покупку, а красная стрелочка сверху графика вниз направленная  - сигнал на продажу.

Вот код индикатора:
#property indicator_chart_window
#include <stdlib.mqh>
#property indicator_buffers 2
#property indicator_color1 Lime
#property indicator_width1 2 
#property indicator_color2 Red
#property indicator_width2 2
 
 
//+------------------------------------------------------------------
 
//| Common External variables                                        
 
//+------------------------------------------------------------------
 
 
//+------------------------------------------------------------------
 
//| External variables                                               
 
//+------------------------------------------------------------------
 
extern double nPips = 0.004;
 
//+------------------------------------------------------------------
 
//| Special Convertion Functions                                     
 
//+------------------------------------------------------------------
 
 
int LastTradeTime;
double ExtHistoBuffer[];
double ExtHistoBuffer2[];
 
void SetLoopCount(int loops)
{
}
 
void SetIndexValue(int shift, double value)
{
  ExtHistoBuffer[shift] = value;
}
 
void SetIndexValue2(int shift, double value)
{
  ExtHistoBuffer2[shift] = value;
}
 
//+------------------------------------------------------------------
 
//| End                                                              
 
//+------------------------------------------------------------------
 
 
//+------------------------------------------------------------------
 
//| Initialization                                                   
 
//+------------------------------------------------------------------
 
 
int init()
{
   SetIndexStyle(0, DRAW_ARROW, STYLE_SOLID);
   SetIndexArrow(0, 233);
   SetIndexBuffer(0, ExtHistoBuffer);
   SetIndexStyle(1, DRAW_ARROW, STYLE_SOLID);
   SetIndexArrow(1, 234);
   SetIndexBuffer(0, ExtHistoBuffer);
   SetIndexBuffer(1, ExtHistoBuffer2);
   return(0);
}
int start()
{
//+------------------------------------------------------------------
 
//| Local variables                                                  
 
//+------------------------------------------------------------------
 
int shift = 0;
double cnt = 0;
double TrStopLevel = 0;
double PREV = 0;
double pass = 0;
 
SetLoopCount(0);
// loop from first bar to current bar (with shift=0)
for(shift=Bars-2;shift>=0 ;shift--){ 
 
 
if( (Close[shift] == PREV) ) 
{
TrStopLevel=PREV;
 
}
else 
{
if( (Close[shift+1])<PREV && (Close[shift]<PREV)  ) 
{
TrStopLevel=MathMin(PREV,Close[shift]*(1+nPips));
}
 
      else 
      {
            if( ((Close[shift+1])>PREV) && (Close[shift]>PREV) ) 
            {
            TrStopLevel=MathMax(PREV,Close[shift]*(1-nPips));
            }
 
 
            else 
                  {
                  if( (Close[shift]>PREV) ) 
                  {                   
                  TrStopLevel=Close[shift]*(1-nPips);
                  }
 
                        else TrStopLevel=Close[shift]*
(1+nPips);
                  }
      }
}
 
 
if( Close[shift] > TrStopLevel &&  Close[shift+1]<PREV && PREV != 
0 ) 
{
//SetOrder(OP_BUY,1,ask,2,0,ask+TakeProfit*Point,blue);
//Alert("buy");
SetIndexValue(shift, TrStopLevel);
}
 
 
if( Close[shift] < TrStopLevel &&  Close[shift+1]>PREV  && PREV != 
0  ) 
{
//SetOrder(OP_SELL,1,bid,2,0,bid-TakeProfit*Point,Red);
SetIndexValue2(shift, TrStopLevel);
//Alert("Sell");
}
 
 
PREV=TrStopLevel;
//Alert(TrStopLevel);
} 
 
  return(0);
}
Нужно сделать советник открывающий позу при появлении соответствующей стрелочки и закрывающий перед открытием противоположную позу. т.е. торговая система полчается канально-переворотной, всё время в рынке.
Вот сделал код (привожу часть кода советника отвечающую за закрытие противоположной и открытие нужной позы):
   
int r=0;
if (OrdersTotal()!=0)
{
for(r=0; r<=50; r++)
{
 if (iCustom(NULL,0,"Stop_reversal",0,r)!=0 )
  {
  if(our==2)
  {
  Zakr_Pokypka();
  break;
  }
  }
 
 if (iCustom(NULL,0,"Stop_reversal",1,r)!=0 )
  {
  if (our==1) 
  {
  Zakr_Prodaza();
  break;
  }
  }
}
} 
   
int i=0;  
int war=0;
if (OrdersTotal()==0)
{
for(i=0; i<=50; i++)
{
 if (iCustom(NULL,0,"Stop_reversal",0,i)!=0 )
  {
  war=1;
  break;
  }
 
 if (iCustom(NULL,0,"Stop_reversal",1,i)!=0 )
  {
  war=2;  
  break;
  }
}
 
 
} 
if (war==1)
{
Prodaza();
our=1;
}
if (war==2)
{
Pokypka();
our=2;
}
По идее всё должно работать, но советник просто не видит сигналов индикатора и просто при установки на график открывает СЕЛЛ.
Кто может помочь - помогайте!
 

При вызове iCustom(NULL,0,"Stop_reversal",0,r) не указан внешний парамер extern double nPips = 0.004; если конечно приведенный эксперт называется Stop_reversal , у меня он называется скромно Signal. К тому же он похоже перерисовывает, пробовал его давно, но результаты признал неперспективными.

 
Figar0:

При вызове iCustom(NULL,0,"Stop_reversal",0,r) не указан внешний парамер extern double nPips = 0. 004;

Ну и что, что не указан, будет работать со значением из extern double nPips индикатора, менять только из советника нельзя.
Мне не нравится код советника. Критиковать не берусь, но желательно распечатать iCustom, если данные нормальные,
то упростить советник до тупого открытия позиции, а уж потом прикрутить переворот. По ходу стук наружу выйдет.
Как возможная причина - в индикаторе не заданы нулевые значения буферов.
 
granit77:Ну и что, что не указан, будет работать со значением из extern double nPips индикатора, менять только из советника нельзя.
Мне не нравится код советника. Критиковать не берусь, но желательно распечатать iCustom, если данные нормальные,
то упростить советник до тупого открытия позиции, а уж потом прикрутить переворот. По ходу стук наружу выйдет.
Как возможная причина - в индикаторе не заданы нулевые значения буферов.


Точно, посмотрел повнимательнее, значение индикатора никогда не равно 0. А так что где-то 2147483647 ...

З.Ы. Спасибо за замечание по поводу необязательности параметров iCustom, как-то всегда проставляю, даже и не знал... Проверил - работает)

 
Вместо           if (iCustom(.....................)  != 0 )
используй      if (iCustom(.....................)  != EMPTY_VALUE )

У тебя в любом случае war=1, т.к. EMPTY_VALUE != 0...
Поэтому и встаёт сразу в шорт.
 
Figar0:

При вызове iCustom(NULL,0,"Stop_reversal",0,r) не указан внешний парамер extern double nPips = 0. 004; если конечно приведенный эксперт называется Stop_reversal , у меня он называется скромно Signal. К тому же он похоже перерисовывает,
пробовал его давно, но результаты признал неперспективными.





Тестировал индикатор на визуальном тестере, он не перерисовывает.
Похоже это действительно один и тот же индикатор.
нПипс добавил. Но всё же советник не работает... Также просто открывает СЕЛЛ и необращает внимание на индикатор...

Красиво смотррится на графике.
 
meta-trader2007 писал (а):

Тестировал индикатор на визуальном тестере, он не перерисовывает.
Похоже это действительно один и тот же индикатор.
нПипс добавил. Но всё же советник не работает... Также просто открывает СЕЛЛ и необращает внимание на индикатор...
И чё, EMPTY_VALUE не помогает ???
 

:) Мужики, iClose[0] на тесторе - это всегда клозе текущей свечи, даже, если его еще не было. А в реале-то вы не знаете, как нас ждет клозе. Это называется смотрим в будущее. Не построишь туто советника. Пробывал не раз, в реале слив будет.

 
meta-trader2007 писал (а):
Есть индикатор Stop_reversal, создаёт на графике стрелочки зеленая ниже графика показывает вверх - сигнал на покупку, а красная стрелочка сверху графика вниз направленная - сигнал на продажу.

Вот код индикатора:

 
int init()
{
   SetIndexStyle(0, DRAW_ARROW, STYLE_SOLID);
   SetIndexArrow(0, 233);
   SetIndexBuffer(0, ExtHistoBuffer);
   SetIndexStyle(1, DRAW_ARROW, STYLE_SOLID);
   SetIndexArrow(1, 234);
   SetIndexBuffer(0, ExtHistoBuffer);
   SetIndexBuffer(1, ExtHistoBuffer2);
   return(0);
}

По идее всё должно работать, но советник просто не видит сигналов индикатора и просто при установки на график открывает СЕЛЛ.
Кто может помочь - помогайте!
Не тестировал, но заметил, что в функции инициализации 0-й буфер SetIndexBuffer(0, ExtHistoBuffer) устанавливается дважды
 

meta-trader2007

Попробуйте вшить алгоритм индикатора в советник. И добавте переменную которая при установке стрелочки присваивает какой либо переменной 1 или -1. Может так заработает.

 
Ясно, что в советник из буферов индикатора вместо нуля прет 2147483647 ...
Если не хотите трогать индикатор, то есть вставить в инит
SetIndexEmptyValue(0,0.0);
SetIndexEmptyValue(1,0.0);

то получайте сигнал другим путем:

если iCustom>100000, считаем, что сигнала (стрелки) нет
если iCustom<100000, считаем, что сигнал есть (стрелка появилась)

Туповато, но я иногда применяю, чтоб не лазить в индикатор. Работает 100%.