この戦略は"DayLight Hunter Quant Strategy with Two-way Position,Stochastic Signal and Random Stop loss/take profit"と名付けられている.主なアイデアは,ストカスティック指標で取引信号を生成し,SMAでシグナルをフィルタリングし,双方向のポジションオープンを実装し,ランダムなストップ損失を設定し,利益をロックするために利益ポイントを取ることです.
この戦略は,5日ストーカスティックインジケーター %Kと%Dラインクロスオーバーを使用して取引信号を生成する. %Kが下から%Dを越えると,買い信号が生成される. %Kが上から%Dを下に越えると,売り信号が生成される.偽信号をフィルタリングするために,50日間のSMAラインが使用される - 閉値がSMA低点以下である場合にのみ,買い信号は有効である.閉値がSMA高点以上である場合にのみ,売り信号は有効である.
戦略は,購入シグナルを受信すると,固定量でロングポジションを開く.販売シグナルを受信すると,一方向取引モードの場合,以前のロングポジションを閉鎖し,ショートポジションを開く.ヘッジモードの場合,単にヘッジのために追加のショートポジションを開く.各取引ユニットに対して,現在の価格の一定のパーセントに基づいてランダムなストップ損失と収益ポイントが設定される.これは利益をロックし,リスクを制御することを可能にします.
この戦略の最大の利点は,SMAフィルター付きストカスティック信号を使用して,両方向取引で比較的低い偽信号率を達成することです. これにより,より多くの利益の機会を提供します. さらに,ランダムストップ損失/利益を得るメカニズムは,利益を得た後に時間内に利益を得ることができ,すべての利益を返すのを避け,損失を減らすために大きな損失の場合の損失を削減することができます. 要するに,この戦略はより大きな利益率とよりよいリスク管理を持っています.
この戦略の主なリスクは,ストーカスティック指標の誤った信号が不必要な損失につながる可能性があること,不適切なランダムストップ損失/利益の取扱ポイントがあまりにも攻撃的になり,早期または遅刻退出を引き起こし,収益性に影響を与える可能性があること,ヘッジ取引で損失を時間内に削減できないことが損失の増幅につながる可能性があります.
リスクを減らすために,SMAフィルターのパラメータは,より多くの誤った信号をフィルタリングするために最適化することができる.また,トレンドに反して取引を避けるために市場傾向を決定するために他の指標を組み合わせることを検討する.最後に,合理的なストップ損失範囲を設定し,リスクを制御するためにヘッジユニットに独立したストップ損失ポイントを使用すべきである.
戦略は以下の側面で最適化できます.
誤った信号を減らすために最適なパラメータ組み合わせを見つけるためにストカスティックのパラメータを最適化します
ストカスティックがトレンドを決定するのに役立つ他の技術指標を最適化または追加します.例えばMACD,KDなど.
精度,勝利率などのメトリックを研究するために機械学習モデルを使用します. ストカスティック信号を異なるパラメータの下で,最適なパラメータ空間を見つけるために.
ランダムなストップ・ロース/テイク・プロフィートアルゴリズムを最適化して,よりインテリジェントでダイナミックなものにする.例えば,ストップ・ロースを移動したり,ポジションサイズを調整したりなどといった概念を組み込む.
ポジションサイズ化モジュールを追加し,パフォーマンスや市場制度などに基づいて動的ポジション調整を可能にします.
/*backtest start: 2023-12-31 00:00:00 end: 2024-01-07 00:00:00 period: 15m basePeriod: 5m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 var int slippage = 0 strategy("X48 - DayLight Hunter | Strategy | V.01.01", overlay=true, calc_on_order_fills = true, initial_capital = 50,default_qty_type = strategy.fixed, default_qty_value = 1, commission_type = strategy.commission.percent, commission_value = 0, currency = currency.USD, slippage = 0) var bool hedge_mode = false var int sto_buy = 0 var int sto_sell = 0 Trade_Mode = input.string(defval = "Hedge", title = "⚖️ Mode For Trade [Oneway / Hedge]", options = ["Oneway", "Hedge"], group = "Mode Trade", tooltip = "Oneway = Switching Position Type With Signal\nHedge Mode = Not Switching Position Type Unitl TP or SL") Risk_Mode = input.string(defval = "Low Risk", title = "⚖️ Risk Signal Mode [Low / Medium / High]", options = ["Low Risk", "Medium Risk", "High Risk"], group = "Mode Trade", tooltip = "[[Signal Form Stochastic]]\nLow Risk is >= 80 and <= 20\nMedium Risk is >= 70 and <= 30\nHigh Risk is >= 50 and <=50") if Trade_Mode == "Oneway" hedge_mode := false else hedge_mode := true if Risk_Mode == "Low Risk" sto_buy := 20 sto_sell := 80 else if Risk_Mode == "Medium Risk" sto_buy := 30 sto_sell := 70 else if Risk_Mode == "High Risk" sto_buy := 50 sto_sell := 50 periodK = input.int(15, title="%K Length", minval=1, group = "Stochastic Setting", inline = "Sto0") smoothK = input.int(3, title="%K Smoothing", minval=1, group = "Stochastic Setting", inline = "Sto0") periodD = input.int(3, title="%D Smoothing", minval=1, group = "Stochastic Setting", inline = "Sto0") SMA_Mode = input.bool(defval = true, title = "SMA High and Low Filter Mode", group = "SMA Filter Mode", tooltip = "Sell Signal With Open >= SMA High\nBuy Signal With Close <= SMA Low") SMA_High = input.int(defval = 50, title = "SMA High", group = "SMA Filter Mode", inline = "SMA1") SMA_Low = input.int(defval = 50, title = "SMA Low", group = "SMA Filter Mode", inline = "SMA1") k = ta.sma(ta.stoch(close, high, low, periodK), smoothK) d = ta.sma(k, periodD) high_line = ta.sma(high, SMA_High) low_line = ta.sma(low, SMA_Low) plot(SMA_Mode ? high_line : na, "H-Line", color = color.yellow, linewidth = 2) plot(SMA_Mode ? low_line : na, "L-Line", color = color.blue, linewidth = 2) entrybuyprice = strategy.position_avg_price var bool longcondition = na var bool shortcondition = na if SMA_Mode == true longcondition := ta.crossover(k,d) and d <= sto_buy and close < low_line and open < low_line// or ta.crossover(k, 20)// and close <= low_line shortcondition := ta.crossunder(k,d) and d >= sto_sell and close > high_line and open > high_line// or ta.crossunder(k, 80)// and close >= high_line else longcondition := ta.crossover(k,d) and d <= sto_buy shortcondition := ta.crossunder(k,d) and d >= sto_sell //longcondition_double = ta.crossover(d,20) and close < low_line// and strategy.position_size > 0 //shortcondition_double = ta.crossunder(d,80) and close > high_line// and strategy.position_size < 0 //=============== TAKE PROFIT and STOP LOSS by % ================= tpsl(percent) => strategy.position_avg_price * percent / 100 / syminfo.mintick GR4 = "=====🆘🆘🆘 TAKE PROFIT & STOP LOSS BY [%] 🆘🆘🆘=====" mode= input.bool(title="🆘 Take Profit & Stop Loss By Percent (%)", defval=true, group=GR4, tooltip = "Take Profit & Stop Loss by % Change\n0 = Disable") tp_l = tpsl(input.float(0, title='🆘 TP [LONG] % >> [Oneway Only]', group=GR4, tooltip = "0 = Disable")) tp_s = tpsl(input.float(0, title='🆘 TP [SHORT] % >> [Oneway Only]', group=GR4, tooltip = "0 = Disable")) sl = tpsl(input.float(0, title='🆘 Stop Loss %', group=GR4, tooltip = "0 = Disable")) tp_pnl = input.float(defval = 1, title = "🆘 TP by PNL $ eg. (0.1 = 0.1$)", group = GR4) spread_size = input.float(defval = 0.350, title = "🆘 Spread Point Size(Eg. 35 Point or 350 Point From Your Broker Digits)", tooltip = "Spread Point Form Your Broker \nEg. 1920.124 - 1920.135 or 1920.12 - 1920.13\nPlease Check From Your Broker", group = GR4) GR5 = "===💮💮💮 Hedge Mode 💮💮💮===" //hedge_mode = input.bool(defval = true, title = "⚖️ Hedge Mode", group = GR5) hedge_point = input.int(defval = 500, title = "💯 Hedge Point Range", group = GR5, tooltip = "After Entry Last Position And Current Price More Than Point Range Are Open New Hedge Position") hedge_gale = input.float(defval = 2.0, title = "✳️ Martingale For Hedge Multiply [default = 2]", tooltip = "Martingale For Multiply Hedge Order", group = GR5) hedge_point_size = hedge_point/100 calcStopLossPrice(OffsetPts) => if strategy.position_size > 0 strategy.position_avg_price - OffsetPts * syminfo.mintick else if strategy.position_size < 0 strategy.position_avg_price + OffsetPts * syminfo.mintick else na calcStopLossL_AlertPrice(OffsetPts) => strategy.position_avg_price - OffsetPts * syminfo.mintick calcStopLossS_AlertPrice(OffsetPts) => strategy.position_avg_price + OffsetPts * syminfo.mintick calcTakeProfitPrice(OffsetPts) => if strategy.position_size > 0 strategy.position_avg_price + OffsetPts * syminfo.mintick else if strategy.position_size < 0 strategy.position_avg_price - OffsetPts * syminfo.mintick else na calcTakeProfitL_AlertPrice(OffsetPts) => strategy.position_avg_price + OffsetPts * syminfo.mintick calcTakeProfitS_AlertPrice(OffsetPts) => strategy.position_avg_price - OffsetPts * syminfo.mintick var stoploss = 0. var stoploss_l = 0. var stoploss_s = 0. var takeprofit = 0. var takeprofit_l = 0. var takeprofit_s = 0. var takeprofit_ll = 0. var takeprofit_ss = 0. if mode == true if (strategy.position_size > 0) if sl > 0 stoploss := calcStopLossPrice(sl) stoploss_l := stoploss else if sl <= 0 stoploss := na if tp_l > 0 takeprofit := tp_l takeprofit_ll := close + ((close/100)*tp_l) //takeprofit_s := na else if tp_l <= 0 takeprofit := na if (strategy.position_size < 0) if sl > 0 stoploss := calcStopLossPrice(sl) stoploss_s := stoploss else if sl <= 0 stoploss := na if tp_s > 0 takeprofit := tp_s takeprofit_ss := close - ((close/100)*tp_s) //takeprofit_l := na else if tp_s <= 0 takeprofit := na else if strategy.position_size == 0 stoploss := na takeprofit := na //takeprofit_l := calcTakeProfitL_AlertPrice(tp_l) //takeprofit_s := calcTakeProfitS_AlertPrice(tp_s) //stoploss_l := calcStopLossL_AlertPrice(sl) //stoploss_s := calcStopLossS_AlertPrice(sl) //////////// INPUT BACKTEST RANGE //////////////////////////////////////////////////// var string BTR1 = '════════⌚⌚ INPUT BACKTEST TIME RANGE ⌚⌚════════' i_startTime = input(defval = timestamp("01 Jan 1945 00:00 +0000"), title = "Start", inline="timestart", group=BTR1, tooltip = 'Start Backtest YYYY/MM/DD') i_endTime = input(defval = timestamp("01 Jan 2074 23:59 +0000"), title = "End", inline="timeend", group=BTR1, tooltip = 'End Backtest YYYY/MM/DD') //////////////// Strategy Alert For X4815162342 BOT ////////////////////// Text_Alert_Future = '{{strategy.order.alert_message}}' copy_Fu = input( defval= Text_Alert_Future , title="Alert Message for BOT", inline = '00' ,group = '═ Bot Setting ═ \n >> If You Dont Use Bot Just Pass It' ,tooltip = 'Alert For X48-BOT > Copy and Paste To Alert Function') TimeFrame_input = input(defval= 'Input Your TimeFrame [1m, 15m, 1h, 4h, 1d ,1w]' , title="TimeFrame Text Alert", inline = '00' ,group = '═ Bot Setting ═ \n >> If You Dont Use Bot Just Pass It') string Alert_EntryL = '🪙 Asset : {{ticker}} \n💱 Status : {{strategy.market_position}}\n🕛 TimeFrame : '+str.tostring(TimeFrame_input)+'\n💸 Price : {{strategy.order.price}} $\n✅ TP : '+str.tostring(takeprofit_ll)+' $\n❌ SL : '+str.tostring(stoploss_l)+' $\n⏰ Time : {{timenow}}' string Alert_EntryS = '🪙 Asset : {{ticker}} \n💱 Status : {{strategy.market_position}}\n🕛 TimeFrame : '+str.tostring(TimeFrame_input)+'\n💸 Price : {{strategy.order.price}} $\n✅ TP : '+str.tostring(takeprofit_ss)+' $\n❌ SL : '+str.tostring(stoploss_s)+' $\n⏰ Time : {{timenow}}' string Alert_TPSL = '🪙 Asset : {{ticker}}\n🕛 TimeFrame : '+str.tostring(TimeFrame_input)+'\n💹 {{strategy.order.comment}}\n💸 Price : {{strategy.order.price}} $\n⏰ Time : {{timenow}}' if true if longcondition strategy.entry("Long", strategy.long, comment = "🌙", alert_message = Alert_EntryL) //if longcondition_double // //strategy.cancel_all() // strategy.entry("Long2", strategy.long, comment = "🌙🌙") // //strategy.exit("Exit",'Long', qty_percent = 100 , profit = takeprofit, stop = stoploss, comment_profit = "TP💚L", comment_loss = "SL💚L") if shortcondition strategy.entry("Short", strategy.short, comment = "👻", alert_message = Alert_EntryS) //strategy.exit("Exit",'Short', qty_percent = 100, profit = takeprofit, stop = stoploss, comment_profit = "TP❤️️S", comment_loss = "SL❤️️S") //if shortcondition_double // //strategy.cancel_all() // strategy.entry("Short2", strategy.short, comment = "👻👻") if strategy.position_size > 0 and strategy.opentrades >= 1 and hedge_mode == true entrypricel = strategy.opentrades.entry_price(strategy.opentrades - 1) callpointsize = entrypricel - close lastsize = strategy.position_size if callpointsize >= hedge_point_size and longcondition strategy.order("Long2", strategy.long, qty = lastsize * hedge_gale, comment = "🌙⌛", alert_message = Alert_EntryL) else if strategy.position_size < 0 and strategy.opentrades >= 1 and hedge_mode == true entryprices = strategy.opentrades.entry_price(strategy.opentrades - 1) callpointsize = (entryprices - close)* -1 lastsize = (strategy.position_size) * -1 if callpointsize >= hedge_point_size and shortcondition strategy.order("Short2", strategy.short, qty = lastsize * hedge_gale, comment = "👻⌛", alert_message = Alert_EntryS) last_price_l = (strategy.opentrades.entry_price(strategy.opentrades - 1) + (strategy.opentrades.entry_price(strategy.opentrades - 1)/100) * takeprofit) + spread_size last_price_s = (strategy.opentrades.entry_price(strategy.opentrades - 1) - (strategy.opentrades.entry_price(strategy.opentrades - 1)/100) * takeprofit) - spread_size current_price = request.security(syminfo.tickerid, "1", close) current_pricel = request.security(syminfo.tickerid, "1", close) + spread_size current_prices = request.security(syminfo.tickerid, "1", close) - spread_size //if mode == true if strategy.position_size > 0 and strategy.openprofit >= tp_pnl and mode == true and hedge_mode == true lastsize = strategy.position_size lastprofitorder = strategy.openprofit //if lastprofitorder >= 0.07 //strategy.close('Long', qty = lastsize, comment = "TP💚L", alert_message = Alert_TPSL, immediately = true) strategy.cancel_all() strategy.close_all(comment = "TP💚PNL", alert_message = Alert_TPSL, immediately = true) //strategy.close_all(comment = "TP💚LH", alert_message = Alert_TPSL) //strategy.exit("Exit",'Long2', qty_percent = 100, profit = last_price_l, stop = stoploss, comment_profit = "TP💚LH", comment_loss = "SL💚LH", alert_message = Alert_TPSL) //strategy.exit("Exit",'Long', qty_percent = 100, profit = last_price_l, stop = stoploss, comment_profit = "TP💚L", comment_loss = "SL💚L", alert_message = Alert_TPSL) else if strategy.position_size > 0 and strategy.openprofit < tp_pnl and mode == true and hedge_mode == true strategy.exit("Exit",'Long', qty_percent = 100, stop = stoploss, comment_loss = "SL💚%L", alert_message = Alert_TPSL) if strategy.position_size > 0 and mode == true and hedge_mode == false //strategy.close_all(comment = "TP💚LH", alert_message = Alert_TPSL, immediately = true) strategy.exit("Exit",'Long', qty_percent = 100, profit = takeprofit, stop = stoploss, comment_profit = "TP💚%L", comment_loss = "SL💚%L", alert_message = Alert_TPSL) //strategy.exit("Exit",'Long', qty_percent = 100, profit = takeprofit, stop = stoploss, comment_profit = "TP💚LL", comment_loss = "SL💚L", alert_message = Alert_TPSL) //else if strategy.position_size > 0 and strategy.opentrades > 1 // lastsize = strategy.position_size // lastprofitorder = strategy.openprofit // if lastprofitorder >= 0.07 // strategy.close_all(comment = "TP💚LL", alert_message = Alert_TPSL) if strategy.position_size < 0 and strategy.openprofit >= tp_pnl and mode == true and hedge_mode == true lastsize = (strategy.position_size) * -1 lastprofitorder = strategy.openprofit //if lastprofitorder >= 0.07 //strategy.close('Short', qty = lastsize, comment = "TP❤️️S", alert_message = Alert_TPSL, immediately = true) strategy.cancel_all() strategy.close_all(comment = "TP❤️️PNL", alert_message = Alert_TPSL, immediately = true) //strategy.close_all(comment = "TP❤️️SH", alert_message = Alert_TPSL) //strategy.exit("Exit",'Short2', qty_percent = 100, profit = last_price_s, stop = stoploss, comment_profit = "TP❤️️SH", comment_loss = "SL❤️️SH", alert_message = Alert_TPSL) //strategy.exit("Exit",'Short', qty_percent = 100, profit = last_price_s, stop = stoploss, comment_profit = "TP❤️️S", comment_loss = "SL❤️️S", alert_message = Alert_TPSL) else if strategy.position_size < 0 and strategy.openprofit < tp_pnl and mode == true and hedge_mode == true strategy.exit("Exit",'Short', qty_percent = 100, stop = stoploss, comment_loss = "SL❤️️%S", alert_message = Alert_TPSL) if strategy.position_size < 0 and mode == true and hedge_mode == false //strategy.close_all(comment = "TP❤️️SH", alert_message = Alert_TPSL, immediately = true) strategy.exit("Exit",'Short', qty_percent = 100, profit = takeprofit, stop = stoploss, comment_profit = "TP❤️️%S", comment_loss = "SL❤️️%S", alert_message = Alert_TPSL) //strategy.exit("Exit",'Short', qty_percent = 100, profit = takeprofit, stop = stoploss, comment_profit = "TP❤️️S", comment_loss = "SL❤️️S", alert_message = Alert_TPSL) //else if strategy.position_size < 0 and strategy.opentrades > 1 // lastsize = (strategy.position_size) * -1 // lastprofitorder = strategy.openprofit // if lastprofitorder >= 0.07 // strategy.close_all(comment = "TP❤️️SS", alert_message = Alert_TPSL) //===================== เรียกใช้ library ========================= import X4815162342/X48_LibaryStrategyStatus/2 as fuLi //แสดงผล Backtest show_Net = input.bool(true,'Monitor Profit&Loss', inline = 'Lnet', group = '= PNL MONITOR SETTING =') position_ = input.string('bottom_center','Position', options = ['top_right','middle_right','bottom_right','top_center','middle_center','bottom_center','middle_left','bottom_left'] , inline = 'Lnet') size_i = input.string('auto','size', options = ['auto','tiny','small','normal'] , inline = 'Lnet') color_Net = input.color(color.blue,"" , inline = 'Lnet') // fuLi.NetProfit_Show(show_Net , position_ , size_i, color_Net )