記事「MQL5での移動平均をゼロから作成する:単純明快」についてのディスカッション

 

新しい記事「MQL5での移動平均をゼロから作成する:単純明快」はパブリッシュされました:

簡単な例を使って、移動平均の計算原理を検証するとともに、移動平均を含むインジケーター計算の最適化方法について学びます。

クライアント端末の標準の移動平均インジケーターの設定で利用できる主な移動平均の計算原理を確認しました。この記事で紹介した計算方法は、計算の最適化を施したインジケーターにも応用でき(最適化例も併せて紹介しています)、また提示したコードは連続データの平均値を独立して計算するプログラムにも活用可能です。

上図は、計算期間が同じ(10)、異なる種類の移動平均の違いを示しています。

:SMA、:EMA、金色:SMMA、:LWMA

平滑移動平均(SMMA)は小さな価格変動の影響を受けにくく、価格の全体的なトレンドをより明確に示しています。
一方、指数移動平均(EMA)や線形加重移動平均(LWMA)は、計算で現在のデータに大きな重みを置くため、市場の変動に対してより敏感に反応します。

作者: Artyom Trishkin

 

良い記事をありがとう。でも、批判せずにはいられない。今日はそんな気分なのだ。

この記事は、コーディングというより、計算式や計算の最適化に特別な注意を払っている。しかし、初心者のプログラマーや、最近さまざまなループ演算子を使う可能性に注目し始めた人たちには、より役に立つと思う。次回の記事にはそれを反映させたいと思っている。結局のところ、MQL5には少なくとも3つのループ演算子がある。そしてそのどれを使ってもインジケーターを構築することができる。

 

有用な情報を一度にまとめて、

そして最後にi++ループ

 

標準的な4つのMQ平均の背後にあるコードを示す初心者向けの良い記事です。

また、単純な最適化の重要性と、ティックの 99% がバーが変わる間に発生するため、その影響についても説明する必要があります。 各バーが変わる間の計算を最小化することで、少し複雑になりますが、はるかに高い効率が得られます。 したがって、バーが変わるときに基本値を一度計算し、その値を保存することで、計算時間が大幅に短縮されます:

次のように考える。

double sm=0;

for(int bar=0;bar<N;bar++) sum+=Close[CurrentBar-bar];

SMA=sum/N;


static double partialsum;

double sum=0;


バーの変化{について

partialsum=0;

for(int bar=0;bar<N-1;bar++) partialsum+=Close[CurrentBar-bar];

partialsum/=(N-1);

}

SMA =partialsum+Close[CurrentBar]/N;

この最適化により、各バーでsum+=Close[EndingBar-bar]の計算が約90,000回節約されます。 チャートに1,000本のバーが含まれる場合、90,000,000回以上の不要な計算が 節約されることになります。 最近のCPUでは、この例で節約されることは些細なことであり、おそらく気づきません。

手作業による最適化の重要性は、より良いプログラミング技術を開発することであり、それが将来のプロジェクトで 自然に身につくようになることです。

 

しかし、OnCalculate()関数を使用した後、なぜOrderSend()トランザクション関数を使用できなくなったのかが不明です。著者がこの問題をどのように解決したのか分かりません:

#property copyright "Copyright 2024, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"

#include <Indicators\Trend.mqh>
CiMA ma;

//+------------------------------------------------------------------+
//| スクリプト番組スタート機能 &nbspスクリプト番組開始関数
//+------------------------------------------------------------------+
int OnInit(){ 
    ma.DeleteFromChart(ChartID(), 0);
    ma.Create(_Symbol, PERIOD_CURRENT, 14, 0, MODE_SMA, PRICE_CLOSE);
    ma.AddToChart(PERIOD_CURRENT, 0);
    
    return INIT_SUCCEEDED; 
}

void OnTick(){ 
    ma.Refresh();
    double curMA = ma.Main(0);
    
    //Print("Current MA value:", maValue);
}