見出し画像

【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は学習・研究目的で公開しています。投資助言ではありません。実際の運用は自己責任でお願いします。コードの使用により発生した損失については一切責任を負いません。

こんな記事も書いてます

いいなと思ったら応援しよう!