
Chiến lược cân bằng Lion’s Crack là một chiến lược giao dịch ngắn hạn đơn giản dựa trên đường chéo. Chiến lược này chủ yếu sử dụng hai đường trung bình di chuyển, làm nhiều hơn khi đường trung bình di chuyển nhanh đi qua đường trung bình di chuyển chậm từ bên dưới; và giữ vị trí bằng phẳng khi đường trung bình di chuyển nhanh đi qua đường trung bình di chuyển chậm từ phía trên.
Chiến lược này sử dụng hai đường trung bình di chuyển: đường trung bình di chuyển nhanh MAPeriod nhỏ và đường trung bình di chuyển chậm bigMAPeriod. Hai đường trung bình di chuyển tạo thành một kênh giá, dưới kênh là đường trung bình di chuyển nhanh, trên kênh là đường trung bình di chuyển chậm.
Cụ thể, chiến lược đầu tiên tính toán đường trung bình di chuyển nhanh smallMA và đường trung bình di chuyển chậm bigMA. Sau đó, tính toán đường mua theo đường trung bình di chuyển chậm là ((100 - percentBelowToBuy) %). Khi đường trung bình di chuyển nhanh smallMA đi qua đường mua từ phía dưới, làm nhiều; khi lợi nhuận đạt 1% hoặc không có lợi nhuận nhưng giữ 7 đường K.
Tóm lại, chiến lược này nắm bắt được các khe hở của sư tử đồng bằng, tức là các cơ hội phá vỡ các đường dẫn dưới cùng, với mục đích đạt được lợi nhuận ngắn. Nó đồng thời đặt các điều kiện dừng và dừng để kiểm soát rủi ro của giao dịch đơn lẻ.
Chiến lược này có những ưu điểm sau:
Khái niệm đơn giản, dễ hiểu và thực hiện. Sử dụng giao thoa hai đường đều là chiến lược chỉ số kỹ thuật cơ bản nhất.
Trả lời dễ dàng. Chiến lược này sử dụng trực tiếp tính năng trả lời của TradingView, không cần thực hiện thêm.
Khả năng hiển thị mạnh mẽ. Sử dụng TradingView để hiển thị các điểm tín hiệu giao dịch và dữ liệu thống kê phản hồi trực tiếp trên biểu đồ.
Có thể kiểm soát rủi ro. Chiến lược đặt các điều kiện dừng và dừng để kiểm soát hiệu quả tổn thất của một giao dịch.
Tính linh hoạt. Người dùng có thể điều chỉnh các tham số đường trung bình và các chỉ số kỹ thuật khác theo nhu cầu của mình, giúp chiến lược phù hợp hơn với các loại và phong cách giao dịch khác nhau.
Chiến lược này cũng có những rủi ro sau:
Có thể tạo ra quá nhiều tín hiệu. Chiến lược hai dòng đồng đều dễ tạo ra nhiều tín hiệu sai lầm khi tổng hợp.
Chỉ số duy nhất phụ thuộc. Chỉ sử dụng đường chéo trung bình để đưa ra quyết định, bỏ qua các yếu tố khác, chất lượng tín hiệu có thể kém hơn.
Tối ưu hóa tham số rất khó. Tối ưu hóa các tham số của chu kỳ trung bình cần rất nhiều tính toán, không dễ tìm ra tham số tối ưu.
Phản xạ sai lệch. Phản xạ của chiến lược đơn giản hai đường trung bình thường tốt hơn so với đĩa cứng.
Khó dừng lỗ. Thiết lập điểm dừng cố định khó thích ứng với sự thay đổi của hành vi.
Chiến lược này có thể được tối ưu hóa bằng cách:
Kết hợp với các chỉ số khác để lọc tín hiệu, chẳng hạn như khối lượng giao dịch, tỷ lệ biến động, v.v., để tránh tạo ra tín hiệu vô hiệu trong việc điều chỉnh.
Thêm phán đoán dựa trên xu hướng, tránh giao dịch ngược. Bạn có thể thêm đường trung bình chu kỳ dài hơn để phán đoán xu hướng.
Sử dụng học máy để tìm tham số tối ưu. Sử dụng tối ưu hóa tham số theo chuỗi hoặc thuật toán di truyền để tự động tìm các tổ hợp tham số tốt hơn.
Thêm các chiến lược dừng lỗ, chẳng hạn như theo dõi dừng, di chuyển dừng để giữ cho dừng lỗ linh hoạt hơn.
Tối ưu hóa thời điểm nhập học. Các chỉ số khác có thể được sử dụng để xác định thời điểm nhập học hiệu quả hơn.
Kết hợp với nghiên cứu định lượng để tối ưu hóa phản hồi đối với các tham số, tăng sự ổn định.
Phát triển hệ thống giao dịch tự động, sử dụng giao dịch lập trình để tối ưu hóa các tham số và đánh giá chiến lược.
Chiến lược cân bằng rãnh sư tử là một chiến lược đầu tiên rất phù hợp cho người mới học. Nó sử dụng nguyên tắc giao chéo đơn giản, thiết lập quy tắc dừng lỗ, có thể nắm bắt biến động giá đường ngắn. Chiến lược này dễ hiểu thực hiện, có hiệu quả đo lường tốt. Tuy nhiên, hiệu quả thực tế của nó rất khó tối ưu hóa. Chúng ta có thể cải thiện chiến lược này bằng cách giới thiệu các chỉ số kỹ thuật khác, tham số tối ưu hóa và phát triển hệ thống giao dịch tự độ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 --- ///////////////