Strategi Martingale dengan rentang rata-rata bergerak yang diperluas untuk perdagangan saham

Penulis:ChaoZhang, Tanggal: 2023-11-02 17:16:08
Tag:

img

Gambaran umum

Strategi ini mengidentifikasi tren dengan memperluas interval antara rata-rata bergerak. Ketika tren naik diidentifikasi, secara bertahap membangun posisi panjang untuk mendapatkan keuntungan dari tren. Pada saat yang sama, titik stop loss diatur untuk mengendalikan risiko.

Logika Strategi

  1. Tetapkan dua rata-rata bergerak, EMA1 dan EMA2, dengan periode yang sedikit berbeda, misalnya 55 dan 89.

  2. Ketika harga menembus MAs, itu menandakan tren kenaikan. Posisi panjang kemudian dapat dibangun secara bertahap.

  3. Setelah mengambil posisi, lanjutkan piramida saat harga terus naik. Ini memungkinkan keuntungan yang lebih tinggi dari tren.

  4. Tetapkan titik stop loss di bawah MA. Ketika harga turun di bawah MA, tutup long untuk stop loss. Stop loss melayang naik dengan harga masuk.

  5. Hal ini memungkinkan posisi piramida untuk mendapatkan keuntungan dari tren, sambil menetapkan stop loss untuk mengendalikan risiko.

Analisis Keuntungan

  1. Jangkauan MA yang lebih luas membantu mengidentifikasi tren dengan jelas.

  2. Pyramiding menciptakan pengembalian yang lebih tinggi dari tren.

  3. Stop loss dinamis mengambil keuntungan dari tren sambil membatasi kerugian.

  4. Cocok untuk perdagangan tren jangka panjang.

Analisis Risiko

  1. Tren harus diidentifikasi dengan benar, jika tidak kerugian akan meningkat.

  2. Pyramiding harus dikendalikan untuk menghindari risiko margin call.

  3. Stop loss harus diatur secara wajar, terlalu luas dapat memperluas kerugian, terlalu ketat dapat menyebabkan whipsaws.

  4. Likuiditas harus dipertimbangkan, aset likuiditas rendah tidak cocok.

Saran Optimalisasi

  1. Tambahkan lebih banyak indikator seperti RSI, KD untuk mengkonfirmasi tren dan menghindari pecah palsu.

  2. Mengoptimalkan periode MA berdasarkan karakteristik aset untuk menemukan kombinasi terbaik.

  3. Penelitian model piramida optimal untuk mengontrol risiko ukuran posisi.

  4. Pertimbangkan mengambil keuntungan parsial untuk mengunci keuntungan dan mengurangi penarikan.

  5. Atur stop loss berdasarkan volatilitas aset untuk menyeimbangkan perlindungan dan menghindari kegagalan.

Ringkasan

Strategi ini mengidentifikasi tren dengan rentang MA yang lebih luas, posisi piramida untuk mendapatkan keuntungan dari tren, dan menetapkan stop loss mengambang untuk mengendalikan risiko.


/*backtest
start: 2023-10-02 00:00:00
end: 2023-11-01 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2
// strategy(title='Super Simple Martingale Buying', shorttitle="Martingale v5",overlay=true, pyramiding = 10, initial_capital=1, calc_on_order_fills = true)


// Revision:        1
// Author:          @ToS_MavericK

// === INPUT SMA ===
EMA1  = input(55)
EMA2  = input(89)

Amount  = input(defval = 6, type = float, title = "Max open Orders", minval = 1, step = 1)
Multiplier  = input(defval = 2  , type = float, title = "Multiplier", minval = 1, step = 0.1)
BuyLvl  = input(defval = 1, type = float, title = "BuyLvl", minval = 0, step = 0.1)
Profit  = input(3)
DoubleUpLimit    = input(2)

// === INPUT BACKTEST RANGE ===
FromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromMonth   = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
FromYear    = input(defval = 2019, title = "From Year", minval = 2012)
ToDay   = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
ToMonth = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
ToYear  = input(defval = 2020, title = "To Year", minval = 2012)

RSIFilter = input(false)
minRSI  = input(defval = 35,  title = "RSI", minval = 1, step = 1)
lengthRSI = input(14, minval=1)
src = input(close, title="RSI Source")

StochRSIFilter = input(false)
lengthStoch = input(14, minval=1)
smoothK = input(3, minval=1)
smoothD = input(3, minval=1)

rsi = rsi(src, lengthRSI)
k = sma(stoch(rsi, rsi, rsi, lengthStoch), smoothK)
d = sma(k, smoothD)

// === FUNCTION EXAMPLE ===
start     = timestamp(FromYear, FromMonth, FromDay, 00, 00)  // backtest start window
finish    = timestamp(ToYear, ToMonth, ToDay, 23, 59)        // backtest finish window
window()  => true // create function "within window of time"

// === SERIES SETUP ===
vEMA1 = ema(close, EMA1)
vEMA2 = ema(close, EMA2)

buy  =  (rsi < minRSI or RSIFilter == false) and ((crossover(k,d) and k < 20) or StochRSIFilter == false) and ((close < vEMA1 * (1 - BuyLvl/100) and vEMA1 < vEMA2) or (close < vEMA2 * (1 - BuyLvl/100) and vEMA2 < vEMA1))

BuyPrice = strategy.position_avg_price * (1 - DoubleUpLimit/50)
SellPrice = strategy.position_avg_price * (1 + Profit/(100*strategy.opentrades))

// Exit first, due to the limit orders, which can be hit on the same bar
strategy.exit("EMA1", limit = SellPrice, when = window() and strategy.opentrades > 0)
strategy.close("EMA1",when = time > finish) // close positions at the end of the specified time period

// Normal entry
strategy.entry("EMA1", strategy.long,qty = strategy.equity/ (close * pow(2,Amount - 1)), when = window() and strategy.opentrades == 0 and buy)
// Martingale
strategy.entry("EMA1", strategy.long,qty = strategy.position_size, limit = strategy.position_avg_price * (1 - DoubleUpLimit/100), when = window() and strategy.opentrades == 1)
strategy.entry("EMA1", strategy.long,qty = strategy.position_size, limit = BuyPrice, when = window() and strategy.opentrades > 1 and strategy.opentrades < Amount)

plot(vEMA1, title = 'EMA1', color = orange, linewidth = 2, style = line)
plot(vEMA2, title = 'EMA2', color = yellow, linewidth = 2, style = line)
plot(BuyPrice[1], title = 'BuyPrice', color = red, linewidth = 2, style = line)
plot(SellPrice[1], title = 'SellPrice', color = green, linewidth = 2, style = line)

Lebih banyak