Chiến lược thúc đẩy bước đột phá của đường sắt và đường sắt trên

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

img

Tổng quan

Chiến lược này sử dụng các tín hiệu chéo của đường nhanh và đường chậm MACD, kết hợp với các phán đoán dựa trên nhiều chỉ số khác, để nắm bắt các tín hiệu đột phá của đường chỉ số trung bình động một cách kịp thời và đưa ra quyết định mua hoặc bán. Nó thuộc về một chiến lược giao dịch ngắn hạn.

Chiến lược logic

  1. Sử dụng sự chéo chéo giữa đường nhanh và đường chậm của MACD như là tín hiệu giao dịch chính. Khi đường nhanh vượt qua đường chậm, hãy đặt vị trí dài. Khi đường nhanh vượt qua đường chậm, hãy đặt vị trí ngắn.

  2. Kết hợp chỉ số RSI để xác định các điều kiện mua quá mức và bán quá mức.

  3. So sánh giá đóng hiện tại với đường SMA của một khoảng thời gian nhất định. Giá đóng dưới SMA cho thấy dài, trong khi trên cho thấy ngắn.

  4. Tính toán mức 0,5 Fibonacci của giá trị cao nhất của một khoảng thời gian nhất định như là kháng cự cho dài. Tính toán mức 0,5 Fibonacci của giá trị thấp nhất của một khoảng thời gian nhất định như là hỗ trợ cho ngắn.

  5. Lấy dài khi đường nhanh vượt qua trên và giá dưới ngưỡng hỗ trợ. Lấy ngắn khi đường nhanh vượt qua dưới và giá vượt qua ngưỡng kháng cự.

  6. Sử dụng một cơ chế dừng lỗ kéo theo. Lỗ dừng được cố định ở một tỷ lệ phần trăm nhất định của giá nhập cảnh ban đầu. Khi lỗ đạt đến một mức độ nhất định, chuyển sang dừng lỗ kéo theo dần.

Ưu điểm

  1. Chiến lược sử dụng đầy đủ các tín hiệu giao dịch chéo MACD, đó là một tín hiệu giao dịch chỉ số kỹ thuật cổ điển và hiệu quả.

  2. Kết hợp xác nhận từ nhiều chỉ số như RSI và SMA có thể lọc các tín hiệu sai và cải thiện độ tin cậy.

  3. Tính toán mức hỗ trợ và kháng cự động cho giao dịch đột phá có thể nắm bắt các xu hướng lớn hơn.

  4. Việc dừng lỗ cuối cùng có thể khóa hầu hết lợi nhuận trong khi kiểm soát rủi ro.

  5. Logic chiến lược là rõ ràng và đơn giản, dễ hiểu và nắm vững cho người mới bắt đầu.

Rủi ro

  1. Chỉ số MACD có các vấn đề chậm và có thể bỏ lỡ các điểm vào và ra tối ưu.

  2. Kết hợp nhiều chỉ số làm tăng sự phức tạp và rủi ro của các tín hiệu mâu thuẫn.

  3. Có những rủi ro của việc phá vỡ không chính xác khi tính toán hỗ trợ và kháng cự một cách năng động.

  4. Việc dừng lỗ sau có thể thoát sớm trong xu hướng mạnh, không thể đi theo xu hướng.

  5. Các thông số đòi hỏi phải thử nghiệm và tối ưu hóa lặp đi lặp lại, các thông số không phù hợp ảnh hưởng tiêu cực đến hiệu suất.

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

  1. Kiểm tra các kết hợp tham số khác nhau để tối ưu hóa các khoảng thời gian MACD.

  2. giới thiệu nhiều chỉ số như Bollinger Bands, KDJ để phân tích đa chiều.

  3. Bao gồm nhiều yếu tố để đánh giá tính hợp lý của hỗ trợ và kháng cự.

  4. Nghiên cứu các cơ chế dừng lỗ tiên tiến hơn như dừng dựa trên thời gian hoặc dựa trên biến động.

  5. Thêm một mô-đun tối ưu hóa tự động để tối ưu hóa tham số tự động.

Tóm lại

Chiến lược này kết hợp MACD, RSI, SMA và các chỉ số khác để nắm bắt các tín hiệu đột phá trung bình chuyển động một cách cơ hội. Nó thuộc về các chiến lược giao dịch đột phá ngắn hạn điển hình. Có một số sự chậm trễ trong việc tạo tín hiệu của nó, nhưng độ chính xác có thể được cải thiện thông qua tối ưu hóa tham số. Nhìn chung, đây là một chiến lược với logic đơn giản và rõ ràng, dễ hiểu cho hầu hết, và đáng để thử nghiệm và tối ưu hóa thêm.


/*backtest
start: 2023-11-05 00:00:00
end: 2023-11-09 23:00:00
period: 1m
basePeriod: 1m
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/
// © onurenginogutcu

//@version=4
strategy("R19 STRATEGY", overlay=true, calc_on_every_tick=true , margin_long=100, margin_short=100 ,  process_orders_on_close=true )



sym = input(title="Symbol", type=input.symbol, defval="BINANCE:BTCUSDT" , group = "SYMBOL") 
timeFrame = input(title="Strategy Decision Time Frame", type = input.resolution ,  defval="60")

adxlen = input(14, title="ADX Smoothing" , group = "ADX")
dilen = input(14, title="ADX DI Length", group = "ADX")
adxemalenght = input(30, title="ADX EMA", group = "ADX")
adxconstant = input(19, title="ADX CONSTANT", group = "ADX")

fibvar = input (title = "Fibo Look Back Canles" , defval = 50 , minval = 0 , group = "FIBO MACD SMA")
smaLookback = input (title = "SMA Look Back Candles" , defval = 30 , minval = 0 , group = "FIBO MACD SMA")
MACDFast = input (title = "MACD Fast Lenght" , defval = 15 , minval = 0 , group = "FIBO MACD SMA")
MACDSlow = input (title = "MACD Slow Lenght" , defval = 30 , minval = 0 , group = "FIBO MACD SMA")
MACDSmooth = input (title = "MACD Signal Smoothing" , defval = 9 , minval = 0 , group = "FIBO MACD SMA")
MACDLookback = input (title = "MACD Look Back Candles" , defval = 100 , minval = 0 , group = "FIBO MACD SMA")

trailingStopLong = input (title = "Trailing Long Stop %" , defval = 2.0 , step = 0.1, group = "TP & SL") * 0.01
trailingStopShort = input (title = "Trailing Short Stop %" , defval = 2.0 , step = 0.1 , group = "TP & SL") * 0.01
LongTrailingProfitStart = input (title = "Long Profit Start %" , defval = 2.0 , step = 0.1 , group = "TP & SL") * 0.01
ShortTrailingProfitStart = input (title = "Short Profit Start %" , defval = 2.0 , step = 0.1, group = "TP & SL") * 0.01

lsl = input(title="Max Long Stop Loss (%)",
     minval=0.0, step=0.1, defval=3.0, group = "TP & SL") * 0.01
     
ssl = input(title="Max Short Stop Loss (%)",
     minval=0.0, step=0.1, defval=2.5, group = "TP & SL") * 0.01
     
longtp = input(title="Long Take Profit (%)",
     minval=0.0, step=0.1, defval=100, group = "TP & SL") * 0.01
     
shorttp = input(title="Short Take Profit (%)",
     minval=0.0, step=0.1, defval=100, group = "TP & SL") * 0.01
     
capperc = input(title="Capital Percentage to Invest (%)",
     minval=0.0, maxval=100, step=0.1, defval=95, group = "CAPITAL TO INVEST") * 0.01
     

symClose = security(sym, timeFrame, close)
symHigh = security(sym, timeFrame, high)
symLow = security(sym, timeFrame, low)

atr = atr (14) 

/////////adx code

dirmov(len) =>
	up = change(symHigh)
	down = -change(symLow)
	plusDM = na(up) ? na : (up > down and up > 0 ? up : 0)
	minusDM = na(down) ? na : (down > up and down > 0 ? down : 0)
	truerange = rma(tr, len)
	plus = fixnan(100 * rma(plusDM, len) / truerange)
	minus = fixnan(100 * rma(minusDM, len) / truerange)
	[plus, minus]
adx(dilen, adxlen) =>
	[plus, minus] = dirmov(dilen)
	sum = plus + minus
	adx = 100 * rma(abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen)
sig = adx(dilen, adxlen)
emasig = ema (sig , adxemalenght )


////////adx code over



i = ema (symClose , MACDFast) - ema (symClose , MACDSlow) 
r = ema (i , MACDSmooth)

sapust = highest (i , MACDLookback) * 0.729 
sapalt = lowest (i , MACDLookback) * 0.729  


simRSI = rsi (symClose , 50 ) 




fibtop = lowest (symLow , fibvar) + ((highest (symHigh , fibvar) - lowest (symLow , fibvar)) * 0.50)
fibbottom = lowest (symLow , fibvar) + ((highest (symHigh , fibvar) - lowest (symLow , fibvar)) * 0.50)





cond1 = 0
cond2 = 0
cond3 = 0
cond4 = 0


longCondition = crossover(i, r) and i < sapalt and sig > adxconstant and symClose < sma (symClose , smaLookback) and simRSI < sma (simRSI , 50) and symClose < fibbottom 
shortCondition = crossunder(i, r) and i > sapust and sig > adxconstant and  symClose > sma (symClose , smaLookback) and simRSI > sma (simRSI , 50) and symClose > fibtop 


//////////////////////probability long/short
if (crossover(i, r) and i < sapalt)
    cond1 := 35
else if (crossunder(i, r) and i > sapust)
    cond1 := -35
else
    cond1 := 0
    
if (symClose < sma (symClose , smaLookback))
    cond2 := 30
else if (symClose > sma (symClose , smaLookback))
    cond2 := -30
else
    cond2 := 0
    
if (simRSI < sma (simRSI , 50))
    cond3 := 25
else if (simRSI > sma (simRSI , 50))
    cond3 := -25
else
    cond3 := 0
    
if (symClose < fibbottom)
    cond4 := 10
else if (symClose > fibbottom)
    cond4 := -10
else
    cond4 := 0
    
probab = cond1 + cond2 + cond3 + cond4
////////////////////////////////////////////////////////////////

///////////////////////////////////////////STRATEGY ENTRIES AND STOP LOSSES /////
var startTrail = 0
var trailingLongPrice = 0.0
var trailingShortPrice = 0.0

if (longCondition and strategy.position_size == 0)
    strategy.entry("Long", strategy.long , qty = capperc * strategy.equity / close )

if (shortCondition and strategy.position_size == 0)
    strategy.entry("Short" , strategy.short , qty = capperc * strategy.equity / close )
    
    
if (strategy.position_size == 0)    
    trailingShortPrice := 0.0
    trailingLongPrice := 0.0  
    startTrail := 0
/////////////////////////////////strategy exit

if (strategy.position_size > 0 and close >= strategy.position_avg_price * (1 + LongTrailingProfitStart))
    startTrail := 1

if (strategy.position_size < 0 and close <= strategy.position_avg_price * (1 - ShortTrailingProfitStart))
    startTrail := -1
    



trailingLongPrice := if strategy.position_size > 0 and startTrail == 1
    stopMeasure = close * (1 - trailingStopLong)
    max (stopMeasure , trailingLongPrice [1])
else if strategy.position_size > 0 and startTrail == 0
    strategy.position_avg_price * (1 - lsl)


trailingShortPrice := if strategy.position_size < 0 and startTrail == -1
    stopMeasure = close * (1 + trailingStopShort)
    min (stopMeasure , trailingShortPrice [1])
else if strategy.position_size < 0 and startTrail == 0
    strategy.position_avg_price * (1 + ssl)




if (strategy.position_size > 0)
    strategy.exit("Exit Long", "Long", stop = trailingLongPrice , limit=strategy.position_avg_price*(1 + longtp))
 

if (strategy.position_size < 0)
    strategy.exit("Exit Short", "Short", stop = trailingShortPrice , limit=strategy.position_avg_price*(1 - shorttp))


////////////////////////vertical colouring signals
bgcolor(color=longCondition ? color.new (color.green , 70) : na)
bgcolor(color=shortCondition ? color.new (color.red , 70) : na)

plot (trailingLongPrice , color = color.green) ///long price trailing stop
plot (trailingShortPrice , color = color.red) /// short price trailing stop
plot (startTrail , color = color.yellow)
plot (probab , color = color.white) ////probability


Thêm nữa