
Chiến lược này kết hợp hai chỉ số công nghệ chính là chỉ số Omaha và chỉ số Apollo để thực hiện giao dịch hai đường hai đường. Ý tưởng cơ bản của nó là tìm kiếm cơ hội thả giá đường ngắn khi xu hướng đường dài trung bình được đánh giá là nhiều đầu và xây dựng nhiều đầu khi xu hướng đường dài trung bình được đánh giá là không.
Chiến lược này sử dụng hai đường trung bình di chuyển 50 ngày và 200 ngày để đánh giá xu hướng đường dài trung bình, đường 50 ngày trên đường 200 ngày cho thấy xu hướng đa đầu, ngược lại, là xu hướng không đầu.
Sau đó, chiến lược này sử dụng Omegle để định vị cơ hội đảo ngược giá đường ngắn. Omegle bao gồm đường% K và đường% D, kết quả của chỉ số RSI được xử lý bằng đường trung bình di chuyển đơn giản.
Ngoài ra, để lọc thêm các cơ hội báo cáo sai, chiến lược này cũng đưa ra chỉ số Apollo. Chỉ số Apollo hiển thị thông tin về điểm cực của giá trị K-line% D. Khi% K-line hình thành một điểm thấp mới, có nghĩa là phản xạ yếu; khi hình thành một điểm cao mới, có nghĩa là phản xạ mạnh. Kết hợp với tín hiệu của chỉ số Omaha, điều này có thể nâng cao thêm độ chính xác của sự tham gia.
Cụ thể, trong xu hướng đa đầu, chiến lược này sẽ kiểm tra thông tin cao điểm mới để xác nhận sức mạnh của đợt phục hồi khi chỉ số OMA hiển thị vùng bán tháo dưới khu vực đa đầu; trong xu hướng đầu tròn, chiến lược này sẽ kiểm tra thông tin thấp điểm mới để xác nhận sức mạnh của đợt phục hồi khi chỉ số OMA hiển thị vùng mua tháo trên khu vực đa đầu.
Thông qua quá trình trên, chiến lược này tận dụng lợi thế của phán đoán xu hướng đường dài trung và chỉ số đảo ngược đường ngắn để xây dựng một hệ thống giao dịch hai đường hai đường nhiều đường không ổn định.
Chiến lược này kết hợp sự phán đoán xu hướng và chỉ số đảo ngược, kết hợp lợi thế của giao dịch theo xu hướng và giao dịch ngược, tạo ra một khung giao dịch hỗn hợp ổn định.
Bằng cách lọc hai chỉ số, tỷ lệ báo cáo sai có thể giảm và tín hiệu đáng tin cậy được nâng cao.
Các tham số chiến lược đơn giản, dễ hiểu và tối ưu hóa, phù hợp cho giao dịch định lượng.
Chiến lược này hoạt động ổn định, có tỷ lệ thắng và thua tốt hơn.
Sử dụng phương pháp hai đường ray đa không, bạn có thể tiếp tục có cơ hội giao dịch, không bị giới hạn trong một hướng duy nhất.
Là một chiến lược đảo ngược, khi xu hướng thay đổi, có thể tạo ra một loạt các tổn thất liên tục.
Chiến lược này đòi hỏi nhiều sự kiểm soát cảm xúc của nhà giao dịch và phải chịu một tỷ lệ rút tiền nhất định.
Một số tham số như chu kỳ trung bình di chuyển có một số chủ quan, cần xác định tham số phù hợp thông qua tối ưu hóa phản hồi.
Chỉ số Omicron và chỉ số Apollo đều nhạy cảm với sự biến động bất thường và có thể bị hỏng trong trường hợp cực đoan.
Chiến lược này phù hợp hơn với môi trường thị trường biến động và có thể giảm hiệu quả trong các tình huống có xu hướng rõ ràng.
Có thể giới thiệu bộ lọc xu hướng bằng cách điều chỉnh chu kỳ trung bình di chuyển một cách thích hợp và tham gia chiến lược dừng lỗ để tránh rủi ro. Khi thị trường đi vào xu hướng rõ ràng, bạn có thể cân nhắc tạm dừng chiến lược và tránh giao dịch trong môi trường đó.
Kiểm tra các kết hợp tham số khác nhau để có được thiết lập tham số tốt hơn. Ví dụ, bạn có thể thử sử dụng các chỉ số như trung bình di chuyển trơn EWMA.
Thêm các chỉ số như Volume hoặc BV để đánh giá lệch, có thể xác minh thêm độ tin cậy của tín hiệu.
Thêm chỉ số hoảng loạn như VIX làm chỉ số giám sát để giảm vị trí khi thị trường hoảng loạn.
Tối ưu hóa chiến lược dừng lỗ, ví dụ như có thể sử dụng phương pháp dừng động như dừng ATR.
Lập các thuật toán học máy để thiết lập tham số tối ưu hóa động.
Thêm mô hình đa yếu tố để nâng cao chất lượng tín hiệu.
Chiến lược này nói chung là một chiến lược giao dịch định lượng ổn định và hiệu quả. Nó kết hợp với phán đoán xu hướng và chỉ số đảo ngược, sử dụng phương pháp xác minh kép của chỉ số Omaha và chỉ số Apollo, có thể phát hiện hiệu quả cơ hội đảo ngược giá đường ngắn.
/*backtest
start: 2023-10-25 00:00:00
end: 2023-10-28 00:00:00
period: 5m
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/
// © PtGambler
//@version=5
strategy("2 EMA + Stoch RSI + ATR [Pt]", shorttitle = "2EMA+Stoch+ATR", overlay=true, initial_capital = 10000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, calc_on_order_fills = false, max_bars_back = 500)
// ********************************** Trade Period / Strategy Setting **************************************
startY = input(title='Start Year', defval=2011, group = "Backtesting window")
startM = input.int(title='Start Month', defval=1, minval=1, maxval=12, group = "Backtesting window")
startD = input.int(title='Start Day', defval=1, minval=1, maxval=31, group = "Backtesting window")
finishY = input(title='Finish Year', defval=2050, group = "Backtesting window")
finishM = input.int(title='Finish Month', defval=12, minval=1, maxval=12, group = "Backtesting window")
finishD = input.int(title='Finish Day', defval=31, minval=1, maxval=31, group = "Backtesting window")
timestart = timestamp(startY, startM, startD, 00, 00)
timefinish = timestamp(finishY, finishM, finishD, 23, 59)
// ******************************************************************************************
group_ema = "EMA"
group_stoch = "Stochastic RSI"
group_atr = "ATR Stoploss Finder"
// ----------------------------------------- 2 EMA -------------------------------------
ema1_len = input.int(50, "EMA Length 1", group = group_ema)
ema2_len = input.int(200, "EMA Length 2", group = group_ema)
ema1 = ta.ema(close, ema1_len)
ema2 = ta.ema(close, ema2_len)
plot(ema1, "ema1", color.white, linewidth = 2)
plot(ema2, "ema2", color.orange, linewidth = 2)
ema_bull = ema1 > ema2
ema_bear = ema1 < ema2
// -------------------------------------- Stochastic RSI -----------------------------
smoothK = input.int(3, "K", minval=1, group = group_stoch)
smoothD = input.int(3, "D", minval=1, group = group_stoch)
lengthRSI = input.int(14, "RSI Length", minval=1, group = group_stoch)
lengthStoch = input.int(14, "Stochastic Length", minval=1, group = group_stoch)
src = close
rsi1 = ta.rsi(src, lengthRSI)
k = ta.sma(ta.stoch(rsi1, rsi1, rsi1, lengthStoch), smoothK)
d = ta.sma(k, smoothD)
var trigger_stoch_OB = k > 80
var trigger_stoch_OS = k < 20
stoch_crossdown = ta.crossunder(k, d)
stoch_crossup = ta.crossover(k, d)
P_hi = ta.pivothigh(k,1,1)
P_lo = ta.pivotlow(k,1,1)
previous_high = ta.valuewhen(P_hi, k, 1)
previous_low = ta.valuewhen(P_lo, k, 1)
recent_high = ta.valuewhen(P_hi, k, 0)
recent_low = ta.valuewhen(P_lo, k, 0)
// --------------------------------------- ATR stop loss finder ------------------------
length = input.int(title='Length', defval=14, minval=1, group = group_atr)
smoothing = input.string(title='Smoothing', defval='EMA', options=['RMA', 'SMA', 'EMA', 'WMA'], group = group_atr)
m = input.float(0.7, 'Multiplier', step = 0.1, group = group_atr)
src1 = input(high, "Source for upper band", group = group_atr)
src2 = input(low, "Source for lower band", group = group_atr)
showatr = input.bool(true, 'Show ATR Bands', group = group_atr)
collong = input.color(color.purple, 'Long ATR SL', inline='1', group = group_atr)
colshort = input.color(color.purple, 'Short ATR SL', inline='2', group = group_atr)
ma_function(source, length) =>
if smoothing == 'RMA'
ta.rma(source, length)
else
if smoothing == 'SMA'
ta.sma(source, length)
else
if smoothing == 'EMA'
ta.ema(source, length)
else
ta.wma(source, length)
a = ma_function(ta.tr(true), length) * m
up = ma_function(ta.tr(true), length) * m + src1
down = src2 - ma_function(ta.tr(true), length) * m
p1 = plot(showatr ? up : na, title='ATR Short Stop Loss', color=colshort)
p2 = plot(showatr ? down : na, title='ATR Long Stop Loss', color=collong)
// ******************************* Profit Target / Stop Loss *********************************************
RR = input.float(2.0, "Reward to Risk ratio (X times SL)", step = 0.1, group = "Profit Target")
var L_PT = 0.0
var S_PT = 0.0
var L_SL = 0.0
var S_SL = 0.0
BSLE = ta.barssince(strategy.opentrades.entry_bar_index(0) == bar_index)
if strategy.position_size > 0 and BSLE == 1
L_PT := close + (close-down)*RR
L_SL := L_SL[1]
S_PT := close - (up - close)*RR
S_SL := up
else if strategy.position_size < 0 and BSLE == 1
S_PT := close - (up - close)*RR
S_SL := S_SL[1]
L_PT := close + (close-down)*RR
L_SL := down
else if strategy.position_size != 0
L_PT := L_PT[1]
S_PT := S_PT[1]
else
L_PT := close + (close-down)*RR
L_SL := down
S_PT := close - (up - close)*RR
S_SL := up
entry_line = plot(strategy.position_size != 0 ? strategy.opentrades.entry_price(0) : na, "Entry Price", color.white, linewidth = 1, style = plot.style_linebr)
L_PT_line = plot(strategy.position_size > 0 and BSLE > 0 ? L_PT : na, "L PT", color.green, linewidth = 2, style = plot.style_linebr)
S_PT_line = plot(strategy.position_size < 0 and BSLE > 0 ? S_PT : na, "S PT", color.green, linewidth = 2, style = plot.style_linebr)
L_SL_line = plot(strategy.position_size > 0 and BSLE > 0 ? L_SL : na, "L SL", color.red, linewidth = 2, style = plot.style_linebr)
S_SL_line = plot(strategy.position_size < 0 and BSLE > 0 ? S_SL : na, "S SL", color.red, linewidth = 2, style = plot.style_linebr)
fill(L_PT_line, entry_line, color = color.new(color.green,90))
fill(S_PT_line, entry_line, color = color.new(color.green,90))
fill(L_SL_line, entry_line, color = color.new(color.red,90))
fill(S_SL_line, entry_line, color = color.new(color.red,90))
// ---------------------------------- strategy setup ------------------------------------------------------
var L_entry_trigger1 = false
var S_entry_trigger1 = false
L_entry_trigger1 := ema_bull and close < ema1 and k < 20 and strategy.position_size == 0
S_entry_trigger1 := ema_bear and close > ema1 and k > 80 and strategy.position_size == 0
L_entry1 = L_entry_trigger1[1] and stoch_crossup and recent_low > previous_low
S_entry1 = S_entry_trigger1[1] and stoch_crossdown and recent_high < previous_high
//debugging
plot(L_entry_trigger1[1]?1:0, "L Entry Trigger")
plot(stoch_crossup?1:0, "Stoch Cross Up")
plot(recent_low > previous_low?1:0, "Higher low")
plot(S_entry_trigger1[1]?1:0, "S Entry Trigger")
plot(stoch_crossdown?1:0, "Stoch Cross down")
plot(recent_high < previous_high?1:0, "Lower high")
if L_entry1
strategy.entry("Long", strategy.long)
if S_entry1
strategy.entry("Short", strategy.short)
strategy.exit("Exit Long", "Long", limit = L_PT, stop = L_SL, comment_profit = "Exit Long, PT hit", comment_loss = "Exit Long, SL hit")
strategy.exit("Exit Short", "Short", limit = S_PT, stop = S_SL, comment_profit = "Exit Short, PT hit", comment_loss = "Exit Short, SL hit")
//resetting triggers
L_entry_trigger1 := L_entry_trigger1[1] ? L_entry1 or ema_bear or S_entry1 ? false : true : L_entry_trigger1
S_entry_trigger1 := S_entry_trigger1[1] ? S_entry1 or ema_bull or L_entry1 ? false : true : S_entry_trigger1
//Trigger zones
bgcolor(L_entry_trigger1 ? color.new(color.green ,90) : na)
bgcolor(S_entry_trigger1 ? color.new(color.red,90) : na)