Strategi MA ganda dengan batas waktu

Penulis:ChaoZhang, Tanggal: 2023-11-14 16:45:03
Tag:

img

Gambaran umum

Strategi ini mengimplementasikan modul batas waktu berdasarkan strategi rata-rata bergerak ganda asli untuk mengontrol waktu awal strategi.

Prinsip

Strategi ini menghasilkan sinyal perdagangan menggunakan MA cepat dan lambat. MA cepat memiliki periode 14 hari dan MA lambat memiliki periode 21 hari. Sinyal beli dihasilkan ketika MA cepat melintasi di atas MA lambat. Sinyal jual dihasilkan ketika MA cepat melintasi di bawah MA lambat.

Strategi ini juga menggabungkan opsi reversi perdagangan untuk membalikkan arah perdagangan asli.

Modul batas waktu membandingkan waktu saat ini dengan waktu awal yang dikonfigurasi menggunakan time stamp, mengembalikan benar atau salah untuk mengontrol apakah strategi dimulai atau tidak. Tahun, bulan, hari, jam dan menit awal perlu ditetapkan. Strategi hanya akan dimulai ketika waktu saat ini melebihi waktu awal yang dikonfigurasi.

Keuntungan

  • Dual MAs secara efektif menangkap tren jangka menengah hingga pendek
  • Modul batas waktu secara tepat mengontrol waktu berjalan strategi, menghindari perdagangan yang tidak perlu di bawah kondisi pasar yang tidak menguntungkan
  • Opsi reversi perdagangan menambah fleksibilitas

Risiko dan Solusi

  • MAs ganda dapat menghasilkan sinyal perdagangan yang berlebihan, meningkatkan frekuensi perdagangan dan biaya
  • Konfigurasi batas waktu yang tidak benar dapat menyebabkan kesempatan yang hilang
  • Inversi perdagangan yang salah dapat menyebabkan sinyal perdagangan yang salah

Mengoptimalkan periode MA dapat mengurangi frekuensi perdagangan. Waktu awal juga harus ditetapkan secara rasional untuk menghindari kesempatan yang hilang. Akhirnya, pilih dengan hati-hati apakah akan membalikkan sinyal berdasarkan kondisi pasar.

Arahan Optimasi

  • Menambahkan modul stop loss lebih mengontrol risiko perdagangan individu
  • Mengimplementasikan stop loss trailing yang secara bertahap memindahkan titik stop loss dapat membantu mengunci keuntungan
  • Menggabungkan sinyal di beberapa simbol dapat meningkatkan kualitas sinyal dan mengurangi sinyal palsu
  • Mengembangkan modul pengoptimalan parameter yang secara otomatis menemukan kombinasi parameter optimal

Ringkasan

Strategi ini menghasilkan sinyal perdagangan menggunakan MAs ganda dan mengontrol waktu berjalan dengan modul batas waktu, secara efektif menangkap tren sambil menghindari kondisi pasar yang tidak menguntungkan. Peningkatan lebih lanjut dapat dilakukan melalui penyesuaian parameter, modul stop loss, generasi sinyal lintas aset, dll untuk mengurangi frekuensi perdagangan sambil meningkatkan stabilitas dan profitabilitas setiap perdagangan.


