Chiến lược cân bằng vết nứt sư tử

Tác giả:ChaoZhang, Ngày: 2023-11-02 16:55:00
Tags:

img

Tổng quan

Chiến lược cân bằng khe hở sư tử là một chiến lược giao dịch ngắn hạn đơn giản dựa trên các giao dịch chéo trung bình động. Nó chủ yếu sử dụng hai trung bình động - khi MA nhanh vượt qua trên MA chậm từ dưới, đi dài; khi MA nhanh vượt qua dưới MA chậm từ trên, đóng vị trí. Tên chiến lược bắt nguồn từ thuật ngữ giao dịch phổ biến Lion Fissure, ngụ ý nắm bắt các hành động giá nhỏ và lợi nhuận từ khoảng cách hẹp giữa các MA.

Chiến lược logic

Chiến lược này sử dụng hai đường trung bình động: MA nhanh (thời gian smallMAPeriod) và MA chậm (thời gian bigMAPeriod). Hai MA tạo thành một kênh giá, với MA nhanh là cơ sở kênh và MA chậm là trần kênh. Khi giá vượt qua cơ sở kênh lên, đi dài; khi giá vượt qua trần kênh xuống, đóng vị trí.

Cụ thể, chiến lược đầu tiên tính toán MA nhanh (smallMA) và MA chậm (bigMA). Sau đó nó tính toán đường mua (buyMA), đó là (100 - phần trămBelowToBuy) % của đường mua chậm. Khi MA nhanh vượt qua đường mua lên, đi dài; khi đạt được lợi nhuận 1% hoặc giữ 7 thanh mà không có lợi nhuận, đóng vị trí.

Tóm lại, chiến lược nhằm mục đích nắm bắt "Lion Fissure" giữa các MAs cho lợi nhuận ngắn hạn.

Phân tích lợi thế

Chiến lược có những lợi thế sau:

  1. Khái niệm đơn giản dễ hiểu và thực hiện.

  2. Khả năng backtesting dễ dàng. Chiến lược trực tiếp sử dụng backtester tích hợp trong TradingView mà không cần thực hiện thêm.

  3. Hình ảnh hóa mạnh mẽ. TradingView có thể trực tiếp hiển thị tín hiệu giao dịch và dữ liệu thống kê trên biểu đồ.

  4. Rủi ro có thể kiểm soát được: Chiến lược đặt ra các điều kiện lấy lợi nhuận và dừng lỗ để kiểm soát hiệu quả lỗ trên mỗi giao dịch.

  5. Tùy chỉnh linh hoạt. Người dùng có thể điều chỉnh các tham số MA và các chỉ số khác để phù hợp với các sản phẩm và phong cách giao dịch khác nhau.

Phân tích rủi ro

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

  1. Các chiến lược MA kép có xu hướng tạo ra các tín hiệu sai trong quá trình hợp nhất.

  2. Dựa vào chỉ số duy nhất. Chỉ sử dụng MA chéo bỏ qua các yếu tố khác, có khả năng dẫn đến chất lượng tín hiệu kém.

  3. Khó khăn tối ưu hóa tham số. Tìm kiếm sự kết hợp MA tối ưu đòi hỏi tính toán rộng rãi.

  4. Biến hướng backtest. Chiến lược MA kép đơn giản thường hoạt động tốt hơn trong backtests so với giao dịch trực tiếp.

  5. Khó dừng lỗ. Mức dừng lỗ cố định có thể không thích nghi với điều kiện thị trường thay đổi.

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

Chiến lược có thể được cải thiện từ các khía cạnh sau:

  1. Thêm các bộ lọc khác như khối lượng và biến động để tránh các tín hiệu không hiệu quả trong quá trình hợp nhất.

  2. Bao gồm xu hướng thiên vị để tránh giao dịch ngược xu hướng.

  3. Sử dụng máy học để tìm các thông số tối ưu, như tối ưu hóa các thông số theo trình tự hoặc các thuật toán di truyền.

  4. Cải thiện các chiến lược dừng lỗ, như dừng lỗ và dừng lỗ thích nghi để linh hoạt hơn.

  5. Tối ưu hóa thời gian nhập bằng cách sử dụng các chỉ số khác để xác định các điểm nhập có xác suất cao hơn.

  6. Thực hiện nghiên cứu định lượng và kiểm tra hậu quả để cải thiện sự ổn định của các tập hợp tham số tối ưu.

  7. Phát triển các hệ thống giao dịch tự động để tối ưu hóa và đánh giá hệ thống các kết hợp tham số.

Kết luận

Chiến lược cân bằng khe cắm sư tử là một chiến lược khởi đầu tuyệt vời cho người mới bắt đầu học. Nó áp dụng logic chéo MA kép đơn giản và thiết lập các quy tắc lấy lợi nhuận và dừng lỗ để nắm bắt biến động giá ngắn hạn. Chiến lược dễ hiểu và thực hiện, và cho thấy kết quả backtest tốt. Tuy nhiên, nó bị khó khăn tối ưu hóa và hiệu suất trực tiếp đáng nghi ngờ. Chúng ta có thể cải thiện chiến lược bằng cách kết hợp các chỉ số khác, tối ưu hóa các tham số và phát triển các hệ thống giao dịch tự động. Nhìn chung, chiến lược cân bằng khe cắm sư tử cung cấp một nền tảng học tập tuyệt vời cho người mới bắt đầu giao dịch định lượng.


