この戦略は"Price Channel Breakout Strategy"と呼ばれる.その主な考え方は,価格チャネルを活用して市場動向と方向性を決定し,価格がチャネルを突破したときにポジションを確立することである.まず価格チャネル範囲を画し,次に2つの連続した赤または緑のK線があるかどうかを判断する.最後のK線がチャネル幅の半分を突破してチャネルの外に閉じる場合,購入または販売信号を生成する.
この戦略は,過去の一定期間の最高高と最低低を計算し,価格チャネルの上下線を決定するために最高 ((() と最低 ((() の関数を使用する.チャネルの真ん中点は上下線の平均値として定義される.その後,K線ボディサイズを計算し,最後のK線ボディが平均ボディの半分よりも大きいかどうかを決定するためにSMAを使用してスムーズ化する.また,最後の2つのK線が同じ方向 (連続して2つの赤または緑) に向いているかどうかを判断する.これらの条件が満たされたとき,購入/売却シグナルを生成し,価格がチャネルの方向に戻るとポジションを閉じる.
これは,全体的な傾向を判断するために価格チャネルを使用するブレークアウト戦略です.以下の利点があります:
価格チャネルを使用して全体的なトレンド方向を決定することは,市場のノイズを効果的にフィルターすることができます.
同じ方向に2つのK線が連続してチャネルを突破すると より強い勢いと 突破の成功率が高くなります
平均体積の半分以上のK線体を判断すれば 誤った突出によって誤導されるのを 避けることができます
戦略の論理はシンプルで 実行も簡単です
チャンネル期間,取引製品,取引時間など,カスタマイズ可能なパラメータにより,高度に適応可能になります.
この戦略にはいくつかの潜在的なリスクもあります.
破綻する可能性はまだある 損失につながるかもしれない
価格チャネルは 市場の変動が激しくなった場合 失敗する可能性があります
ストップ・ロスのメカニズムの欠如は,損失を効果的に制御することができません.
単純な取引規則には 過剰な適応リスクがあります
より複雑な市場環境に適応できない
対応する解は次のとおりです.
パラメータを最適化して 脱出の成功率を向上させる
波動指数を追加して 市場が動かないようにします
移動ストップ損失を追加します.
複素性テストを重ね合わせのチェックに
機械学習モデルを増やして適応性を向上させる
主な最適化方向は以下の通りである.
ストップ・ロスのメカニズムを追加してリスクを制御する.ATRに基づいて価格リトラセッションストップ・ロスの設定またはモバイルストップ・ロスの設定.
チャネル期間,ブレイクアウトスローシュールなどのパラメータを最適化します. 遺伝アルゴリズム,グリッド検索などを通じて最適なパラメータを見つけます.
ブレイクアウトの確実性を高めるためにフィルタリング条件を追加します.例えば,ブレイクアウトを確認するために取引量を組み合わせます.
LSTMのような機械学習モデルを追加することで より多くのデータを活用して 予測能力と適応性を向上します
ポートフォリオの最適化を行い,異なるタイプのブレイクアウト戦略を組み合わせて,直角性を達成し,類似性を減らす.
結論として,これはトレンドを決定し,ブレイクアウト信号を発見するための価格チャネルに基づく定量戦略です.トレンドを判断し,ブレイクアウトを確認する利点もありますが,偽ブレイクアウトのリスクもあります.リスクを減らすためにパラメータ最適化,ストップ損失,フィルターなどを追加することで戦略を改善することができます.一方,機械学習モデルを導入することで予測能力がさらに向上できます.全体的に見ると,これは研究と改善に値する有望な定量戦略アプローチです.
/*backtest start: 2023-12-16 00:00:00 end: 2024-01-15 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //Noro //2018 //@version=2 strategy(title = "Noro's Price Channel Strategy v1.0", shorttitle = "Price Channel str 1.0", overlay=true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 0) //Settings needlong = input(true, defval = true, title = "Long") needshort = input(true, defval = true, title = "Short") pch = input(30, defval = 30, minval = 2, maxval = 200, title = "Price Channel") showcl = input(true, defval = true, title = "Show center-line") fromyear = input(1900, defval = 1900, minval = 1900, maxval = 2100, title = "From Year") toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year") frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month") tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month") fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day") today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day") src = close //Price channel lasthigh = highest(src, pch) lastlow = lowest(src, pch) center = (lasthigh + lastlow) / 2 col = showcl ? blue : na plot(center, color = col, linewidth = 2) //Bars bar = close > open ? 1 : close < open ? -1 : 0 rbars = sma(bar, 2) == -1 gbars = sma(bar, 2) == 1 //Signals body = abs(close - open) abody = sma(body, 10) up = rbars and close > center and body > abody / 2 dn = gbars and close < center and body > abody / 2 exit = ((strategy.position_size > 0 and close > open) or (strategy.position_size < 0 and close < open)) and body > abody / 2 //Trading if up if strategy.position_size < 0 strategy.close_all() strategy.entry("Long", strategy.long, needlong == false ? 0 : na) if dn if strategy.position_size > 0 strategy.close_all() strategy.entry("Short", strategy.short, needshort == false ? 0 : na) if exit strategy.close_all()