「株テック | Kabutech Lab.」は、日本株トレードを初心者向けに解説するメディアです。

ツールの使い方や考え方、環境構築方法を学ぶ場として、主に以下の内容を解説しています:

  • TradingViewを使ったバックテスト・ストラテジーの実践情報
    (プログラミング知識がなくても始めやすい検証ツールです)
  • 三菱UFJ eスマート証券のkabu APIを使った環境構築
    (日本株の発注が可能な数少ないAPI接続サービスです)

バックテストは自作プログラム(Pandasなど)で応用可能、発注は他の証券会社のRSSなどでも対応できます。
特定の証券会社やツールを強く推奨するものではありません。

以下の点にご留意ください:

  • 個別銘柄の売買や投資判断の助言は行いません。
  • サンプルのストラテジーやコードは学習・検証用の参考資料であり、実際の売買や利益を保証しません。
  • バックテストは過去データに基づく結果であり、将来の成果を保証しません。
  • 自動売買環境はエラーハンドリングと十分な整備が必須です。
  • 市場変動、システム障害、予期せぬ遅延やエラーなどのリスクがあります。

投資はあくまで自己責任です。リスクを理解して慎重に取り組んでください。

当サイトでは一部アフィリエイト広告を利用しています (プライバシーポリシー)。

ご質問はこちらまでお気軽にどうぞ。

無料公開 | FO MA CROSS Strategy Template | 実戦向けフィルター搭載 TradingView戦略

🧭 はじめての方へ:基礎 → 実践 → 設計 → 検証 → 理論。最短で再現性に辿り着くためのロードマップ
👉️ Kabutech Lab.のおすすめの進め方

実戦運用を意識したフィルター搭載版 TradingView戦略テンプレート

本テンプレートは、移動平均クロス戦略をベースにした実戦向けの ストラテジー テンプレートです。

TradingView 単体での バックテスト はもちろん、FO(Flex Order)と連携することで実口座への自動発注にも対応できます。

📊 参考バックテストサマリー(日経先物 / 15分足 / 1枚)

FO MA CROSS Strategy バックテスト例
検証項目 実戦想定(スリッページ3) 参考値(スリッページ0)
プロフィットファクター 2.038 3.009
勝率 68.97% 75.00%
総損益 +969,500.00 JPY +1,397,500.00 JPY
最大ドローダウン -128,500 JPY -72,500 JPY

FO Simple SMA Templateとの違い

本テンプレートは、FO Simple SMA Templateの売買ロジックをベースに、 実運用を想定したフィルター群や検証機能を追加した発展版です。

  • 相場環境の選別
  • エントリー 条件の絞り込み
  • ダマシシグナルの低減

などを検証できる構成になっています。

まずは FO Simple SMA Template で全体の流れを理解し、その後に本テンプレートでフィルターによる改善効果を検証してみてください。

👉 FO Simple SMA Template

このストラテジーでできること

エントリー

  • SMA / EMA 切り替え
  • ゴールデンクロス (GC)
  • デッドクロス (DC)
  • クロス後○本以内 エントリー

フィルター機能

  • 出来高 フィルター
  • ATR ボラティリティ フィルター
  • ヒゲ フィルター
  • 傾きフィルター
  • 日足 MTF フィルター
  • DMI 方向フィルター
  • ADX トレンド 強度フィルター
  • Choppinessフィルター

出口管理

  • ATR 損切り
  • ATR 利確
  • 最大損失率制限

運用機能

  • エントリー 時間制御
  • バックテスト 期間制御
  • 引け 決済
  • 週末決済
  • TradingView アラート 対応
  • FO通知連携で 自動売買 対応

FO MA CROSS Strategy Templateコード全文

//@version=6
import kabutech/FO_Util/53 as util

strategy(
    "FO MA CROSS Strategy Template",
    overlay=true,
    initial_capital=10000000,
    default_qty_value=1
)

// ====================
// ■ 市場設定
// ====================
marketTypeInput = input.string(
     "JP_FUT",
     title="市場タイプ",
     options=["JP_STOCK","JP_FUT"],
     tooltip="市場に応じて発注禁止時間(昼休み・引け前)を自動制御します"
)

