포럼을 어지럽히 지 않도록 모든 초보자 질문. 프로, 놓치지 마세요. 너 없이는 아무데도 - 6. - 페이지 545

 
GSB :

또 다른 더블은 무엇입니까? 완전히 다른 매개 변수를 사용하여 동일한 표시기를 호출할 수 있습니다.



지표 자체에 있는 경우
 extern int        periodAMA= 10 ;
고문에서
 extern int periodAMA_1= 8 ; 
extern int periodAMA_2= 13 ; 

표시기 코드는 전달된 매개변수를 어떻게 인식합니까?이름이 다른가요?

그러나 그건 그렇고, 모든 것이 당신이 말한대로입니다. 스크립트로 다시 확인)

 
Forexman77 :
EA의 지표 자체에있는 경우

표시기 코드는 전달된 매개변수를 어떻게 인식합니까?이름이 다른가요?

그러나 그건 그렇고, 모든 것이 당신이 말한대로입니다. 스크립트로 다시 확인)


호출 프로그램에서 변수의 이름은 원하는 대로 지정할 수 있습니다. 이름은 표시기의 변수 이름과 연결되지 않습니다. 이들은 서로 다른 변수이며 일반적으로 다른 터미널 스레드에서 호출됩니다.

표시기는 세 번째 위치에 표시된 이름으로 호출되고 네 번째 위치에서 호출될 때마다 매개변수가 전달된 다음 iCustom() 매개변수가 전달되며 표시기 계산에 사용되는 것이 있습니다.

변수 per1=9인 경우; iCustom()이 4위에 있으면 지표는 기간 9로 계산되고 다른 변수를 설정합니다. 해당 값은 계산에 사용되며 이는 모든 지표 매개변수에 적용됩니다. 표시기 자체에서와 같이 올바른 순서입니다. 표시기의 첫 번째 매개변수로 전달(참조)할 변수 - 네 번째 iCustom() 두 번째는 다섯 번째 등입니다.

 
GSB :

호출 프로그램에서 변수의 이름은 원하는 대로 지정할 수 있습니다. 이름은 표시기의 변수 이름과 연결되지 않습니다. 이들은 서로 다른 변수이며 일반적으로 다른 터미널 스레드에서 호출됩니다.

표시기는 세 번째 위치에 표시된 이름으로 호출되고 네 번째 위치에서 호출될 때마다 매개변수가 전달된 다음 iCustom() 매개변수가 전달되며 표시기 계산에 사용되는 것이 있습니다.

변수 per1=9인 경우; iCustom()이 4위에 있으면 지표는 기간 9로 계산되고 다른 변수를 설정합니다. 해당 값은 계산에 사용되며 이는 모든 지표 매개변수에 적용됩니다. 표시기 자체에서와 같이 올바른 순서입니다. 표시기의 첫 번째 매개변수로 전달(참조)할 변수 - 네 번째 iCustom() 두 번째는 다섯 번째 등입니다.



알았다. 튜토리얼에서는 이것을 강제성 값 전달이라고 하는 것 같습니다.
 

