
この戦略は,主に唐通道指標を使用して,追跡型の突破取引戦略を実現する.この戦略は,傾向と突破の2つの取引考え方とを組み合わせ,長線トレンドの判断に基づいて,より短い周期の突破点を探して,トレンドの状況で順調な取引を実現する.さらに,この戦略は,各取引のリスクと利益の比率を制御するために,止損と停止のレベルを設定する.全体的に,この戦略は,トレンドを追跡する利点があり,順調に,長線トレンドの機会をつかむことができる.
東通道指数のパラメータを設定し,デフォルト周期は20;
EMA平滑移動均線を設定し,デフォルト周期は200;
リスク・リターン比率を設定します.
突破回転のパラメータを,多頭と空頭に設定する.
破綻が高点か低点かを記録する
マルチヘッドシグナル: 前回のブレイクが低点であり,価格が唐津上線より高く,EMA平均線より高く,マルチヘッドシグナルを生成する.
空頭シグナル:上回のブレイクが高点であり,価格が唐津下位軌道より低く,EMA平均線より低い場合,空頭シグナルを生成する.
多頭ポジションに入ると,ストップロスは唐下線で5ポイント引き下げ,ストップはリスク/利益比でストップ距離を掛けます.
空頭ポジションに入ると,ストップロッドをドンチアン上線で5点引き戻し,ストップはリスク/利益の比率でストップロッドの距離を掛けます.
このようにして,戦略は,トレンド判断と突破操作を組み合わせて,順番に,長線トレンドの中でより短い周期の機会を捕捉することができます.同時に,ストップ・ストップの設定は,単一の取引のリスク・リターンを制御することができます.
長期トレンドを追跡し,順位を把握し,逆行を避ける.
唐通路は,長線指標として,EMA均線フィルターと組み合わせて,トレンド方向をよく判断することができる.
損失防止器具は,個々のリスクを制御し,潜在的な損失を制限します.
リスクと利益の比率を最適化することで,利益と損失の比率を大きくし,利益の余剰を追求することができる.
回測パラメータの設定は柔軟で,異なる市場に対して最適なパラメータの組み合わせを調整できます.
唐通路とEMA均線はフィルタリング指標として,誤信号を発する可能性がある.
突破する取引は簡単に騙されやすいので,トレンドの背景を明確に識別する必要があります.
ストップダストストップの距離は固定であり,市場の変動に合わせて調整することはできません.
パラメータの最適化スペースは限られており,リッドディスクの効果は保証できません.
取引システムにはランダムな事件が多すぎると判断されず,ブラック・スウィーン事件は大きな損失を招く可能性があります.
シグナル品質を向上させるため,振動指数など,より多くの指標をフィルタリングすることを考えることができます.
スマートストップを設定し,市場の変動度とATR指標の動向に応じて損益位置を調整します.
マシン・ラーニングなどの手法でパラメータをテストし,最適化することで,現実市場に近いものになります.
入場論理を最適化して,VOLUMEまたは波動率指標を補助条件として設定し,トラップを回避できます.
トレンド追跡戦略や機械学習と組み合わせて,混合戦略を形成し,安定性を向上させることも考えられます.
この戦略は,追跡型突破戦略として,核心構想は,長線トレンドを前提として,突破を信号として順調に操作し,単一取引のリスクを制御するストップ・ストップを設定することです.この戦略には一定の利点がありますが,いくつかの最適化可能なスペースもあります.全体的に,パラメータ設定,入場タイミングの選択などの問題をうまく処理でき,他の技術で補強されれば,この戦略は実用的なトレンド追跡戦略になることができます.しかし,投資家は,いかなる取引システムも市場リスクを完全に回避することはできませんが,リスク管理をよくする必要があります.
/*backtest
start: 2023-09-16 00:00:00
end: 2023-10-16 00:00:00
period: 4h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
// Welcome to my second script on Tradingview with Pinescript
// First of, I'm sorry for the amount of comments on this script, this script was a challenge for me, fun one for sure, but I wanted to thoroughly go through every step before making the script public
// Glad I did so because I fixed some weird things and I ended up forgetting to add the EMA into the equation so our entry signals were a mess
// This one was a lot tougher to complete compared to my MACD crossover trend strategy but I learned a ton from it, which is always good and fun
// Also I'll explain the strategy and how I got there through some creative coding(I'm saying creative because I had to figure this stuff out by myself as I couldn't find any reference codes)
// First things first. This is a Donchian Channel Breakout strategy which follows the following rules
// If the price hits the upperband of the Donchian Channel + price is above EMA and the price previously hit the lowerband of the Donchian Channel it's a buy signal
// If the price hits the lowerband of the Donchian Channel + price is below EMA and the price prevbiously hit the upper band of the Donchian Channel it's a sell signal
// Stop losses are set at the lower or upper band with a 0.5% deviation because we are acting as if those two bands are the resistance in this case
// Last but not least(yes, this gave BY FAR the most trouble to code), the profit target is set with a 1.5 risk to reward ratio
// If you have any suggestions to make my code more efficient, I'll be happy to hear so from you
// So without further ado, let's walk through the code
// The first line is basically standard because it makes backtesting so much more easy, commission value is based on Binance futures fees when you're using BNB to pay those fees in the futures market
// strategy(title="Donchian Channels", shorttitle="DC", overlay=true, default_qty_type = strategy.cash, default_qty_value = 150, initial_capital = 1000, currency = currency.USD, commission_type = "percent", commission_value = 0.036)
// The built-in Donchian Channels + an added EMA input which I grouped with the historical bars from the Donchian Channels
length = input(20, minval=1, group = "Indicators")
lower = lowest(length)
upper = highest(length)
basis = avg(upper, lower)
emaInput = input(title = "EMA Input", type = input.integer, defval = 200, minval = 10, maxval = 400, step = 1, group = "Indicators")
// I've made three new inputs, for risk/reward ratio and for the standard pullback deviation. My advise is to not use the pullback inputs as I'm not 100% sure if they work as intended or not
riskreward = input(title = "Risk/Reward Ratio", type = input.float, defval = 1.50, minval = 0.01, maxval = 100, step = 0.01, group = "Risk/Reward")
pullbackLong = input(title = "Distance from Long pullback %", type = input.float, defval = 0.995, minval = 0.001, maxval = 2, step = 0.001, group = "Risk/Reward")
pullbackShort = input(title = "Distance from Short pullback %", type = input.float, defval = 1.005, minval = 0.001, maxval = 2, step = 0.001, group = "Risk/Reward")
// Input backtest range, you can adjust these in the input options, just standard stuff
fromMonth = input(defval = 1, title = "From Month", type = input.integer, minval = 1, maxval = 12, group = "Backtest Date Range")
fromDay = input(defval = 1, title = "From Day", type = input.integer, minval = 1, maxval = 31, group = "Backtest Date Range")
fromYear = input(defval = 2000, title = "From Year", type = input.integer, minval = 1970, group = "Backtest Date Range")
thruMonth = input(defval = 1, title = "Thru Month", type = input.integer, minval = 1, maxval = 12, group = "Backtest Date Range")
thruDay = input(defval = 1, title = "Thru Day", type = input.integer, minval = 1, maxval = 31, group = "Backtest Date Range")
thruYear = input(defval = 2099, title = "Thru Year", type = input.integer, minval = 1970, group = "Backtest Date Range")
// Date variable also standard stuff
inDataRange = (time >= timestamp(syminfo.timezone, fromYear, fromMonth, fromDay, 0, 0)) and (time < timestamp(syminfo.timezone, thruYear, thruMonth, thruDay, 0, 0))
// I had to makes these variables because the system has to remember whether the previous 'breakout' was a high or a low
// Also, because I based my stoploss on the upper/lower band of the indicator I had to find a way to change this value just once without losing the value, that was added, on the next bar
var previousishigh = false
var previousislow = false
var longprofit = 0.0
var shortprofit = 0.0
var stoplossLong = 0.0
var stoplossShort = 0.0
// These are used as our entry variables
emaCheck = ema(close, emaInput)
longcond = high >= upper and close > emaCheck
shortcond = low <= lower and close < emaCheck
// With these two if statements I'm changing the boolean variable above to true, we need this to decide out entry position
if high >= upper
previousishigh := true
if low <= lower
previousislow := true
// Made a last minute change on this part. To clean up our entry signals we don't want our breakouts, while IN a position, to change. This way we do not instantly open a new position, almost always in the opposite direction, upon exiting one
if strategy.position_size > 0 or strategy.position_size < 0
previousishigh := false
previousislow := false
// Strategy inputs
// Long - previous 'breakout' has to be a low, the current price has to be a new high and above the EMA, we're not allowed to be in a position and ofcourse it has to be within our given data for backtesting purposes
if previousislow == true and longcond and strategy.position_size == 0 and inDataRange
strategy.entry("Long Entry", strategy.long, comment = "Entry Long")
stoplossLong := lower * pullbackLong
longprofit := ((((1 - stoplossLong / close) * riskreward) + 1) * close)
strategy.exit("Long Exit", "Long Entry", limit = longprofit, stop = stoplossLong, comment = "Long Exit")
// Short - Previous 'breakout' has to be a high, current price has to be a new low and lowe than the 200EMA, we're not allowed to trade when we're in a position and it has to be within our given data for backtesting purposes
if previousishigh == true and shortcond and strategy.position_size == 0 and inDataRange
strategy.entry("Short Entry", strategy.short, comment = "Entry Short")
stoplossShort := upper * pullbackShort
shortprofit := (close - ((((1 - close / stoplossShort) * riskreward) * close)))
strategy.exit("Short Exit", "Short Entry", limit = shortprofit, stop = stoplossShort, comment = "Short Exit")
// This plots the Donchian Channels on the chart which is just using the built-in Donchian Channels
plot(basis, "Basis", color=color.blue)
u = plot(upper, "Upper", color=color.green)
l = plot(lower, "Lower", color=color.red)
fill(u, l, color=#0094FF, transp=95, title="Background")
// These plots are to show if the variables are working as intended, it's a mess I know but I didn't have any better ideas, they work well enough for me
// plot(previousislow ? close * 0.95 : na, color=color.red, linewidth=2, style=plot.style_linebr)
// plot(previousishigh ? close * 1.05 : na, color=color.green, style=plot.style_linebr)
// plot(longprofit, color=color.purple)
// plot(shortprofit, color=color.silver)
// plot(stoplossLong)
// plot(stoplossShort)
// plot(strategy.position_size)