Strategi Martingale dengan julat purata bergerak yang diperluaskan untuk perdagangan saham

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

img

Ringkasan

Strategi ini mengenal pasti trend dengan memperluaskan selang antara purata bergerak. Apabila trend menaik dikenal pasti, ia secara beransur-ansur membina kedudukan panjang untuk mendapat keuntungan dari trend. Pada masa yang sama, titik stop loss ditetapkan untuk mengawal risiko.

Logika Strategi

  1. Tetapkan dua purata bergerak, EMA1 dan EMA2, dengan tempoh yang sedikit berbeza, contohnya 55 dan 89.

  2. Apabila harga memecahkan di atas MAs, ia menandakan trend menaik. Posisi panjang kemudian boleh dibina secara beransur-ansur.

  3. Selepas mengambil kedudukan, teruskan piramid apabila harga terus meningkat. Ini membolehkan keuntungan yang lebih tinggi dari trend.

  4. Tetapkan titik stop loss di bawah MA. Apabila harga turun di bawah MA, tutup panjang untuk menghentikan kerugian. Stop loss mengambang dengan harga kemasukan.

  5. Ini membolehkan kedudukan piramid mendapat keuntungan daripada trend, sambil menetapkan stop loss untuk mengawal risiko.

Analisis Kelebihan

  1. Julat MA yang lebih luas membantu mengenal pasti trend dengan jelas.

  2. Pyramiding menghasilkan pulangan yang lebih tinggi daripada trend.

  3. Stop loss dinamik mengambil keuntungan daripada trend sambil mengehadkan kerugian.

  4. Sesuai untuk perdagangan trend jangka panjang.

Analisis Risiko

  1. Trend mesti dikenal pasti dengan betul, jika tidak, kerugian akan meningkat.

  2. Pyramiding mesti dikawal untuk mengelakkan risiko panggilan margin.

  3. Stop loss mesti ditetapkan dengan munasabah, terlalu luas boleh mengembangkan kerugian, terlalu ketat boleh menyebabkan whipsaws.

  4. Kecairan mesti dipertimbangkan, aset kecairan rendah tidak sesuai.

Cadangan Pengoptimuman

  1. Tambah lebih banyak penunjuk seperti RSI, KD untuk mengesahkan trend dan mengelakkan pecah palsu.

  2. Mengoptimumkan tempoh MA berdasarkan ciri aset untuk mencari kombinasi terbaik.

  3. Penyelidikan model piramida optimum untuk mengawal risiko saiz kedudukan.

  4. Pertimbangkan mengambil keuntungan separa untuk mengunci keuntungan dan mengurangkan pengeluaran.

  5. Tetapkan stop loss berdasarkan turun naik aset untuk mengimbangi perlindungan dan mengelakkan whipsaws.

Ringkasan

Strategi ini mengenal pasti trend dengan julat MA yang lebih luas, kedudukan piramid untuk mendapat keuntungan daripada trend, dan menetapkan stop loss terapung untuk mengawal 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 lanjut