Hệ thống đột phá giai đoạn chéo

Tác giả:ChaoZhang, Ngày: 2023-11-22 15:22:49
Tags:

img

Tổng quan

Đây là một chiến lược giao dịch định lượng sử dụng các đường trung bình động và chỉ số MACD cho các hoạt động đột phá theo cả hai hướng. Nó có tính năng của các hoạt động chéo giai đoạn, tức là đánh giá hướng xu hướng trên khung thời gian dài hơn và tìm kiếm cơ hội trên khung thời gian ngắn hơn.

Nguyên tắc chiến lược

Chiến lược này sử dụng 3 đường trung bình di chuyển SMMA có chiều dài khác nhau và 1 đường trung bình di chuyển EMA để xác định hướng xu hướng. Đồng thời, nó kết hợp chỉ số MACD để đánh giá xu hướng ngắn hạn và cơ hội nhập cảnh. Cụ thể, điều kiện kích hoạt mua là: giá vượt qua tất cả các đường trung bình di chuyển lên, và các đường trung bình ngắn hơn là trên những đường dài hơn; trong khi điều kiện kích hoạt bán là ngược lại, giá vượt qua tất cả các đường trung bình di chuyển xuống, và đường trung bình ngắn hơn là dưới những đường dài hơn.

Có thể thấy rằng chiến lược này sử dụng đường trung bình động để đánh giá hướng xu hướng trung và dài hạn, và MACD để nắm bắt các cơ hội nhập cảnh tốt hơn bằng cách đánh giá sự đảo ngược ngắn hạn.

Phân tích lợi thế

Ưu điểm của giao dịch chéo thời gian này là nó có thể chọn các điểm đảo ngược ngắn hạn phù hợp để bước vào hướng xu hướng có khả năng cao, do đó có tỷ lệ rủi ro-lợi nhuận tốt hơn.

  1. Các trung bình 3 SMMA cộng với bộ lọc đa cấp 1 đường EMA có thể xác định hiệu quả hướng xu hướng trung và dài hạn để tránh giao dịch chống lại xu hướng.

  2. Chỉ số MACD đánh giá các điểm đảo ngược ngắn hạn để nhập có thể có mức giá nhập cảnh tốt hơn.

  3. Mối quan hệ chuỗi trung bình động nghiêm ngặt như một điều kiện lọc có thể làm giảm xác suất hoạt động sai.

Phân tích rủi ro

Những rủi ro chính của chiến lược này là:

  1. Đường trung bình động tự nó có tính chất tụt hậu lớn hơn, có thể bỏ lỡ cơ hội đảo ngược xu hướng ngắn hạn.

  2. Các chỉ số MACD có xu hướng tạo ra các tín hiệu sai và cần được lọc kết hợp với mức giá.

  3. Các phán quyết nhiều khung thời gian làm tăng sự phức tạp của chiến lược và dễ thất bại.

Để giải quyết rủi ro 1 và rủi ro 2, chúng ta có thể tối ưu hóa bằng cách rút ngắn đúng mức trung bình động và chu kỳ tín hiệu để phản ứng nhanh chóng với sự đảo ngược xu hướng ngắn hạn. Đối với rủi ro 3, chúng ta cần tối ưu hóa và thử nghiệm cho các giống và chu kỳ khác nhau để điều chỉnh nghiêm ngặt các tham số chiến lược theo đặc điểm của giống đó.

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

Các khía cạnh chính mà chiến lược này có thể được tối ưu hóa bao gồm:

  1. Tối ưu hóa các thông số của đường trung bình động và MACD để phù hợp nhất với các đặc điểm của các chu kỳ và giống khác nhau. chẳng hạn như rút ngắn chiều dài của đường trung bình động, tăng thông số tín hiệu, v.v.

  2. Tăng các chiến lược dừng lỗ bằng cách sử dụng ATR hoặc các chỉ số khác để thiết lập dừng di chuyển hợp lý. Điều này có thể cải thiện đáng kể việc kiểm soát rủi ro của chiến lược.

  3. Tìm kiếm các chỉ số hoặc phương pháp lọc tốt hơn để thay thế các tín hiệu MACD. Ví dụ, giới thiệu các chỉ số biến động và lọc các tín hiệu phù hợp.

  4. Kiểm tra các mối quan hệ tỷ lệ lợi nhuận và lỗ khác nhau để có được sự kết hợp các tham số với tỷ lệ rủi ro-lợi nhuận tốt hơn.

Tóm lại

Nói chung, đây là một hệ thống đột phá độc đáo với tư duy khung thời gian chéo. Nó sử dụng những lợi thế của cả trung bình động và MACD để đạt được một chiến lược hoạt động phán đoán chung trên nhiều khung thời gian. Bằng cách tối ưu hóa và điều chỉnh các tham số và tiêu chí lọc, chiến lược này có thể trở thành một giải pháp giao dịch định lượng rất thực tế.


