Chiến lược scalping trong ngày điên rồ với sự kết hợp của hai chỉ báo


Ngày tạo: 2023-12-01 14:47:57 sửa đổi lần cuối: 2023-12-01 14:47:57
sao chép: 0 Số nhấp chuột: 857
1
tập trung vào
1619
Người theo dõi

Chiến lược scalping trong ngày điên rồ với sự kết hợp của hai chỉ báo

Tổng quan

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.

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

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:

  1. Chỉ số TMO xuất hiện nhiều tín hiệu, tức là giá lệch hướng lên và chỉ số AMA xuất hiện nhiều giá trị cực đại
  2. Chỉ số TMO xuất hiện tín hiệu giảm giá, tức là giá biến ngược xuống và chỉ số AMA xuất hiện giá giảm giá
  3. Trong khi đó, yêu cầu số lượng thực thể của 3 đường K gần nhất ngày càng lớn.

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.

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

Chiến lược này có một số lợi thế:

  1. 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.

  2. 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.

  3. 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ố.

  4. 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.

Rủi ro chiến lược

Chiến lược này có những rủi ro:

  1. 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.

  2. 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.

  3. 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.

Hướng tối ưu hóa

Chiến lược này cũng có thể được tối ưu hóa theo các hướng sau:

  1. 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.

  2. 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.

  3. 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ố.

  4. 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.

Tóm tắt

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.

Mã nguồn chiến lược
/*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)