Использование кастом-индикаторов в стратегиях - ?

 
Товарищи
При попытках разобраться со стратегиями и индикаторами у меня возникла проблема следующего характера.
Есть parabolic SAR, на основании которого я делаю свой индикатор. Этот индикатор показывает 1, когда САР опускается ниже графика цен, -1 - когда поднимается выше, и 0 - во всех остальных случаях.
Код имеет вид:

//+------------------------------------------------------------------+
//|                                                      GOscSAR.mq4 |
//|                                                                  |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright ""
#property link      ""
#property indicator_separate_window
#property indicator_minimum -1
#property indicator_maximum 1
#property indicator_buffers 1
#property indicator_color1 Red
extern double SARStep = 0;
extern double SARMax = 0;
//---- buffers
double Buffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
{
 SetIndexStyle( 0,DRAW_HISTOGRAM );
 SetIndexBuffer( 0,Buffer );
 return(0);
}
double SAR( int bar )
{
 double ret = iSAR( Symbol(), NULL, SARStep, SARMax, bar );
 return (ret);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
{
 for( int bar = 0; bar < Bars ; bar++ )
 {
  double value = 0;
  double prev = SAR( bar + 1 );
  double curr = SAR( bar );
  if( prev <= iLow( Symbol(), NULL, bar + 1 ) && curr >= iHigh( Symbol(), NULL, bar ) ) 
  {
   value = -1;
  }
  else if( prev >= iHigh( Symbol(), NULL, bar + 1 ) && curr <= iLow( Symbol(), NULL, bar ) )
  {
   value = 1;
  }
  Buffer[ bar ] = value;
  
 }//for
return(0);
}
//+------------------------------------------------------------------+

У меня есть простая стратегия, которая использует этот индикатор следующим образом. Если значение индикатора 1 - делает buy, если -1 - делает sell, если перед этим был открытый ордер - использует те же самые сигналы 1 и -1 для закрытия.
Код имеет вид:

//+------------------------------------------------------------------+
//|                                                       Test01.mq4 |
//|                                                                  |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright ""
#property link      ""
#include "includeGUtils.mqh"
extern double Lots = 1;
extern int Length = 3;
extern double BuyLevel = 0.3;
extern double SellLevel = -0.3;
extern double SARStep = 0.02;
extern double SARMax = 0.2;

int m_Ticket = 0;
double m_dSAR = 0.0;

void CheckClosePos( int ticket )
{
  
   double price = -1;
   if( m_dSAR != 0 )
   {
      int pos = OrderType();
      price = GetPrice( pos, false );
   }//if
   if( price > 0 )
   {
  if( !OrderClose( ticket, Lots, price, 0 ) )
      {
         int err = GetLastError();
  }//if           
   }//if price
}
int CheckOpenPos()
{
  
   double price = 0;
   int result = 0;
   int pos = -1;
   if( m_dSAR > 0 )
   {
      pos = OP_BUY;
   }//if
  
   else if( m_dSAR < 0 )
   {
      pos = OP_SELL;  
   }//else if
  
   price = GetPrice( pos, true );
  
   if( price > 0 )
   {
  result = OrderSend( Symbol(), pos, Lots, price, 0, 0, 0 );
  
   }//if
   return (result);
}
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
{
   m_dSAR = iCustom( Symbol(), NULL, "GOscSAR", SARStep, SARMax, 0, 0 );
   Print("GOscSAR: " + m_dSAR);
  
   if( OrderSelect( m_Ticket, SELECT_BY_TICKET )  )
   {
      CheckClosePos( m_Ticket );
   }//if
   if( OrdersTotal() == 0 )
   {
      m_Ticket = CheckOpenPos();
   }//if
   
   return(0);
}
//+------------------------------------------------------------------+
Проблема состоит в следующем. При тестировании у меня генерируется набор сигналов 1, -1 (окно индикатора под графиком цен) и на барах, где эти сигналы сгенерированы, я ожидаю увидеть открытие/закрытие соответсвующих позиций. Но! Этих открытий/закрытий нет, а в журнале я вижу, что все значения САР-а равны 0 (выводятся строчкой Print("GOscSAR: " + m_dSAR) ). При этом повторяю - индикатор отображается верно.
Вопрос: что я сделал неверно? Почему код стратегии получает значения, отличные от тех, которые генерирует мой кастом-индикатор.
З.Ы. Я только начинаю практиковаться, так что буду рад любым замечаниям и предложениям.

 
Индикатор

//+------------------------------------------------------------------+
//|                                                      GOscSAR.mq4 |
//|                                                                  |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright ""
#property link      "" 
 
#property indicator_separate_window
#property indicator_minimum -1
#property indicator_maximum 1
#property indicator_buffers 1
#property indicator_color1 Red
 
extern double SARStep = 0;
extern double SARMax = 0;
//---- buffers
double Buffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
{
 SetIndexStyle( 0,DRAW_HISTOGRAM );
 SetIndexBuffer( 0,Buffer );
 return(0);
}
 
double SAR( int bar )
{
 double ret = iSAR( Symbol(), NULL, SARStep, SARMax, bar );
 return (ret);
} 
 
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
{
 for( int bar = 0; bar < Bars ; bar++ )
 {
  double value = 0;
  double prev = SAR( bar + 1 );
  double curr = SAR( bar );
  if( prev <= iLow( Symbol(), NULL, bar + 1 ) && curr >= iHigh( Symbol(), NULL, bar ) ) 
  {
   value = -1;
  }
  else if( prev >= iHigh( Symbol(), NULL, bar + 1 ) && curr <= iLow( Symbol(), NULL, bar ) )
  {
   value = 1;
  }
  Buffer[ bar ] = value;
  
 }//for
 
 return(0);
}
//+------------------------------------------------------------------+
 
Советник

//+------------------------------------------------------------------+
//|                                                       Test01.mq4 |
//|                                                                  |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright ""
#property link      ""
 
#include "include\GUtils.mqh"
 
extern double Lots = 1;
extern int Length = 3;
extern double BuyLevel = 0.3;
extern double SellLevel = -0.3;
extern double SARStep = 0.02;
extern double SARMax = 0.2;
 
int m_Ticket = 0;
double m_dSAR = 0.0;
 
void CheckClosePos( int ticket )
{
   
   double price = -1;
   if( m_dSAR != 0 )
   {
      int pos = OrderType();
      price = GetPrice( pos, false );
   }//if
   if( price > 0 )
   {
  if( !OrderClose( ticket, Lots, price, 0 ) )
      {
         int err = GetLastError();
  }//if            
   }//if price
}
 
int CheckOpenPos()
{
   
   double price = 0;
   int result = 0;
   int pos = -1;
   if( m_dSAR > 0 )
   {
      pos = OP_BUY;
   }//if
   
   else if( m_dSAR < 0 )
   {
      pos = OP_SELL;   
   }//else if
   
   price = GetPrice( pos, true );
   
   if( price > 0 )
   {
  result = OrderSend( Symbol(), pos, Lots, price, 0, 0, 0 ); 
   
   }//if
   return (result);
}
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
{
   m_dSAR = iCustom( Symbol(), NULL, "GOscSAR", SARStep, SARMax, 0, 0 );
   Print("GOscSAR: " + m_dSAR);
   
   if( OrderSelect( m_Ticket, SELECT_BY_TICKET )  )
   {
      CheckClosePos( m_Ticket );
   }//if
   if( OrdersTotal() == 0 )
   {
      m_Ticket = CheckOpenPos();
   }//if
   
   return(0);
}
//+------------------------------------------------------------------+
 
Может надо так ?
iCustom( Symbol(), 0, "GOscSAR", SARStep, SARMax, 0, 0 );
 
Rosh:
Советник

//+------------------------------------------------------------------+
//|                                                       Test01.mq4 |
//|                                                                  |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright ""
#property link      ""
 
#include "includeGUtils.mqh"
 
extern double Lots = 1;
extern int Length = 3;
extern double BuyLevel = 0.3;
extern double SellLevel = -0.3;
extern double SARStep = 0.02;
extern double SARMax = 0.2;
 
int m_Ticket = 0;
double m_dSAR = 0.0;
 
void CheckClosePos( int ticket )
{
   
   double price = -1;
   if( m_dSAR != 0 )
   {
      int pos = OrderType();
      price = GetPrice( pos, false );
   }//if
   if( price > 0 )
   {
  if( !OrderClose( ticket, Lots, price, 0 ) )
      {
         int err = GetLastError();
  }//if            
   }//if price
}
 
int CheckOpenPos()
{
   
   double price = 0;
   int result = 0;
   int pos = -1;
   if( m_dSAR > 0 )
   {
      pos = OP_BUY;
   }//if
   
   else if( m_dSAR < 0 )
   {
      pos = OP_SELL;   
   }//else if
   
   price = GetPrice( pos, true );
   
   if( price > 0 )
   {
  result = OrderSend( Symbol(), pos, Lots, price, 0, 0, 0 ); 
   
   }//if
   return (result);
}
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
{
   m_dSAR = iCustom( Symbol(), NULL, "GOscSAR", SARStep, SARMax, 0, 0 );
   Print("GOscSAR: " + m_dSAR);
   
   if( OrderSelect( m_Ticket, SELECT_BY_TICKET )  )
   {
      CheckClosePos( m_Ticket );
   }//if
   if( OrdersTotal() == 0 )
   {
      m_Ticket = CheckOpenPos();
   }//if
   
   return(0);
}
//+------------------------------------------------------------------+



Маленькое дополнение.
Файл #include "includeGUtils.mqh"
содержит функцию GetPrice(), имеющую вид:

double GetPrice( int position, bool isOpen = true )
{
   double result = 0;
   if( isOpen )
   {
      switch( position )
      {
      case OP_BUY :
         result = Ask;
         break;
      case OP_SELL :
         result = Bid;
         break;
      }//switch
   }//if
   else 
   {
      switch( position )
      {
      case OP_BUY :
         result = Bid;
         break;
      case OP_SELL :
         result = Ask;
         break;
      }//switch
   
   }//else
   return (result);
}
 
Rosh:
Может надо так ?
iCustom( Symbol(), 0, "GOscSAR", SARStep, SARMax, 0, 0 );



Возможно.
А можно пояснить: чем второй параметр 0 отличается от NULL?
PS Установка второго параметра в 0 изменений не принесла. При тестировании использую модель по ценам открытия ( со сформированными барами )
 
Смените модель на Control Points - должно заработать :)
 
Rosh:
Смените модель на Control Points - должно заработать :)

Спасибо, заработало :)
 
To Rosh - мне показалось, что у Параболика можно кроме "сверху/снизу" выделить "движение/флэт". В зависимости от

if(SAR(bar)<low && SAR(bar+1))<low && SAR(bar+2))<low) 
{
   double d=(SAR(bar)-SAR(bar+1))/(SAR(bar+1)-SAR(bar+2)) ;
   if(d>1) ...; // Mart Go Up
}

или ... и так не делают? задержка в два бара все скушает.


    
 
Обычно параболик используют как трендовый индикатор.