/*backtest
start: 2023-11-06 00:00:00
end: 2023-11-13 00:00:00
period: 45m
basePeriod: 5m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2

strategy(title = "Strategy Code Example", shorttitle = "Strategy Code Example", overlay = true)

// Revision:        1
// Author:          @JayRogers
//
// *** THIS IS JUST AN EXAMPLE OF STRATEGY TIME LIMITING ***
//
//  This is a follow up to my previous strategy example for risk management, extended to include a time limiting factor.

// === GENERAL INPUTS ===
// short ma
maFastSource   = input(defval = open, title = "Fast MA Source")
maFastLength   = input(defval = 14, title = "Fast MA Period", minval = 1)
// long ma
maSlowSource   = input(defval = open, title = "Slow MA Source")
maSlowLength   = input(defval = 21, title = "Slow MA Period", minval = 1)

// === STRATEGY RELATED INPUTS ===
tradeInvert     = input(defval = false, title = "Invert Trade Direction?")
// Risk management
inpTakeProfit   = input(defval = 1000, title = "Take Profit", minval = 0)
inpStopLoss     = input(defval = 200, title = "Stop Loss", minval = 0)
inpTrailStop    = input(defval = 200, title = "Trailing Stop Loss", minval = 0)
inpTrailOffset  = input(defval = 0, title = "Trailing Stop Loss Offset", minval = 0)
// *** FOCUS OF EXAMPLE ***
// Time limiting
// a toggle for enabling/disabling
useTimeLimit    = input(defval = true, title = "Use Start Time Limiter?")
// set up where we want to run from
startYear       = input(defval = 2016, title = "Start From Year",  minval = 0, step = 1)
startMonth      = input(defval = 05, title = "Start From Month",  minval = 0,step = 1)
startDay        = input(defval = 01, title = "Start From Day",  minval = 0,step = 1)
startHour       = input(defval = 00, title = "Start From Hour",  minval = 0,step = 1)
startMinute     = input(defval = 00, title = "Start From Minute",  minval = 0,step = 1)

// === RISK MANAGEMENT VALUE PREP ===
// if an input is less than 1, assuming not wanted so we assign 'na' value to disable it.
useTakeProfit   = inpTakeProfit  >= 1 ? inpTakeProfit  : na
useStopLoss     = inpStopLoss    >= 1 ? inpStopLoss    : na
useTrailStop    = inpTrailStop   >= 1 ? inpTrailStop   : na
useTrailOffset  = inpTrailOffset >= 1 ? inpTrailOffset : na

// *** FOCUS OF EXAMPLE ***
// === TIME LIMITER CHECKING FUNCTION ===
// using a multi line function to return true or false depending on our input selection
// multi line function logic must be indented.
startTimeOk() =>
    // get our input time together
    inputTime   = timestamp(syminfo.timezone, startYear, startMonth, startDay, startHour, startMinute)
    // check the current time is greater than the input time and assign true or false
    timeOk      = time > inputTime ? true : false
    // last line is the return value, we want the strategy to execute if..
    // ..we are using the limiter, and the time is ok -OR- we are not using the limiter
    r = (useTimeLimit and timeOk) or not useTimeLimit

// === SERIES SETUP ===
/// a couple of ma's..
maFast = ema(maFastSource, maFastLength)
maSlow = ema(maSlowSource, maSlowLength)

// === PLOTTING ===
fast = plot(maFast, title = "Fast MA", color = green, linewidth = 2, style = line, transp = 50)
slow = plot(maSlow, title = "Slow MA", color = red, linewidth = 2, style = line, transp = 50)

// === LOGIC ===
// is fast ma above slow ma?
aboveBelow = maFast >= maSlow ? true : false
// are we inverting our trade direction?
tradeDirection = tradeInvert ? aboveBelow ? false : true : aboveBelow ? true : false

// *** FOCUS OF EXAMPLE ***
// wrap our strategy execution in an if statement which calls the time checking function to validate entry
// like the function logic, content to be included in the if statement must be indented.
if( startTimeOk() )
    // === STRATEGY - LONG POSITION EXECUTION ===
    enterLong = not tradeDirection[1] and tradeDirection
    exitLong = tradeDirection[1] and not tradeDirection
    strategy.entry( id = "Long", long = true, when = enterLong )
    strategy.close( id = "Long", when = exitLong )
    
    // === STRATEGY - SHORT POSITION EXECUTION ===
    enterShort = tradeDirection[1] and not tradeDirection
    exitShort = not tradeDirection[1] and tradeDirection
    strategy.entry( id = "Short", long = false, when = enterShort )
    strategy.close( id = "Short", when = exitShort )
    
    // === STRATEGY RISK MANAGEMENT EXECUTION ===
    strategy.exit("Exit Long", from_entry = "Long", profit = useTakeProfit, loss = useStopLoss, trail_points = useTrailStop, trail_offset = useTrailOffset)
    strategy.exit("Exit Short", from_entry = "Short", profit = useTakeProfit, loss = useStopLoss, trail_points = useTrailStop, trail_offset = useTrailOffset)


Lebih banyak