Chiến lược tăng cường xu hướng định lượng nhiều lớp AO

AO EMA WF WA
Ngày tạo: 2024-12-05 15:01:48 sửa đổi lần cuối: 2024-12-05 15:01:48
sao chép: 3 Số nhấp chuột: 402
1
tập trung vào
1617
Người theo dõi

Chiến lược tăng cường xu hướng định lượng nhiều lớp AO

Tổng quan

Chiến lược này là một hệ thống giao dịch đa tầng dựa trên động lực và theo dõi xu hướng. Nó xác định nhiều cơ hội giao dịch có xác suất cao bằng cách kết hợp chỉ số Williams Shark, chỉ số Williams Split, chỉ số Magic Shock (AO) và chỉ số Moving Average (EMA). Chiến lược sử dụng cơ chế đầu tư phân tầng vốn, tăng dần khi xu hướng tăng lên, có thể giữ tối đa 5 vị trí cùng một lúc, mỗi vị trí sử dụng 10% vốn.

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

Chiến lược sử dụng nhiều cơ chế lọc để đảm bảo tính chính xác của hướng giao dịch. Đầu tiên, đánh giá xu hướng dài hạn thông qua EMA, chỉ tìm kiếm nhiều cơ hội khi giá nằm trên EMA. Tiếp theo, đánh giá xu hướng ngắn hạn thông qua sự kết hợp của chỉ số Williams Shark và Split, xác nhận xu hướng tăng lên khi đột phá Split trên xảy ra trên đường răng của cá mập. Cuối cùng, sau khi xác nhận xu hướng, chiến lược tìm kiếm chỉ số AO để thực hiện nhiều tín hiệu “bông” như là thời điểm cụ thể.

Lợi thế chiến lược

  1. Cơ chế lọc nhiều lớp có hiệu quả trong việc giảm nhiễu tín hiệu giả
  2. Khoa học quản lý tài chính, sử dụng phương pháp gia tăng dần dần
  3. Tính năng theo xu hướng cho phép nó nắm bắt các xu hướng lớn
  4. Không có điểm dừng cố định, nhưng đánh giá xu hướng kết thúc bằng các chỉ số kỹ thuật
  5. Hệ thống có khả năng cấu hình tốt, dễ dàng điều chỉnh các tham số theo các điều kiện thị trường khác nhau
  6. Kết quả khảo sát cho thấy có yếu tố lợi nhuận tốt và lợi nhuận trung bình.

Rủi ro chiến lược

  1. Các tín hiệu giả liên tục có thể xuất hiện trong thị trường bất ổn
  2. Một sự thoái lui lớn hơn có thể xảy ra khi xu hướng đảo ngược
  3. Điều kiện lọc nhiều lần có thể làm mất cơ hội giao dịch
  4. Trong quản lý tài chính, việc gia tăng liên tục có thể mang lại rủi ro khi biến động mạnh
  5. Lựa chọn tham số EMA có ảnh hưởng lớn đến hiệu suất chiến lược

Để giảm bớt những rủi ro này, chúng tôi khuyên bạn nên:

  • Tối ưu hóa các tham số trong các môi trường thị trường khác nhau
  • Xem xét thêm bộ lọc tỷ lệ dao động
  • Thiết lập các điều kiện gia tăng nghiêm ngặt hơn
  • Thiết lập giới hạn rút tối đa

Hướng tối ưu hóa chiến lược

  1. Tham gia ATR để lọc tỷ lệ dao động
  2. Thêm phân tích khối lượng giao dịch để cải thiện độ tin cậy của tín hiệu
  3. Phát triển cơ chế thích ứng cho các tham số động
  4. Cải thiện hệ thống ngăn chặn, thu lợi nhuận đúng lúc khi xu hướng giảm
  5. Thêm mô-đun nhận dạng trạng thái thị trường, sử dụng các tham số khác nhau trong các môi trường thị trường khác nhau

Tóm tắt

Đây là một chiến lược theo dõi xu hướng được thiết kế hợp lý, thông qua việc sử dụng nhiều chỉ số kỹ thuật kết hợp, trong khi đảm bảo tính an toàn, đạt được hiệu suất lợi nhuận tốt. Điểm sáng tạo của chiến lược là cơ chế xác nhận xu hướng nhiều cấp và phương pháp quản lý tiền theo cấp độ. Mặc dù có một số nơi cần tối ưu hóa, nhưng nói chung là một hệ thống giao dịch đáng thử.