//====================================================
// ■ バックテスト期間
//====================================================
fromDays = input.int(
    0,
    "開始から除外日数",
    minval = 0,
    tooltip = "バックテスト開始日から指定日数を除外",
    inline="バックテスト"
)

toDays = input.int(
    0,
    "終了から除外日数",
    minval = 0,
    tooltip = "最新日から指定日数を除外",
    inline="バックテスト"
)

//====================================================
// ■ インジケータ設定
//====================================================
maType = input.string(
    "SMA",
    title="移動平均タイプ",
    options=["SMA", "EMA"],
    tooltip="SMA: 単純移動平均\nEMA: 指数平滑移動平均"
)

// SMA
maShortLen = input.int(5,  "短期MA期間", inline="ma_len")
maLongLen  = input.int(25, "長期MA期間", inline="ma_len")

// クロス後猶予
barsAfterCross = input.int(1, "クロス後エントリー許可本数", minval=0, maxval=20)

//====================================================
// ATR
//====================================================
atrLength     = input.int(14, "ATR期間", inline="")
atrMultiplier = input.float(0, "ATR最小(0:無効)", step=0.1, inline="atr_filter", group="エントリーフィルター設定",
     tooltip="")
atrMultiplierMax = input.float(0, "ATR最大(0:無効)", step=0.1, inline="atr_filter", group="エントリーフィルター設定",
     tooltip="ローソク足のサイズをATRと比較するフィルター。\n0で無効化。\nATR×倍率以上・以下をフィルタ。")

//====================================================
// ■ VOLUME FILTER(出来高フィルター)
//====================================================
volLength     = input.int(20, "出来高フィルター (0:無効)", group="エントリーフィルター設定")
volMultiplier = input.float(1.2, "出来高倍率", step=0.1, inline="vol", tooltip="平均×倍率【以上】の出来高(クライマックス)で許可", group="エントリーフィルター設定")
volLookback   = input.int(3, "Lookback", minval=1, inline="vol", group="エントリーフィルター設定")

//====================================================
// ■ DAILY MA FILTER(日足トレンドフィルター)
//====================================================
dailyMaLength = input.int(
     0,
     "日足MA期間 (0:無効)",
     minval = 0,
     group = "エントリーフィルター設定",
     tooltip = "日足移動平均を利用した上位足フィルター。\n0で無効化。"
)

//====================================================
// ■ SLOPE FILTER(傾きフィルター)
//====================================================
slopeLength = input.int(0, "傾き期間(0:無効)", inline="slope", group="エントリーフィルター設定",
     tooltip="傾きの計算期間")
slopeThreshold  = input.float(0.05, "閾値", step=0.01, inline="slope", group="エントリーフィルター設定",
     tooltip="傾きがこの値未満ならレンジと判定\n値を大きくするとレンジ判定が広がる")

//====================================================
// ■ WICK FILTER(ヒゲ判定)
//====================================================
wickRatio = input.float(0.0, "Wick Ratio (0:off)", step=0.1, inline="wick", maxval=1.0,
     tooltip="ローソク足のレンジに対するヒゲの割合(0.0〜1.0)。\n0で無効化。例)0.5 = レンジの50%以上がヒゲ", group="エントリーフィルター設定")
wickLookback = input.int(3, "Lookback", minval=1, inline="wick",
     tooltip="直近何本以内に指定したヒゲが出現したかを判定します。\n1なら現在の足のみ。", group="エントリーフィルター設定")

//====================================================
// ■ DMI / ADX 統合設定
//====================================================
dmiMode = input.string(
     "OFF",
     "DMI方向モード",
     options=["OFF", "TREND", "REVERSAL"],
     inline="dmi_1",
     group="エントリーフィルター設定"
)
dmiAdxLength = input.int(14, "DMI/ADX 共通期間", inline="dmi_1", minval=0, group="エントリーフィルター設定")
adxThreshMin    = input.int(20, "ADX 下限 (0:無効)", inline="dmi_2", minval=0, group="エントリーフィルター設定")
adxThreshMax    = input.int(0, "ADX上限 (0:無効)", inline="dmi_2", minval=0, group="エントリーフィルター設定")

//====================================================
// ■ CHOPPINESS FILTER(レンジ判定フィルター)
//====================================================
chopLength = input.int(9, "日足Chop期間 (0で無効)", inline="", group="エントリーフィルター設定")
chopThreshMin = input.float(0, "Chop下限", inline="Chop", group="エントリーフィルター設定")
chopThreshMax = input.float(61.8, "Chop上限", inline="Chop", group="エントリーフィルター設定")

