Chiến lược này xác định xu hướng thị trường dựa trên các điểm đột phá giá và sử dụng các chỉ số thích nghi để xác định xu hướng tổng thể để nắm bắt các cơ hội đảo ngược giá ngắn hạn. Nó tạo ra tín hiệu mua / bán khi giá vượt ra khỏi kênh cơ sở. Chiến lược này phù hợp với giao dịch tiền điện tử biến động cao.
Các bước tiếp theo bao gồm tối ưu hóa nhiều chiều như khung tổng thể, tham số chỉ số và kiểm soát rủi ro để làm cho các tham số chiến lược và tín hiệu giao dịch đáng tin cậy hơn.
/*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) //----------------------------------------------------------------------------------------------------------