Chiến lược giao dịch theo dõi động lực

Tác giả:ChaoZhang, Ngày: 2023-12-20 16:06:26
Tags:

img

Tổng quan chiến lược

Chiến lược giao dịch theo dõi đà là một chiến lược giao dịch tự động chủ yếu theo dõi xu hướng đà thị trường và sử dụng nhiều chỉ số kỹ thuật làm phán đoán phụ trợ.

Nhìn chung, chiến lược này phù hợp với giao dịch xu hướng trung và dài hạn, và có thể nắm bắt hiệu quả xu hướng thị trường và giảm tần suất giao dịch để theo đuổi lợi nhuận đơn lẻ cao hơn.

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

Phán quyết về quyền lực chính

Cốt lõi của chiến lược theo dõi đà là đánh giá hướng của các quỹ chính của thị trường. Chiến lược tính toán chỉ số ATR để theo dõi sự biến động của thị trường trong thời gian thực. Khi sự biến động tăng lên, điều đó có nghĩa là các quỹ chính đang tích lũy hoặc phân phối, và chiến lược sẽ tạm thời thoát khỏi thị trường để tránh giai đoạn khi các quỹ chính hoạt động.

Khi biến động suy yếu, điều đó có nghĩa là sự tích lũy hoặc phân bổ lực chính đã hoàn tất, và chiến lược sẽ quay lại thị trường để xác định hướng cụ thể của lực chính. Phương pháp phán đoán là tính toán vị trí hỗ trợ và áp lực của thị trường để xem liệu có dấu hiệu đột phá hay không. Nếu có một bước đột phá rõ ràng, nó sẽ chứng minh rằng các quỹ chính đã chọn hướng đó.

Phán quyết phụ

Sau khi xác định hướng của các quỹ chính, chiến lược cũng sẽ giới thiệu nhiều chỉ số kỹ thuật phụ để xác minh lại để tránh đánh giá sai. Cụ thể, MACD, KDJ và các chỉ số khác sẽ được tính toán để xác định xem chúng có phù hợp với hướng của các quỹ chính hay không.

Chỉ khi hướng của các quỹ chính và các chỉ số phụ cấp phát ra tín hiệu theo cùng một hướng, chiến lược sẽ mở các vị trí. Điều này có hiệu quả kiểm soát tần suất giao dịch và chỉ vào với xác suất cao.

Stop Loss Exit

Sau khi mở các vị trí, chiến lược theo dõi đà sẽ theo dõi sự thay đổi giá trong thời gian thực và sử dụng sự mở rộng các giá trị ATR như một tín hiệu dừng lỗ. Điều này có nghĩa là thị trường đã bước vào giai đoạn hoạt động chính một lần nữa và phải thoát ra tiền mặt ngay lập tức để tránh bị mắc kẹt.

Ngoài ra, nếu chuyển động giá vượt quá một phạm vi nhất định và sau đó rút lui, việc dừng lỗ cũng sẽ xảy ra.

Ưu điểm của Chiến lược

Hệ thống hóa cao

Ưu điểm lớn nhất của các chiến lược theo dõi đà là mức độ hệ thống hóa và tiêu chuẩn hóa cao của chúng.

Điều này làm cho khả năng sao chép của chiến lược này rất mạnh. Người dùng có thể áp dụng nó cho việc sử dụng lâu dài sau khi cấu hình mà không cần can thiệp bằng tay.

Kiểm soát rủi ro trưởng thành

Chiến lược này có các cơ chế kiểm soát rủi ro đa cấp tích hợp, chẳng hạn như đánh giá sức mạnh chính, xác minh phụ trợ, thiết lập đường dừng lỗ, v.v., có thể kiểm soát hiệu quả các rủi ro phi hệ thống.

Cụ thể, chiến lược chỉ mở các vị trí trong các tình huống có khả năng cao và đặt các điểm dừng lỗ khoa học để tối đa hóa việc tránh thua lỗ.

Lợi nhuận tương đối bền vững

So với các chiến lược ngắn hạn, thời gian nắm giữ các chiến lược theo dõi đà phát triển dài hơn và mỗi lợi nhuận cao hơn. Điều này làm cho lợi nhuận chiến lược tổng thể ổn định và bền vững hơn.

