Strategi Penyaringan Analisis Koreksi Indeks


Tanggal Pembuatan: 2023-12-13 15:55:07 Akhirnya memodifikasi: 2023-12-13 15:55:07
menyalin: 0 Jumlah klik: 637
1
fokus pada
1621
Pengikut

Strategi Penyaringan Analisis Koreksi Indeks

Ringkasan

Strategi ini menggunakan kombinasi operasi modeling dan indeks moving average untuk mewujudkan filter tren yang kuat secara acak untuk menentukan arah pemegang posisi. Strategi ini pertama-tama menghitung apakah harga dibagi dengan sisa satu digit yang ditetapkan menjadi 0, dan jika ada sinyal perdagangan muncul. Sinyal ini akan menjadi kosong jika di bawah indeks moving average; jika di atas indeks moving average, lakukan lebih banyak.

Prinsip Strategi

  1. Setel nilai input harga a untuk harga close, yang dapat diubah; setel nilai divisi b untuk 4, yang dapat diubah.
  2. Hitung a dibagi dengan residu modulo dari b untuk menentukan apakah residu adalah 0.
  3. Setting the index to the moving average length MALen, with a default of 70 cycles, as an indicator to judge the mid- to long-term trend in prices.
  4. Ketika sisa modulo adalah 0, menghasilkan sinyal perdagangan evennumber, dan hubungan dengan EMA menentukan arah. Ketika harga melewati garis EMA di atas, menghasilkan sinyal BUY; Ketika harga melewati garis EMA di bawah, menghasilkan sinyal SELL.
  5. Trading entries mengikuti arah sinyal untuk melakukan over atau short position. Strategi dapat membatasi reverse positioning untuk mengontrol jumlah transaksi.
  6. Kondisi stop loss diatur berdasarkan tiga cara stop loss: stop loss tetap, stop loss ATR, dan stop loss dari harga berfluktuasi. Kondisi stop loss adalah kebalikan dari stop loss.
  7. Anda dapat memilih untuk menggunakan Stop Loss Mobile untuk mengunci lebih banyak keuntungan.

Analisis Keunggulan

  1. Operasi acak dari simulasi menghindari dampak dari pergerakan harga, dan kombinasi dengan penilaian tren dari moving averages, dapat secara efektif menyaring beberapa sinyal yang tidak valid.
  2. Indikator Moving Average digunakan sebagai indikator untuk menilai tren jangka menengah dan jangka panjang, dengan kombinasi sinyal jangka pendek dari operasi modular, untuk mencapai verifikasi multi-lapisan dan menghindari sinyal palsu.
  3. Pengaturan parameter yang dapat disesuaikan sangat fleksibel, dapat menyesuaikan parameter sesuai dengan pasar yang berbeda, mencari kombinasi parameter terbaik.
  4. Terintegrasi dengan berbagai metode stop loss untuk mengontrol risiko. Pada saat yang sama, pengaturan kondisi stop loss untuk mengunci keuntungan.
  5. Dukungan untuk membuka posisi secara langsung dan terbalik, dapat dengan mulus beralih arah posisi. Anda juga dapat mematikan fitur ini untuk mengurangi jumlah transaksi.

Analisis risiko

  1. Penetapan parameter yang tidak tepat dapat menyebabkan terlalu banyak sinyal perdagangan, meningkatkan frekuensi perdagangan dan biaya slippage.
  2. Indikator Moving Average sebagai satu-satunya indikator untuk menilai tren, dapat menyebabkan keterlambatan dan kehilangan waktu untuk membalikkan harga.
  3. Stop loss tetap mungkin terlalu mekanis dan tidak dapat disesuaikan dengan pergerakan pasar.
  4. Pembukaan posisi langsung kebalik akan meningkatkan frekuensi perubahan posisi, meningkatkan biaya dan risiko transaksi.

Arah optimasi

  1. Anda dapat menguji indikator rata-rata yang berbeda sebagai pengganti EMA, atau menggunakan kombinasi EMA dan rata-rata lainnya, untuk melihat apakah Anda dapat meningkatkan tingkat keuntungan.
  2. Anda dapat mencoba untuk menggabungkan modus operasi filter dengan strategi lain, seperti Brinks, K-line, dan lain-lain, untuk membuat filter yang lebih stabil.
  3. Anda dapat mempelajari cara untuk beradaptasi dengan stop loss, menyesuaikan jarak stop loss sesuai dengan volatilitas pasar.
  4. Anda dapat mengatur jumlah transaksi atau margin kerugian untuk membatasi jumlah reversal langsung.

