Strategi perdagangan bidirectional berdasarkan fase bulan

Penulis:ChaoZhang, Tanggal: 2024-02-21 16:15:25
Tag:

img

Gambaran umum

Strategi ini memperdagangkan panjang dan pendek berdasarkan fase bulan, pergi panjang pada bulan baru dan pergi pendek pada bulan purnama.

Logika Strategi

Strategi ini menghitung fase bulan secara akurat berdasarkan tanggal menggunakan fungsi kustom. Umur bulan kurang dari 15 adalah bulan baru, dan antara 15 dan 30 adalah bulan purnama.

Pengguna dapat memilih antara panjang pada bulan baru, pendek pada bulan purnama atau sebaliknya. Variabel Boolean melacak jika perdagangan saat ini terbuka. Ini membuka perdagangan baru ketika sinyal muncul sementara tidak ada posisi yang terbuka, dan menutup posisi saat ini pada sinyal terbalik. Penanda beli dan jual ditampilkan secara visual.

Keuntungan

  1. Menangkap tren jangka panjang menggunakan periodikitas siklus bulan
  2. Warna tampilan yang dapat disesuaikan, isi, dll
  3. Pilihan strategi dua arah
  4. Tanda terbuka/tutup yang jelas
  5. Waktu awal backtest yang dapat disesuaikan untuk optimasi

Risiko

  1. Siklus bulan panjang gagal menangkap gerakan jangka pendek
  2. Tidak ada stop loss dapat menyebabkan kerugian besar
  3. Siklus tetap yang rentan terhadap pembentukan pola

Pengurangan Risiko:

  1. Tambahkan indikator siklus pendek lainnya untuk perdagangan multi-timeframe
  2. Mengimplementasikan stop loss
  3. Mengoptimalkan ukuran posisi untuk membatasi dampak kerugian

Arahan Optimasi

Strategi dapat ditingkatkan dengan:

  1. Menambahkan lebih banyak indikator untuk menyaring sinyal dan meningkatkan ketahanan
  2. Menambahkan ukuran posisi untuk mengoptimalkan dan mengurangi dampak kerugian
  3. Menambahkan modul stop loss untuk membatasi kerugian
  4. Mengoptimalkan kondisi terbuka / dekat untuk mengurangi slippage dan meningkatkan tingkat kemenangan

Kesimpulan

Strategi ini memanfaatkan periodikitas siklus bulan untuk menerapkan strategi perdagangan dua arah berdasarkan bulan baru dan bulan purnama. Strategi ini memiliki sinyal yang jelas, kemampuan penyesuaian yang tinggi, dan menangkap tren jangka panjang dengan baik. Namun ketidakmampuan untuk membatasi kerugian menimbulkan risiko yang signifikan.


/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-31 23:59:59
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/

// ---------------------------© paaax----------------------------
// ---------------- Author1: Pascal Simon (paaax) ----------------
// -------------------- www.pascal-simon.de ---------------------
// ---------------- www.tradingview.com/u/paaax/-----------------
// Source: https://gist.github.com/L-A/3497902#file-moonobject-js

// -------------------------© astropark--------------------------
// --------------- Author2: Astropark (astropark) ---------------
// -------------- https://bit.ly/astroparktrading ---------------
// -------------- www.tradingview.com/u/astropark/---------------


// @version=4
strategy(title="[astropark] Moon Phases [strategy]", overlay=true, pyramiding = 10, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, initial_capital = 100000, currency = currency.USD, commission_value = 0.1)

// INPUT    --- {

newMoonColor = input(color.black, "New Moon Color")
fullMoonColor = input(color.white, "Full Moon Color")

