移動平均線の変化率インジケーターの作り方について

MetaTrader 4
ポストマン
2023/07/19 01:20
262

インジケーターつくーるにて移動平均線の変化率を表示するインジケーターを作ろうとしましたが上手くいきません。

(0本前の移動平均線の値ー1本前の移動平均線の値)÷1本前の移動平均線の値×100

上の計算式でやっていますがエラーになるのか何も表示されません。
『(0本前の移動平均線の値ー1本前の移動平均線の値)×100』のみだと普通に表示できるので『÷1本前の移動平均線の値』を行うときにエラーが発生しているようです。
何か改善方法ありますか?

コメント

GogoJungle
2023/07/20 14:33

ご連絡ありがとうございます。

弊社にて調査させていただきましたところ、メタトレーダーの仕様上
iMA()関数にて、計算ができない場合(例えばデータが足りていない場合など)
ゼロ除算が行われてしまう可能性がございました。

iMA()が0を返してしまう可能性がありましたため、
移動平均を計算するための3つのiMA()関数の結果をそれぞれ一時変数に格納いたします。
その後、ma_value20が0でないことを確認してから、式を計算します。

お手数ですがソースの修正をいただけますでしょうか。

以下は (0本前の移動平均線の値ー1本前の移動平均線の値)÷1本前の移動平均線の値×100 の場合の例となります。

【修正前】
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 limit = Bars - IndicatorCounted();
   for(int i = limit - 1; i >= 0; i--){
      bool drawing1 = Drawing1(i);
      if(drawing1 == true){
         indicator1[i] = ( iMA(Symbol(), 0, MA_Period18, MA_Slide18, MODE_SMA, PRICE_CLOSE, i + MA_Shift18) - iMA(Symbol(), 0, MA_Period19, MA_Slide19, MODE_SMA, PRICE_CLOSE, i + MA_Shift19) ) / iMA(Symbol(), 0, MA_Period20, MA_Slide20, MODE_SMA, PRICE_CLOSE, i + MA_Shift20) * 100 ;
      }
   }

   return(0);
}
【修正後】
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 limit = Bars - IndicatorCounted();
   for(int i = limit - 1; i >= 0; i--){
      bool drawing1 = Drawing1(i);
      if(drawing1 == true){
         double ma_value18 = iMA(Symbol(), 0, MA_Period18, MA_Slide18, MODE_SMA, PRICE_CLOSE, i + MA_Shift18);
         double ma_value19 = iMA(Symbol(), 0, MA_Period19, MA_Slide19, MODE_SMA, PRICE_CLOSE, i + MA_Shift19);
         double ma_value20 = iMA(Symbol(), 0, MA_Period20, MA_Slide20, MODE_SMA, PRICE_CLOSE, i + MA_Shift20);

         if(ma_value20 != 0){
            indicator1[i] = (ma_value18 - ma_value19) / ma_value20 * 100;
            Print("indicator1[", i, "] = ", indicator1[i]);
         } else {
            Print("Unable to calculate MA for index ", i, " due to zero division error");
         }
      }
   }

   return(0);
}

iMA()内部にあるMA_Period18, MA_Slide18,MA_Shift18などの数字は異なる場合がありますため
適応する値と合わせていただけますと幸いです。

下記で確認可能です。

extern int MA_Period18 = 10;
extern int MA_Slide18 = 0;
extern int MA_Shift18 = 0; 

![スクリーンショット 2023-07-20 142804.png](スクリーンショット 2023-07-20 142804.png)

弊社にて確認しましたところ、表示が確認できました。
ご不便おかけいたしますが、何卒よろしくお願い申し上げます。

関連トピックス

検索結果がありません。

ノーコードで誰でも簡単EA開発!MQL言語学習にも使える! | GogoJungle

注目トピックス

検索結果がありません。