
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.
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ể.
Để giảm bớt những rủi ro này, chúng tôi khuyên bạn nên:
Đâ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ử.
/*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>