Ngoài ra, chiến lược theo dõi xu hướng trung và dài hạn, có thể nắm bắt đầy đủ sự biến động của xu hướng.

Cảnh báo về rủi ro

Tối ưu hóa tham số khó khăn

Chiến lược theo dõi động lượng bao gồm nhiều thông số, chẳng hạn như các thông số ATR, các thông số thâm nhập, các thông số dừng lỗ, vv. Có một mối tương quan nhất định giữa các thông số này, đòi hỏi phải thử nghiệm lặp đi lặp lại để tìm ra sự kết hợp các thông số tối ưu.

Cấu hình tham số không chính xác có thể dễ dàng dẫn đến tần suất giao dịch quá mức hoặc kiểm soát rủi ro không đủ. Điều này đòi hỏi người dùng phải có một số kinh nghiệm trong tối ưu hóa chiến lược.

Bẫy thoát

Khi chiến lược xác định các tín hiệu sức mạnh và chỉ số chính, nó dựa vào sự đột phá của giá để xác nhận.

Nếu một bước đột phá quan trọng thất bại, nó có thể dẫn đến tổn thất lớn hơn.

Hướng dẫn tối ưu hóa

Giới thiệu Machine Learning

Các thuật toán học máy có thể được sử dụng để tự động phát hiện mối tương quan giữa các tham số và tìm kết hợp tham số tối ưu.

Cụ thể, thuật toán EnvironmentError có thể được sử dụng để lặp lại liên tục các tham số dựa trên học tăng cường để tối đa hóa lợi nhuận chiến lược.

Tăng bộ lọc

Nhiều bộ lọc phụ có thể được đưa ra dựa trên các chỉ số hiện có, chẳng hạn như chỉ số khối lượng giao dịch, chỉ số dòng vốn, v.v., để xác minh tín hiệu đột phá ba hoặc bốn lần để cải thiện độ tin cậy.

Nhưng quá nhiều bộ lọc cũng có thể dẫn đến việc bỏ lỡ cơ hội. Độ cường độ của bộ lọc cần phải được cân bằng. Ngoài ra, các bộ lọc cũng nên tránh mối tương quan.

Chiến lược hợp nhất

Kết hợp chiến lược theo dõi động lượng với các chiến lược khác để tận dụng điểm mạnh của các chiến lược khác nhau để đạt được sự thẳng đứng và cải thiện sự ổn định tổng thể.

Ví dụ, kết hợp các chiến lược đảo ngược ngắn hạn và mở các giao dịch đảo ngược sau khi đột phá có thể khóa trong lợi nhuận nhiều hơn.

Tóm lại

Nói chung, Chiến lược giao dịch theo dõi đà là một chiến lược theo dõi xu hướng có hệ thống đáng khuyến cáo. Nó có logic giao dịch rõ ràng, kiểm soát rủi ro đầy đủ và có thể mang lại cho người dùng lợi nhuận đầu tư ổn định và hiệu quả.

Nhưng chính chiến lược này cũng có một số điểm yếu vốn có. Nó đòi hỏi người dùng phải có khả năng tối ưu hóa các thông số và tích hợp các chiến lược để tối đa hóa hiệu quả của chiến lược này. Nhìn chung, chiến lược theo dõi đà là một sản phẩm định lượng phù hợp cho những người đam mê định lượng với một số nền tảng.


