Индикатор Разные вопросы - страница 15

 

OnCalculate

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

Обычно это происходит при получении нового тика для символа, для которого рассчитывается индикатор.

Индикатор не обязательно должен быть привязан к какому-либо ценовому графику данного символа.

Функция OnCalculate() должна иметь возвращаемый тип int. Возможны два варианта определения. В рамках одного индикатора нельзя использовать обе версии функции.

Первая форма предназначена для тех индикаторов, которые могут рассчитываться на одном буфере данных. Примером такого индикатора является Custom Moving Average.

intOnCalculate(constint rates_total,// размер массива price[]
constint prev_calculated,// бары, обработанные в предыдущем вызове
constint begin,// откуда начинаются значимые данные
constdouble& price[]// массив для расчета
);

 
Marco vd Heijden:

OnCalculate

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

Обычно это происходит при получении нового тика для символа, для которого рассчитывается индикатор.

Индикатор не обязательно должен быть привязан к какому-либо ценовому графику данного символа.

Функция OnCalculate() должна иметь возвращаемый тип int. Возможны два варианта определения. В рамках одного индикатора нельзя использовать обе версии функции.

Первая форма предназначена для тех индикаторов, которые могут рассчитываться на одном буфере данных. Примером такого индикатора является Custom Moving Average.

intOnCalculate(constint rates_total,// размер массива price[]
constint prev_calculated,// бары, обработанные в предыдущем вызове
constint begin,// откуда начинаются значимые данные
constdouble& price[]// массив для расчета
);

Отлично, господин Марко, большое спасибо.
 

(Я использую слово "Lag", оно означает задержку ценового действия, открытия и закрытия ордеров, одно это слово выводит из строя мою платформу MT4).

Я использую нижеприведенную функцию для моего пользовательского индикатора.

int OnCalculate(const int rates_total, const int prev_calculated, const datetime & time[], const double & open[], const double & high[], const double & low[], const double & close[], const long & tick_volume[], const long & volume[], const int & spread[]){...}

Когда я пишу нижеприведенный код возврата для моего пользовательского индикатора, то мой пользовательский индикатор начинает запаздывать. Но работает корректно, что мне и нужно.

return(0); // starts to lag...

И когда я пишу ниже код возврата к моему пользовательскому индикатору, мой пользовательский индикатор не работает правильно, что я и хочу. То есть при фальшивом пересечении МА "Стрелка" не возвращается к предыдущей точке пересечения МА.

return rates_total-1; // does not go back to previous MA cross point
return(rates_total-1); // and same thing here

Вопрос: Что я могу сделать в этой ситуации, пожалуйста?

Заранее спасибо.

 
Max Enrik: И когда я пишу нижеприведенный код возврата к моему пользовательскому индикатору, то мой пользовательский индикатор не работает правильно, как я хочу. Я имею в виду, что при фальшивом пересечении МА "Стрелка" не возвращается к предыдущей точке пересечения МА.
Опубликуйте весь свой код. Это бессмысленно без контекста.
 
whroeder1:
Опубликуйте весь свой код. Это бессмысленно без контекста.

Вот, пожалуйста.

Заранее спасибо.

Пример индикатора График 06

#property strict
#property indicator_chart_window
#property indicator_buffers 2

string arrowIcon="delete arrow icon";

int i;
double arrowLow,arrowHigh,priceOne,priceTwo,priceOne_pre,priceTwo_pre,bufferOne[],bufferTwo[];
color clrup=clrBlue,clrdown=clrRed;
datetime arrowTime;
//---------------------------------------------------------
// OnDeinit
void OnDeinit(const int reason)
  {
   ObjectsDeleteAll(0,"delete");
   return;
  }
// OnInit
int OnInit()
  {
   IndicatorDigits(Digits);
// line
   SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,1,clrdown);
   SetIndexBuffer(0,bufferOne);

   SetIndexStyle(1,DRAW_LINE,STYLE_SOLID,1,clrup);
   SetIndexBuffer(1,bufferTwo);
//---
   return(0);
  }
