Strategi Pembalikan Julat Hibernate


Tarikh penciptaan: 2023-10-30 10:54:00 Akhirnya diubah suai: 2023-10-30 10:54:00
Salin: 1 Bilangan klik: 569
1
fokus pada
1617
Pengikut

Strategi Pembalikan Julat Hibernate

Gambaran keseluruhan

Strategi pembalikan dormansi menggunakan tempoh penurunan kadar turun naik harga sebagai isyarat untuk membuat simpanan dan mengambil kedudukan imbang apabila kadar turun naik harga naik semula. Ia menangkap trend harga yang akan meletus dengan mengenal pasti keadaan di mana harga dibatasi dalam rentang dormansi yang sempit yang bergolak.

Prinsip Strategi

Strategi ini mula-mula mengenal pasti ruang tidur, iaitu harga yang terhad dalam julat harga hari perdagangan sebelumnya. Ini menunjukkan bahawa kadar turun naik semasa telah menurun beberapa hari sebelum ini. Kami menilai sama ada kami memenuhi syarat ruang tidur dengan membandingkan harga tertinggi hari perdagangan semasa dengan harga tertinggi n hari yang lalu (biasanya 4 hari) dan membandingkan harga terendah hari perdagangan semasa dengan harga terendah n hari yang lalu.

Sebaik sahaja jangkauan tidur telah disahkan, strategi ini akan membuka dua pegangan pada masa yang sama: satu pegangan beli terletak berhampiran dengan ketinggian jangkauan, satu pegangan jual terletak berhampiran dengan ketinggian jangkauan. Kemudian menunggu harga untuk memecahkan jangkauan tidur untuk terus berjalan ke atas atau ke bawah. Jika harga pecah ke atas, pesanan beli akan dicetuskan untuk membina kedudukan berbilang kepala; jika pecah ke bawah, pesanan jual akan dicetuskan untuk membina kedudukan kosong.

Selepas kedudukan ditubuhkan, strategi akan menetapkan perintah hentikan dan hentikan. Perintah hentikan boleh mengehadkan risiko penurunan, dan perintah hentikan digunakan untuk posisi kosong selepas keuntungan. Perintah hentikan adalah satu jarak peratusan dari harga masuk, yang ditetapkan oleh parameter pengurusan risiko. Perintah hentikan adalah jarak dari harga masuk untuk ruang tidur yang besar, kerana kami menjangkakan pergerakan harga akan sama dengan kadar pergerakan sebelumnya.

Akhirnya, strategi ini juga mengandungi modul pengurusan wang. Mengubah jumlah wang yang diperdagangkan dengan pesanan melalui kaedah perkalian tetap, meningkatkan penggunaan wang apabila ia menguntungkan, dan mengurangkan risiko apabila ia rugi.

Analisis kelebihan

Strategi ini mempunyai beberapa kelebihan:

  1. Menggunakan masa turun naik turun naik sebagai isyarat untuk meletakkan, untuk menangkap peluang sebelum trend harga berlaku.

  2. Pada masa yang sama, anda boleh menetapkan pesanan perdagangan dua hala yang banyak untuk menangkap trend naik atau turun.

  3. Menggunakan strategi Hentikan Kerosakan dan Hentikan Kerosakan, risiko perdagangan tunggal dapat dikawal dengan berkesan.

  4. Menggunakan kaedah pengurusan dana berganda tetap dapat meningkatkan kecekapan penggunaan dana.

  5. Strategi logiknya mudah, jelas dan mudah dilaksanakan.

Analisis risiko

Strategi ini juga mempunyai risiko yang perlu diperhatikan:

  1. Risiko kesalahan penghakiman ke arah pecahnya rantaian tidur. Harga mungkin tidak dapat melihat penembusan ke atas atau ke bawah, yang menyebabkan kesalahan arah masuk.

  2. Risiko tidak dapat meneruskan operasi arah selepas penembusan. Penembusan hanyalah pembalikan jangka pendek.

  3. Risiko penembusan stop loss. Dalam keadaan yang tidak menentu, ia mungkin melangkaui garis stop loss.

  4. Risiko peningkatan kerugian dengan penambahan pegangan dengan perkalian tetap. Anda boleh menurunkan nilai perkalian tetap untuk mengurangkan risiko.

  5. Penetapan parameter yang tidak betul boleh menyebabkan strategi tidak berkesan.

