Chiến lược giao dịch hai chiều dựa trên các giai đoạn của mặt trăng

Tác giả:ChaoZhang, Ngày: 2024-02-21 16:15:25
Tags:

img

Tổng quan

Chiến lược này giao dịch cả dài và ngắn dựa trên pha trăng, đi dài trên mặt trăng mới và đi ngắn trên mặt trăng tròn.

Chiến lược logic

Chiến lược này tính toán chính xác các giai đoạn của mặt trăng dựa trên ngày sử dụng một hàm tùy chỉnh. Tuổi trăng dưới 15 là một mặt trăng mới, và từ 15 đến 30 là một mặt trăng tròn. Nó tạo ra các tín hiệu dài và ngắn dựa trên các giai đoạn của mặt trăng, mở các vị trí dài trên các mặt trăng mới và các vị trí ngắn trên các mặt trăng tròn. Nó đóng các vị trí trên các tín hiệu ngược lại - đóng dài trên các mặt trăng tròn và ngắn trên các mặt trăng mới.

Người dùng có thể chọn giữa dài vào trăng mới, ngắn vào trăng tròn hoặc ngược lại. Các biến Boolean theo dõi nếu giao dịch hiện đang mở. Nó mở giao dịch mới khi tín hiệu xuất hiện trong khi không có vị trí mở và đóng các vị trí hiện tại trên tín hiệu ngược.

Ưu điểm

  1. Khám phá xu hướng dài hạn bằng cách sử dụng chu kỳ chu kỳ mặt trăng
  2. Màu sắc hiển thị tùy chỉnh, điền, vv
  3. Lựa chọn các chiến lược hai chiều
  4. Các dấu hiệu mở/khép rõ ràng
  5. Thời gian bắt đầu backtest tùy chỉnh cho tối ưu hóa

Rủi ro

  1. Chu kỳ trăng dài không thể bắt được những chuyển động ngắn hạn
  2. Không dừng lỗ có thể dẫn đến tổn thất lớn
  3. Các chu kỳ cố định dễ hình thành mô hình

Giảm rủi ro:

  1. Thêm các chỉ số chu kỳ ngắn khác cho giao dịch nhiều khung thời gian
  2. Thực hiện lệnh dừng lỗ
  3. Tối ưu hóa kích thước vị trí để hạn chế tác động mất mát

Hướng dẫn tối ưu hóa

Chiến lược có thể được cải thiện bằng cách:

  1. Thêm nhiều chỉ số để lọc tín hiệu và cải thiện độ bền
  2. Thêm kích thước vị trí để tối ưu hóa và giảm tác động mất mát
  3. Thêm mô-đun dừng lỗ để giới hạn lỗ
  4. Tối ưu hóa các điều kiện mở / đóng để giảm trượt và cải thiện tỷ lệ thắng

Kết luận

Chiến lược này khai thác tính định kỳ của chu kỳ mặt trăng để thực hiện một chiến lược giao dịch hai chiều dựa trên mặt trăng mới và tròn. Nó có tín hiệu rõ ràng, khả năng tùy biến cao và bắt được xu hướng dài hạn tốt. Nhưng việc không thể hạn chế lỗ gây ra rủi ro đáng kể.


/*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


Thêm nữa