ダウ理論と移動平均線を組み合わせる考え方 — 2つのトレンド定義の一致とずれを読む設計

「いまはトレンドか」という問いには、実はいくつもの定義があります。ダウ理論は、高値と安値がどちらへ切り上がっているか(または切り下がっているか)という 値動きの構造 で方向を定義します。移動平均線は、一定期間の価格を平均した線の傾きと価格の位置という 平滑化した数値 で方向を定義します。

この2つは同じ「トレンド」を扱いながら、見ている対象も反応のタイミングも異なります。本記事では、2つの定義が一致する局面とずれる局面を別々の状態として扱う設計を、cBot開発の視点から整理します。トレンド判定の仕組みを自作したい方や、移動平均線だけの方向判定に物足りなさを感じている方を想定しています。特定の設定が成果を保証するものではなく、設計の考え方の整理としてお読みください。

ダウ理論のスイング構造と移動平均線の傾きを上下に並べ、両者が一致する区間とずれる区間を示した模式図

ダウ理論の役割

まず、構造側を担うダウ理論の考え方を確認します。

ダウ理論では、直近の高値(スイングハイ)と安値(スイングロー)を結んだ並びで方向を判断します。高値も安値も切り上がっていれば上方向、両方が切り下がっていれば下方向とみなし、この並びが崩れるまでは方向が続いていると考えます。基礎はダウ理論とはにまとめています。

単独で使う場合の観察軸は次のとおりです。

限界は2つあります。第一に、スイングの定義が人によって揺れる 点です。どの程度の山や谷をスイングとして数えるかで、同じチャートでも判定が変わります。第二に、スイングは後から確定するという性質です。ある足が山だったと分かるのは、その後に数本の足が出てからです。この遅れを意識しないと、バックテストで「確定前の情報を使ってしまう」誤りにつながります。

移動平均線の役割

次に、平滑化側を担う移動平均線の性格を整理します。

移動平均線は、一定期間の終値を平均して線にしたものです。線の傾きが上向きか下向きか、価格が線の上にあるか下にあるかで方向を観察します。詳しくは移動平均線とはを参照してください。

強みは、毎足ひとつの値が機械的に決まることです。定義の揺れがなく、cBotで扱いやすい性質を持っています。

一方の限界は、平均であるがゆえに構造を持たない 点です。価格が線を少し割り込んでも、それが押し安値を割った構造的な崩れなのか、ただの一時的な振れなのかを線は区別しません。また横ばいの相場では、線が水平に近づき、価格が上下を細かく行き来するため、方向判定が頻繁に入れ替わります。

なぜこの組み合わせか

2つの定義を重ねると何が見えるのかを、理屈の面から整理します。

ダウ理論は「構造」を持っているものの定義が揺れやすく、移動平均線は「機械的な一貫性」を持っているものの構造を持ちません。性格が逆向きなので、一方の弱点を他方が補完する関係と考えられます。

組み合わせの核は、2つの判定を 4つの状態 に分けることです。

ポイントは、ずれている状態を「どちらかが正しい」と決めつけず、ずれていること自体を情報として扱う ことです。一般論として、構造の変化は線の変化に先行しやすく、線の変化は構造が落ち着いたあとに追いつく傾向があります。そのため、ずれの状態は「方向の切り替わり途中」の候補として観察できます。

押し目・戻りの観察にも使えます。上方向で一致している局面で、価格が押し安値を割らずに線の近くまで戻ってくる場面は、構造が保たれたまま平滑値に寄った状態です。押し目の考え方は押し目と戻りの基礎も参考にしてください。

注意点として、この組み合わせは方向判定の層であり、エントリーのタイミングや損切り幅までは決めません。別の層を足す前提で設計するのが基本です。

パラメータをどう考えるか

唯一の正解はないため、方向性だけを整理します。

スイングの検出幅 は、ある足の左右それぞれ何本より高い(低い)ときに山(谷)とみなすかを決める値です。幅を小さくすると細かな山谷も拾って反応が速くなる一方、ノイズも増えます。幅を大きくすると大きな波だけが残りますが、確定までの遅れが伸びます。

移動平均線の期間と種類 は、短期向けなら短めの期間、長期向けなら長めの期間という方向性です。単純移動平均(SMA)より指数平滑移動平均(EMA)のほうが直近の値を重く扱うため反応は速くなります。傾きの判定に「何本前との差」を使うかも決めておきます。