// OnCalculate
int OnCalculate(const int rates_total,const int prev_calculated,
                const datetime  &time[],const double  &open[],const double  &high[],
                const double  &low[],const double  &close[],const long  &tick_volume[],
                const long  &volume[],const int  &spread[])
  {
//---
   int lookback=30; // I do not know what could I write here.
   for(i=Bars-1-MathMax(lookback,prev_calculated); i>=0; --i)
     {
      bufferOne[i]=iMA(Symbol(),0,lookback/2,0,MODE_EMA,PRICE_CLOSE,i);
      bufferTwo[i]=iMA(Symbol(),0,lookback,0,MODE_EMA,PRICE_CLOSE,i);

      priceOne = bufferOne[i];
      priceTwo = bufferTwo[i];
      priceOne_pre = bufferOne[i+5];
      priceTwo_pre = bufferTwo[i+5];

      // buy
      if(priceOne>priceTwo && priceOne_pre<=priceTwo_pre)
        {
         arrowTime=Time[i];
         //arrowLow  = iLow( Symbol(), 0, i );
         arrowLow=Low[i];

         objArrow();
         if(ObjectFind(0,arrowIcon)>=0)
           {
            ObjectMove(0,arrowIcon,0,arrowTime,arrowLow-5*Point);
            ObjectSetInteger(0,arrowIcon,OBJPROP_COLOR,clrup);
            ObjectSetInteger(0,arrowIcon,OBJPROP_ANCHOR,ANCHOR_TOP);
           }
        }
      // sell
      if(bufferOne[i]<bufferTwo[i] && priceOne_pre>=priceTwo_pre)
        {
         arrowTime = Time[i];
         arrowHigh = High[i];

         objArrow();
         if(ObjectFind(0,arrowIcon)>=0)
           {
            ObjectMove(0,arrowIcon,0,arrowTime,arrowHigh+5*Point);
            ObjectSetInteger(0,arrowIcon,OBJPROP_COLOR,clrdown);
            ObjectSetInteger(0,arrowIcon,OBJPROP_ANCHOR,ANCHOR_BOTTOM);
           }
        }
     }
   Print("Time: ",arrowTime,"  Low: ",arrowLow);
//    Print( "priceOne ", DoubleToString( priceOne, Digits ), "  priceTwo ", DoubleToString( priceTwo, Digits ) );
//---
//return(0); // works correct but cause lags
   return(rates_total - 1); // no lags but does not go to previous ma cross after fake ma cross
  }
// objects
void objArrow()
  {
   if(ObjectFind(0,arrowIcon)<0)
     {
      ObjectCreate(0,arrowIcon,OBJ_ARROW,0,arrowTime,arrowLow);
      ObjectSetInteger(0,arrowIcon,OBJPROP_ARROWCODE,159);
      ObjectSetInteger(0,arrowIcon,OBJPROP_WIDTH,2);
     }
//---
   return;
  }
//+------------------------------------------------------------------+
 
Max Enrik: Я имею в виду, что при фальшивом пересечении МА "стрелка" не возвращается к предыдущей точке пересечения МА.
Вы не проверяете это и не перемещаете ее назад.
 
whroeder1:
Вы не можете проверить это и переместить его назад.

ХОРОШО! Спасибо!
 

Мне все еще нужен более четкий ответ.

Заранее спасибо.

 

Ответ:Проверьте как текущее пересечение МА, так и предыдущее пересечение МА.

#Буфер (массив вне диапазона в ) - закрыто
#Задержка пользовательского индикатора - закрыто

 

#Первый результат цикла - Открыть

string counts;
void _a()
{
    counts += "a - " + IntegerToString( ObjectsTotal( OBJ_ARROW ) );
    //---
    return;
}
void _b()
{
    counts += " - b - " + IntegerToString( ObjectsTotal( OBJ_ARROW ) );
    //---
    return;
}
Print( counts );
// while 1st loop: a - 2 - b - 4
// while 2nd loop: a - 2 - b - 4a - 2 - b - 4
// while 3rd loop: a - 2 - b - 4a - 2 - b - 4a - 2 - b - 4a - 2 - b - 4
// and so on...
// But I like only 1st loop results even that loop runs 10 thousand times

Заранее спасибо.

Причина обращения: