Chiến lược R-Breaker được phát triển bởi Richard Saidenberg và được xuất bản vào năm 1994. Nó được tạp chí
Nói một cách đơn giản, chiến lược R-Breaker là một chiến lược hỗ trợ và kháng cự giá. Nó tính toán bảy giá dựa trên giá cao nhất, thấp nhất và đóng cửa hôm qua: một giá trung tâm (pivot) và ba mức hỗ trợ (s1 s2, s3), ba mức kháng cự (r1, r2, r3). Sau đó theo mối quan hệ vị trí giữa giá hiện tại và các mức hỗ trợ và kháng cự này, để hình thành các điều kiện kích hoạt mua và bán, và thông qua một điều chỉnh thuật toán nhất định, điều chỉnh khoảng cách giữa bảy giá này, tiếp tục thay đổi giá kích hoạt của giao dịch.
Giá mua phá vỡ (mức kháng cự r3) = giá cao nhất ngày hôm qua + 2 * (giá trung tâm - giá thấp nhất ngày hôm qua) / 2
Quan sát giá bán (mức kháng cự r2) = giá trung tâm + (giá cao nhất ngày hôm qua - giá thấp nhất ngày hôm qua)
Giá bán ngược (mức kháng cự r1) = 2 * Giá trung tâm - giá thấp nhất hôm qua
Giá trung tâm (pivot) = (giá cao nhất hôm qua + giá đóng cửa hôm qua + giá thấp nhất hôm qua) / 3
Giá mua ngược (mức hỗ trợ s1) = 2 * Giá trung tâm - giá cao nhất hôm qua
Quan sát giá mua (mức hỗ trợ s2) = giá trung tâm - (giá cao nhất ngày hôm qua - giá thấp nhất ngày hôm qua)
Giá bán phá vỡ (mức hỗ trợ s3) = giá thấp nhất ngày hôm qua - 2 * (giá cao nhất ngày hôm qua - giá trung tâm)
Từ đây chúng ta có thể thấy rằng chiến lược R-Breaker vẽ một đường giá giống như lưới dựa trên giá hôm qua, và cập nhật các đường giá này một lần mỗi ngày. Trong phân tích kỹ thuật, mức hỗ trợ và kháng cự và vai trò của cả hai có thể được chuyển đổi thành nhau. Khi giá phá vỡ thành công mức kháng cự, mức kháng cự trở thành mức hỗ trợ; khi giá phá vỡ thành công mức hỗ trợ, mức hỗ trợ trở thành mức kháng cự.
Trong giao dịch thực tế, các mức hỗ trợ và kháng cự này cho nhà giao dịch biết hướng mở và đóng các vị trí và các điểm giao dịch chính xác. Các nhà giao dịch có điều kiện mở và đóng cụ thể có thể tùy chỉnh linh hoạt theo giá trong ngày, giá trung tâm, mức kháng cự và mức hỗ trợ, và cũng có thể quản lý các vị trí dựa trên các đường giá lưới này.
Tiếp theo, chúng ta hãy xem chiến lược R-Breaker sử dụng các mức hỗ trợ và kháng cự này như thế nào. Logic của nó hoàn toàn không phức tạp. Nếu không có vị trí giữ, hãy vào chế độ xu hướng. Khi giá lớn hơn giá mua đột phá, mở vị trí dài; khi giá thấp hơn giá bán đột phá, mở vị trí ngắn.
vị trí mở dài: nếu không có vị trí giữ và giá lớn hơn giá mua đột phá
vị trí mở ngắn: nếu không có vị trí nắm giữ và giá thấp hơn giá bán đột phá
đóng vị trí dài: nếu bạn nắm giữ một vị trí dài, và giá cao nhất trong ngày lớn hơn giá bán quan sát và giá thấp hơn giá bán ngược
đóng vị trí ngắn: nếu bạn nắm giữ một vị trí ngắn, và giá thấp nhất trong ngày thấp hơn giá mua quan sát và giá lớn hơn giá mua ngược
Mở vị trí dài: nếu bạn giữ một vị trí ngắn, và giá thấp nhất trong ngày thấp hơn giá mua quan sát và giá lớn hơn giá mua ngược
Mở vị trí ngắn: nếu bạn nắm giữ một vị trí dài, và giá cao nhất trong ngày lớn hơn giá bán quan sát và giá thấp hơn giá bán ngược
Close long position: nếu các vị trí long được giữ và giá thấp hơn giá bán đột phá
Close short position: nếu bạn nắm giữ short position và giá cao hơn giá mua đột phá
Nếu có các vị trí giữ, nó đi vào chế độ đảo ngược. Khi có giữ các vị trí dài, và giá cao nhất trong ngày lớn hơn giá bán quan sát, và giá giảm xuống dưới giá bán ngược, vị trí dài sẽ được đóng và vị trí ngắn sẽ được mở đồng bộ. Khi giữ các vị trí ngắn, và giá thấp nhất trong ngày thấp hơn giá mua quan sát, và giá phá vỡ giá mua ngược, vị trí ngắn sẽ được đóng và vị trí dài sẽ được mở.
'''backtest
start: 2019-01-01 00:00:00
end: 2020-01-01 00:00:00
period: 5m
exchanges: [{"eid":"Futures_CTP","currency":"FUTURES"}]
'''
# Strategy main function
def onTick():
# retrieve data
exchange.SetContractType(contract_type) # Subscribe to futures products
bars_arr = exchange.GetRecords(PERIOD_D1) # Get daily K line array
if len(bars_arr) < 2: # If the number of K lines is less than 2
return
yesterday_open = bars_arr[-2]['Open'] # Yesterday's opening price
yesterday_high = bars_arr[-2]['High'] # Yesterday's highest price
yesterday_low = bars_arr[-2]['Low'] # Yesterday's lowest price
yesterday_close = bars_arr[-2]['Close'] # Yesterday's closing price
# Calculation
pivot = (yesterday_high + yesterday_close + yesterday_low) / 3 # Pivot point
r1 = 2 * pivot - yesterday_low # Resistance level 1
r2 = pivot + (yesterday_high - yesterday_low) # Resistance level 2
r3 = yesterday_high + 2 * (pivot - yesterday_low) # Resistance level 3
s1 = 2 * pivot - yesterday_high # Support level 1
s2 = pivot - (yesterday_high - yesterday_low) # Support level 2
s3 = yesterday_low - 2 * (yesterday_high - pivot) # Support level 3
today_high = bars_arr[-1]['High'] # Today's highest price
today_low = bars_arr[-1]['Low'] # Today's lowest price
current_price = _C(exchange.GetTicker).Last # Current price
# Get positions
position_arr = _C(exchange.GetPosition) # Get array of positions
if len(position_arr) > 0: # If the position array length is greater than 0
for i in position_arr:
if i['ContractType'] == contract_type: # If the position variety equals the subscription variety
if i['Type'] % 2 == 0: # If it is long position
position = i['Amount'] # The number of assigned positions is positive
else:
position = -i['Amount'] # The number of assigned positions is negative
profit = i['Profit'] # Get position profit and loss
else:
position = 0 # The number of assigned positions is 0
profit = 0 # The value of the assigned position is 0
if position == 0: # If there is no position
if current_price > r3: # If the current price is greater than Resistance level 3
exchange.SetDirection("buy") # Set transaction direction and type
exchange.Buy(current_price + 1, 1) # open long position
if current_price < s3: # If the current price is less than Support level 3
exchange.SetDirection("sell") # Set transaction direction and type
exchange.Sell(current_price - 1, 1) # open short position
if position > 0: # if holding long position
if today_high > r2 and current_price < r1 or current_price < s3: # If today's highest price is greater than Resistance level 2, and the current price is less than Resistance level 1
exchange.SetDirection("closebuy") # Set transaction direction and type
exchange.Sell(current_price - 1, 1) # close long position
exchange.SetDirection("sell") # Set transaction direction and type
exchange.Sell(current_price - 1, 1) # open short position
if position < 0: # if holding short position
if today_low < s2 and current_price > s1 or current_price > r3: # If today's lowest price is less than Support level 2, and the current price is greater than Support level 1
exchange.SetDirection("closesell") # Set transaction direction and type
exchange.Buy(current_price + 1, 1) # close short position
exchange.SetDirection("buy") # Set transaction direction and type
exchange.Buy(current_price + 1, 1) # open long position
# Program main function
def main():
while True: # loop
onTick() # Execution strategy main function
Sleep(1000) # Sleep for 1 second
Chiến lược hoàn chỉnh đã được công bố trên nền tảng FMZ (FMZ.COM), nhấp vào liên kết bên dưới để sao chép trực tiếp, và bạn có thể backtest mà không cần cấu hình:https://www.fmz.com/strategy/187009
Lý do tại sao chiến lược R-Breaker phổ biến là vì nó không chỉ đơn thuần là một chiến lược theo dõi xu hướng, mà là một chiến lược hỗn hợp để kiếm được cả xu hướng alpha và thu nhập alpha ngược. Chiến lược trong bài viết này chỉ dành cho việc chứng minh, mà không tối ưu hóa các thông số và biến thể thích hợp. Ngoài ra, chiến lược hoàn chỉnh cũng phải bao gồm chức năng dừng lỗ, và bạn bè quan tâm có thể cải thiện nó.