Chiến lược giao dịch động lực kết hợp STEM và MATCS

Tác giả:ChaoZhang, Ngày: 2023-09-15 16:22:48
Tags:

Chiến lược này được gọi là STEM và MATCS Combined Momentum Trading Strategy. Nó kết hợp chỉ số Supertrend với chỉ số MACD để tạo ra các tín hiệu giao dịch.

Chiến lược hoạt động như thế nào:

  1. Tính toán chỉ số Supertrend để tạo ra tín hiệu mua và bán khi giá đảo ngược.
  2. Tính toán các MA nhanh, trung bình và chậm của chỉ số MACD. Các tín hiệu mua được tạo ra khi MA nhanh vượt trên MA trung bình. Các tín hiệu bán được tạo ra khi MA nhanh vượt dưới MA trung bình.
  3. Kết hợp các tín hiệu từ Supertrend và MACD, chỉ giao dịch khi cả hai chỉ số đồng ý.
  4. Sử dụng chỉ số ATR để tính mức dừng mất tích động.

Các quy tắc giao dịch cụ thể:

  1. Khi Supertrend lật từ xuống lên, và MACD MA nhanh vượt qua trên MA trung bình, đi dài.
  2. Khi Supertrend lật từ trên xuống, và MACD MA nhanh vượt qua dưới MA trung bình, đi ngắn.
  3. Quy tắc thoát: dừng lỗ hoặc lấy lợi nhuận (không cần thiết).

Ưu điểm của chiến lược này:

  1. Kết hợp nhiều chỉ số cải thiện độ chính xác tín hiệu.
  2. Động thái dừng lỗ có thể hạn chế các lỗ lớn cá nhân.
  3. Có cả khả năng theo xu hướng và khả năng đảo ngược trung bình.

Rủi ro của chiến lược này:

  1. Các thông số Supertrend và MACD không chính xác có thể tạo ra tín hiệu xấu.
  2. Dừng lỗ quá gần có thể dẫn đến dừng thường xuyên.
  3. Phí và trượt ảnh hưởng đến lợi nhuận.

Tóm lại, Chiến lược giao dịch động lực kết hợp STEM và MATCS tăng cường hiệu quả thông qua tích hợp chỉ số, phù hợp với giao dịch ngắn hạn và trung hạn. Ứng dụng dừng lỗ rất quan trọng để kiểm soát rủi ro. Các nhà giao dịch cần giảm rủi ro trong giao dịch trực tiếp thông qua tối ưu hóa tham số và quản lý tiền chặt chẽ.


/*backtest
start: 2023-09-07 00:00:00
end: 2023-09-14 00:00:00
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/
// © IncomePipelineGenerator
//@version=4
// strategy("STRAT_STEM_MATCS_BTC", overlay=true, pyramiding = 0, default_qty_value = 20, slippage = 5)


ST_EMA_PERIOD = input(1, minval=1)
ST_EMA = ema(close, ST_EMA_PERIOD)

LENGTH = input(title="ATR_PERIOD", type=input.integer, defval=95)
ATR_TUNE = input(title="ATR_TUNE", type=input.float, step=0.1, defval=2.1)
showLabels = input(title="Show_Buy/Sell_Labels ?", type=input.bool, defval=true)
highlightState = input(title="Highlight_State ?", type=input.bool, defval=true)

ATR = ATR_TUNE * atr(LENGTH)

longStop = ST_EMA - ATR
longStopPrev = nz(longStop[1], longStop)
longStop := (close[1]) > longStopPrev ? max(longStop, longStopPrev) : longStop

shortStop = ST_EMA + ATR
shortStopPrev = nz(shortStop[1], shortStop)
shortStop := (close[1]) < shortStopPrev ? min(shortStop, shortStopPrev) : shortStop

dir = 1
dir := nz(dir[1], dir)
dir := dir == -1 and (close) > shortStopPrev ? 1 : dir == 1 and (close) < longStopPrev ? -1 : dir


fastLength = input(3, minval=1), medLength=input(9, minval=1), slowLength=input(12, minval=1), signalLength=input(16,minval=1)
fastMA = ema(close, fastLength), medMA = ema(close, medLength), slowMA = ema(close, slowLength)

macd = fastMA - slowMA
fmacd = fastMA - medMA
smacd = slowMA - medMA

signal = ema(macd, signalLength)
fsignal = ema(fmacd, signalLength)
ssignal = ema(smacd, signalLength)


SetStopLossShort = 0.0
SetStopLossShort := if(strategy.position_size < 0)
    StopLossShort = shortStop
    min(StopLossShort,SetStopLossShort[1])

SetStopLossLong = 0.0
SetStopLossLong := if(strategy.position_size > 0)
    StopLossLong = longStop
    max(StopLossLong,SetStopLossLong[1])


ATR_CrossOver_Period = input(5, type=input.integer, minval=1, maxval=2000)
ATR_SIGNAL_FINE_TUNE = input(0.962, type=input.float)  
ATR_CS = atr(ATR_CrossOver_Period)*ATR_SIGNAL_FINE_TUNE

StopLoss_Initial_Short = input(0.0, type=input.float) 
StopLoss_Initial_Long = input(0.0, type=input.float) 

StopLoss_Long_Adjust = input(0.0, type=input.float) 
StopLoss_Short_Adjust = input(0.0, type=input.float) 

VOLUME_CHECK = input(200)

//Custom Time Interval
fromMinute = input(defval = 0, title = "From Minute", minval = 0, maxval = 60)
fromHour = input(defval = 0, title = "From Hour", minval = 0, maxval = 24)
fromDay = input(defval = 1, title = "From Day", minval = 1)
fromMonth = input(defval = 1, title = "From Month", minval = 1)
fromYear = input(defval = 2019, title = "From Year", minval = 1900)
tillMinute = input(defval = 0, title = "Till Minute", minval = 0, maxval = 60)
tillHour = input(defval = 0, title = "Till Hour", minval = 0, maxval = 24)
tillDay = input(defval = 1, title = "Till Day", minval = 1)
tillMonth = input(defval = 1, title = "Till Month", minval = 1)
tillYear = input(defval = 2020, title = "Till Year", minval = 1900)
timestampStart = timestamp(fromYear,fromMonth,fromDay,fromHour,fromMinute)
timestampEnd = timestamp(tillYear,tillMonth,tillDay,tillHour,tillMinute)


//Custom Buy Signal Code --  This is where you design your own buy and sell signals. You now have millions of possibilites with the use of simple if/and/or statements.
if (  dir==1 and dir[1]==-1  and volume > VOLUME_CHECK and ((fsignal[1] -fsignal) <= 0) and  cross(fmacd, smacd) )
    strategy.exit("SELL")
    strategy.entry("BUY", strategy.long)
    strategy.exit("BUY_STOP","BUY", stop = close - StopLoss_Initial_Long)

//Custom Sell Signal Code
if  ( dir == -1 and dir[1] == 1 and dir[2] == 1 and dir[3] == 1 and dir[4] == 1 and  cross(fmacd, smacd) )
    strategy.exit( "BUY")
    strategy.entry("SELL", strategy.short)
    strategy.exit("SELL_STOP","SELL", stop = close + StopLoss_Initial_Short)

//Slight adjustments to ST for fine tuning
if (strategy.opentrades > 0 )
    strategy.exit("BUY_TRAIL_STOP","BUY", stop = longStop - StopLoss_Long_Adjust)
    strategy.exit("SELL_TRAIL_STOP","SELL", stop = shortStop + StopLoss_Short_Adjust)

Thêm nữa