MQL4 및 MQL5에 대한 초보자 질문, 알고리즘 및 코드에 대한 도움말 및 토론 - 페이지 1445

 
Vitaly Muzichenko :

고맙습니다!

시도했는데 오류가 발생했습니다. 잘못된 작업을 수행하고 있습니다.

버퍼[]가 할당되어 있습니까? 광고는 보이지만 크기 설정이 보이지 않습니다.

 
Artyom Trishkin :

버퍼[]가 할당되어 있습니까? 광고는 보이지만 크기 설정이 보이지 않습니다.

크기를 설정했는데 오류가 여전히 어딘가에 있고 작동하지 않습니다.

 
Vitaly Muzichenko :

크기를 설정했는데 오류가 여전히 어딘가에 있고 작동하지 않습니다.

시작하기 위해 무엇을 통과하고 있습니까?

 
Artyom Trishkin :

시작하기 위해 무엇을 통과하고 있습니까?

   double Array_1[];
   double Array_2[];
   ArraySetAsSeries (close, true );
   int count = rates_total- 1 ;
   if (count < 0 )
       return (- 1 );
   int i = 1 ;
   int period = ( int ) MathFloor ( MathSqrt (a));
   int val_1 = ( int ) MathFloor (a / 1.9 );
   int counter = Bars ( _Symbol , _Period ) - count + a + 1 ;
   if (counter > Bars ( _Symbol , _Period ))
      counter = Bars ( _Symbol , _Period );
   // ArraySetAsSeries(Array_1, true);
   ArrayResize (Array_1, counter);
   // ArraySetAsSeries(Array_2, true);
   ArrayResize (Array_2, counter);
   double d_close = close[ 1 ];
   double buff[];
   ArrayResize (buff, counter);
   for (i = 0 ; i < counter; i++)
      Array_1[i] = 2.0 * ma_1(i, val_1) - ma_1(i, a);
   for (i = 0 ; i < counter - a; i++) {
       // buf_3[i] = iMAOnArray(Array_1, 0, period, 0, MODE_SMMA, i);
       // buf_3[i] = iMA(NULL, 0, period, 0, MODE_SMMA, PRICE_LOW);
       //  CopyBuffer(10,0,i,1,buff);
      SmoothedMAOnBuffer(counter, prev_calculated, i, period, Array_1, buff);
      buf_3[i] = buff[ 0 ];
      }
     .....

//+------------------------------------------------------------------+
int SmoothedMAOnBuffer( const int rates_total, const int prev_calculated, const int begin, const int period, const double & price[], double & buffer[])
{
//--- check period
   if (period<= 1 || period>(rates_total-begin))
       return ( 0 );
//--- save as_series flags
   bool as_series_price= ArrayGetAsSeries (price);
   bool as_series_buffer= ArrayGetAsSeries (buffer);
   ArraySetAsSeries (price, false );
   ArraySetAsSeries (buffer, false );
//--- calculate start position
   int start_position;
   if (prev_calculated== 0 ) { // first calculation or number of bars was changed
       //--- set empty value for first bars
      start_position=period+begin;
       for ( int i= 0 ; i<start_position- 1 ; i++)
         buffer[i]= 0.0 ;
       //--- calculate first visible value
       double first_value= 0 ;
       for ( int i=begin; i<start_position; i++)
         first_value+=price[i];
      buffer[start_position- 1 ]=first_value/period;
   } else
      start_position=prev_calculated- 1 ;
//--- main loop
   for ( int i=start_position; i<rates_total; i++)
       buffer[i]=(buffer[i- 1 ]*(period- 1 )+price[i] )/period;
//--- restore as_series flags
   ArraySetAsSeries (price,as_series_price);
   ArraySetAsSeries (buffer,as_series_buffer);
//---
   return (rates_total);
}
 
Vitaly Muzichenko :

Vitaly, 포함에서 기능을 복사하는 이유는 무엇입니까? 라이브러리를 포함하는 것이 더 쉽지 않습니까?

 #include <MovingAverages.mqh>
 
Vitaly Muzichenko :

일반적으로 루프에서 이 함수에 대한 호출을 제거합니다. 그것은 이미 그 자체로 완전한 주기를 가지고 있습니다. 처음에는 스무딩을 수행하는 기준으로 배열의 중요한 데이터 시작 부분을 전달해야 합니다. 일부 앤티앨리어싱 유형의 경우 사전 계산이 필요합니다. SMMA의 경우 이는 약 2개의 계산 기간입니다.

 
Artyom Trishkin :

일반적으로 루프에서 이 함수에 대한 호출을 제거합니다 . 그것은 이미 그 자체로 완전한 주기를 가지고 있습니다. 처음에는 스무딩을 수행하는 기준으로 배열의 중요한 데이터 시작 부분을 전달해야 합니다. 일부 앤티앨리어싱 유형의 경우 사전 계산이 필요합니다. SMMA의 경우 이는 약 2개의 계산 기간입니다.

그리고 이 경우 새 막대를 추가할 때 전체 배열이 다시 계산되지 않습니까? 예, 버퍼 배열의 현재 값을 변경할 때 다시 계산해도 문제가 되지 않습니다. 그러면 주기 없이 어떻게 합니까?