/*backtest
start: 2023-10-02 00:00:00
end: 2023-11-01 00:00:00
period: 1h
basePeriod: 15m
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/
// © TraderHalai
// This script was born out of my quest to be able to display strategy back test statistics on charts to allow for easier backtesting on devices that do not natively support backtest engine (such as mobile phones, when I am backtesting from away from my computer). There are already a few good ones on TradingView, but most / many are too complicated for my needs.
//
//Found an excellent display backtest engine by 'The Art of Trading'. This script is a snippet of his hard work, with some very minor tweaks and changes. Much respect to the original author.
//
//Full credit to the original author of this script. It can be found here: https://www.tradingview.com/script/t776tkZv-Hammers-Stars-Strategy/?offer_id=10&aff_id=15271
//
// This script can be copied and airlifted onto existing strategy scripts of your own, and integrates out of the box without implementation of additional functions. I've also added Max Runup, Average Win and Average Loss per trade to the orignal script.
//
//Will look to add in more performance metrics in future, as I further develop this script.
//
//Feel free to use this display panel in your scripts and strategies.

//Thanks and enjoy! :)
//@version=5
// strategy("Strategy BackTest Display Statistics - TraderHalai", overlay=true, default_qty_value= 5, default_qty_type = strategy.percent_of_equity, initial_capital=10000,  commission_type=strategy.commission.percent, commission_value=0.1)

//DEMO basic strategy - Use your own strategy here -  Jaws Mean Reversion from my profile used here
source = input(title = "Source", defval = close)
smallMAPeriod = input(title = "Small Moving Average", defval = 2)
bigMAPeriod = input(title = "Big Moving Average", defval = 8)
percentBelowToBuy = input(title = "Percent below to buy %", defval = 1)

smallMA = ta.sma(source, smallMAPeriod)
bigMA =  ta.sma(source, bigMAPeriod) 
buyMA = ((100 - percentBelowToBuy) / 100) * ta.sma(source, bigMAPeriod)[0]

buy = ta.crossunder(smallMA, buyMA)
if(buy)
    strategy.entry("BUY", strategy.long)

if(strategy.openprofit >= strategy.position_avg_price * 0.01) // 1% profit target
    strategy.close("BUY")

if(ta.barssince(buy) >= 7) //Timed Exit, if you fail to make 1 percent in 7 candles.
    strategy.close("BUY")
    
///////////////////////////// --- BEGIN TESTER CODE --- ////////////////////////
// COPY below into your strategy to enable display
////////////////////////////////////////////////////////////////////////////////

// strategy.initial_capital = 50000
// // Declare performance tracking variables
// drawTester = input.bool(true, "Draw Tester")
// var balance = strategy.initial_capital
// var drawdown = 0.0
// var maxDrawdown = 0.0
// var maxBalance = 0.0
// var totalWins = 0
// var totalLoss = 0

// // Prepare stats table
// var table testTable = table.new(position.top_right, 5, 2, border_width=1)
// f_fillCell(_table, _column, _row, _title, _value, _bgcolor, _txtcolor) =>
//     _cellText = _title + "\n" + _value
//     table.cell(_table, _column, _row, _cellText, bgcolor=_bgcolor, text_color=_txtcolor)
    
// // Custom function to truncate (cut) excess decimal places
// truncate(_number, _decimalPlaces) =>
//     _factor = math.pow(10, _decimalPlaces)
//     int(_number * _factor) / _factor
    
// // Draw stats table
// var bgcolor = color.new(color.black,0)
// if drawTester
//     if barstate.islastconfirmedhistory
//         // Update table
//         dollarReturn = strategy.netprofit
//         f_fillCell(testTable, 0, 0, "Total Trades:", str.tostring(strategy.closedtrades), bgcolor, color.white)
//         f_fillCell(testTable, 0, 1, "Win Rate:", str.tostring(truncate((strategy.wintrades/strategy.closedtrades)*100,2)) + "%", bgcolor, color.white)
//         f_fillCell(testTable, 1, 0, "Starting:", "$" + str.tostring(strategy.initial_capital), bgcolor, color.white)
//         f_fillCell(testTable, 1, 1, "Ending:", "$" + str.tostring(truncate(strategy.initial_capital + strategy.netprofit,2)), bgcolor, color.white)
//         f_fillCell(testTable, 2, 0, "Avg Win:", "$"+ str.tostring(truncate(strategy.grossprofit / strategy.wintrades, 2)), bgcolor, color.white)
//         f_fillCell(testTable, 2, 1, "Avg Loss:", "$"+ str.tostring(truncate(strategy.grossloss / strategy.losstrades, 2)), bgcolor, color.white)
//         f_fillCell(testTable, 3, 0, "Profit Factor:", str.tostring(truncate(strategy.grossprofit / strategy.grossloss,2)), strategy.grossprofit > strategy.grossloss ? color.green : color.red, color.white)
//         f_fillCell(testTable, 3, 1, "Max Runup:",  str.tostring(truncate(strategy.max_runup, 2 )), bgcolor, color.white)
//         f_fillCell(testTable, 4, 0, "Return:", (dollarReturn > 0 ? "+" : "") + str.tostring(truncate((dollarReturn / strategy.initial_capital)*100,2)) + "%", dollarReturn > 0 ? color.green : color.red, color.white)
//         f_fillCell(testTable, 4, 1, "Max DD:", str.tostring(truncate((strategy.max_drawdown / strategy.equity) * 100 ,2)) + "%", color.red, color.white)
// // --- END TESTER CODE --- ///////////////

Thêm nữa