Cette stratégie identifie les tendances du marché en fonction des points de rupture des prix et utilise des indicateurs adaptatifs pour déterminer la tendance globale afin de saisir les opportunités d'inversion des prix à court terme.
La logique générale de cette stratégie est claire et a une certaine valeur pratique. Cependant, les risques de trading doivent toujours être contrôlés pour éviter de grosses pertes dans certaines conditions de marché. Les prochaines étapes comprennent l'optimisation de plusieurs dimensions telles que le cadre global, les paramètres des indicateurs et le contrôle des risques pour rendre les paramètres de stratégie et les signaux de trading plus fiables.
/*backtest start: 2023-11-03 00:00:00 end: 2023-12-03 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // @version = 4 // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © TradingGroundhog // ||--- Cash & Date: cash_amout = 10000 pyramid_val = 1 cash_given_per_lot = cash_amout/pyramid_val startDate = input(title="Start Date",defval=13) startMonth = input(title="Start Month",defval=9) startYear = input(title="Start Year",defval=2021) afterStartDate = (time >= timestamp(syminfo.timezone,startYear, startMonth, startDate, 0, 0)) // ||------------------------------------------------------------------------------------------------------ // ||--- Strategy: strategy(title="TradingGroundhog - Strategy & Fractal V1 - Short term", overlay=true, max_bars_back = 4000, max_labels_count=500, commission_type=strategy.commission.percent, commission_value=0.00,default_qty_type=strategy.cash, default_qty_value= cash_given_per_lot, pyramiding=pyramid_val) // ||------------------------------------------------------------------------------------------------------ // ||--- Fractal Recognition: filterBW = input(true, title="filter Bill Williams Fractals:") filterFractals = input(true, title="Filter fractals using extreme method:") length = input(2, title="Extreme Window:") regulartopfractal = high[4] < high[3] and high[3] < high[2] and high[2] > high[1] and high[1] > high[0] regularbotfractal = low[4] > low[3] and low[3] > low[2] and low[2] < low[1] and low[1] < low[0] billwtopfractal = filterBW ? false : (high[4] < high[2] and high[3] < high[2] and high[2] > high[1] and high[2] > high[0] ? true : false) billwbotfractal = filterBW ? false : (low[4] > low[2] and low[3] > low[2] and low[2] < low[1] and low[2] < low[0] ? true : false) ftop = filterBW ? regulartopfractal : regulartopfractal or billwtopfractal fbot = filterBW ? regularbotfractal : regularbotfractal or billwbotfractal topf = ftop ? high[2] >= highest(high, length) ? true : false : false botf = fbot ? low[2] <= lowest(low, length) ? true : false : false filteredtopf = filterFractals ? topf : ftop filteredbotf = filterFractals ? botf : fbot // ||------------------------------------------------------------------------------------------------------ // ||--- V1 : Added Swing High/Low Option ShowSwingsHL = input(true) highswings = filteredtopf == false ? na : valuewhen(filteredtopf == true, high[2], 2) < valuewhen(filteredtopf == true, high[2], 1) and valuewhen(filteredtopf == true, high[2], 1) > valuewhen(filteredtopf == true, high[2], 0) lowswings = filteredbotf == false ? na : valuewhen(filteredbotf == true, low[2], 2) > valuewhen(filteredbotf == true, low[2], 1) and valuewhen(filteredbotf == true, low[2], 1) < valuewhen(filteredbotf == true, low[2], 0) //--------------------------------------------------------------------------------------------------------- // ||--- V2 : Plot Lines based on the fractals. showchannel = input(true) //--------------------------------------------------------------------------------------------------------- // ||--- ZigZag: showZigZag = input(true) //---------------------------------------------------------------------------------------------------------- // ||--- Fractal computation: istop = filteredtopf ? true : false isbot = filteredbotf ? true : false topcount = barssince(istop) botcount = barssince(isbot) vamp = input(title="VolumeMA", defval=2) vam = sma(volume, vamp) fractalup = 0.0 fractaldown = 0.0 up = high[3]>high[4] and high[4]>high[5] and high[2]<high[3] and high[1]<high[2] and volume[3]>vam[3] down = low[3]<low[4] and low[4]<low[5] and low[2]>low[3] and low[1]>low[2] and volume[3]>vam[3] fractalup := up ? high[3] : fractalup[1] fractaldown := down ? low[3] : fractaldown[1] //---------------------------------------------------------------------------------------------------------- // ||--- Fractal save: fractaldown_save = array.new_float(0) for i = 0 to 4000 if array.size(fractaldown_save) < 3 if array.size(fractaldown_save) == 0 array.push(fractaldown_save, fractaldown[i]) else if fractaldown[i] != array.get(fractaldown_save, array.size(fractaldown_save)-1) array.push(fractaldown_save, fractaldown[i]) if array.size(fractaldown_save) < 3 array.push(fractaldown_save, fractaldown) array.push(fractaldown_save, fractaldown) fractalup_save = array.new_float(0) for i = 0 to 4000 if array.size(fractalup_save) < 3 if array.size(fractalup_save) == 0 array.push(fractalup_save, fractalup[i]) else if fractalup[i] != array.get(fractalup_save, array.size(fractalup_save)-1) array.push(fractalup_save, fractalup[i]) if array.size(fractalup_save) < 3 array.push(fractalup_save, fractalup) array.push(fractalup_save, fractalup) Bottom_1 = array.get(fractaldown_save, 0) Bottom_2 = array.get(fractaldown_save, 1) Bottom_3 = array.get(fractaldown_save, 2) Top_1 = array.get(fractalup_save, 0) Top_2 = array.get(fractalup_save, 1) Top_3 = array.get(fractalup_save, 2) //---------------------------------------------------------------------------------------------------------- // ||--- Fractal Buy Sell Signal: bool Signal_Test = false bool Signal_Test_OUT_TEMP = false var Signal_Test_TEMP = false longLossPerc = input(title="Long Stop Loss (%)", minval=0.0, step=0.1, defval=0.01) * 0.01 if filteredbotf and open < Bottom_1 and (Bottom_1 - open) / Bottom_1 >= longLossPerc Signal_Test := true if filteredtopf and open > Top_1 Signal_Test_TEMP := true if filteredtopf and Signal_Test_TEMP Signal_Test_TEMP := false Signal_Test_OUT_TEMP := true //---------------------------------------------------------------------------------------------------------- // ||--- Plotting: //plotshape(filteredtopf, style=shape.triangledown, location=location.abovebar, color=color.red, text="•", offset=0) //plotshape(filteredbotf, style=shape.triangleup, location=location.belowbar, color=color.lime, text="•", offset=0) //plotshape(ShowSwingsHL ? highswings : na, style=shape.triangledown, location=location.abovebar, color=color.maroon, text="H", offset=0) //plotshape(ShowSwingsHL ? lowswings : na, style=shape.triangleup, location=location.belowbar, color=color.green, text="L", offset=0) plot(showchannel ? (filteredtopf ? high[2] : na) : na, color=color.black, offset=0) plot(showchannel ? (filteredbotf ? low[2] : na) : na, color=color.black, offset=0) plot(showchannel ? (highswings ? high[2] : na) : na, color=color.black, offset=-2) plot(showchannel ? (lowswings ? low[2] : na) : na, color=color.black, offset=-2) plotshape(Signal_Test, style=shape.flag, location=location.belowbar, color=color.yellow, offset=0) plotshape(Signal_Test_OUT_TEMP, style=shape.flag, location=location.abovebar, color=color.white, offset=0) //---------------------------------------------------------------------------------------------------------- // ||--- Buy And Sell: strategy.entry(id="Long", long=true, when = Signal_Test and afterStartDate) strategy.close_all(when = Signal_Test_OUT_TEMP and afterStartDate) //----------------------------------------------------------------------------------------------------------