2つのパラメータは独立ではありません。スイング幅が捉える波の大きさと、移動平均線の期間が捉える波の大きさが大きく食い違うと、ずれの状態が常態化して判定が機能しにくくなります。両者の時間スケールをそろえる意識が大切です。どの設定でも、自分の運用銘柄と時間足でバックテストを行い、4つの状態の出現頻度を確認してから採用してください。検証の基本はバックテストの基礎にまとめています。

cBot化する際の考慮点

ここからは、cTraderのcBotに組み込む際の設計上のポイントを整理します。

スイングの確定遅れを正しく扱う: 検出幅を左右N本とした場合、ある足がスイングだと確定するのは、その足からN本後の足が確定した時点です。バックテストでスイングの足の時点にさかのぼって判定を使うと、実際には知り得なかった情報を使うことになります。判定に使えるのは「確定済みのスイングだけ」という原則をコードで守ります。

確定足で処理する: 判定はOnBarで行い、確定した足(Last(1))から数えたインデックスで扱います。

スイング履歴を保持する: 直近の高値2つ、安値2つを保持し、新しいスイングが確定したら古い値を押し出す形で更新します。起動直後はスイングが揃っていないため、その間は「未判定」として扱う分岐を入れます。

同値の扱いを決める: 左右の足と高値が同じ場合を山とみなすかどうかは、仕様として明記しておきます。

計算負荷: スイング検出は確定足1本ごとに左右N本を比べるだけなので、負荷は小さく済みます。

// 例: 左右 Strength 本で確定したスイングハイの検出(確定足ベース)
int c = Strength + 1;                       // 判定対象はN本前に確定した足
double h = Bars.HighPrices.Last(c);
bool isSwingHigh = true;
for (int i = 1; i <= Strength; i++)
{
    if (Bars.HighPrices.Last(c + i) >= h || Bars.HighPrices.Last(c - i) >= h)
    { isSwingHigh = false; break; }
}
if (isSwingHigh) { prevHigh = lastHigh; lastHigh = h; }  // 履歴を押し出す

double ma = ema.Result.Last(1);
double maSlope = ma - ema.Result.Last(1 + SlopeBars);   // 傾き
bool structureUp = lastHigh > prevHigh && lastLow > prevLow;
// structureUp と maSlope の符号から4状態のどれかを決める

実装の流れ

全体の処理を、入力から出力までの順序で整理します。

  1. 入力: 対象銘柄・時間足の確定足をOnBarで受け取る
  2. スイング更新: N本前の足がスイングとして確定したかを判定し、高値・安値の履歴を更新する
  3. 構造判定: 履歴の並びから「上方向・下方向・混在・未判定」を決める
  4. 平滑値判定: 移動平均線の傾きと価格の位置から「上向き・下向き・水平」を決める
  5. 状態の決定: 2つの判定を突き合わせ、一致・構造先行のずれ・平滑値先行のずれ・未判定のいずれかに分類する
  6. 出力: 状態と、根拠となったスイング値・移動平均線の値をログや別のエントリー層へ渡す

構造判定と平滑値判定を別の関数に分けておくと、スイング幅だけを検証し直す、移動平均線をEMAからSMAに差し替える、といった変更を局所的に行えます。スイングを自動で可視化したい場合は、Swing Point Auto Markerのようなツールでチャート上の山谷と判定ロジックを突き合わせると、定義の揺れを確認しやすくなります。

スイング更新・構造判定・平滑値判定・状態の決定・出力の順に処理する実装フロー図

どう活用するか

最後に、立場別の使い方をまとめます。

自作派の方は、Claude Code を使ったcBot開発の際、まずスイングの確定タイミングを正しく扱うテストを先に書いてから判定ロジックに進むと、バックテストの結果を信頼しやすくなります。最初の1本の作り方はcBotの作り方入門が参考になります。委託派の方は、ai-programming.xyzへの相談時に「スイング構造と移動平均線の傾きが一致したときだけ方向判定を出したい」と伝えていただくと、要件のすり合わせが進めやすくなります。教育派の方は、スクールでの「確定前の情報を使わない設計」の練習題材として活用できます。

本記事は一般的な情報提供を目的としています。投資助言ではありません。 取引判断はご自身の責任で行ってください。