//====================================================
// ■ 出口管理(ATR)
//====================================================
atrLimitMult = input.float(1.5, "ATR利確倍率", inline="exit1", step=0.1, group="出口管理")
atrStopMult  = input.float(2.0, "損切り倍率", inline="exit2", step=0.1, group="出口管理")
// trailAtrMult = input.float(0.0, "トレール幅 (0で固定利確)", inline="exit2", step=0.1, group="出口管理")
maxStopPerc  = input.float(2.0, "最大損切り(%)", inline="exit2", step=0.1, group="出口管理")

//====================================================
// ■ SESSION管理
//====================================================
useSessionFilter = input.bool(true, "エントリー時間制限", group="SESSION")
startHour   = input.int(9, "開始", inline="s", group="SESSION")
startMinute = input.int(0, " ", inline="s", group="SESSION")
endHour     = input.int(14, "終了", inline="e", group="SESSION")
endMinute   = input.int(30, " ", inline="e", group="SESSION")

useSessionClose = input.bool(true, "引け決済", group="SESSION")
closeHour   = input.int(15, "時", inline="c", group="SESSION")
closeMinute = input.int(0, "分", inline="c", group="SESSION")

//====================================================
// BASE CALCULATION
//====================================================
f_ma(src, len, type) =>
    type == "EMA" ? ta.ema(src, len) : ta.sma(src, len)

maShort = f_ma(close, maShortLen, maType)
maLong  = f_ma(close, maLongLen, maType)

// 傾き対象
slopeTarget = maLong

atrValue = ta.atr(atrLength)
safeATR  = math.max(atrValue, syminfo.mintick)

// ■ クロス判定
goldenCross = ta.crossover(maShort, maLong)
deathCross  = ta.crossunder(maShort, maLong)

barsFromGolden = ta.barssince(goldenCross)
barsFromDeath  = ta.barssince(deathCross)

longTrigger = barsFromGolden >= 0 and
     barsFromGolden <= barsAfterCross and
     maShort > maLong and
     close > open
shortTrigger = barsFromDeath >= 0 and
     barsFromDeath <= barsAfterCross and
     maShort < maLong and
     close < open

//====================================================
// FILTER LOGIC(共通フィルターロジック)
//====================================================
// エントリー時間制御
allowEntry = util.f_allowEntry(useSessionFilter, startHour, startMinute, endHour, endMinute, marketTypeInput, fromDays, toDays)

// 出来高フィルター
volOK = util.f_volumeFilter(volLength, volMultiplier, 0, volLookback)

// ATRフィルター
rangeFilter = util.f_atrRangeFilter(high, low, safeATR, atrMultiplier, atrMultiplierMax)

// DMI/ADXフィルター
[dmiLongMode, dmiShortMode, adxOK] = util.f_dmiAdxFilter(dmiAdxLength, dmiMode != "OFF", adxThreshMin, adxThreshMax)

// CHOPフィルター
[chopVal, chopOK] = util.f_chopFilter(chopLength, chopThreshMin, chopThreshMax)

// フィルター統合
baseFilters = adxOK and chopOK and volOK and allowEntry and rangeFilter

//====================================================
// 各方向専用のフィルター
//====================================================

// 日足MTF
[allowDMALong, allowDMAShort, dmaValue] = util.f_dailyMAFilter(dailyMaLength)

// 傾きフィルター
[slope, slopeNorm, isRange, trendUpSlope, trendDownSlope] = util.f_slopeFilter(slopeTarget, slopeLength, slopeThreshold, safeATR)

// ヒゲフィルター
wickLongOK  = util.f_wickFilter(wickRatio, -1, wickLookback)
wickShortOK = util.f_wickFilter(wickRatio,  1, wickLookback)

// DMIモード切り替え
longDmiOK = dmiMode == "REVERSAL" ? dmiShortMode : dmiLongMode
shortDmiOK = dmiMode == "REVERSAL" ? dmiLongMode : dmiShortMode

longFilter  = longDmiOK and trendUpSlope and wickLongOK and allowDMALong
shortFilter = shortDmiOK and trendDownSlope and wickShortOK and allowDMAShort

