Strategi ini mengidentifikasi tren pasar berdasarkan titik terobosan harga dan menggunakan indikator adaptif untuk menentukan tren keseluruhan untuk menangkap peluang pembalikan harga jangka pendek.
Logika keseluruhan strategi ini jelas dan memiliki beberapa nilai praktis. Namun, risiko perdagangan masih harus dikendalikan untuk mencegah kerugian besar dalam kondisi pasar tertentu. Langkah selanjutnya termasuk mengoptimalkan beberapa dimensi seperti kerangka keseluruhan, parameter indikator, dan kontrol risiko untuk membuat parameter strategi dan sinyal perdagangan lebih dapat diandalkan.
/*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) //----------------------------------------------------------------------------------------------------------