Mã nguồn chiến lược
/*backtest
start: 2019-12-23 08:00:00
end: 2024-12-04 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Skyrexio

//@version=6
//_______ <licence>
strategy(title = "MultiLayer Awesome Oscillator Saucer Strategy [Skyrexio]", 
         shorttitle = "AO Saucer", 
         overlay = true, 
         format = format.inherit, 
         pyramiding = 5, 
         calc_on_order_fills = false, 
         calc_on_every_tick = false, 
         default_qty_type = strategy.percent_of_equity, 
         default_qty_value = 10, 
         initial_capital = 10000, 
         currency = currency.NONE,  
         commission_type = strategy.commission.percent, 
         commission_value = 0.1,
         slippage = 5,
         use_bar_magnifier = true)


//_______ <constant_declarations>
var const color skyrexGreen               = color.new(#2ECD99, 0)
var const color skyrexGray                = color.new(#F2F2F2, 0)
var const color skyrexWhite               = color.new(#FFFFFF, 0)


//________<variables declarations>
var int trend                             = 0
var float upFractalLevel                  = na
var float upFractalActivationLevel        = na
var float downFractalLevel                = na
var float downFractalActivationLevel      = na
var float saucerActivationLevel           = na
bool highCrossesUpfractalLevel            = ta.crossover(high, upFractalActivationLevel)
bool lowCrossesDownFractalLevel           = ta.crossunder(low, downFractalActivationLevel)
var int signalsQtyInRow                   = 0


//_______ <inputs>
// Trading bot settings
sourceUuid               = input.string(title = "sourceUuid:", defval = "yourBotSourceUuid", group = "🤖Trading Bot Settings🤖")
secretToken              = input.string(title = "secretToken:", defval = "yourBotSecretToken", group = "🤖Trading Bot Settings🤖")


// Trading period settings
lookBackPeriodStart      = input(title = "Trade Start Date/Time", defval = timestamp('2023-01-01T00:00:00'), group = "🕐Trading Period Settings🕐")
lookBackPeriodStop       = input(title = "Trade Stop Date/Time", defval = timestamp('2025-01-01T00:00:00'), group = "🕐Trading Period Settings🕐")


// Strategy settings
EMaLength                = input.int(100, minval = 10, step = 10, title = "EMA Length", group = "📈Strategy settings📈")


//_______ <function_declarations>
//@function       Used to calculate Simple moving average for Alligator
//@param src      Sourse for smma Calculations
//@param length   Number of bars to calculate smma
//@returns        The calculated smma value 
smma(src, length) =>
    var float smma = na
    sma_value = ta.sma(src, length)
    smma := na(smma) ? sma_value : (smma * (length - 1) + src) / length
    smma

//_______ <calculations>


//Upfractal calculation 
upFractalPrice = ta.pivothigh(2, 2)
upFractal = not na(upFractalPrice) 


//Downfractal calculation 
downFractalPrice = ta.pivotlow(2, 2)
downFractal = not na(downFractalPrice)


//Calculating Alligator's teeth 
teeth = smma(hl2, 8)[5]


//Calculating upfractal and downfractal levels
if upFractal 
    upFractalLevel := upFractalPrice
else
    upFractalLevel := upFractalLevel[1]


if downFractal
    downFractalLevel := downFractalPrice
else
    downFractalLevel := downFractalLevel[1]


//Calculating upfractal activation level, downfractal activation level to approximate the trend and this current trend 
if upFractalLevel > teeth
    upFractalActivationLevel := upFractalLevel

if highCrossesUpfractalLevel
    trend := 1
    upFractalActivationLevel := na 
    downFractalActivationLevel := downFractalLevel


if downFractalLevel < teeth
    downFractalActivationLevel := downFractalLevel

if lowCrossesDownFractalLevel
    trend := -1
    downFractalActivationLevel := na 
    upFractalActivationLevel := upFractalLevel


if trend == 1
    upFractalActivationLevel := na

if trend == -1
    downFractalActivationLevel := na


//Calculating filter EMA 
filterEMA = ta.ema(close, EMaLength)


//Сalculating AO saucer signal
ao = ta.sma(hl2,5) - ta.sma(hl2,34)
diff = ao - ao[1]
saucerSignal = ao > ao[1] and ao[1] < ao[2] and ao > 0 and ao[1] > 0 and ao[2] > 0 and trend == 1 and close > filterEMA


//Calculating sauser activation level
if saucerSignal
    saucerActivationLevel := high    
else 
    saucerActivationLevel := saucerActivationLevel[1]


if not na(saucerActivationLevel[1]) and high < saucerActivationLevel[1] and diff > 0
    saucerActivationLevel := high
    saucerSignal := true
    

if (high > saucerActivationLevel[1] and not na(saucerActivationLevel)) or diff < 0
    saucerActivationLevel := na 


//Calculating number of valid saucer signal in current trading cycle 
if saucerSignal and not saucerSignal[1]
    signalsQtyInRow := signalsQtyInRow + 1


if not na(saucerActivationLevel[1]) and diff < 0 and na(saucerActivationLevel) and not (strategy.opentrades[1] <= strategy.opentrades - 1)
    signalsQtyInRow := signalsQtyInRow - 1


if trend == -1 and trend[1] == 1 
    signalsQtyInRow := 0


//_______ <strategy_calls>
//Defining trade close condition
closeCondition =  trend[1] == 1 and trend == -1


//Cancel stop buy order if current Awesome oscillator column lower, than prevoius 
if diff < 0 
    strategy.cancel_all()

//Strategy entry
if (signalsQtyInRow == 1 and not na(saucerActivationLevel)) 
    strategy.entry(id = "entry1", direction = strategy.long, stop = saucerActivationLevel + syminfo.mintick,  alert_message = '{\n"base": "' + syminfo.basecurrency + '",\n"quote": "' + syminfo.currency + '",\n"position": "entry1",\n"price": "' + str.tostring(close) + '",\n"sourceUuid": "' + sourceUuid + '",\n"secretToken": "' + secretToken + '",\n"timestamp": "' + str.tostring(timenow) + '"\n}')

if (signalsQtyInRow == 2 and not na(saucerActivationLevel)) 
    strategy.entry(id = "entry2", direction = strategy.long, stop = saucerActivationLevel + syminfo.mintick,  alert_message = '{\n"base": "' + syminfo.basecurrency + '",\n"quote": "' + syminfo.currency + '",\n"position": "entry2",\n"price": "' + str.tostring(close) + '",\n"sourceUuid": "' + sourceUuid + '",\n"secretToken": "' + secretToken + '",\n"timestamp": "' + str.tostring(timenow) + '"\n}')

if (signalsQtyInRow == 3 and not na(saucerActivationLevel)) 
    strategy.entry(id = "entry3", direction = strategy.long, stop = saucerActivationLevel + syminfo.mintick,  alert_message = '{\n"base": "' + syminfo.basecurrency + '",\n"quote": "' + syminfo.currency + '",\n"position": "entry3",\n"price": "' + str.tostring(close) + '",\n"sourceUuid": "' + sourceUuid + '",\n"secretToken": "' + secretToken + '",\n"timestamp": "' + str.tostring(timenow) + '"\n}')

if (signalsQtyInRow == 4 and not na(saucerActivationLevel)) 
    strategy.entry(id = "entry4", direction = strategy.long, stop = saucerActivationLevel + syminfo.mintick,  alert_message = '{\n"base": "' + syminfo.basecurrency + '",\n"quote": "' + syminfo.currency + '",\n"position": "entry4",\n"price": "' + str.tostring(close) + '",\n"sourceUuid": "' + sourceUuid + '",\n"secretToken": "' + secretToken + '",\n"timestamp": "' + str.tostring(timenow) + '"\n}')

if (signalsQtyInRow == 5 and not na(saucerActivationLevel)) 
    strategy.entry(id = "entry5", direction = strategy.long, stop = saucerActivationLevel + syminfo.mintick,  alert_message = '{\n"base": "' + syminfo.basecurrency + '",\n"quote": "' + syminfo.currency + '",\n"position": "entry5",\n"price": "' + str.tostring(close) + '",\n"sourceUuid": "' + sourceUuid + '",\n"secretToken": "' + secretToken + '",\n"timestamp": "' + str.tostring(timenow) + '"\n}')

//Strategy exit 
if (closeCondition)
    strategy.close_all(alert_message = '{\n"base": "' + syminfo.basecurrency + '",\n"quote": "' + syminfo.currency + '",\n"position": "close",\n"price": "' + str.tostring(close) + '",\n"sourceUuid": "' + sourceUuid + '",\n"secretToken": "' + secretToken + '",\n"timestamp": "' + str.tostring(timenow) + '"\n}')


//_______ <visuals>
//Plotting shapes for adding to current long trades
gradPercent = if strategy.opentrades == 2
    90
else if strategy.opentrades == 3
    80
else if strategy.opentrades == 4
    70
else if strategy.opentrades == 5
    60

pricePlot = plot(close, title="Price", color=color.new(color.blue, 100))
teethPlot = plot(strategy.opentrades > 1 ? teeth : na, title="Teeth", color= skyrexGreen, style=plot.style_linebr, linewidth = 2)
fill(pricePlot, teethPlot, color = color.new(skyrexGreen, gradPercent))
if strategy.opentrades != 1 and  strategy.opentrades[1] == strategy.opentrades - 1
    label.new(bar_index, teeth, style = label.style_label_up, color = color.lime, size = size.tiny, text="Buy More", textcolor = color.black, text_formatting = text.format_bold)


//_______ <alerts>