전체 버퍼에 대해 표시기를 시작한 다음 각 틱의 마지막 인덱스만 시작할 때 한 번? 이것은 즉흥적입니다. 아직 안해봐서... 확인해봐야겠네요.

 
Alexey Viktorov :

그리고 이 경우 새 막대를 추가할 때 전체 배열이 다시 계산되지 않습니까? 예, 버퍼 배열의 현재 값을 변경할 때 다시 계산해도 문제가 되지 않습니다. 그러면 주기 없이 어떻게 합니까?

전체 버퍼에 대해 표시기를 시작한 다음 각 틱의 마지막 인덱스만 시작할 때 한 번? 이것은 즉흥적입니다. 아직 안해봐서... 확인해봐야겠네요.

글쎄, 코드를 봐 - Vitaly가 직접 게시

 
Artyom Trishkin :

글쎄, 코드를 봐 - Vitaly가 직접 게시

이제 MT4에서 "SmoothedMAOnBuffer()" 구성을 디버그하기 위해 왔습니다.

무슨 일이야, 이해가 안 돼

 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[])
{
   double Array_1[];
   double Array_2[];
   int count = IndicatorCounted();
   if (count < 0 )
       return (- 1 );
   int i = 1 ;
   int period = ( int ) MathFloor ( MathSqrt (a));
   int val_1 = ( int ) MathFloor (a / 1.9 );
   int counter = Bars - count + a + 1 ;
   if (counter > Bars )
      counter = Bars ;
   ArraySetAsSeries (Array_1, TRUE);
   ArrayResize (Array_1, counter);
   ArraySetAsSeries (Array_2, TRUE);
   ArrayResize (Array_2, counter);
   double d_close = close[ 1 ];
   double buff[];
   ArrayResize (buff, counter);
   for (i = 0 ; i < counter; i++)
      Array_1[i] = 2.0 * ma_1(i, val_1) - ma_1(i, a);
   for (i = 0 ; i < counter - a; i++) {
     // buf_3[i] = iMAOnArray(Array_1, 0, period, 0, MODE_SMMA, i); // Так индикатор работает
       SmoothedMAOnBuffer(counter, prev_calculated, i, period, Array_1, buff); Совсем не работает, но и ошибок в журнале нет
       buf_3[i] = buff[ 0 ]; ???
   }
   for (i = counter - a; i > 0 ; i--) {
      Array_2[i] = Array_2[i + 1 ];
       if (buf_3[i] > buf_3[i + 1 ])
         Array_2[i] = 1 ;
       if (buf_3[i] < buf_3[i + 1 ])
         Array_2[i] = - 1 ;
       if (Array_2[i] > 0.0 ) {
         buf_1[i] = buf_3[i];
         if (Array_2[i + 1 ] < 0.0 )
            buf_1[i + 1 ] = buf_3[i + 1 ];
         if (Array_2[i + 1 ] < 0.0 ) {
         }
         buf_2[i] = EMPTY_VALUE ;
      } else {
         if (Array_2[i] < 0.0 ) {
            buf_2[i] = buf_3[i];
             if (Array_2[i + 1 ] > 0.0 )
               buf_2[i + 1 ] = buf_3[i + 1 ];
             if (Array_2[i + 1 ] > 0.0 ) {
            }
            buf_1[i] = EMPTY_VALUE ;
         }
      }
   }
   for (i = 0 ; i < counter- 1 ; i++) {
       if (buf_2[i + 1 ] == EMPTY_VALUE && buf_2[i] != EMPTY_VALUE )
         buf_4[i] = buf_2[i];
       if (buf_1[i + 1 ] == EMPTY_VALUE && buf_1[i] != EMPTY_VALUE )
         buf_5[i] = buf_1[i];
   }
   return (rates_total);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
int SmoothedMAOnBuffer( const int rates_total, const int prev_calculated, const int begin, const int period, const double & price[], double & buffer[])
{
//--- check period
   if (period<= 1 || period>(rates_total-begin))
       return ( 0 );
//--- save as_series flags
   bool as_series_price= ArrayGetAsSeries (price);
   bool as_series_buffer= ArrayGetAsSeries (buffer);
   ArraySetAsSeries (price, false );
   ArraySetAsSeries (buffer, false );
//--- calculate start position
   int start_position;
   int i= 0 ;
   if (prev_calculated== 0 ) { // first calculation or number of bars was changed
       //--- set empty value for first bars
      start_position=period+begin;
       for (i= 0 ; i<start_position- 1 ; i++)
         buffer[i]= 0.0 ;
       //--- calculate first visible value
       double first_value= 0 ;
       for (i=begin; i<start_position; i++)
         first_value+=price[i];
      buffer[start_position- 1 ]=first_value/period;
   } else
      start_position=prev_calculated- 1 ;
//--- main loop
   for (i=start_position; i<rates_total; i++)
      buffer[i]=(buffer[i- 1 ]*(period- 1 )+price[i])/period;
//--- restore as_series flags
   ArraySetAsSeries (price,as_series_price);
   ArraySetAsSeries (buffer,as_series_buffer);
//---
   return (rates_total);
}
 
Vitaly Muzichenko :

이제 MT4에서 "SmoothedMAOnBuffer()" 구성을 디버그하기 위해 왔습니다.

무슨 일이야, 이해가 안 돼

주기에서 제거