fillBackground = input(true, "Fill Background?")
newMoonBackgroundColor = input(#fffff0aa, "New Moon Background Color")
fullMoonBackgroundColor = input(#aaaaaaaa, "Full Moon Background Color")

//} --- INPUT

// FUNCTION --- {

normalize(_v) =>
    x = _v
    x := x - floor(x)
    if x < 0
        x := x + 1
    x

calcPhase(_year, _month, _day) =>

    int y = na
    int m = na
    float k1 = na 
    float k2 = na 
    float k3 = na
    float jd = na
    float ip = na

    y := _year - floor((12 - _month) / 10)       
    m := _month + 9
    if m >= 12 
        m := m - 12
    
    k1 := floor(365.25 * (y + 4712))
    k2 := floor(30.6 * m + 0.5)
    k3 := floor(floor((y / 100) + 49) * 0.75) - 38
    
    jd := k1 + k2 + _day + 59
    if jd > 2299160
        jd := jd - k3
    
    ip := normalize((jd - 2451550.1) / 29.530588853)
    age = ip * 29.53

//} --- FUNCTION

// INIT     --- {

age = calcPhase(year, month, dayofmonth)
moon = 
     floor(age)[1] > floor(age) ? 1 : 
     floor(age)[1] < 15 and floor(age) >= 15 ? -1 : na

//} --- INIT

// PLOT     --- {

plotshape(
     moon==1, 
     "Full Moon", 
     shape.circle, 
     location.top, 
     color.new(newMoonColor, 20), 
     size=size.normal
     )   

plotshape(
     moon==-1, 
     "New Moon", 
     shape.circle, 
     location.bottom, 
     color.new(fullMoonColor, 20), 
     size=size.normal
     )   

var color col = na
if moon == 1 and fillBackground
    col := fullMoonBackgroundColor
if moon == -1 and fillBackground
    col := newMoonBackgroundColor
bgcolor(col, title="Moon Phase", transp=10)

//} --- PLOT


// STRATEGY     --- {

strategy = input("buy on new moon, sell on full moon", options=["buy on new moon, sell on full moon","sell on new moon, buy on full moon"])
longCond = strategy == "buy on new moon, sell on full moon" ? moon == -1 : moon == 1
shortCond = strategy == "buy on new moon, sell on full moon" ? moon == 1 : moon == -1

weAreInLongTrade = false
weAreInShortTrade = false
weAreInLongTrade := (longCond or weAreInLongTrade[1]) and shortCond == false
weAreInShortTrade := (shortCond or weAreInShortTrade[1]) and longCond == false
buySignal = longCond and weAreInLongTrade[1] == false
sellSignal = shortCond and weAreInShortTrade[1] == false

showBuySellSignals = input(defval=true, title = "Show Buy/Sell Signals")
longEnabled = input(true, title="Long enabled")
shortEnabled = input(true, title="Short enabled")

analysisStartYear = input(2017, "Backtesting From Year", minval=1980)
analysisStartMonth = input(1, "And Month", minval=1, maxval=12)
analysisStartDay = input(1, "And Day", minval=1, maxval=31)
analysisStartHour = input(0, "And Hour", minval=0, maxval=23)
analysisStartMinute = input(0, "And Minute", minval=0, maxval=59)
analyzeFromTimestamp = timestamp(analysisStartYear, analysisStartMonth, analysisStartDay, analysisStartHour, analysisStartMinute)

plotshape(showBuySellSignals and buySignal, title="Buy Label", text="Buy", location=location.belowbar, style=shape.labelup, size=size.tiny, color=color.green, textcolor=color.white, transp=0)
plotshape(showBuySellSignals and sellSignal, title="Sell Label", text="Sell", location=location.abovebar, style=shape.labeldown, size=size.tiny, color=color.red, textcolor=color.white, transp=0)

strategy.entry("long", strategy.long, when = time > analyzeFromTimestamp and buySignal and longEnabled)
strategy.entry("short", strategy.short, when = time > analyzeFromTimestamp and sellSignal and shortEnabled)
strategy.close("long", when = sellSignal)
strategy.close("short", when = buySignal)

//} --- STRATEGY


Lebih banyak