Arah pengoptimuman

Strategi ini juga boleh dioptimumkan dalam beberapa aspek:

  1. Menambah penembusan keluar dari isyarat penapis menunggu, mengelakkan penembusan salah.

  2. Meningkatkan strategi penangguhan kerugian, seperti penangguhan bergerak, penangguhan hantaran, dan sebagainya.

  3. Meningkatkan trend penilaian dan mengelakkan pembalikan.

  4. Mengoptimumkan nilai perkalian tetap, menyeimbangkan nisbah keuntungan dan kerugian.

  5. Menggabungkan beberapa analisis kitaran masa untuk meningkatkan peluang keuntungan.

  6. Mengoptimumkan parameter secara automatik menggunakan kaedah pembelajaran mesin.

ringkaskan

Strategi pembalikan trend dalam ruang tertidur mempunyai pemikiran keseluruhan yang jelas dan mempunyai potensi keuntungan tertentu. Strategi ini dapat meningkatkan kestabilan strategi melalui pengoptimuman parameter, pengurusan risiko, penapisan isyarat dan sebagainya. Tetapi strategi pembalikan trend mempunyai risiko tertentu, perlu digunakan dengan berhati-hati dan menyesuaikan skala kedudukan dengan betul.

Kod sumber strategi
/*backtest
start: 2023-09-29 00:00:00
end: 2023-10-29 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © gsanson66


//This code is based on the Narrow Range strategy
//Interactive Broker fees are applied on this strategy
//@version=5
strategy("NARROW RANGE BACKTESTING", shorttitle="NR BACKTESTING", overlay=true, initial_capital=1000, default_qty_type=strategy.fixed, commission_type=strategy.commission.percent, commission_value=0.18)


//--------------------------------FUNCTIONS------------------------------------//

//@function to print label
debugLabel(txt, color) =>
    label.new(bar_index, high, text = txt, color=color, style = label.style_label_lower_right, textcolor = color.black, size = size.small)

//@function which looks if the close date of the current bar falls inside the date range
inBacktestPeriod(start, end) => (time >= start) and (time <= end)


//--------------------------------USER INPUTS------------------------------------//

//Narrow Range Length 
nrLength = input.int(4, minval=2, title="Narrow Range Length", group="Strategy parameters")
//Risk Management
stopLossInput = input.float(0.5, title="Stop Loss (in percentage of reference range)", group="Strategy parameters")
//Money Management
fixedRatio = input.int(defval=400, minval=1, title="Fixed Ratio Value ($)", group="Money Management")
increasingOrderAmount = input.int(defval=200, minval=1, title="Increasing Order Amount ($)", group="Money Management")
//Backtesting period
startDate = input(title="Start Date", defval=timestamp("1 Janv 2020 00:00:00"), group="Backtesting Period")
endDate = input(title="End Date", defval=timestamp("1 July 2024 00:00:00"), group="Backtesting Period")


//--------------------------------VARIABLES INITIALISATION--------------------------//
strategy.initial_capital = 50000
bool nr = na
var bool long = na
var bool short = na
var float stopPriceLong = na
var float stopLossLong = na
var float takeProfitLong = na
var float stopPriceShort = na
var float stopLossShort = na
var float takeProfitShort = na
var float takeProfit = na
var float stopLoss = na
bool inRange = na
int closedtrades = strategy.closedtrades
equity = math.abs(strategy.equity - strategy.openprofit)
var float capital_ref = strategy.initial_capital
var float cashOrder = strategy.initial_capital * 0.95


//------------------------------CHECKING SOME CONDITIONS ON EACH SCRIPT EXECUTION-------------------------------//

//Checking if the date belong to the range
inRange := true

//Checking performances of the strategy
if equity > capital_ref + fixedRatio
    spread = (equity - capital_ref)/fixedRatio
    nb_level = int(spread)
    increasingOrder = nb_level * increasingOrderAmount
    cashOrder := cashOrder + increasingOrder
    capital_ref := capital_ref + nb_level*fixedRatio
if equity < capital_ref - fixedRatio
    spread = (capital_ref - equity)/fixedRatio
    nb_level = int(spread)
    decreasingOrder = nb_level * increasingOrderAmount
    cashOrder := cashOrder - decreasingOrder
    capital_ref := capital_ref - nb_level*fixedRatio

//We check if a trade has been closed to cancel all previous orders
if closedtrades > closedtrades[1]
    strategy.cancel("Long")
    strategy.cancel("Short")
    stopPriceLong := na
    stopPriceShort := na

//Checking if we close all trades in case where we exit the backtesting period
if strategy.position_size!=0 and not inRange
    debugLabel("END OF BACKTESTING PERIOD : we close the trade", color=color.rgb(116, 116, 116))
    strategy.close_all()
    long := na
    short := na
    stopPriceLong := na
    stopLossLong := na
    takeProfitLong := na
    stopPriceShort := na
    stopLossShort := na
    takeProfitShort := na
    takeProfit := na
    stopLoss := na

//----------------------------------FINDING NARROW RANGE DAY------------------------------------------//

// We find the Narrow Range Day
if low > low[nrLength] and high < high[nrLength]
    nr := true 


//------------------------------------STOP ORDERS--------------------------------------------//

// We handle plotting of stop orders and cancellation of other side order if one order is triggered
if strategy.position_size > 0 and not na(stopPriceLong) and not na(stopPriceShort)
    long := true
    strategy.cancel("Short")
    stopPriceLong := na
    stopPriceShort := na
    takeProfit := takeProfitLong
    stopLoss := stopLossLong
if strategy.position_size < 0 and not na(stopPriceLong) and not na(stopPriceShort)
    short := true
    strategy.cancel("Long") 
    stopPriceLong := na
    stopPriceShort := na
    takeProfit := takeProfitShort
    stopLoss := stopLossShort


//------------------------------------STOP LOSS & TAKE PROFIT--------------------------------//

// If an order is triggered we plot TP and SL
if not na(takeProfit) and not na(stopLoss) and long
    if high >= takeProfit and closedtrades == closedtrades[1] + 1
        takeProfit := na
        stopLoss := na
        long := na
    if low <= stopLoss and closedtrades == closedtrades[1] + 1
        takeProfit := na
        stopLoss := na
        long := na
if not na(takeProfit) and not na(stopLoss) and short
    if high >= stopLoss and closedtrades == closedtrades[1] + 1
        takeProfit := na
        stopLoss := na
        short := na
    if low <= takeProfit and closedtrades == closedtrades[1] + 1
        takeProfit := na
        stopLoss := na
        short := na


//-----------------------------LONG/SHORT CONDITION-------------------------//

// Conditions to create two stop orders (one for Long and one for Short) and SL & TP calculation
if nr and inRange and strategy.position_size == 0
    stopPriceLong := high[4]
    takeProfitLong := high[4] + (high[4] - low[4])
    stopLossLong := high[4] - (high[4] - low[4])*stopLossInput
    qtyLong = cashOrder/stopPriceLong
    strategy.entry("Long", strategy.long, qtyLong, stop=stopPriceLong)
    strategy.exit("Exit Long", "Long", limit=takeProfitLong ,stop=stopLossLong)
    stopPriceShort := low[4]
    takeProfitShort := low[4] - (high[4] - low[4])
    stopLossShort := low[4] + (high[4] - low[4])*stopLossInput
    qtyShort = cashOrder/stopPriceShort
    strategy.entry("Short", strategy.short, qtyShort, stop=stopPriceShort)
    strategy.exit("Exit Short", "Short", limit=takeProfitShort ,stop=stopLossShort)


//--------------------------PLOTTING ELEMENT----------------------------//

plotshape(nr, "NR", shape.arrowdown, location.abovebar, color.rgb(255, 132, 0), text= "NR4", size=size.huge)
plot(stopPriceLong, "Stop Order", color.blue, 3, plot.style_linebr)
plot(stopPriceShort, "Stop Order", color.blue, 3, plot.style_linebr)
plot(takeProfit, "Take Profit", color.green, 3, plot.style_linebr)
plot(stopLoss, "Stop Loss", color.red, 3, plot.style_linebr)