MT4 iMAOnArray 및 iBandsOnArray 계산에 대한 요소 수의 영향 - 페이지 2

 
Sergey Efimenko :
내가 무엇을 기대합니까? 나는 오프셋 299-0에서 배열에 액세스한다는 사실에도 불구하고 마지막 300(현재) 실제 값이 필요하고 처음 300(초기)이 필요하지 않다고 위에서 썼지만 "끝"에서 오프셋에서 데이터를 얻습니다. 배열"에서 " 배열의 끝 - 300 "값(제 경우에는 4999에서 4700까지), 즉 오프셋 299에는 오프셋 4999에 있어야 하는 값이 있고 오프셋 0에도 마찬가지로 오프셋 4700에 있어야 하는 값입니다. 초기 이력 데이터가 아니라 현재 데이터를 수신하기 위해 배열 계산의 수를 줄이는 실제 경우, 문제는 현재는 수행되지 않습니까?

당신이 쓴 내용에서 명확했다면 질문이 없었을 것입니다.

 double    iMAOnArray (
   double        array[],           // массив               // С этим понятно...
   int           total,             // количество элементов // Это у тебя 300
   int           ma_period,         // период               // Это ???
   int           ma_shift,         // сдвиг средней        // понятно
   int           ma_method,         // метод усреднения     // понятно
   int           shift             // сдвиг                // А здесь чему равна i???
   );

코드 예제를 보여달라는 요청을 받았고 예제의 일부만 보여주었습니다. 나머지는 모두 주기에 있다고 추측할 수 있습니다. i의 어떤 값에서 마지막 현재 값을 얻으시겠습니까??? i = 4700 또는 어디에서?

 
Alexey Viktorov :

당신이 쓴 내용에서 명확했다면 질문이 없었을 것입니다.

코드 예제를 보여달라는 요청을 받았고 예제의 일부만 보여주었습니다. 나머지는 모두 주기에 있다고 추측할 수 있습니다. i의 어떤 값에서 마지막 현재 값을 얻으시겠습니까??? i = 4700 또는 어디에서?

실제로 계산된 배열의 길이에 제한이 있는 표시된 함수를 사용했다면 그것이 무엇인지 이해하게 될 것입니다. 그렇지 않으면 이론적 추론의 요점이 무엇입니까?.. 그리고 내 코드 조각에서 이해할 수 없는 것은 무엇입니까? 나는 첫 번째 경우 배열을 계산하기 위해 길이 제한을 사용하지 않는다는 유일한 차이점과 함께 절대적으로 동일한 섹션을 제공했습니다. 이 경우 계산 기간, 평균 이동 또는 평균 방법은 전혀 중요하지 않습니다. 두 경우 모두 동일합니까? 시프트 값은 위에서 쓴 것처럼 정확히 동일하게 유사하게 사용됩니다. 지정된 줄을 정상적으로 수행되고 새 막대만 계산하는 표시기로 이동하고 루프에서 "i"를 오프셋 변수로 교체하고 GetValue(i) 함수를 최소한 Open[i]로 교체하고 지정된 세 개의 배열을 3으로 만듭니다. 표시기의 버퍼를 표시하고 첫 번째 옵션과 두 번째 옵션이 어떻게 작동하는지 확인합니다. 그러나 다음은 문제의 본질에 대한 이해를 단순화하기 위해 두 가지 버전의 가장 간단한 지표 버전의 전체 코드 예입니다.

// 이것은 잘 작동합니다:
 #property strict
#property indicator_separate_window
#property indicator_buffers 3
#property indicator_color1 clrYellow
#property indicator_color2 clrGreen
#property indicator_color3 clrRed
double Buffer[],BufferMA[],BufferBMA[]; bool firstrun= true ;
int init() { firstrun= true ; SetIndexBuffer ( 0 ,Buffer); SetIndexBuffer ( 1 ,BufferMA); SetIndexBuffer ( 2 ,BufferBMA); return ( 0 ); }
int start() { int i,limit; int counted_bars= IndicatorCounted (); if (counted_bars< 0 ) return (- 1 ); if (counted_bars> 0 ) counted_bars--; limit= Bars -counted_bars- 1 ;
   if (firstrun) { ArrayInitialize (Buffer, Open [ Bars - 1 ]); ArrayInitialize (BufferMA, Open [ Bars - 1 ]); ArrayInitialize (BufferBMA, Open [ Bars - 1 ]); firstrun= false ; }
   for (i=limit; i>= 0 ; i--) { Buffer[i]= Open [i]; BufferMA[i]= iMAOnArray (Buffer, 0 , 12 , 0 , 0 ,i); BufferBMA[i]= iBandsOnArray (Buffer, 0 , 12 , 2 , 0 , MODE_MAIN ,i); }
return ( 0 ); }