//====================================================
// ■ シグナル
//====================================================
longSignal = longTrigger and longFilter and baseFilters and barstate.isconfirmed
shortSignal = shortTrigger and shortFilter and baseFilters and barstate.isconfirmed

// エントリー
util.f_executeEntry(longSignal, shortSignal)

//====================================================
// EXIT LOGIC(出口設計)
//====================================================
[longStop, shortStop, longLimit, shortLimit] = util.f_calcATRExit(
        strategy.position_avg_price,
        atrValue,
        atrStopMult,
        atrLimitMult,
        maxStopPerc
     )

strategy.exit("CLOSE_LONG",  from_entry="LONG",  stop=longStop,  limit=longLimit)
strategy.exit("CLOSE_SHORT", from_entry="SHORT", stop=shortStop, limit=shortLimit)

// ====================
// ■ 引け決済
// ====================
util.f_executeSessionClose(useSessionClose, closeHour, closeMinute, marketTypeInput)

// ====================
// ■ 描画
// ====================
plot(maShort, color=color.blue, title="Short MA")
plot(maLong,  color=color.red,  title="Long MA")
// plot(dmaValue, color=color.green, title="day MA")

//====================================================
// STATUS DASHBOARD
//====================================================

var table board = table.new(position.bottom_right, 2, 4, bgcolor=color.new(color.black, 70))

// ヘッダー
table.cell(board, 0, 0, "項目", text_color=color.white, bgcolor=color.gray)
table.cell(board, 1, 0, "現在の状態", text_color=color.white, bgcolor=color.gray)

//----------------------------------
// ■ 市場
//----------------------------------
table.cell(board, 0, 1, "市場", text_color=color.white)
table.cell(board, 1, 1, marketTypeInput, text_color=color.yellow)

//----------------------------------
// ■ ポジション
//----------------------------------
posStr = strategy.position_size > 0 ? "LONG" : strategy.position_size < 0 ? "SHORT" : "FLAT"
posCol = strategy.position_size > 0 ? color.lime : strategy.position_size < 0 ? color.red : color.white

table.cell(board, 0, 2, "ポジション", text_color=color.white)
table.cell(board, 1, 2, posStr, text_color=posCol)

//----------------------------------
// ■ 利確・損切り目安
//----------------------------------
longActive  = strategy.position_size > 0
shortActive = strategy.position_size < 0

tpStr =
     longActive  ? str.tostring(longLimit, format.mintick) :
     shortActive ? str.tostring(shortLimit, format.mintick) :
     "-"

slStr =
     longActive  ? str.tostring(longStop, format.mintick) :
     shortActive ? str.tostring(shortStop, format.mintick) :
     "-"

table.cell(board, 0, 3, "出口目安", text_color=color.white)
table.cell(board, 1, 3, "利確: " + tpStr + "\n損切: " + slStr, text_color=color.white)

SMA・EMAを切り替え可能