/*backtest
start: 2023-12-12 00:00:00
end: 2023-12-15 01:00:00
period: 30m
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Created by frasmac2k Strategy credit to Alex Morris

//@version=5
strategy("Mechanical", shorttitle="MECH", overlay=true)

// Get the current date and time
currentYear = year
currentMonth = month
currentDay = dayofmonth

// Create a timestamp for the present date and time
currentTimestamp = timestamp(currentYear, currentMonth, currentDay)

// Define time interval for backtesting
dStart = input(timestamp('2023-07-01'), title='Set Start date', tooltip='Select a start date to run the script from')

// Define direction of strategy
direction = input.string('Forward',title='Direction', tooltip='Forward will go LONG on a Green anchor candle. Inverse will go short on a Green anchor candle and vice versa for Red candle', options=['Forward', 'Inverse'])

// Define the anchor hour as user input with a range of 0 to 23
anchorHour = input.int(11, title="Anchor Hour", tooltip='Set the hour to trade', minval=0, maxval=23)

// Define the take profit and stop loss in pips
takeProfitPips = input.int(10, title='Define TP Pips', tooltip='How many pips do you want to set TP. Choose a sensible value related to the instrument', minval=5)
stopLossPips = input.int(10,'Define SL Pips', tooltip='How many pips do you want to set SL. Choose a sensible value related to the instrument', minval=5)

// Define Tick size
tick10p = input.int(100, title='tick size', tooltip='Choose how many ticks equal 10 pips. This can vary by broker so measure 10 pips on the chart and select how many ticks that equates to. Forex is typically 100. Some instruments such as indices can be 1000', options=[100,1000])

// Declare TP/SL variables
var float takeProfit = na
var float stopLoss = na

// Calculate take profit and stop loss levels in ticks
if tick10p == 100
    takeProfit := takeProfitPips * 10
    stopLoss := stopLossPips * 10
if tick10p == 1000
    takeProfit := takeProfitPips * 100
    stopLoss := stopLossPips * 100

// Declare offset time
var int offset = na

if currentTimestamp > timestamp('2023-10-29')
    offset := 4
else
    offset := 5

//adjust for exchange time
anchorHour := anchorHour - offset

// Define the anchor hour as user input with a range of 0 to 23
tradeHour = anchorHour

// Define logical check for strategy date range
isStratTime = true

// Calculate the time condition for placing the order at the user-defined hour (start of the next hour)
isTradeTime = true

// Logic condition for forwards or inverse
isForward = direction == 'Forward'
isInverse = direction == 'Inverse'

// Declare entry condition variables
var bool longCondition = na
var bool shortCondition = na

// Declare and initialize variables for anchorCandle open and close prices
var float anchorOpen = na
var float anchorClose = na
var float tradeOpen = na
var float tradeClose = na

// Set logic by direction

if isForward
    // Strategy logic
    if isTradeTime and isStratTime
        //Obtain candle open/close
        anchorOpen := open
        anchorClose := close
        // Define entry conditions
        longCondition := anchorClose > anchorOpen
        shortCondition := anchorClose < anchorOpen
        
        // Entry logic
        if longCondition
            strategy.entry("Long", strategy.long)
            strategy.exit("Exit Long", from_entry="Long", profit=takeProfit, loss=stopLoss, comment_profit='TP', comment_loss='SL')
        if shortCondition
            strategy.entry("Short", strategy.short)
            strategy.exit("Exit Short", from_entry="Short", profit=takeProfit, loss=stopLoss, comment_profit='TP', comment_loss='SL')

if isInverse
    // Strategy logic
    if isTradeTime and isStratTime
        //Obtain candle open/close
        anchorOpen := open
        anchorClose := close
        // Define entry conditions
        shortCondition := anchorClose > anchorOpen
        longCondition := anchorClose < anchorOpen
        
        // Entry logic
        if longCondition
            strategy.entry("Long", strategy.long)
            strategy.exit("Exit Long", from_entry="Long", profit=takeProfit, loss=stopLoss, comment_profit='TP', comment_loss='SL')
        if shortCondition
            strategy.entry("Short", strategy.short)
            strategy.exit("Exit Short", from_entry="Short", profit=takeProfit, loss=stopLoss, comment_profit='TP', comment_loss='SL')

// Define the time range for the background shade
startHour = anchorHour
startMinute = 0
endHour = anchorHour
endMinute = 0

// Check if the current time is within the specified range
isInTimeRange = (hour == startHour and minute >= startMinute) or (hour == endHour and minute <= endMinute) or (hour > startHour and hour < endHour)

// Define the background color for the shade
backgroundColor = color.new(color.red, 90)

// Apply the background shade
bgcolor(isInTimeRange ? backgroundColor : na)



Thêm nữa