/*backtest
start: 2023-10-22 00:00:00
end: 2023-11-21 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/
// © SoftKill21

//@version=4
strategy("Koala Script",initial_capital=1000, 
     commission_type=strategy.commission.cash_per_contract, 
     commission_value=0.000065,
     slippage=3)
fromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
fromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
fromYear = input(defval = 2000, title = "From Year", minval = 1970)
 
// To Date Inputs
toDay = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
toMonth = input(defval = 8, title = "To Month", minval = 1, maxval = 12)
toYear = input(defval = 2031, title = "To Year", minval = 1970)
 


startDate = timestamp(fromYear, fromMonth, fromDay, 00, 00)
finishDate = timestamp(toYear, toMonth, toDay, 00, 00)




len = input(3, minval=1, title="Length")
src = input(hl2, title="Source")
smma = 0.0
sma1 = sma(src, len)
smma := na(smma[1]) ? sma1 : (smma[1] * (len - 1) + src) / len

len2 = input(6, minval=1, title="Length")
src2 = input(hl2, title="Source")
smma2 = 0.0
sma2 = sma(src2, len2)
smma2 := na(smma2[1]) ? sma2 : (smma2[1] * (len2 - 1) + src2) / len2

len3 = input(9, minval=1, title="Length")
src3 = input(hl2, title="Source")
smma3 = 0.0
sma3 = sma(src3, len3)
smma3 := na(smma3[1]) ? sma3 : (smma3[1] * (len3 - 1) + src3) / len3

len4 = input(50, minval=1, title="Length")
src4 = input(close, title="Source")
smma4 = 0.0
sma4 = sma(src4, len4)
smma4 := na(smma4[1]) ? sma4  : (smma4[1] * (len4 - 1) + src4) / len4

len5 = input(200, minval=1, title="Length")
src5 = input(close, title="Source")
out5 = ema(src5, len5)

timeinrange(res, sess) => time(res, sess) != 0
london=timeinrange(timeframe.period, "0300-1045")
londonEntry=timeinrange(timeframe.period, "0300-0845")

time_cond = time >= startDate and time <= finishDate and londonEntry

fast_length = input(title="Fast Length", type=input.integer, defval=12)
slow_length = input(title="Slow Length", type=input.integer, defval=26)
srcc = input(title="Source", type=input.source, defval=close)
signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 9)
sma_source = input(title="Simple MA(Oscillator)", type=input.bool, defval=false)
sma_signal = input(title="Simple MA(Signal Line)", type=input.bool, defval=false)


// Calculating
fast_ma = sma_source ? sma(srcc, fast_length) : ema(srcc, fast_length)
slow_ma = sma_source ? sma(srcc, slow_length) : ema(srcc, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal ? sma(macd, signal_length) : ema(macd, signal_length)
hist = macd - signal


longCond = close > out5 and close > smma4 and close > smma3 and close > smma2 and close > smma and londonEntry and smma > smma2 and smma2>smma3 and smma3>smma4 and smma4>out5 
shortCond = close < out5 and close < smma4 and close < smma3 and close < smma2 and close < smma and londonEntry and smma < smma2 and smma2<smma3 and smma3<smma4 and smma4<out5 
//longCond2 = crossover(close,out5) and crossover(close,smma4) and crossover(close,smma3) and crossover(close,smma2) and crossover(close,smma) and time_cond
//shortCond2 = crossunder(close,out5) and crossunder(close,smma4) and crossunder(close,smma3) and crossunder(close,smma2) and crossunder(close,smma) and time_cond

length=input(14, title="ATR Length")
mult=input(1.0, title="Percentage Multiplier (for ex., 0.7 = 70%)", step=0.1, minval=0.1, maxval=5.0)

oa=input(false, title="Show actual ATR")

ii=syminfo.pointvalue==0
s=ii?na:oa?atr(length):(syminfo.pointvalue * mult * atr(length))

tp=input(300,title="tp")
sl=input(300,title="sl")


//tp = s*10000
//sl= s*10000



//if(tp>300)
//    tp:=300
//if(sl>300)
//    sl:=300
//if(sl<150)
//    sl:=150
//if(tp<150)
//    tp:=150
strategy.initial_capital = 50000
//MONEY MANAGEMENT--------------------------------------------------------------''
balance = strategy.netprofit + strategy.initial_capital //current balance
floating = strategy.openprofit          //floating profit/loss
risk = input(3,type=input.float,title="Risk %")/100           //risk % per trade


    //Calculate the size of the next trade
temp01 = balance * risk     //Risk in USD
temp02 = temp01/sl        //Risk in lots
temp03 = temp02*100000      //Convert to contracts
size = temp03 - temp03%1000 //Normalize to 1000s (Trade size)
if(size < 10000)
    size := 10000           //Set min. lot size



strategy.entry("long",1,when=longCond )
strategy.exit("closelong","long", profit=tp,loss=sl)
//strategy.close("long",when= crossunder(close[4],smma4) and close[4] > close[3] and close[3]>close[2] and close[2] > close[1] and close[1] > close)
strategy.entry("short",0,when=shortCond )
strategy.exit("closeshort","short", profit=tp,loss=sl)
//strategy.close("short",when= crossover(close[4],smma4) and close[4] < close[3] and close[3]< close[2] and close[2] < close[1] and close[1] < close)

strategy.close_all(when = not london)

maxEntry=input(2,title="max entries")
// strategy.risk.max_intraday_filled_orders(maxEntry)

Thêm nữa