マルチタイムフレームトレンドフォロー戦略


作成日: 2024-01-26 15:54:45 最終変更日: 2024-01-26 15:54:45
コピー: 0 クリック数: 614
1
フォロー
1617
フォロワー

マルチタイムフレームトレンドフォロー戦略

概要

この戦略は,異なる時間周期 ((50バーと200バー) の間の最高価格と最低価格を計算することによって,主要な価格チャネルを形成し,長期のトレンドの方向を代表する.同時に,高速信号線と遅い信号線を組み合わせて,短期のトレンドの方向を判断する.この戦略は,長期短期のトレンドの方向が一致するときに入場を提示する.

戦略原則

まず,最後の50バーの最高値と最低値,そして最後の200バーの最高値と最低値を計算することで,長期トレンドの方向を表す2つの価格チャネルが形成されます.

次に,最後の7バーの最高値と最低値を計算し,急速な信号通路を判断し,短期的な傾向を判断する.最後の20バーの内での最高値と最低値を計算し,遅い信号通路を判断し,より短期的な傾向を判断する.

最後に,入場シグナルを提示するのは,高速信号通路,遅い信号通路,および長期価格通路の方向が一致しているときにである.例えば,すべての通路が上昇傾向にある場合,購入を提示する;すべての通路が下降傾向にある場合,販売を提示する.

優位分析

この戦略の最大の利点は,長期短期の一致的なトレンドの方向を識別できる点にある.異なる時間周期の価格チャネルを確認することで,短期市場の騒音に惑わされないようにすることが可能である.

また,多時間枠判断により,短期的な価格逆転が起きても,信号は容易に変化しないので,信号の安定性を保証する.

リスク分析

この戦略の主なリスクは,長期短期トレンドが逆転すると,複数のタイムサイクルチャネルが確認される必要性があるため,信号生成に一定の遅れが生じることにある.この場合,盲目追随は損失拡大を引き起こす可能性がある.

また,高周波取引には友好的でなく,短期的な価格変動に迅速に反応することができません. 激烈な状況に直面した場合,停止条件の不適切な設定も大きな損失を引き起こす可能性があります.

最適化の方向

適応的なダイナミック・ストップ・ストラトジーを加えることを検討し,価格が不利な方向に一定の割合を突破したときにストップ・アウトをすることで,リスクを効果的に制御することができる.

さらに,異なる長さの価格チャネルを追加して,投票によって最終的な信号が決定され,判断の正確性が向上します.

また,Machine Learning アルゴリズムを使用して,各チャネルのパラメータを自動的に最適化して,現在の市場環境に適したパラメータを作ることができます.

要約する

この戦略の全体的な考え方は明確で分かりやすく,多時間枠価格通路によって市場動向を判断し,短期市場のノイズを効果的に除することができる。しかし,逆転走勢の処理とリスク管理は強化する必要がある。止損戦略とパラメータ最適化と組み合わせれば,戦略の安定性と実戦効果をさらに強化することができる。

ストラテジーソースコード
/*backtest
start: 2023-12-26 00:00:00
end: 2024-01-25 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © ZoomerXeus

//@version=4
strategy("Swing High Low Price Channel V.1", overlay=true)

//========================= variable =================================//
dead_channel_source = input(title="Main swing channel source", defval="H/L", options=["H/L"])
fast_signal_length = input(title="Fast Slow Length", type=input.integer, defval=7, maxval=49, minval=1)
slow_signal_length = input(title="Slow Slow Length", type=input.integer, defval=20, maxval=49, minval=1)
is_show_only_dead_channel = input(title="Show main channel only", defval=true)
main_channel_width = input(title="Main line width", defval=2, minval=1)
signal_channel_width = input(title="Signal line width", defval=1, minval=1)

//========================= indicator function =================================//
dead_cross_high_50 = highest(high, 50) 
dead_cross_high_200 = highest(high, 200) 
//========================================
dead_cross_low_50 = lowest(low, 50) 
dead_cross_low_200 = lowest(low, 200) 
//========================================
medain_dead_cross_50 = ((dead_cross_high_50-dead_cross_low_50)*0.5)+dead_cross_low_50
medain_dead_cross_200 = ((dead_cross_high_200-dead_cross_low_200)*0.5)+dead_cross_low_200


//========================================
fasthighest = highest(high, fast_signal_length)
fastlowest = lowest(low, fast_signal_length)
//========================================
slowhighest = highest(high, slow_signal_length)
slowlowest = lowest(low, slow_signal_length)
//========================================

    
//========================= plot =================================//
plot(dead_channel_source == "H/L" ? dead_cross_high_50 : na,title="50 bar highest", color=color.red, linewidth=main_channel_width)
plot(dead_channel_source == "H/L" ? dead_cross_high_200 : na,title="200 bar highest", color=color.aqua, linewidth=main_channel_width)
plot(dead_channel_source == "H/L" ? dead_cross_low_50 : na,title="50 bar lowest", color=color.red, linewidth=main_channel_width)
plot(dead_channel_source == "H/L" ? dead_cross_low_200 : na,title="200 bar lowest", color=color.aqua, linewidth=main_channel_width)
plot(dead_channel_source == "H/L" ? medain_dead_cross_200 : na,title="200 bar middle lowest", color=color.orange, linewidth=main_channel_width)
plot(dead_channel_source == "H/L" ? medain_dead_cross_50 : na,title="50 bar middle lowest", color=color.lime, linewidth=main_channel_width)
//===========================================
plot(is_show_only_dead_channel == false ? fasthighest : na,title="fast signal highest", color=#ff00f9, linewidth=signal_channel_width)
plot(is_show_only_dead_channel == false ? fastlowest : na,title="fast signal lowest", color=#ff00f9, linewidth=signal_channel_width)
plot(is_show_only_dead_channel == false ? slowhighest : na,title="slow signal highest", color=color.white, linewidth=signal_channel_width)
plot(is_show_only_dead_channel == false ? slowlowest : na,title="slow signal lowest", color=color.white, linewidth=signal_channel_width)
//===========================================
plot(crossover(medain_dead_cross_50, medain_dead_cross_200) ? medain_dead_cross_200 : na, title="Dead cross buy plot", style=plot.style_circles, linewidth=6, color=color.lime)
plot(crossunder(medain_dead_cross_50, medain_dead_cross_200) ? medain_dead_cross_200 : na, title="Dead cross sell plot", style=plot.style_circles, linewidth=6, color=color.red)
plot(is_show_only_dead_channel and (medain_dead_cross_50 < medain_dead_cross_200) and high == slowhighest ? high : na, title="Follow trend short term  sell plot zone", style=plot.style_circles, linewidth=3, color=color.orange)
plot(is_show_only_dead_channel and (medain_dead_cross_50 > medain_dead_cross_200) and low == slowlowest ? low : na, title="Follow trend short term buy plot zone", style=plot.style_circles, linewidth=3, color=color.green)
plot(is_show_only_dead_channel and high == slowhighest and (high == dead_cross_high_200) ? high : na, title="Not follow trend short term  sell plot zone", style=plot.style_circles, linewidth=3, color=color.orange)
plot(is_show_only_dead_channel and low == slowlowest and (low == dead_cross_low_200) ? low : na, title="Not follow trend short term buy plot zone", style=plot.style_circles, linewidth=3, color=color.green)

//===================== open close order condition =========================================================//
strategy.entry("strong buy", true, 1, when=low == dead_cross_low_200)
strategy.exit("close strong buy 50%", "strong buy", qty_percent=50, when=high==slowhighest)
strategy.entry("strong sell", false, 1, when=high == dead_cross_high_200)
strategy.exit("close strong sell 50%", "strong sell", qty_percent=50, when=low==slowlowest)