
Chiến lược này kết hợp các tín hiệu mua và bán của hai chỉ số TMO và AMA được phát triển bởi LuxAlgo, để nắm bắt cơ hội bắt đầu xu hướng trong việc sắp xếp xung đột. Nó sẽ thực hiện thêm lệnh nhàn rỗi sau khi đáp ứng nhiều điều kiện như tín hiệu mua và bán của chỉ số TMO, cực điểm mua và bán của chỉ số AMA, khối lượng thực thể K dần lớn hơn.
Chỉ số TMO phản ánh động thái giá. Nó thuộc loại chỉ số biến động, có thể phát ra tín hiệu giao dịch khi có sự lệch giá. Chỉ số AMA là một chỉ số trung bình di chuyển trơn. Nó hiển thị một phạm vi biến động giá, thể hiện hiện quá mua quá bán khi giá gần lên xuống.
Lý luận chính của chiến lược này là: Chỉ số TMO có thể phản ánh xu hướng giá từ xa để cung cấp tín hiệu giao dịch, chỉ số AMA có thể hiển thị khu vực giá có thể đảo ngược, đồng thời kết hợp với khối lượng thực thể K-line được phóng to để xác nhận xu hướng bắt đầu. Do đó, sự kết hợp của chúng có thể làm tăng tỷ lệ thành công của giao dịch. Cụ thể, chiến lược sẽ mở lỗ hoặc lỗ khi:
Do đó, nó giải quyết được vấn đề tín hiệu giả do chỉ số đơn gây ra. Phương pháp dừng lỗ chọn giá cao nhất hoặc thấp nhất gần nhất trong đường N gốc K để kiểm soát rủi ro tốt hơn.
Chiến lược này có một số lợi thế:
Kết hợp các chỉ số, tăng độ chính xác của tín hiệu. Chỉ số TMO và chỉ số AMA xác nhận lẫn nhau, có thể làm giảm tín hiệu giả, do đó tăng độ chính xác của tín hiệu.
Nhiều điều kiện kết hợp, bắt đầu xu hướng. Các điều kiện khác nhau như tín hiệu chỉ số TMO, cực điểm chỉ số AMA và K-line thực thể tăng cường được thiết lập bởi chiến lược, có thể bắt kịp thời điểm bắt đầu xu hướng, đây là mục tiêu của chiến lược Scalping.
Kiểm soát rủi ro bằng cách dừng K-line. Sử dụng giá cao nhất gần đây nhất và giá thấp nhất của K-line làm phương pháp dừng lỗ, có thể kiểm soát rủi ro của mỗi đơn vị tốt hơn. Đồng thời, không đảo ngược rủi ro bị tụt hậu do tính toán lại chỉ số.
Chiến lược này chỉ sử dụng hai chỉ số để thực hiện một chiến lược Scalping hoàn chỉnh hơn, không phức tạp, logic đơn giản và rõ ràng. Và dựa trên kết quả ví dụ, chiến lược này đã đạt được lợi nhuận tốt.
Chiến lược này có những rủi ro:
Thường xuyên tham gia vào rủi ro. Là một chiến lược Scalping, thời gian nắm giữ của nó không dài, nếu chi phí giao dịch cao, sẽ ảnh hưởng đến lợi nhuận.
K-line Stop Loss là một rủi ro quá quyết liệt. Việc sử dụng giá thấp nhất gần đây nhất như một phương pháp dừng có thể sẽ rất quyết liệt, không thể lọc hoàn toàn tiếng ồn thị trường, làm tăng khả năng dừng được kích hoạt.
Rủi ro khó khăn trong việc tối ưu hóa tham số. Chiến lược liên quan đến nhiều tham số, tìm ra sự kết hợp tham số tốt nhất có thể khó khăn hơn.
Chiến lược này cũng có thể được tối ưu hóa theo các hướng sau:
Thêm thêm các chỉ số lọc, chẳng hạn như khối lượng giao dịch thị trường, có thể lọc ra một số tín hiệu giả và cải thiện chất lượng tín hiệu hơn nữa.
Cố gắng thêm các điều kiện lọc trên phương thức dừng để tránh dừng quá quyết liệt. Ví dụ: chờ một vài đường K xác nhận trước khi kích hoạt dừng, sau đó dừng.
Tối ưu hóa tham số để tìm ra sự kết hợp tốt nhất của các tham số chỉ số. Điều này có thể sẽ lọc ra nhiều tiếng ồn hơn, tăng tỷ lệ chiến thắng chiến lược. Các tham số được tối ưu hóa chính là chiều dài chỉ số TMO, chiều dài chỉ số AMA và nhân số.
Cố gắng thử nghiệm và thực hiện trên các loại và chu kỳ thời gian khác nhau để tìm ra loại và chu kỳ giao dịch phù hợp nhất với logic của chiến lược.
Chiến lược này sử dụng các tín hiệu giao dịch kết hợp các chỉ số TMO và chỉ số AMA để tìm kiếm thời điểm bắt đầu xu hướng trong tình huống biến động. Nó có độ chính xác tín hiệu cao, nắm bắt xu hướng sớm và kiểm soát rủi ro. Sau khi tối ưu hóa các tham số và quy tắc hơn nữa, chiến lược này có thể trở thành chiến lược Scalping trong ngày có giá trị thực tế rất mạnh.
/*backtest
start: 2023-11-23 00:00:00
end: 2023-11-30 00:00:00
period: 10m
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/
// © Kaspricci
//@version=5
strategy("TradeIQ - Crazy Scalping Trading Strategy [Kaspricci]", overlay=true, initial_capital = 1000, currency = currency.USD)
headlineTMO = "TMO Settings"
tmoLength = input.int(7, "TMO Length", minval = 1, group = headlineTMO)
tmoSource = input.source(close, "TMO Source", group = headlineTMO)
// calculate values
osc = ta.mom(ta.sma(ta.sma(tmoSource, tmoLength), tmoLength), tmoLength)
// determine color of historgram
oscColor = osc > osc[1] and osc > 0 ? #00c42b : osc < osc[1] and osc > 0 ? #4ee567 : osc < osc[1] and osc < 0 ? #ff441f : osc > osc[1] and osc < 0 ? #c03920 : na
// plot histogram
//plot(osc, "OSC", oscColor, linewidth = 3, style = plot.style_histogram)
// conditon to find highs and lows
up = ta.highest(tmoSource, tmoLength)
dn = ta.lowest(tmoSource, tmoLength)
// define conditions to be used for finding divergence
phosc = ta.crossunder(ta.change(osc), 0)
plosc = ta.crossover (ta.change(osc), 0)
// test for divergence
bear = osc > 0 and phosc and ta.valuewhen(phosc,osc,0) < ta.valuewhen(phosc,osc,1) and ta.valuewhen(phosc,up,0) > ta.valuewhen(phosc,up,1) ? 1 : 0
bull = osc < 0 and plosc and ta.valuewhen(plosc,osc,0) > ta.valuewhen(plosc,osc,1) and ta.valuewhen(plosc,dn,0) < ta.valuewhen(plosc,dn,1) ? 1 : 0
// -------------------------------------------------------------------------------------------------------------
headlineAMA = "AMA Settings"
amaSource = input.source(defval = close, title = "AMA Source", group = headlineAMA)
amaLength = input.int(defval = 50, title = "AMA Length", minval = 2, group = headlineAMA)
amaMulti = input.float(defval = 2.0, title = "Factor", minval = 1)
amaShowCd = input(defval = true , title = "As Smoothed Candles")
amaShowEx = input(defval = true, title = "Show Alternating Extremities")
amaAlpha = input.float(1.0, "Lag", minval=0, step=.1, tooltip='Control the lag of the moving average (higher = more lag)', group= 'AMA Kernel Parameters')
amaBeta = input.float(0.5, "Overshoot", minval=0, step=.1, tooltip='Control the overshoot amplitude of the moving average (higher = overshoots with an higher amplitude)', group='AMA Kernel Parameters')
// -------------------------------------------------------------------------------------------------------------
headlineSL = "Stop Loss Settings"
slLength = input.int(defval = 10, title = "SL Period", minval = 1, group = headlineSL, tooltip = "Number of bars for swing high / low")
// -------------------------------------------------------------------------------------------------------------
var b = array.new_float(0)
var float x = na
if barstate.isfirst
for i = 0 to amaLength - 1
x := i / (amaLength - 1)
w = math.sin(2 * 3.14159 * math.pow(x, amaAlpha)) * (1 - math.pow(x, amaBeta))
array.push(b, w)
// local function to filter the source
filter(series float x) =>
sum = 0.
for i = 0 to amaLength - 1
sum := sum + x[i] * array.get(b,i)
sum / array.sum(b)
// apply filter function on source series
srcFiltered = filter(amaSource)
deviation = ta.sma(math.abs(amaSource - srcFiltered), amaLength) * amaMulti
upper = srcFiltered + deviation
lower = srcFiltered - deviation
//----
crossHigh = ta.cross(high, upper)
crossLow = ta.cross(low, lower)
var os = 0
os := crossHigh ? 1 : crossLow ? 0 : os[1]
ext = os * upper + (1 - os) * lower
//----
os_css = ta.rsi(srcFiltered, amaLength) / 100
extColor = os == 1 ? #30FF85 : #ff1100
plot(srcFiltered, "MA", amaShowCd ? na : color.black, 2, editable = false)
plot(amaShowEx ? ext : na, "Extremities", ta.change(os) ? na : extColor, 2, editable=false)
// handle smoothed candles
var float h = na
var float l = na
var float c = na
var float body = na
if amaShowCd
h := filter(high)
l := filter(low)
c := filter(amaSource)
body := math.abs(math.avg(c[1], c[2]) - c)
ohlc_os = ta.rsi(c, amaLength) / 100
plotcandle(math.avg(c[1], c[2]), h, l, c, "Smooth Candles", #434651, bordercolor = na, editable = false, display = amaShowCd ? display.all : display.none)
// -------------------------------------------------------------------------------------------------------------
plotshape(bull ? ext : na, "Bullish Circle", shape.circle, location.absolute, color = #00c42b, size=size.tiny)
plotshape(bear ? ext : na, "Bearish Circle", shape.circle, location.absolute, color = #ff441f, size=size.tiny)
plotshape(bull ? ext : na, "Bullish Label", shape.labeldown, location.absolute, color = #00c42b, text="Buy", textcolor=color.white, size=size.tiny)
plotshape(bear ? ext : na, "Bearish Label", shape.labelup, location.absolute, color = #ff441f, text="Sell", textcolor=color.white, size=size.tiny)
// -------------------------------------------------------------------------------------------------------------
candleSizeIncreasing = body[2] < body[1] and body[1] < body[0]
longEntryCond = os == 1 and bull
shortEntryCond = os == 0 and bear
longEntry = strategy.opentrades == 0 and candleSizeIncreasing and not candleSizeIncreasing[1] and ta.barssince(longEntryCond) < ta.barssince(os == 0) and ta.barssince(longEntryCond) < ta.barssince(bear)
shortEntry = strategy.opentrades == 0 and candleSizeIncreasing and not candleSizeIncreasing[1] and ta.barssince(shortEntryCond) < ta.barssince(os == 1) and ta.barssince(shortEntryCond) < ta.barssince(bull)
longExit = strategy.opentrades > 0 and strategy.position_size > 0 and (bear or os == 0)
shortExit = strategy.opentrades > 0 and strategy.position_size < 0 and (bull or os == 1)
recentSwingHigh = ta.highest(high, slLength) // highest high of last candles
recentSwingLow = ta.lowest(low, slLength) // lowest low of recent candles
bgcolor(longEntry ? color.rgb(76, 175, 79, 90) : na)
bgcolor(shortEntry ? color.rgb(255, 82, 82, 90) : na)
slLong = (close - recentSwingLow) / syminfo.mintick // stop loss in ticks
slShort = (recentSwingHigh - close) / syminfo.mintick // stop loss in ticks
newOrderID = str.tostring(strategy.closedtrades + strategy.opentrades + 1)
curOrderID = str.tostring(strategy.closedtrades + strategy.opentrades)
alertMessageForEntry = "Trade {0} - New {1} Entry at price: {2} with stop loss at: {3}"
if (longEntry)
alertMessage = str.format(alertMessageForEntry, newOrderID, "Long", close, recentSwingLow)
strategy.entry(newOrderID, strategy.long, alert_message = alertMessage)
strategy.exit("Stop Loss Long", newOrderID, loss = slLong, alert_message = "Stop Loss for Trade " + newOrderID)
if(longExit)
strategy.close(curOrderID, alert_message = "Close Trade " + curOrderID)
if (shortEntry)
alertMessage = str.format(alertMessageForEntry, newOrderID, "Short", close, recentSwingLow)
strategy.entry(newOrderID, strategy.short, alert_message = alertMessage)
strategy.exit("Stop Loss Short", newOrderID, loss = slShort, alert_message = "Stop Loss for Trade " + newOrderID)
if(shortExit)
strategy.close(curOrderID, alert_message = "Close Trade " + curOrderID)