Meringkaskan

Strategi ini menggunakan operasi simulasi untuk mengintegrasikan penyaringan acak dengan penilaian tren rata-rata bergerak, pengaturan parameternya fleksibel, dapat disesuaikan dan dioptimalkan sesuai dengan berbagai kondisi pasar, sehingga mendapatkan sinyal perdagangan yang lebih andal. Selain itu, strategi ini mengintegrasikan berbagai mekanisme pengendalian risiko stop loss, serta stop loss dan stop loss bergerak untuk mengunci keuntungan. Strategi ini secara keseluruhan jelas, mudah dipahami dan dimodifikasi, layak untuk diuji dan dioptimalkan lebih lanjut, dan memiliki potensi aplikasi nyata yang besar.

Kode Sumber Strategi
/*backtest
start: 2023-11-12 00:00:00
end: 2023-12-12 00:00:00
period: 1h
basePeriod: 15m
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/
// © tweakerID

// To understand this strategy first we need to look into the Modulo (%) operator. The modulo returns the remainder numerator 
// of a division's quotient (the result). If we do 5 / 3, we get 1 and 2/3 as a result, where the remainder is 2 (two thirds, in this case). This can be
// used for many things, for example to determine when a number divides evenly into another number. If we divide 3/3, our result is 1,
// with no remainder numerator, hence our modulo result is 0. In this strategy, we compare a given number (divisor, user defined) with the
// the closing price of every candle (dividend, modifiable from the inputs panel) to determine if the result between their division is an even number. 
// If the answer is true, we have an entry signal. If this signal occurs below the EMA (length is defined by the user) we go short and
// viceversa for longs. This logic can be reversed. In this case, the modulo works as a random-like filter for a moving average strategy
// that usually struggles when the market is ranging.

//@version=4

//@version=4
strategy("Modulo Logic + EMA Strat", 
     overlay=true, 
     default_qty_type=strategy.percent_of_equity, 
     default_qty_value=100, 
     initial_capital=10000, 
     commission_value=0.04, 
     calc_on_every_tick=false, 
     slippage=0)

direction = input(0, title = "Strategy Direction", type=input.integer, minval=-1, maxval=1)
strategy.risk.allow_entry_in(direction == 0 ? strategy.direction.all : (direction < 0 ? strategy.direction.short : strategy.direction.long))

/////////////////////// STRATEGY INPUTS ////////////////////////////////////////
title1=input(true, "-----------------Strategy Inputs-------------------")  

a=input(close, title="Dividend")
b=input(4, title="Divisor")
usemod=input(true, title="Use Modulo Logic")
MALen=input(70, title="EMA Length")

/////////////////////// BACKTESTER /////////////////////////////////////////////
title2=input(true, "-----------------General Inputs-------------------")  

// Backtester General Inputs
i_SL=input(true, title="Use Stop Loss and Take Profit")
i_SLType=input(defval="ATR Stop", title="Type Of Stop", options=["Strategy Stop", "Swing Lo/Hi", "ATR Stop"])
i_SPL=input(defval=10, title="Swing Point Lookback")
i_PercIncrement=input(defval=3, step=.1, title="Swing Point SL Perc Increment")*0.01
i_ATR = input(14, title="ATR Length")
i_ATRMult = input(4, step=.1, title="ATR Multiple")
i_TPRRR = input(1, step=.1, title="Take Profit Risk Reward Ratio")
TS=input(false, title="Trailing Stop")

// Bought and Sold Boolean Signal
bought = strategy.position_size > strategy.position_size[1] 
 or strategy.position_size < strategy.position_size[1]

// Price Action Stop and Take Profit
LL=(lowest(i_SPL))*(1-i_PercIncrement)
HH=(highest(i_SPL))*(1+i_PercIncrement)
LL_price = valuewhen(bought, LL, 0)
HH_price = valuewhen(bought, HH, 0)
entry_LL_price = strategy.position_size > 0 ? LL_price : na 
entry_HH_price = strategy.position_size < 0 ? HH_price : na 
tp=strategy.position_avg_price + (strategy.position_avg_price - entry_LL_price)*i_TPRRR
stp=strategy.position_avg_price - (entry_HH_price - strategy.position_avg_price)*i_TPRRR

// ATR Stop
ATR=atr(i_ATR)*i_ATRMult
ATRLong = ohlc4 - ATR
ATRShort = ohlc4 + ATR
ATRLongStop = valuewhen(bought, ATRLong, 0)
ATRShortStop = valuewhen(bought, ATRShort, 0)
LongSL_ATR_price = strategy.position_size > 0 ? ATRLongStop : na 
ShortSL_ATR_price = strategy.position_size < 0 ? ATRShortStop : na 
ATRtp=strategy.position_avg_price + (strategy.position_avg_price - LongSL_ATR_price)*i_TPRRR
ATRstp=strategy.position_avg_price - (ShortSL_ATR_price - strategy.position_avg_price)*i_TPRRR


// Strategy Stop

float LongStop = na
float ShortStop = na
float StratTP = na
float StratSTP = na

/////////////////////// STRATEGY LOGIC /////////////////////////////////////////

modulo=a%b
evennumber=modulo==0
MA=ema(close, MALen)
plot(MA)

BUY=usemod ? evennumber and close > MA : close > MA
SELL=usemod ? evennumber and close < MA : close < MA

//Trading Inputs
DPR=input(true, "Allow Direct Position Reverse")
reverse=input(false, "Reverse Trades")

// Entries
if reverse
    if not DPR
        strategy.entry("long", strategy.long, when=SELL and strategy.position_size == 0)
        strategy.entry("short", strategy.short, when=BUY and strategy.position_size == 0)
    else     
        strategy.entry("long", strategy.long, when=SELL)
        strategy.entry("short", strategy.short, when=BUY)
else
    if not DPR 
        strategy.entry("long", strategy.long, when=BUY and strategy.position_size == 0)
        strategy.entry("short", strategy.short, when=SELL and strategy.position_size == 0)
    else
        strategy.entry("long", strategy.long, when=BUY)
        strategy.entry("short", strategy.short, when=SELL)


SL= i_SLType == "Swing Lo/Hi" ? entry_LL_price : i_SLType == "ATR Stop" ? LongSL_ATR_price : LongStop
SSL= i_SLType == "Swing Lo/Hi" ? entry_HH_price : i_SLType == "ATR Stop" ? ShortSL_ATR_price : ShortStop
TP= i_SLType == "Swing Lo/Hi" ? tp : i_SLType == "ATR Stop" ? ATRtp : StratTP
STP= i_SLType == "Swing Lo/Hi" ? stp : i_SLType == "ATR Stop" ? ATRstp : StratSTP

//TrailingStop
dif=(valuewhen(strategy.position_size>0 and strategy.position_size[1]<=0, high,0))
 -strategy.position_avg_price
trailOffset     = strategy.position_avg_price - SL
var tstop = float(na)
if strategy.position_size > 0
    tstop := high- trailOffset - dif
    if tstop<tstop[1]
        tstop:=tstop[1]
else
    tstop := na
StrailOffset     = SSL - strategy.position_avg_price
var Ststop = float(na)
Sdif=strategy.position_avg_price-(valuewhen(strategy.position_size<0 
 and strategy.position_size[1]>=0, low,0))
if strategy.position_size < 0
    Ststop := low+ StrailOffset + Sdif
    if Ststop>Ststop[1]
        Ststop:=Ststop[1]
else
    Ststop := na

strategy.exit("TP & SL", "long", limit=TP, stop=TS? tstop : SL, when=i_SL)
strategy.exit("TP & SL", "short", limit=STP, stop=TS? Ststop : SSL, when=i_SL)

/////////////////////// PLOTS //////////////////////////////////////////////////

plot(i_SL and strategy.position_size > 0 and not TS ? SL : i_SL and strategy.position_size > 0 and TS ? tstop : na , title='SL', style=plot.style_cross, color=color.red)
plot(i_SL and strategy.position_size < 0 and not TS ? SSL : i_SL and strategy.position_size < 0 and TS ? Ststop : na , title='SSL', style=plot.style_cross, color=color.red)
plot(i_SL and strategy.position_size > 0 ? TP : na, title='TP', style=plot.style_cross, color=color.green)
plot(i_SL and strategy.position_size < 0 ? STP : na, title='STP', style=plot.style_cross, color=color.green)
// Draw price action setup arrows
plotshape(BUY ? 1 : na, style=shape.triangleup, location=location.belowbar, 
 color=color.green, title="Bullish Setup", size=size.auto)
plotshape(SELL ? 1 : na, style=shape.triangledown, location=location.abovebar, 
 color=color.red, title="Bearish Setup", size=size.auto)