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で特に注意すること
- 型を間違えると警告が出る:doubleの結果をintに入れると「possible loss of data」の警告になる(エラーを10個再現した記事)
- チャートの価格配列は、新しい順に並べることが多い:上のコードは「古い順」の配列ですが、CopyRatesで取った価格を
ArraySetAsSeriesで新しい順にすると、添字の向きが逆になります(CopyRatesと配列の並び) - 実際のEAでは、iMAなどの組み込みの関数を使うことが多い。自分で計算するのは、仕組みを理解するための練習として役立ちます
練習の進め方
- Pythonで書いた計算を、MQL5に1行ずつ書き直してみる
- MetaEditorでコンパイルし、0 errors, 0 warnings になるまで直す
- MQL5を学ぶ順番の全体はMQL5を学ぶ順番と、独学とスクールの分かれ目にあります
実際の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では、型の警告と、価格配列の並び順に注意する
本記事はプログラミングの説明であり、特定の売買を勧めるものではありません。