// 다음과 같이 작동하지 않습니다.

 #property strict
#property indicator_separate_window
#property indicator_buffers 3
#property indicator_color1 clrYellow
#property indicator_color2 clrGreen
#property indicator_color3 clrRed
double Buffer[],BufferMA[],BufferBMA[]; bool firstrun= true ;
int init() { firstrun= true ; SetIndexBuffer ( 0 ,Buffer); SetIndexBuffer ( 1 ,BufferMA); SetIndexBuffer ( 2 ,BufferBMA); return ( 0 ); }
int start() { int i,limit; int counted_bars= IndicatorCounted (); if (counted_bars< 0 ) return (- 1 ); if (counted_bars> 0 ) counted_bars--; limit= Bars -counted_bars- 1 ;
   if (firstrun) { ArrayInitialize (Buffer, Open [ Bars - 1 ]); ArrayInitialize (BufferMA, Open [ Bars - 1 ]); ArrayInitialize (BufferBMA, Open [ Bars - 1 ]); firstrun= false ; }
   for (i=limit; i>= 0 ; i--) { Buffer[i]= Open [i]; BufferMA[i]= iMAOnArray (Buffer, 300 , 12 , 0 , 0 ,i); BufferBMA[i]= iBandsOnArray (Buffer, 300 , 12 , 2 , 0 , MODE_MAIN ,i);  }
return ( 0 ); }

차트에 표시기를 넣은 후 차트 의 시작 부분(왼쪽)으로 이동하여 막대 12에서 표시기 1을 보고 더 나아가 두 번째 및 세 번째 배열의 "비어 있지 않은" 채우기가 시작됩니다. , 0과 다른 처음 몇 개의 값을 대략적으로 기억한 다음 차트를 현재 따옴표로 이동하고 300bar부터 시작하는 값을 확인하므로 2(하위) 표시기의 값은 다음과 같을 것입니다. 지표 1에 대한 차트의 시작 부분에서 본 값이지만 이론상 값은 현재 값과 일치해야 합니다. 나는 내가 명확하게 설명했기를 바랍니다. 또한 차트를 온라인 차트에 넣으면 첫 번째 차트는 제대로 작동하고 두 번째 차트는 "자체적으로 중단"됩니다.

 
Sergey Efimenko :


스타일이 없는 코드일 뿐만 아니라 일반 텍스트 형태로 코드를 삽입 하기도 합니다. 코드를 올바르게 붙여넣으십시오.
 

좀 더 읽기 쉬운 형식과 새로운 표기법으로 코드를 제시하겠습니다.

지표 1:

 //+------------------------------------------------------------------+
//|                                                         Test.mq4 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property version    "1.00"
#property strict
#property indicator_separate_window
#property indicator_buffers 3
#property indicator_color1 clrYellow
#property indicator_color2 clrGreen
#property indicator_color3 clrRed
double Buffer[];
double BufferMA[];
double BufferBMA[];
bool firstrun= true ;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- indicator buffers mapping
   firstrun= true ;
   SetIndexBuffer ( 0 ,Buffer, INDICATOR_DATA );
   SetIndexBuffer ( 1 ,BufferMA, INDICATOR_DATA );
   SetIndexBuffer ( 2 ,BufferBMA, INDICATOR_DATA );
//---
   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 i,limit;
   limit=rates_total-prev_calculated- 1 ;
   if (prev_calculated== 0 )
     {
       ArrayInitialize (Buffer,open[rates_total- 1 ]);
       ArrayInitialize (BufferMA,open[rates_total- 1 ]);
       ArrayInitialize (BufferBMA,open[rates_total- 1 ]);
     }
   for (i=limit; i>= 0 ; i--)
     {
      Buffer[i]=open[i];
      BufferMA[i]= iMAOnArray (Buffer, 0 , 12 , 0 , MODE_SMA ,i);
      BufferBMA[i]= iBandsOnArray (Buffer, 0 , 12 , 2 , 0 , MODE_MAIN ,i);
     }
   return (rates_total);
  }
//+------------------------------------------------------------------+

지표 2:

 //+------------------------------------------------------------------+
