最終更新: 2026年6月
SuperTrendは視覚的なわかりやすさと実用性を兼ね備えた優れたトレンドインジケーターだ。ローソク足の下にある緑のライン(上昇トレンド)か上にある赤のライン(下降トレンド)かを見るだけでトレンド方向を判断できる。
しかしEAに実装する場合、「色転換を検出してエントリーするだけ」では不十分なことが多い。SuperTrendの計算にはATRが内包されているため、ATR期間と乗数の設定がEAの成績を大きく左右する。また、標準のMT4/MT5にはSuperTrendが搭載されていないため、カスタムインジケーターのバッファを読み取る実装が必要になる。
本稿ではSuperTrendの計算ロジックから、MQL5でのカスタムインジケーター連携、バックテストでのパラメータ最適化まで体系的に解説する。
Claudeと会話しながらインジケータが作れるhedgrow-fxはこちら
SuperTrendの計算式——ATRが核心
SuperTrendの上下ラインは以下の式で計算される:
中央値 = (高値 + 安値) / 2
上限ライン(BasicUpperBand)= 中央値 + ATR(n) × 乗数
下限ライン(BasicLowerBand)= 中央値 − ATR(n) × 乗数
この上下ラインを、価格の動きに合わせてダイナミックに更新することでSuperTrendラインを形成する:
上昇トレンド中(緑): 下限ラインが損切りとして機能し、価格がこのラインを下回ると赤に転換 下降トレンド中(赤): 上限ラインが損切りとして機能し、価格がこのラインを上回ると緑に転換
本質的にSuperTrendは「ATRベースのトレーリングストップ」であり、トレンドが続く限り自動的にラインが追随する構造だ。
ATR乗数(Multiplier)の意味
乗数が大きいほどラインが中央値から離れ、バンドが広がる:
- 乗数2.0: タイトなライン、ダマし多め、シグナル頻度高
- 乗数3.0(標準): バランス型、多くの通貨ペア・時間足で検証されている
- 乗数4.0以上: 広いライン、ダマし少、シグナル頻度低
バックテスト検証(2024〜2025年複数通貨ペア)では、乗数3.0が乗数2.0より一貫してドローダウンが小さく、ダマしが少なかったという報告が見られる。ただし乗数が大きくなると利確タイミングも遅くなるというトレードオフがある。
MQL5でのSuperTrend実装——2つのアプローチ
アプローチ1: カスタムインジケーターのバッファを読み取る
MT4/MT5のコードベース(community library等)から入手したSuperTrendカスタムインジケーターのバッファを、EAから読み取る方法。
input string STIndicatorName = "SuperTrend"; // インジケーター名
input int STPeriod = 14; // ATR期間
input double STMultiplier = 3.0; // 乗数
int STHandle;
double STBuffer0[]; // SuperTrendライン値
double STBuffer1[]; // 方向バッファ(1=上昇、-1=下降など実装依存)
int OnInit()
{
// カスタムインジケーターのロード
STHandle = iCustom(_Symbol, _Period, STIndicatorName,
STPeriod, STMultiplier);
if(STHandle == INVALID_HANDLE)
{
Print("SuperTrendインジケーターのロードに失敗: ", STIndicatorName);
return INIT_FAILED;
}
ArraySetAsSeries(STBuffer0, true);
ArraySetAsSeries(STBuffer1, true);
return INIT_SUCCEEDED;
}
// SuperTrendの値と方向を取得
bool GetSuperTrend(double &stValue, int &direction)
{
if(CopyBuffer(STHandle, 0, 0, 3, STBuffer0) < 3) return false;
stValue = STBuffer0[0];
// 価格とSTラインの位置関係で方向を判定
double close = iClose(_Symbol, _Period, 0);
direction = (close > stValue) ? 1 : -1;
return true;
}
注意: バッファのインデックス(0番がどのデータを返すか)はカスタムインジケーターの実装によって異なる。使用するインジケーターのコードを確認してバッファのマッピングを把握する必要がある。
アプローチ2: EAにSuperTrend計算を内包する
外部インジケーターに依存せず、EAの内部でSuperTrendを計算する方法。バックテストの再現性が高く、ブローカーの環境に依存しない。
input int STPeriod = 14;
input double STMultiplier = 3.0;
int ATRHandle;
double ATRBuffer[];
// SuperTrendの状態管理
double upperBand[];
double lowerBand[];
bool isUpTrend[];
int OnInit()
{
ATRHandle = iATR(_Symbol, _Period, STPeriod);
if(ATRHandle == INVALID_HANDLE) return INIT_FAILED;
ArraySetAsSeries(ATRBuffer, true);
return INIT_SUCCEEDED;
}
// SuperTrend計算(最新N本分を計算)
bool CalculateSuperTrend(int bars)
{
if(CopyBuffer(ATRHandle, 0, 0, bars + 1, ATRBuffer) < bars + 1)
return false;
ArrayResize(upperBand, bars);
ArrayResize(lowerBand, bars);
ArrayResize(isUpTrend, bars);
for(int i = bars - 1; i >= 0; i--)
{
double high = iHigh(_Symbol, _Period, i);
double low = iLow(_Symbol, _Period, i);
double close = iClose(_Symbol, _Period, i);
double atr = ATRBuffer[i];
double midPoint = (high + low) / 2.0;
double basicUpper = midPoint + atr * STMultiplier;
double basicLower = midPoint - atr * STMultiplier;
// バンドの動的更新(前バーからの継承ロジック)
if(i < bars - 1)
{
upperBand[i] = (basicUpper < upperBand[i + 1] ||
iClose(_Symbol, _Period, i + 1) > upperBand[i + 1])
? basicUpper : upperBand[i + 1];
lowerBand[i] = (basicLower > lowerBand[i + 1] ||
iClose(_Symbol, _Period, i + 1) < lowerBand[i + 1])
? basicLower : lowerBand[i + 1];
}
else
{
upperBand[i] = basicUpper;
lowerBand[i] = basicLower;
}
// トレンド方向の決定
if(i < bars - 1)
{
isUpTrend[i] = (close > upperBand[i]) ? true :
(close < lowerBand[i]) ? false :
isUpTrend[i + 1];
}
else
{
isUpTrend[i] = (close > midPoint);
}
}
return true;
}
// 色転換シグナルの検出
int CheckSuperTrendCross()
{
if(!CalculateSuperTrend(10)) return 0;
// 前バーは下降→現バーは上昇 → 買いシグナル
if(!isUpTrend[1] && isUpTrend[0]) return 1;
// 前バーは上昇→現バーは下降 → 売りシグナル
if(isUpTrend[1] && !isUpTrend[0]) return -1;
return 0;
}
EAでのSuperTrend活用パターン
パターン1: 色転換エントリー(基本)
void OnTick()
{
if(!IsNewBar()) return; // 確定バーでのみ処理
int signal = CheckSuperTrendCross();
if(signal == 1) // 緑転換 → 買いエントリー
{
// ADXフィルター確認
if(GetADX() >= 25.0)
OpenBuy();
}
else if(signal == -1) // 赤転換 → 売りエントリー
{
if(GetADX() >= 25.0)
OpenSell();
}
}
パターン2: SuperTrendをトレーリングストップとして使用
void ManagePositions()
{
for(int i = PositionsTotal() - 1; i >= 0; i--)
{
if(PositionSelectByTicket(PositionGetTicket(i)))
{
// SuperTrendラインを損切りとして追随
double stLine = isUpTrend[0] ? lowerBand[0] : upperBand[0];
if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
{
// 買いポジション: 下限ラインに損切りを追随
if(stLine > PositionGetDouble(POSITION_SL))
ModifyStopLoss(PositionGetTicket(i), stLine);
}
}
}
}
パラメータ最適化の推奨設定
バックテストでの最適化範囲:
| パラメーター | 探索範囲 | ステップ | |------------|--------|--------| | STPeriod | 7〜20 | 1 | | STMultiplier | 1.5〜5.0 | 0.5 |
検証レポートが示す傾向: M15〜H4足ではSTPeriod=10〜14、STMultiplier=2.5〜3.5の範囲が比較的安定したパフォーマンスを示すことが多い。ただし通貨ペアによって最適値は変わる。
相場環境の適合性
SuperTrendが機能しやすい環境:
- 明確な方向性のあるトレンド相場
- 15分足〜4時間足・日足
- ボラティリティが中〜高い通貨ペア(GBPJPY・XAUUSD等)
機能しにくい環境:
- レンジ相場(ADXが低い局面)
- 超短期足(M1〜M5)での高頻度色転換
- ニュース直後のスパイク時
ADXフィルター(ADX≥25)との組み合わせは、SuperTrendをEAに実装する際の「ほぼ必須」の追加条件と言える。
Claudeと会話しながらインジケータが作れるhedgrow-fxはこちら
よくある質問(FAQ)
Q: MT4の標準インジケーターにSuperTrendはありますか? A: MT4/MT5の標準ビルトインにはSuperTrendは含まれていません。MQL5コミュニティのコードベース(mql5.com)からカスタムインジケーターをダウンロードするか、EAにロジックを内包する形で実装します。
Q: SuperTrendのバッファ番号はどう確認しますか? A: 使用するカスタムインジケーターのMQL4/MQL5コードをMetaEditorで開き、SetIndexBuffer()の呼び出し順序を確認します。バッファ0が何のデータかはインジケーターの実装によって異なります。
Q: ATR期間とSuperTrendのATR期間を統一すべきですか? A: SuperTrendのATR期間はSuperTrend専用のパラメーターです。ADXやATR損切りに使うATR期間は別途設定でき、それぞれ独立して最適化できます。
Q: SuperTrendとSMA/EMAを組み合わせる場合の推奨設定は? A: SuperTrend(トレンド方向)とSMA200(長期トレンドの確認)の組み合わせが一般的です。SuperTrendが緑かつ価格がSMA200上方にある場合のみ買いエントリーとするフィルター設計が使いやすいです。
著者情報
本記事は金融工学・アルゴリズム取引の実務経験を持つライターが執筆しています。
免責事項: 本記事はFXの教育・情報提供を目的としており、投資勧誘を行うものではありません。FX取引には元本割れリスクがあります。バックテスト結果は将来の運用成果を保証しません。実際の取引は自己責任で行ってください。
