Chiến lược hai MA với giới hạn thời gian

Tác giả:ChaoZhang, Ngày: 2023-11-14 16:45:03
Tags:

img

Tổng quan

Chiến lược này thực hiện một mô-đun giới hạn thời gian dựa trên chiến lược trung bình động kép ban đầu để kiểm soát thời gian bắt đầu của chiến lược.

Nguyên tắc

Chiến lược này tạo ra các tín hiệu giao dịch bằng cách sử dụng MA nhanh và chậm. MA nhanh có khoảng thời gian 14 ngày và MA chậm có khoảng thời gian 21 ngày. Một tín hiệu mua được tạo ra khi MA nhanh vượt qua trên MA chậm. Một tín hiệu bán được tạo ra khi MA nhanh vượt qua dưới MA chậm.

Chiến lược cũng kết hợp một tùy chọn đảo ngược thương mại để đảo ngược hướng thương mại ban đầu.

Mô-đun giới hạn thời gian so sánh thời gian hiện tại với thời gian bắt đầu được cấu hình bằng cách sử dụng dấu thời gian, trả về đúng hoặc sai để kiểm soát xem chiến lược bắt đầu hay không.

Ưu điểm

  • Các MA kép có hiệu quả nắm bắt các xu hướng trung hạn đến ngắn hạn
  • Mô-đun giới hạn thời gian kiểm soát chính xác thời gian chạy của chiến lược, tránh giao dịch không cần thiết trong điều kiện thị trường không thuận lợi
  • Tùy chọn đảo ngược giao dịch thêm sự linh hoạt

Rủi ro và giải pháp

  • Hai MAs có thể tạo ra các tín hiệu giao dịch quá mức, tăng tần suất giao dịch và chi phí
  • Cấu hình thời hạn không chính xác có thể gây ra cơ hội bị bỏ lỡ
  • Chuyển đổi giao dịch không chính xác có thể dẫn đến tín hiệu giao dịch sai

Tối ưu hóa thời gian MA có thể làm giảm tần suất giao dịch. Thời gian bắt đầu cũng nên được thiết lập hợp lý để tránh bỏ lỡ cơ hội. Cuối cùng, cẩn thận chọn liệu có nên đảo ngược tín hiệu dựa trên điều kiện thị trường hay không.

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

  • Thêm một mô-đun dừng lỗ kiểm soát tốt hơn rủi ro của các giao dịch cá nhân
  • Thực hiện một lệnh dừng lỗ cuối cùng mà dần dần di chuyển điểm dừng lỗ có thể giúp khóa trong lợi nhuận
  • Kết hợp tín hiệu trên nhiều biểu tượng có thể cải thiện chất lượng tín hiệu và giảm tín hiệu sai
  • Phát triển một mô-đun tối ưu hóa tham số tự động tìm ra các kết hợp tham số tối ưu

Tóm lại

Chiến lược này tạo ra các tín hiệu giao dịch bằng cách sử dụng hai MAs và kiểm soát thời gian chạy với mô-đun giới hạn thời gian, có hiệu quả nắm bắt xu hướng trong khi tránh điều kiện thị trường không thuận lợi.


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


Thêm nữa