MQL5とPythonで移動平均を書き比べる|Pythonの知識はどこまで使えるか

MQL5を学ぶ前に、PythonやC言語など別の言語で基礎を学ぶ人は多いと思います。では、Pythonで覚えたことは、MQL5でどこまでそのまま使えるのか。この記事では、同じ5つの終値から3本の単純移動平均(SMA)を計算するプログラムを、MQL5とPythonで書き比べ、違いを一つずつ確かめます。

(確認:MQL5のコードはMetaEditorでコンパイルして 0 errors, 0 warnings。Pythonのコードは筆者のPC(Python 3.13)で実行した結果を載せています。MQL5のスクリプトは、取引中のMT5では実行していません。計算の手順は同じなので、実行すれば同じ値になるはずです)

2つのコード

MQL5(スクリプト)

// 同じ5つの終値から、3本の単純移動平均(SMA)を計算して表示する
void OnStart()
  {
   double close[] = {100.0, 102.0, 101.0, 105.0, 107.0};   // 古い順
   int    period  = 3;
   int    n       = ArraySize(close);
   for(int i = period - 1; i < n; i++)
     {
      double sum = 0.0;
      for(int k = 0; k < period; k++)
         sum += close[i - k];
      PrintFormat("i=%d SMA=%.4f", i, sum / period);
     }
  }

Python

# 同じ5つの終値から、3本の単純移動平均(SMA)を計算して表示する
close = [100.0, 102.0, 101.0, 105.0, 107.0]  # 古い順
period = 3
for i in range(period - 1, len(close)):
    sma = sum(close[i - period + 1:i + 1]) / period
    print(f"i={i} SMA={sma:.4f}")

Pythonの実行結果

i=2 SMA=101.0000
i=3 SMA=102.6667
i=4 SMA=104.3333

手で確かめると、(100+102+101)÷3=101.0000、(102+101+105)÷3=102.6667、(101+105+107)÷3=104.3333 です。

違いの一覧

項目 MQL5 Python
変数の型 double・int を書く 書かない(自動で決まる)
文の終わり ; が必要 改行で終わる
まとまり { } で囲む 字下げで表す
繰り返し for(初期化; 条件; 増やし方) for i in range(...)
配列の長さ ArraySize(close) len(close)
合計 for で1つずつ足す sum() と範囲の切り出し
表示 PrintFormat("%.4f", ...) print(f"{...:.4f}")
プログラムの入口 OnStart()(スクリプトの場合) ファイルの先頭から順に実行

違いは書き方の細部で、「配列を順に見て、3つ足して3で割る」という考え方は同じです。Pythonで変数・for・関数の考え方を身につけていれば、MQL5では型と記号の書き方を覚えるだけで、同じ計算を書けます。

MQL5で特に注意すること

  1. 型を間違えると警告が出る:doubleの結果をintに入れると「possible loss of data」の警告になる(エラーを10個再現した記事)
  2. チャートの価格配列は、新しい順に並べることが多い:上のコードは「古い順」の配列ですが、CopyRatesで取った価格をArraySetAsSeriesで新しい順にすると、添字の向きが逆になります(CopyRatesと配列の並び)
  3. 実際のEAでは、iMAなどの組み込みの関数を使うことが多い。自分で計算するのは、仕組みを理解するための練習として役立ちます

練習の進め方

実際のEAでは:組み込みのiMAで同じ計算をする

MQL5には、移動平均を計算する組み込みの関数 iMA があります。チャートの銘柄・時間足の3本SMAを、新しい順に3つ表示する例です(MetaEditorで 0 errors, 0 warnings を確認)。

void OnStart()
  {
   int handle = iMA(_Symbol, _Period, 3, 0, MODE_SMA, PRICE_CLOSE);
   if(handle == INVALID_HANDLE)
     {
      Print("iMA failed: ", GetLastError());
      return;
     }
   double buf[];
   ArraySetAsSeries(buf, true);            // [0] が最新の足
   if(CopyBuffer(handle, 0, 0, 3, buf) != 3)
     {
      Print("CopyBuffer failed: ", GetLastError());
      IndicatorRelease(handle);
      return;
     }
   for(int i = 0; i < 3; i++)
      PrintFormat("shift=%d SMA=%.5f", i, buf[i]);
   IndicatorRelease(handle);
  }

自分で書いた計算と違い、ハンドルを作る→値をコピーする→失敗を確かめる→使い終わったら解放するという手順になります。iCustomで値が取れない時の確認はiCustomとCopyBufferで値が取れない時が参考になります。

まとめ

  • 同じSMAの計算を、MQL5とPythonで書き比べた。Pythonの結果は101.0000・102.6667・104.3333
  • 違いは、型・セミコロン・括弧・forの書き方など書き方の細部で、考え方は同じ
  • MQL5では、型の警告と、価格配列の並び順に注意する

本記事はプログラミングの説明であり、特定の売買を勧めるものではありません。