//|                                                         Test.mq4 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property version    "1.00"
#property strict
#property indicator_separate_window
#property indicator_buffers 3
#property indicator_color1 clrYellow
#property indicator_color2 clrGreen
#property indicator_color3 clrRed
double Buffer[];
double BufferMA[];
double BufferBMA[];
bool firstrun= true ;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- indicator buffers mapping
   firstrun= true ;
   SetIndexBuffer ( 0 ,Buffer, INDICATOR_DATA );
   SetIndexBuffer ( 1 ,BufferMA, INDICATOR_DATA );
   SetIndexBuffer ( 2 ,BufferBMA, INDICATOR_DATA );
//---
   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 i,limit;
   limit=rates_total-prev_calculated- 1 ;
   if (prev_calculated== 0 )
     {
       ArrayInitialize (Buffer,open[rates_total- 1 ]);
       ArrayInitialize (BufferMA,open[rates_total- 1 ]);
       ArrayInitialize (BufferBMA,open[rates_total- 1 ]);
     }
   for (i=limit; i>= 0 ; i--)
     {
      Buffer[i]=open[i];
      BufferMA[i]= iMAOnArray (Buffer, 300 , 12 , 0 , MODE_SMA ,i);
      BufferBMA[i]= iBandsOnArray (Buffer, 300 , 12 , 2 , 0 , MODE_MAIN ,i);
     }
   return (rates_total);
  }
//+------------------------------------------------------------------+

그리고 실행 결과:

결과

~에 대한

파일:
Test.mq4  3 kb
Test300.mq4  3 kb
 
Sergey Efimenko :

이러한 기능을 사용한 경우

내가 그것을 사용하지 않는다면, 나는 올바른 결정을 내리기 위해 질문하지 않을 것입니다.

12의 기간으로 계산이 필요한 경우 300 막대를 취하는 요점이 무엇입니까? 이런 식으로 필요하더라도 "왜냐하면" 평균값 계산에 어떤 12개 요소가 포함되는지 이해해야 합니다. 그리고 배열 인덱싱의 방향에 대한 힌트는 매우 정확했습니다.

이해를 돕기 위해 종이나 계산기, 잘 또는 Excel에서 수동으로 계산하는 실험을 하십시오.

 

그래서 나는 답을 보고 내가 여기서 시간을 낭비하고 있다는 것을 이해합니다. 문제의 본질을 보여주려고 노력하고 응답으로 코드의 "아름다움"을 얻으려고 합니다(물론 감사하지만 제안된 코드는 작성되었습니다. 몇 분 안에 문제의 본질을 표시하고 가독성이나 다른 변환이 필요하지 않음) ...

그리고 나는 특히 내 게시물 전에 답변에 만족했습니다 ... 무슨 계산기, 어떤 수동 계산, 어떤 인덱싱? 친애하는 사용자 여러분, 귀하의 시간뿐만 아니라 다른 사람의 시간도 낭비하지 않도록 상황의 본질을 탐구하십시오. 제 씹은 글을 좀 더 주의 깊게 다시 읽어보되 어렵다면 간단하게 답하겠습니다. 두 경우 모두배열 인덱싱 의 방향이 정확하고 필요한 계산의 크기와 기타 변수 매개변수는 기본 코드에서 볼 수 있듯이 다음과 같습니다. 외부 변수에 의해 설정되면 자신의 기능을 생성하는 옵션이 위에서 논의되었지만(사실 이것이 유일한 올바른 솔루션임), 다시 내장 MT4에서 이것을 얻고 싶습니다.

일반적으로 서비스 데스크 또는 해당 기능의 유사체 중 하나를 요약하겠습니다.

 

그리고 글을 올리기 전 답변이 우울하네요...

글쎄, 당신이 그렇게 완고하다면 => 서비스 데스크에 가면 그들은 지루함에서 그런 질문에 대답하고 거의 지루하지 않습니다.

음, 다시 해볼게...

iMAOnArray()는 귀하의 경우 300개 막대를 사용하여 300개 막대 중 마지막 12개 막대의 평균을 계산합니다. 처음 12개 막대의 평균을 얻으려면배열 인덱싱 을 반대로 해야 합니다. ArraySetAsSeries(BufferMA, false); 또는 12개의 막대를 가져 가라.

BufferMA[i]= iMAOnArray (Buffer, 12 , 12 , 0 , MODE_SMA ,i);

따라서 작동 방식, 사용 방법을 이해하고 이해하는 대신 작동하지 않거나 올바르게 작동하지 않는다고 선언하기만 하면 됩니다. 그리고 그것은 당신에게 옳지 않습니다 ...