移動平均には様々な種類がありますが、本テンプレートでは代表的な

  • SMA (Simple Moving Average / 単純 移動平均線
  • EMA (Exponential Moving Average / 指数平滑 移動平均線

を切り替えて利用できます。

maType = input.string(
    "SMA",
    options=["SMA", "EMA"]
)

市場や銘柄・ 時間足 によって相性が変わるため、 バックテスト しながら比較検証できます。

SMA(単純移動平均線)

SMA は、指定した期間の価格を単純に平均して表示する 移動平均線 です。

例えば25期間 SMA の場合、直近25本の終値を平均して線を描画します。

特徴:

  • 値動きが比較的なだらか
  • ノイズ の影響を受けにくい
  • 長期的な トレンド 確認に向いている

EMA(指数平滑移動平均線)

EMA は、直近の価格により大きな比重を置いて計算する 移動平均線 です。

特徴:

  • SMA より価格変化への反応が早い
  • 短期的な トレンド 検出に向いている
  • その分、ダマシも増える場合がある

どちらが優れているというより、目的によって使い分けることが重要です。

クロス後エントリーに対応

一般的な移動平均クロス戦略では、クロス発生と同時に エントリー します。

しかし実際の相場では、

  • クロス直後に 押し目 が入る
  • クロス後に数本遅れて動き出す

といったケースも少なくありません。

本テンプレートでは、

barsAfterCross

を利用することで、

  • 「クロス後○本以内」

まで エントリー を許可できます。

これにより、単純なクロス戦略では取り逃しやすい局面も検証できるようになります。

ステータスダッシュボード搭載

チャート 右下には簡易ステータスダッシュボードを表示しています。

確認できる内容は以下の通りです。

  • 市場種別
  • 現在 ポジション
  • 利確価格目安
  • 損切り 価格目安

検証中に現在の戦略状態を把握しやすくするための補助機能です。

フィルター機能

ストラテジー では、相場環境を判定するための汎用的なフィルター機能を標準搭載しています。

単純に売買シグナルだけで エントリー するのではなく、

  • 相場に十分な値動きがあるか
  • トレンド が発生しているか
  • レンジ 相場ではないか
  • 上位足の方向と一致しているか

など、複数の観点から エントリー 条件を調整できます。 これらのフィルターは移動平均クロスに限らず、様々な ストラテジー で利用できる基本的な機能です。

※各フィルターの具体的な設定方法やコード利用方法については、FO_Util解説ページで詳しく説明しています。

👉️ FO_Util ライブラリの詳細を見る

出来高フィルター

出来高 は、市場参加者の多さやその価格変化に対する注目度を確認するための指標です。

なぜ必要?

価格が動いていても、 出来高 が少ない場合は一時的な値動きや流動性の低い相場である可能性があります。

特に短期売買では、参加者が少ない場面では価格変動の信頼性が低下し、ダマシシグナルにつながることがあります。

メリット

出来高 フィルターを利用することで、一定以上の売買が発生している場面を対象に検証できます。

市場参加者が増えている局面に絞ることで、不要な エントリー を減らし、より活発な相場環境での戦略検証が可能になります。

ATRボラティリティフィルター

ATR (Average True Range)は、一定期間における価格変動の大きさを測定する指標です。

なぜ必要?

相場は常に同じ値動きをするわけではなく、 値幅 が大きい局面と小さい局面が存在します。

ボラティリティ が低い相場では利益幅を確保しにくく、逆に急激な値動きが発生している局面では リスク管理 が難しくなる場合があります。

メリット

ATR フィルターを利用することで、現在の値動きの大きさに応じて取引条件を調整できます。

値動きが小さすぎる場面や、想定外に荒れている場面を除外するなど、相場環境に合わせた検証が可能になります。

ヒゲフィルター

ローソク足 ヒゲ は、価格がその水準まで動いた後に押し戻された値動きの痕跡です。

なぜ必要?

長い上 ヒゲ は売り圧力、長い下 ヒゲ は買い圧力を示す場合があり、単純な価格変化だけでは分からない市場参加者の反応を確認できます。

特定の価格帯で強い反発や拒否反応が起きている場合、 エントリー 後の値動きに影響することがあります。

メリット

ヒゲ フィルターを利用することで、特定の ローソク足 形状が発生した局面を条件に追加できます。

急激な反発や ブレイク 失敗など、価格の勢いが弱まっている可能性がある場面を避ける検証が可能になります。

傾きフィルター

傾きフィルターは、 移動平均線 などの変化量を利用して相場の方向性を確認するためのフィルターです。

なぜ必要?

価格が 移動平均線 を上回っていても、線自体の傾きがほとんどない場合は方向感の弱い相場である可能性があります。

トレンド 系の戦略では、単純な位置関係だけではなく、価格がどの方向へ進んでいるかを確認することが重要になります。

メリット

傾きフィルターを利用することで、横ばい相場を避け、一定方向への流れが発生している場面を対象に検証できます。

トレンド の方向性を条件として追加することで、相場環境に応じた戦略調整が可能になります。

日足MTFフィルター

MTF (Multi Time Frame)は、複数の 時間足 を利用して相場を分析する考え方です。

なぜ必要?

短期足だけで判断すると、より大きな 時間足 で発生している トレンド や重要な流れを見落とす場合があります。

例えば短期足では買いシグナルが出ていても、 日足 では下降 トレンド 中というケースがあります。

メリット

日足 MTF フィルターを利用することで、上位足の方向性を確認した上で エントリー 条件を設定できます。

短期的な値動きだけではなく、大きな相場の流れを考慮した戦略検証が可能になります。

DMI方向フィルター

DMI (Directional Movement Index)は、買い方向・売り方向への価格変化の強さを確認するための指標です。

なぜ必要?

相場では、上昇・下降・横ばいなど様々な状態が発生します。

シグナルが発生していても、現在どちらの方向に市場参加者の力が向いているかによって、その後の値動きは変化します。

メリット

DMI フィルターを利用することで、買い優勢・売り優勢といった方向性を条件に追加できます。

順張り戦略では トレンド 方向の確認、逆張り戦略では過熱状態の判断など、様々な用途で利用できます。

ADXトレンド強度フィルター

ADX(Average Directional Index)は、 トレンド の強さを測定するための指標です。

なぜ必要?

ADXは上昇か下降かではなく、「現在の相場にどれだけ勢いがあるか」を確認する指標です。

方向感が弱い レンジ 相場では、多くの トレンド 系シグナルが機能しにくくなる場合があります。

メリット

ADXフィルターを利用することで、一定以上の トレンド 強度がある相場だけを対象に検証できます。

トレンド が発生していない局面を除外し、戦略が得意とする相場環境に絞った分析が可能になります。

Choppinessフィルター

Choppiness Indexは、現在の相場が トレンド 状態なのか、 レンジ 状態なのかを判断するための指標です。

なぜ必要?

市場環境によって、有効な戦略は変化します。

トレンド フォロー型の戦略は方向感のある相場で機能しやすい一方、 レンジ 相場ではダマシが増える傾向があります。

メリット

Choppinessフィルターを利用することで、相場環境を判定し、 トレンド 向き・ レンジ 向きの条件設定を検証できます。

単純にシグナルだけを見るのではなく、「今どのような相場なのか」を考慮した戦略設計が可能になります。

自動売買環境を構築するには?

ストラテジー の作成や バックテスト はできたけれど、

「実際にどうやって 自動売買 へ繋げるの?」

自動売買 の全体像や構築手順については、こちらの環境構築ガイドで詳しく解説しています。

👉 自動売買環境構築ガイドを見る

💡 自力構築も可能ですが

  • VPS の設定
  • サーバー保守
  • API 接続
  • 障害対応

など、実際に運用を始めるまでには想像以上にやることがあります。

  • まずは運用を始めたい
  • 環境構築より戦略開発に集中したい

という方は、構築済み環境のFO(Flex Order)という選択肢もあります。

FOで実口座へ接続する

TradingView バックテスト だけで終わらせず、そのまま実口座運用へ接続したい方はFO(Flex Order)をご利用ください。

TradingView
↓
Webhook
↓
FO(Flex Order)
↓
証券会社

という構成で 自動売買 環境を構築できます。

👉 FO(Flex Order)を見る

関連テンプレート

まずはシンプルな構成から学びたい方は、こちらもご覧ください。

👉 FO Simple SMA Template
👉 その他戦略テンプレート一覧を見る

コメント

@管理人

質問・リクエスト・感想など、お気軽にコメントしてください。
※ コメント同士での情報交換は歓迎しています。
運営から個別返信は行っていませんが、すべて拝見し、今後のコンテンツ改善や記事作成の参考にしています。 誹謗中傷・スパムなどは予告なく非表示・削除する場合があります。

🧭 はじめての方へ:基礎 → 実践 → 設計 → 検証 → 理論。最短で再現性に辿り着くためのロードマップ
👉️ Kabutech Lab.のおすすめの進め方

ストラテジー一覧

本ページでは、TradingViewで利用できるストラテジーを「指標 × ロジック(順張り・逆張り)」で整理しています。
自分のトレードスタイルや相場状況に合ったロジックを選択してください。

📈 テクニカル分析

テクニカル指標をTradingViewで実践活用

詳しく見る

🛠️ 自動売買の構築

TradingView, kabu API を使った環境構築

詳しく見る

📊 戦略設計

戦略を検証し、改善するための手法と実装

詳しく見る

🔧 ストラテジー作成

Pineスクリプトでの戦略実装をガイド

詳しく見る

📦 システム拡張

Slack連携/プロセス監視で安定・拡張

詳しく見る
FO 日本株自動売買 コピペで動く! 無料TradingViewストラテジー公開中

はじめての自動売買・Pine Scriptの学習におすすめ

背景画像
「戦略が、自律する。」