나는 포럼을 어지럽히고 별도의 주제를 시작할 가치가 없다고 생각했지만 내 문제에 대한 건설적인 답변을 정말로 희망합니다. 이것이 없으면 나는 꿈쩍도 하지 않을 것입니다 :(
다양한 지표를 작성하려고 시도했지만 모든 것이 잘 된 것 같습니다. 이제 iCustom() 함수를 사용하여 모든 것을 Expert Advisor로 전송합니다. 고문의 코드:

 double ma= iCustom ( NULL , 0 , "TestMA" , 0 , 1 );

표시기 자체(테스트용으로 작성됨)

 //+------------------------------------------------------------------+
//|                                                       TestMA.mq4 |
//|                                  Copyright 2014, Semyon Polyakov |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, Semyon Polyakov"
#property link        "https://www.mql5.com"
#property version    "1.00"
#property strict
#property indicator_chart_window

double ExtMapBuffer1[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- indicator buffers mapping
   
 
   SetIndexStyle ( 0 , DRAW_LINE , EMPTY , 1 , clrRed );
   SetIndexBuffer ( 0 ,ExtMapBuffer1);
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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 counted_bars= IndicatorCounted (),
       limit;
 
   if (counted_bars> 0 )
      counted_bars--;
   
   limit= Bars -counted_bars;
     
   for ( int i= 0 ;i<limit;i++)
   {
      ExtMapBuffer1[i]=SimpleMA(i, 20 ,close);
   }
//--- return value of prev_calculated for next call
   return (rates_total);
  }
  
   double SimpleMA( const int position, const int period, const double &price[])
  {
//---
   double result= 0.0 ;
//--- check position
   if (position>= 0 && period> 0 )
     {
       //--- calculate value
       for ( int i= 0 ;i<period;i++) result+=price[position+i];
      result/=period;
     }
//---
   return (result);
  }
//+------------------------------------------------------------------+

다음으로 테스트할 때 EMPTY_VALUE 로 헛소리를 합니다.

저것들. 테스트를 시작할 때 EA의 시작 날짜가 있으며 이 날짜 이전의 모든 항목은 iCustom이 올바른 표시기 값을 제공하며 그 이후의 모든 항목은 EMPTY_VALUE에서 직접 테스트됩니다. :(
나는 이미 구글과 포럼을 검색하는 것에 지쳤고 그들은 "미래를 내다보지 말라"고 썼지만 코드에서는 이것을 볼 수 없었습니다. 내가 어디 바보야?)

 
Semionn :

나는 포럼을 어지럽히고 별도의 주제를 시작할 가치가 없다고 생각했지만 내 문제에 대한 건설적인 답변을 정말로 희망합니다. 이것이 없으면 나는 꿈쩍도 하지 않을 것입니다 :(
다양한 지표를 작성하려고 시도했지만 모든 것이 잘 된 것 같습니다. 이제 iCustom() 함수를 사용하여 모든 것을 Expert Advisor로 전송합니다. 고문의 코드:

표시기 자체(테스트용으로 작성됨)

다음으로 테스트할 때 EMPTY_VALUE로 헛소리를 합니다.

저것들. 테스트를 시작할 때 EA의 시작 날짜가 있으며 이 날짜 이전의 모든 항목은 iCustom이 올바른 표시기 값을 제공하며 그 이후의 모든 항목은 EMPTY_VALUE에서 직접 테스트됩니다. :(
나는 이미 구글과 포럼을 검색하는 것에 지쳤고 그들은 "미래를 내다보지 말라"고 썼지만 코드에서는 이것을 볼 수 없었습니다. 내가 어디 바보야?)

전문가의 코드에 오류가 있는 것 같습니다. 디버거를 사용하지 않는 이유는 무엇입니까? 중단점을 설정하고 변수의 값을 확인하고 일반적으로 표시기가 호출되었는지 여부, 날짜 이전과 이후를 볼 수 있습니다.
 
GSB :
전문가의 코드에 오류가 있는 것 같습니다. 디버거를 사용하지 않는 이유는 무엇입니까? 중단점을 설정하고 변수의 값을 확인하고 일반적으로 표시기가 호출되었는지 여부, 날짜 이전과 이후를 볼 수 있습니다.

디버거는 데모 계정 모드에서만 사용할 수 있으며 테스트용으로는 사용할 수 없습니다. 또한 표시기가 호출되고 올바른 값이라도 작동하고 반환하지만 지정된 날짜(테스트 시작 날짜)까지만 사용할 수 있다고 썼습니다. Expert Advisor에 변수 값을 표시하기 때문에 처음에는 모든 것이 괜찮다고 말한 다음 EMPTY_VALUE
 
Semionn :

디버거는 데모 계정 모드에서만 사용할 수 있으며 테스트용으로는 사용할 수 없습니다. 또한 표시기가 호출되고 올바른 값이라도 작동하고 반환하지만 지정된 날짜(테스트 시작 날짜)까지만 사용할 수 있다고 썼습니다. Expert Advisor에 변수 값을 표시하기 때문에 처음에는 모든 것이 괜찮다고 말한 다음 EMPTY_VALUE


사용자 지정 표시기 에서 새 막대를 추적하는 방법을 주의 깊게 읽었습니까?

[인용]첫 번째 매개변수 rate_total은 지표에서 계산할 수 있는 막대의 수를 포함하며 차트에서 사용할 수 있는 막대의 수에 해당합니다.

OnCalculate() 함수에서 반환된 값과 두 번째 입력 매개변수 prev_calculated 사이의 관계에 유의하십시오. 함수를 호출할 때 prev_calculated 매개변수에는 이전 호출에서 OnCalculate() 함수가 반환한 값이 포함됩니다. 이를 통해 이 기능의 이전 실행 이후 변경되지 않은 막대에 대한 재계산을 피하기 위해 사용자 지정 지표를 계산하는 경제적인 알고리즘을 구현할 수 있습니다.

이렇게 하려면 일반적으로 현재 함수 호출의 막대 수를 포함하는 Rates_total 매개변수의 값을 반환하는 것으로 충분합니다. OnCalculate() 함수에 대한 마지막 호출 이후 가격 데이터가 변경된 경우(더 깊은 기록이 업로드되었거나 기록 간격이 채워진 경우) prev_calculated 입력 매개변수의 값은 터미널 자체에서 0으로 설정됩니다. [/인용문]

 

20일 동안의 1일 모멘텀의 평균을 구한 다음 5일 동안의 20일 모멘텀의 평균을 찾아야 합니다.

20일 동안의 평균을 구하는 것은 문제가 되지 않았습니다. 하지만 이 평균에서 5에 대한 평균을 얻는 방법을 모르겠습니다.

 #property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Lime

//--- input parameters
extern int        Period_MA_1= 1 ;
extern int        p          = 20 ;
//--- buffers
double ExtMapBuffer1[];
double val20[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle ( 0 , DRAW_LINE );
   SetIndexBuffer ( 0 ,ExtMapBuffer1);
   IndicatorDigits ( Digits + 1 );
//----
   return ( 0 );
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
   return ( 0 );
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
     int counted_bars= IndicatorCounted (),                      
    limit;
     double momentum20;
   if (counted_bars> 0 )
      counted_bars--;  
   limit= Bars -counted_bars;
    
   for ( int i= 0 ;i<limit;i++)
   {
      momentum20= 0 ;
       ArrayInitialize (val20, 0 );      
       for ( int k=p;k>= 0 ;k--)
      {
       ArrayResize (val20,p);
      val20[k]= Close [i+k]- Close [i+k+Period_MA_1];
      momentum20=momentum20+val20[k];
      }
      momentum20=momentum20/p;
      ExtMapBuffer1[i]=momentum20;
   }
   return ( 0 );
  }
 
Forexman77 :

20일 동안의 1일 모멘텀의 평균을 구한 다음 5일 동안의 20일 모멘텀의 평균을 찾아야 합니다.

20일 동안의 평균을 구하는 것은 문제가 되지 않았습니다. 하지만 이 평균에서 5에 대한 평균을 얻는 방법을 모르겠습니다.



 //+------------------------------------------------------------------+
//|                                                   ForexMan77.mq4 |
//|                                            Copyright 2014, Vinin |
//|                                                    vinin@mail.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, Vinin"
#property link        "vinin@mail.ru"
#property version    "1.00"
#property strict
#property indicator_separate_window
#property indicator_buffers 3
#property indicator_color1 Lime
#property indicator_color2 Yellow
#property indicator_color3 Red

//--- input parameters
extern int        Period_MA_1= 1 ;
extern int        p2          = 20 ;
extern int        p3          = 5 ;
//--- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];
double ExtMapBuffer3[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle ( 0 , DRAW_LINE );
   SetIndexBuffer ( 0 ,ExtMapBuffer1);
   SetIndexStyle ( 1 , DRAW_LINE );
   SetIndexBuffer ( 1 ,ExtMapBuffer2);
   SetIndexStyle ( 2 , DRAW_LINE );
   SetIndexBuffer ( 2 ,ExtMapBuffer3);

//----
   return ( 0 );
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
   return ( 0 );
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int counted_bars= IndicatorCounted (),
   i,limit1,limit2,limit3;
   limit1= Bars -counted_bars- 1 ;
   limit2=limit1;
   limit3=limit2;
   if (limit1> 0 ) 
     {
      limit1= Bars -Period_MA_1- 1 ;
      limit2=limit1-p2;
      limit3=limit2-p3;
     }

   for (i=limit1;i>= 0 ;i--) ExtMapBuffer1[i]= iMomentum ( NULL , 0 , Period_MA_1, PRICE_CLOSE , i);
   for (i=limit2;i>= 0 ;i--) ExtMapBuffer2[i]= iMAOnArray (ExtMapBuffer1, 0 , p2, 0 , MODE_SMA ,i);
   for (i=limit3;i>= 0 ;i--) ExtMapBuffer3[i]= iMAOnArray (ExtMapBuffer2, 0 , p3, 0 , MODE_SMA ,i);

   return ( 0 );
  }
//+------------------------------------------------------------------+
 

돕다

 int OnInit ()
{
   EventSetTimer ( 60 );
   Print (GetLastError());

   return ( INIT_SUCCEEDED );
}

타이머가 작동하지 않고 false 및 오류 4051을 반환합니다.

또는 테스터에서 작동하지 않아야 합니까?