タイトルが入力されていません。
コンテンツがありません。
There have no category
There have no subcategory
インジケーターつくーるにて移動平均線の変化率を表示するインジケーターを作ろうとしましたが上手くいきません。
(0本前の移動平均線の値ー1本前の移動平均線の値)÷1本前の移動平均線の値×100
上の計算式でやっていますがエラーになるのか何も表示されません。 『(0本前の移動平均線の値ー1本前の移動平均線の値)×100』のみだと普通に表示できるので『÷1本前の移動平均線の値』を行うときにエラーが発生しているようです。 何か改善方法ありますか?
ご連絡ありがとうございます。
弊社にて調査させていただきましたところ、メタトレーダーの仕様上 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などの数字は異なる場合がありますため 適応する値と合わせていただけますと幸いです。
MA_Period18, MA_Slide18,MA_Shift18
下記で確認可能です。
extern int MA_Period18 = 10; extern int MA_Slide18 = 0; extern int MA_Shift18 = 0;
弊社にて確認しましたところ、表示が確認できました。 ご不便おかけいたしますが、何卒よろしくお願い申し上げます。
コメント文がありません。
ご連絡ありがとうございます。
弊社にて調査させていただきましたところ、メタトレーダーの仕様上
iMA()関数にて、計算ができない場合(例えばデータが足りていない場合など)
ゼロ除算が行われてしまう可能性がございました。
iMA()が0を返してしまう可能性がありましたため、
移動平均を計算するための3つのiMA()関数の結果をそれぞれ一時変数に格納いたします。
その後、ma_value20が0でないことを確認してから、式を計算します。
お手数ですがソースの修正をいただけますでしょうか。
以下は
(0本前の移動平均線の値ー1本前の移動平均線の値)÷1本前の移動平均線の値×100の場合の例となります。iMA()内部にある
MA_Period18, MA_Slide18,MA_Shift18などの数字は異なる場合がありますため適応する値と合わせていただけますと幸いです。
下記で確認可能です。
弊社にて確認しましたところ、表示が確認できました。
ご不便おかけいたしますが、何卒よろしくお願い申し上げます。