코드의 아름다움에 대한 추가 정보: 모든 것이 한 줄로 작성되었을 때 누군가가 당신의 코드를 읽고 눈을 떼는 것이 흥미롭다고 생각하시나요??? 네가 틀렸어. 저는 개인적으로 읽지 않았습니다. 하루에 여러 번 인내심을 갖고 모두를 보내준 드러머에게 감사합니다... 내가 보냈을 곳이 아닙니다.

 

아주 "세세하게" 대답하고 싶었지만, 다시 글을 읽고 나서 답을 지웠고, 결국 같은 내용을 다른 말로 몇 번이고 설명하면서 여기서 시간낭비만 하고 있다는 걸 깨달았습니다...

추신 "Barabashka"(Vladimir)에게 모두 감사하고 정말 감사합니다. 그는 잘했지만이 모든 상황은 그의 작업 가치가 없었습니다. 어렵지 않은 경우 그에게 더 감사 할 것입니다. 화면은 이전 키에서 세 번째 옵션을 추가하고 인덱싱 방향을 변경하면서 조언을 따랐을 때 어떤 일이 일어날지 보여줍니다. 기능 문제를 끝내기 위해.

 
Sergey Efimenko :

아주 "세세하게" 대답하고 싶었지만, 다시 글을 읽고 나서 답을 지웠고, 결국 같은 내용을 다른 말로 몇 번이고 설명하면서 여기서 시간낭비만 하고 있다는 걸 깨달았습니다...

추신 "Barabashka"(Vladimir)에게 모두 감사하고 정말 감사합니다. 그는 잘했지만이 모든 상황은 그의 작업 가치가 없었습니다. 어렵지 않은 경우 그에게 더 감사 할 것입니다. 화면은 이전 키에서 세 번째 옵션을 추가하고 인덱싱 방향을 변경하면서 조언을 따랐을 때 어떤 일이 일어날지 보여줍니다. 기능 문제를 끝내기 위해.

옵션 3:

 //+------------------------------------------------------------------+
//|                                         Test300AsSeriesFalse.mq4 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property version    "1.00"
#property strict
#property indicator_separate_window
#property indicator_buffers 3
#property indicator_color1 clrYellow
#property indicator_color2 clrGreen
#property indicator_color3 clrRed
double Buffer[];
double BufferMA[];
double BufferBMA[];
bool firstrun= true ;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- indicator buffers mapping
   firstrun= true ;
   SetIndexBuffer ( 0 ,Buffer, INDICATOR_DATA );
   SetIndexBuffer ( 1 ,BufferMA, INDICATOR_DATA );
   SetIndexBuffer ( 2 ,BufferBMA, INDICATOR_DATA );
//---
   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[])
  {
//---
   ArraySetAsSeries (open, false );
//---
   int i,limit;
   limit=rates_total-prev_calculated- 1 ;
   if (prev_calculated== 0 )
     {
       ArrayInitialize (Buffer,open[rates_total- 1 ]);
       ArrayInitialize (BufferMA,open[rates_total- 1 ]);
       ArrayInitialize (BufferBMA,open[rates_total- 1 ]);
     }
   for (i=limit; i>= 0 ; i--)
     {
      Buffer[i]=open[i];
      BufferMA[i]= iMAOnArray (Buffer, 300 , 12 , 0 , MODE_SMA ,i);
      BufferBMA[i]= iBandsOnArray (Buffer, 300 , 12 , 2 , 0 , MODE_MAIN ,i);
     }
   return (rates_total);
  }
//+------------------------------------------------------------------+

그리고 전체적인 결과:

옵션 1, 2 및 3

파일:
 

아니 블라디미르. 조금 그렇지 않습니다.

이 경우 ArraySetAsSeries(array, false); iMAOnArray()가 고려되는 300개 요소의 배열에 적용합니다. 그러나 이를 위해 배열 채우기 루프 대신 CopyOpen()을 사용하는 것이 좋습니다.

내가 알기로는 이 옵션이 더 좋을 것입니다.

   for (i=limit; i>= 0 ; i--)
     {
      Buffer[i]=open[i];
      BufferMA[i]= iMAOnArray (Buffer, 12 , 12 , 0 , MODE_SMA ,i);
      BufferBMA[i]= iBandsOnArray (Buffer, 12 , 12 , 2 , 0 , MODE_MAIN ,i);
     }