【MQL4】移動平均線の傾きを数値化する2つの方法
はじめに
今日はFX自動売買やインジケーター開発でよく使う
「移動平均線の傾き」を数値で取得する方法を解説します。
なんで傾きを数値化するの?
チャートを見てると
「あ、この移動平均線、結構急な角度で上がってるな」
とか思いますよね。
でもEA(自動売買プログラム)に「急な角度」って伝えられないんです。
そこで傾きを数値化することで、
トレンドの強さを定量的に判断できる
「角度が〇〇以上ならエントリー」みたいな条件が作れる
視覚的な判断から脱却して、再現性のある取引ができる
というメリットがあります。
今回は2つの計算方法を紹介しますね。
方法①:差分で計算する(シンプル版)
一番シンプルなのがこれ。
「今のMA値」と「5本前のMA値」の差を見るだけです。
コード
double GetMASlopeSimple(int maPeriod, int shift, int lookback)
{
// 現在の移動平均線の値
double currentMA = iMA(Symbol(), 0, maPeriod, 0, MODE_SMA, PRICE_CLOSE, shift);
// lookback本前の移動平均線の値
double pastMA = iMA(Symbol(), 0, maPeriod, 0, MODE_SMA, PRICE_CLOSE, shift + lookback);
// 引き算するだけ!
double slope = currentMA - pastMA;
return slope;
}使い方
// 20期間移動平均線の5本分の傾きをチェック
double slope = GetMASlopeSimple(20, 0, 5);
if(slope > 0)
Print("上向いてる!");
else if(slope < 0)
Print("下向いてる!");
else
Print("フラット");パラメータの意味
maPeriod: 移動平均線の期間(例:20)
shift: 何本前のローソク足を見るか(0=最新)
lookback: 何本前と比較するか(例:5なら5本前と比較)
この方法の良いところ・イマイチなところ
👍 良いところ
めっちゃシンプル。初心者でも理解しやすい
処理が軽いからEAに組み込んでも重くならない
👎 イマイチなところ
返ってくる値が「0.0015」とか「-0.0032」みたいな感じで、ぱっと見で強い・弱いが分かりにくい
通貨ペアによって値のスケールが全然違う(ドル円とポンド円で同じ閾値使えない)
方法②:角度で計算する(角度版)
「30度の上昇」「-15度の下降」みたいに角度で表現する方法です。
これなら直感的ですよね。
コード
double GetMASlopeAngle(int maPeriod, int shift, int lookback)
{
// 現在と過去のMA値を取得
double currentMA = iMA(Symbol(), 0, maPeriod, 0, MODE_SMA, PRICE_CLOSE, shift);
double pastMA = iMA(Symbol(), 0, maPeriod, 0, MODE_SMA, PRICE_CLOSE, shift + lookback);
// 価格の変化量
double priceChange = currentMA - pastMA;
// アークタンジェントで角度を計算して、度数に変換
double angle = MathArctan(priceChange / lookback) * 180 / M_PI;
return angle;
}計算の仕組み(数学苦手な人は飛ばしてOK)
三角関数のarctan(逆正接)を使ってます。
角度 = arctan(価格変化 ÷ 期間) × 180 ÷ π中学の数学で習った「傾き = tanθ」の逆算ですね。
使い方
// 20期間MAの角度をチェック
double angle = GetMASlopeAngle(20, 0, 5);
if(angle > 1.0)
Print("かなり急な上昇!");
else if(angle > 0.3)
Print("緩やかに上昇中");
else if(angle < -1.0)
Print("急降下してる!");
else if(angle < -0.3)
Print("緩やかに下降中");
else
Print("ほぼフラット、レンジかも");
この方法の良いところ・イマイチなところ
👍 良いところ
角度で表現されるから分かりやすい
-90度〜+90度の範囲で統一的に判断できる
👎 イマイチなところ
チャート上で見た角度とは違う(チャートって縦横比がバラバラだから)
実際の値は0.5度とか1度とか、思ったより小さい角度になりがち
実践Tips:こうやって使うと良いよ
① lookback期間の選び方
// 短期(3本):反応が早いけどノイズも拾いやすい
double slope3 = GetMASlopeSimple(20, 0, 3);
// 中期(5本):バランス型、とりあえずこれ使っとけば間違いない
double slope5 = GetMASlopeSimple(20, 0, 5);
// 長期(10本):安定してるけど反応が鈍い
double slope10 = GetMASlopeSimple(20, 0, 10);私は5本で使うことが多いです。
② 時間足によって調整する
1分足と1時間足じゃローソク足の意味が全然違うので、lookbackも変えましょう。
int lookback;
if(Period() == PERIOD_M1)
lookback = 10; // 1分足は多めに
else if(Period() == PERIOD_M5)
lookback = 7;
else if(Period() == PERIOD_H1)
lookback = 5;
else
lookback = 3; // 日足とかは少なめでOK
double slope = GetMASlopeSimple(20, 0, lookback);③ 処理を軽くする工夫
毎ティック計算すると重くなるので、新しいバーができた時だけ計算するのがおすすめ。
static datetime lastBar = 0;
static double lastSlope = 0;
// 新しいバーができた時だけ計算
if(Time[0] != lastBar)
{
lastSlope = GetMASlopeSimple(20, 1, 5); // 確定した1本前のバーで計算
lastBar = Time[0];
}
// それ以外は前回の値を使い回す
return lastSlope;これだけでCPU負荷がかなり減ります。
実際に使ってみた例
簡単なトレンドフィルターを作ってみます。
bool IsTrendUp()
{
double slope = GetMASlopeSimple(20, 0, 5);
double threshold = 0.0010; // ドル円だと10pipsくらい
return (slope > threshold);
}
bool IsTrendDown()
{
double slope = GetMASlopeSimple(20, 0, 5);
double threshold = -0.0010;
return (slope < threshold);
}
// エントリー判定
void CheckEntry()
{
if(IsTrendUp() && 他の条件)
{
// 買いエントリー
}
else if(IsTrendDown() && 他の条件)
{
// 売りエントリー
}
}こんな感じで、傾きをフィルターとして使うと勝率上がったりします。
どっちの方法を使えばいい?
方法①(差分版)がおすすめな人
シンプルに実装したい
他の指標と組み合わせて使う予定
とりあえず動くものを作りたい
方法②(角度版)がおすすめな人
角度で表現したい(分かりやすさ重視)
インジケーターとして表示したい
複数通貨ペアで統一的に判断したい
正直、どっちでも大差ないです。私は①のシンプル版を使うことが多いかな。
両方試してみて、自分のトレードスタイルに合う方を選んでください!
まとめ
今回は移動平均線の傾きを数値化する2つの方法を紹介しました。
方法①:シンプルに差分を計算
方法②:角度として計算
どちらも一長一短あるので、実際に使ってみて感覚を掴むのが一番です。
この技術を使えば
「なんとなく」じゃなくて「数値的に」
トレンドを判断できるようになります。
EAやインジケーター開発の幅がグッと広がるので、ぜひ試してみてください!
⚠️ 免責事項
このnoteは学習・研究目的で公開しています。投資助言ではありません。実際の運用は自己責任でお願いします。コードの使用により発生した損失については一切責任を負いません。
