표시기 기타 질문 - 페이지 15

 

OnCalculate

OnCalculate() 함수는 Calculate 이벤트로 표시기 값을 계산해야 하는 경우 사용자 정의 표시기에서만 호출됩니다.

이것은 일반적으로 지표가 계산되는 기호에 대해 새 틱이 수신될 때 발생합니다.

이 표시기는 이 기호의 가격 차트에 첨부할 필요가 없습니다.

OnCalculate() 함수는 반환 유형이 int여야 합니다. 두 가지 가능한 정의가 있습니다. 하나의 지표 내에서 두 버전의 기능을 모두 사용할 수는 없습니다.

첫 번째 형식은 단일 데이터 버퍼에서 계산할 수 있는 지표를 위한 것입니다. 이러한 지표의 예는 사용자 정의 이동 평균입니다.

정수   OnCalculate ( const   int Rates_total, // price[] 배열의 크기
                  상수   int prev_calculated, // 이전 호출에서 처리된 막대
                  상수   int begin, // 중요한 데이터가 시작되는 위치
                  상수   double & price[] // 계산할 배열
);

 
Marco vd Heijden :

OnCalculate

OnCalculate() 함수는 Calculate 이벤트로 표시기 값을 계산해야 하는 경우 사용자 정의 표시기에서만 호출됩니다.

이것은 일반적으로 지표가 계산되는 기호에 대해 새 틱이 수신될 때 발생합니다.

이 표시기는 이 기호의 가격 차트에 첨부할 필요가 없습니다.

OnCalculate() 함수는 반환 유형이 int여야 합니다. 두 가지 가능한 정의가 있습니다. 하나의 지표 내에서 두 버전의 기능을 모두 사용할 수는 없습니다.

첫 번째 형식은 단일 데이터 버퍼에서 계산할 수 있는 지표를 위한 것입니다. 이러한 지표의 예는 사용자 정의 이동 평균입니다.

정수   OnCalculate ( const   int Rates_total, // price[] 배열의 크기
                  상수   int prev_calculated, // 이전 호출에서 처리된 막대
                  상수   int begin, // 중요한 데이터가 시작되는 위치
                  상수   double & price[] // 계산할 배열
);

완벽합니다, Mr. Marco , 정말 감사합니다.
 

(저는 "지연"이라는 단어를 사용합니다. 이는 가격 조치 지연, 주문 열기, 닫기를 의미하며, 한 단어만 내 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...

그리고 아래에 내 사용자 지정 표시기에 반환 코드를 작성하면 내 사용자 지정 표시기가 내가 원하는 대로 올바르게 작동하지 않습니다. 가짜 MA 크로스 " Arrow "는 이전 MA 크로스 포인트로 돌아가지 않습니다.

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

Q: 이 상황에 대해 무엇을 할 수 있습니까?

미리 감사드립니다.

 
Max Enrik : 내 사용자 지정 표시기에 반환 코드를 아래에 작성하면 내 사용자 지정 표시기가 내가 원하는 대로 올바르게 작동하지 않습니다. 가짜 MA 크로스 " Arrow "는 이전 MA 크로스 포인트로 돌아가지 않습니다.
모든 코드를 게시하십시오. 문맥 없이는 의미가 없습니다.
 
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 : 가짜 MA 크로스 " Arrow "는 이전 MA 크로스 포인트로 돌아가지 않습니다.
당신은 그것을 테스트 하지 않고 그것을 다시 이동합니다.
 
whroeder1 :
당신은 그것을 테스트 하지 않고 그것을 다시 이동합니다.

확인! 감사해요!
 

아직 더 명확한 답변이 필요합니다.

미리 감사드립니다.

 

답은 다음과 같습니다.   현재 MA 교차와 이전 MA 교차를 모두 확인하십시오 .

#Buffer( 배열이 범위 를 벗어남 ) - 닫힘
#커스텀 인디케이터 지연 - 폐쇄

 

# 루프의 첫 번째 결과 - 열기

 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

미리 감사드립니다.

사유: