
この戦略は,動態指標に基づく突破取引戦略である.これは,市場傾向と波動率を判断するために,平均線,ATR,RSIなどの複数の指標を使用し,厳格なストップ・ストップ・損失設定と組み合わせて取引を行う.この戦略は,価格が上昇線を突破するか,または平均線を下回るか判断し,ATRの範囲を足して取引シグナルを生成する.
この戦略は,主に以下のポイントに基づいています.
EMA平均線を使用して価格のトレンド方向を判断する。価格の上部に平均線を穿戴して看板信号,下部に看板信号する。
ATR指標は市場の変動率を判断する.ATRは,止損範囲として係数で掛けられる.これは,単一の損失を効果的に制御することができる.
RSI指数は,超買い超売り判断する。ATRストップ価格と均線判断の突破取引は,RSIが超買いまたは超売りしない場合に触発されなければならない。これは,偽突破を避ける。
前期の高点または低点をストップオフのベースとして使用する. ストップオフの価格を追跡することで,より多くの利益をロックすることができます.
厳格なストップ・ストップ・ルール. ATRのストップ・ストップは,波動率指数と組み合わせてリスクを制御し,ストップ・ストップの設定は,利益をロックすることができる.
入るシグナルは,価格が平均線を突破しATRのストップ範囲である.もし看板のシグナルなら,価格はその高点を突破する必要がある.もし下落のシグナルなら,価格はその低点を破らなければならない.
この戦略の利点は以下の通りです.
多指標判断により,偽突破を回避し,信号の正確性を向上させる.
ATRの止損範囲設定は,損失を合理的なレベルに抑えることができます.
ダイナミック・トラッキング・ストップで最大限の利益を得られる
厳格なストップ・ストップ・ロスのルールがリスク管理に役立っています
指数やパラメータの最適化空間は広く,異なる市場に応じて調整できます.
この戦略には以下のリスクもあります.
収益能力は市場の変動率に関連している.市場の傾向が不明または周期が長い場合,収益の余地が制限されている.
ストップ価格の揺れの後,再び突破が発生する可能性がある.この場合,タイムリーに倉庫を建設することができない傾向を追跡する.適切なストップ価格を緩和することができます.
chasing。
この戦略は以下の点で最適化できます.
平均線参数,ATR参数など,異なる品種と周期に応じて調整する.
MACD,KDJなどの判断が導入される.
ATR値に応じてリアルタイムでストップ・ローカーを調整できます. ストップ・ローカーを市場の変動に適したものにします.
複数の時間周期の組み合わせを確立する.異なる周期指標の組み合わせは,信号の質を向上させる.
マシン・ラーニング技術を使って指標とパラメータをテストし,最適化して,戦略パラメータを最適化します.
この戦略全体は,指標を用いて判断し,厳格にストップストップの突破取引戦略である.これは,均線,ATR,RSIなどの指標の優位性を有効に利用し,市場トレンドの方向を効果的に判断することができる.厳格なストップストップ設定と組み合わせて,トレンドの利潤を把握しながらリスクを制御することができる.パラメータとルールで最適化され,この戦略は,長期的に使用する価値のある量化取引戦略になる.
/*backtest
start: 2024-01-27 00:00:00
end: 2024-02-03 00:00:00
period: 5m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
strategy(title="UT Bot Strategy", overlay = true)
//CREDITS to HPotter for the orginal code. The guy trying to sell this as his own is a scammer lol.
// Inputs
emaLengh = input(2, title = "emaLengh")
a = input(3.0, title = "Key Vaule. 'This changes the sensitivity'")
c = input(10, title = "ATR Period")
h = input(false, title = "Signals from Heikin Ashi Candles")
emaLengh2 = input(9, title = "emaLengh show")
rate = input(0.00025, title = "波动率min")
rateMax = input(0.00045, title = "波动率max")
adx_length = input(20, title = "adx_length")
adx_min = input(14, title = "adx_min")
sma_length = input(11, title = "sma_length")
rsi_len = input(9, title = "rsi_len")
src = h ? security(heikinashi(syminfo.tickerid), timeframe.period, close, lookahead = false) : close
// boll 通道----------------------------------------------------
length = input(20, minval=1)
mult = input(2.0, minval=0.001, maxval=50, title="StdDev")
basis = sma(src, length)
dev = mult * stdev(src, length)
upper = basis + dev
lower = basis - dev
bbr = (src - lower)/(upper - lower)
// plot(upper, color = color.rgb(46, 59, 240), title="upper")
// plot(lower, color = color.rgb(46, 59, 240), title="lower")
// plot(bbr, "Bollinger Bands %B", color=#26A69A)
// band1 = hline(1, "Overbought", color=#787B86, linestyle=hline.style_dashed)
// hline(0.5, "Middle Band", color=color.new(#787B86, 50))
// band0 = hline(0, "Oversold", color=#787B86, linestyle=hline.style_dashed)
// fill(band1, band0, color=color.rgb(38, 166, 154, 90), title="Background")
// boll 通道----------------------------------------------------
// 线性回归 --------------------------------------------------------------
zlsma_length = input(title="zlsma-Length", type=input.integer, defval=50)
zlsma_offset = input(title="zlsma-Offset", type=input.integer, defval=0)
lsma = linreg(src, zlsma_length, zlsma_offset)
lsma2 = linreg(lsma, zlsma_length, zlsma_offset)
eq= lsma-lsma2
zlsma = lsma+eq
// plot(zlsma , color = color.rgb(243, 243, 14), title="zlsma",linewidth=3)
// 线性回归 --------------------------------------------------------------
// --------------------------------
rsi = rsi(src, 6)
// xHH = sma(high, sma_length)
// xLL = sma(low, sma_length)
// movevalue = (xHH - xLL) / 2
// xHHM = xHH + movevalue
// xLLM = xLL - movevalue
// plot(xHHM, color = color.rgb(208, 120, 219), title="xHHM")
// plot(xLLM, color = color.rgb(208, 120, 219), title="xLLM")
xATR = atr(c)
nLoss = a * xATR
xATRTrailingStop = 0.0
xATRTrailingStop := iff(src > nz(xATRTrailingStop[1], 0) and src[1] > nz(xATRTrailingStop[1], 0), max(nz(xATRTrailingStop[1]), src - nLoss),
iff(src < nz(xATRTrailingStop[1], 0) and src[1] < nz(xATRTrailingStop[1], 0), min(nz(xATRTrailingStop[1]), src + nLoss),
iff(src > nz(xATRTrailingStop[1], 0), src - nLoss, src + nLoss)))
pos = 0
pos := iff(src[1] < nz(xATRTrailingStop[1], 0) and src > nz(xATRTrailingStop[1], 0), 1,
iff(src[1] > nz(xATRTrailingStop[1], 0) and src < nz(xATRTrailingStop[1], 0), -1, nz(pos[1], 0)))
xcolor = pos == -1 ? color.red: pos == 1 ? color.green : color.blue
ema = ema(src,emaLengh)
// sma = sma(src,emaLengh)
emaFast = ema(src,100)
emaSlow = ema(src,576)
emaShow = ema(src, emaLengh2)
// sma = sma(src, 8)
// [superTrend, dir] = supertrend(3, 200)
// 判断连续涨
[diplus, diminus, adx] = dmi(adx_length, adx_length)
above = crossover(ema, xATRTrailingStop)
below = crossover(xATRTrailingStop, ema)
// above = ema == xATRTrailingStop
// below = xATRTrailingStop== ema
// smaabove = crossover(src, sma)
// smabelow = crossover(sma, src)
// smaabove = src > sma
// smabelow = sma > src
close_rate (n)=>
abs(close[n]-open[n])/min(close[n],open[n])
rate_val = close_rate(0)
rate_val1 = close_rate(1)
buy = src > xATRTrailingStop and above and src > zlsma and adx >adx_min
// and src>emaShow
// and rate_val < rate_val1*2 and rate_val >=rate_val1
// and rate_val1<rateMax
// and close[1]>open[1]
sell = src < xATRTrailingStop and below and src < zlsma and adx >adx_min
// and src<emaShow
// and rate_val < rate_val1*2 and rate_val >=rate_val1
// and rate_val1<rateMax
// and open[1]>close[1] and rate_val1 > rate
// buy = src > xATRTrailingStop
// sell = src < xATRTrailingStop
// plot(rate_val1 , color = color.red, title="rate_val1")
barbuy = src > xATRTrailingStop
barsell = src < xATRTrailingStop
atrRsi = rsi(xATRTrailingStop,rsi_len)
// plot(emaFast , color = color.rgb(243, 206, 127), title="emaFast")
// plot(ema , color = color.rgb(47, 227, 27), title="ut-ema")
// plot(emaShow , color = color.rgb(47, 227, 27), title="ema9")
plot(xATRTrailingStop, color = color.rgb(233, 233, 232), title="xATRTrailingStop")
plotshape(buy, title = "Buy", text = 'Buy', style = shape.labelup, location = location.belowbar, color= color.green, textcolor = color.white, size = size.tiny)
plotshape(sell, title = "Sell", text = 'Sell', style = shape.labeldown, location = location.abovebar, color= color.red, textcolor = color.white, size = size.tiny)
// plotshape(buy, title = "Sell", text = 'Sell', style = shape.labelup, location = location.belowbar, color= color.green, textcolor = color.white, transp = 0, size = size.tiny)
// plotshape(sell, title = "buy", text = 'buy', style = shape.labeldown, location = location.abovebar, color= color.red, textcolor = color.white, transp = 0, size = size.tiny)
// barcolor(barbuy ? color.green : na)
// barcolor(barsell ? color.red : na)
// strategy.entry("short", false, when = buy)
// strategy.entry("long ", true, when = sell)
strategy.entry("long", true, when = buy and strategy.position_size == 0)
strategy.entry("short", false, when = sell and strategy.position_size == 0)
//动态止盈start------------------------------------------------------------------------------------------
profit = input( 0.015, title = "最小收益率")
close_profit_rate = input( 10, title = "平仓收益回撤比")
loss = input(0.004, title = "回撤率")
// 收益回撤比例
profit_price_scale =profit/close_profit_rate
var float profit_price = 0
// 计算小收益价格
get_profit_price(long) =>
float res = 0
if long == true
res := strategy.position_avg_price * (1+profit)
if long == false
res := strategy.position_avg_price * (1-profit)
res
// 止盈平仓条件
close_profit_position(long)=>
bool result=false
if long == true and profit_price>0 and profit_price*(1-profit_price_scale) >=close and get_profit_price(true) <= close
result:=true
if long == false and profit_price>0 and profit_price*(1+profit_price_scale) <=close and get_profit_price(false) >= close
result:=true
result
// 更新动态止盈价格
update_profit_price(price)=>
float res = price
// 无仓位时 动态止盈价格为0
if strategy.position_size == 0
res := 0
// long - 价格大于最小收益时保存
if strategy.position_size > 0 and get_profit_price(true) <= close and (res==0 or res < close)
res := close
// short - 价格小于最小收益时保存
if strategy.position_size < 0 and get_profit_price(true) >= close and (res==0 or res > close)
res := close
res
///////
profit_price := update_profit_price(profit_price)
long_close_profit_position = close_profit_position(true)
short_close_profit_position = close_profit_position(false)
// plot(profit_price, color = color.green, title="profit_price")
//动态止盈end------------------------------------------------------------------------------------------
strategy.close("long",comment="long-止盈",when = strategy.position_size > 0 and long_close_profit_position)
strategy.close("long",comment="long-止损",when = strategy.position_size >0 and strategy.position_avg_price * (1-loss) >= close)
strategy.close("short",comment="short-止盈",when = strategy.position_size <0 and short_close_profit_position)
strategy.close("short",comment="short-止损",when = strategy.position_size <0 and strategy.position_avg_price * (1+loss) <= close)