MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 903

 
Alexandr Sokolov:

MQL5で実行されないコードがインジケーターにあるのですが

ポイントは、price == STO_LOWHIGHの 場合はすべて正しく動作しますが、price == STO_CLOSECLOSEの場合はスタティック変数にのみ 代入される点です。

...ループ回避

が、これと全く同じ関数がMQL4で正しく動作します。

 
Alexandr Sokolov:

が、MQL4では同じ関数が正しく動作します。

次に、どのような配列High[] Close[]を指定する必要があります。

mql4のものであればmql5では使用できませんし、カスタムであれば...。何も提案できない。

 
Alexandr Sokolov:

Low/HighとClose/CloseでK期間内の通常のmaxHighとminLowストキャスティクスを取得したい

初期化時のLow/Highはうまくいきますが、Close/Closeはうまくいきません。

CopyBuffer()で得た 配列からfmax()やfmin()を求める方が簡単です。

 
Alexey Viktorov:

次に、High[] Close[]という配列が何であるかを明確にする必要があります。

mql4のものであればmql5では使用できませんし、カスタムであれば...。思い込みはダメですね。

以下は、MQL5におけるこれらのバッファの内容です。

int count = rates_total - prev_calculated, copied = 0; if(count < (int)kperiod + (int)dperiod + (int)slowing) {count = (int)kperiod + (int)dperiod + (int)slowing;};
   if(mode == m1 && price == STO_LOWHIGH) {copied = CopyOpen(_Symbol,PERIOD_CURRENT,0,count,Open); if(copied != count) return(0);};
   if(price == STO_LOWHIGH) {copied = CopyHigh(_Symbol,PERIOD_CURRENT,0,count,High); if(copied != count) return(0);};
   if(price == STO_LOWHIGH) {copied = CopyLow(_Symbol,PERIOD_CURRENT,0,count,Low); if(copied != count) return(0);};
   copied = CopyClose(_Symbol,PERIOD_CURRENT,0,count,Close); if(copied != count) return(0);
 
Alexey Viktorov:

CopyBuffer()で得た配列からfmax()やfmin()を求める方が簡単です。

バッファ全体ではなく、ある期間内の値が必要です K
その他、減速時間を考慮してデータをコピーする必要があることを考慮した上で、どのように実装すればよいでしょうか。

 
Alexandr Sokolov:

バッファ全体の値ではなく、期間K内の値が必要です
その他、減速期間を考慮してデータをコピーする必要があるのですが、どのように実装すればよいのでしょうか?

昨日も同じことをしましたが、ハイアレイとローアレイだけでした。

   for(i = limit; i < rates_total; i++)
    {
     UpperBuf[i] = high[ArrayMaximum(high, i-period, period)];
     LowerBuf[i] = low[ArrayMinimum(low, i-period, period)];
     MidBuf[i] = (UpperBuf[i]+LowerBuf[i])/2;
    }

時系列フリップなし。では、mql5で規定されているように? 左側のバーがゼロ。

また、インジケーターのバッファーを丸ごとコピーするのではなく、指定したバーから指定した量だけコピーすることが可能です。そして、間違えてfmax()とfmin()を推奨してしまったのです。ArrayMaximum()のことです。

 
Alexandr Sokolov:

Low/HighとClose/CloseでK期間内の通常のmaxHighとminLowのストキャスティクスを取得したい。

初期化中のLow/Highは正常に動作するが、Close/Closeは正常に動作しない

時系列に対する標準的な関数がある

Maximum=iHigh(_Symbol,_Period,iHighest(_Symbol,_Period,MODE_HIGH,num,startbar));
Minimum=iLow(_Symbol,_Period,iLowest(_Symbol,_Period,MODE_LOW,num,startbar));
 
Taras Slobodyanik:

時系列のための標準関数があります。

良いアドバイスを得るために、最初から読み始めることをお勧めします。最初の質問があったところから、その後の議論まで。

 
Alexey Viktorov:

良いアドバイスのために、最初から読み始めることをお勧めします。最初の質問があったところから、その後の議論まで。

最初から、この人は時系列で最小・最大値を探しているようだ。
なくても大丈夫です。

void KValues(int i)
  {
   if (price == STO_LOWHIGH)
      {
      vhigh=iHigh(_Symbol,_Period,iHighest(_Symbol,_Period,MODE_HIGH,kperiod,i));
      vlow=iLow(_Symbol,_Period,iLowest(_Symbol,_Period,MODE_LOW,kperiod,i));
      }
   else
      {
      vhigh=iClose(_Symbol,_Period,iHighest(_Symbol,_Period,MODE_CLOSE,kperiod,i));
      vlow=iClose(_Symbol,_Period,iLowest(_Symbol,_Period,MODE_CLOSE,kperiod,i));
      }
  }
(確認しなかった)。
 
Taras Slobodyanik:

最初から見ていたようだ - 男は最小/最大を求めて時系列を調べている。
なくてもいいんじゃない?

(確認しなかった)。

ストキャスティックな値を求めている。

とはいえ...何が必要なのか、もう自分でも混乱しています。ストキャスティックコンディションのように見えるが、バーをコピーしている...。