Chiến lược này sử dụng nguyên tắc trung bình chi phí đô la (DCA) để thực hiện giao dịch đặt hàng. Nó có thể thêm vị trí theo tỷ lệ phần trăm lệch giá và số lần đặt hàng theo quy tắc đặt sau khi mở vị trí ban đầu.
Chiến lược này đầu tiên sẽ mở thêm vị trí ngay lập tức trong cửa sổ thời gian đo lường, khi giá đóng cửa lớn hơn 0 vào ngày đó, và giá mở vị trí này là giá cơ sở bo_level. Sau đó, nếu không có lệnh an toàn (((so), tất cả các lệnh có thể được đặt trên giá hiện tại sẽ được đặt trên giá hiện tại dựa trên tỷ lệ phần trăm và số lần đặt hàng được thiết lập. Cụ thể, giá của lệnh an toàn sẽ được dựa trên giá lệnh an toàn gần đây nhất latest_so_level, dựa trên bước lệnh an toàn kéo dài và thu nhỏ safe_order_step_scale để tính toán giá lệnh an toàn tiếp theo next_so_level.
Trong giai đoạn giữ vị trí, nếu số lượng giữ vị trí lớn hơn 0, giá dừng sẽ được tính toán dựa trên giá cơ bản và tỷ lệ dừng mục tiêu. Nếu tính năng theo dõi dừng được tắt, hãy sử dụng giá dừng cố định này; nếu không, giá dừng theo dõi sẽ được cập nhật liên tục theo giá cao nhất của thùng, và điều chỉnh giá dừng để thực hiện theo dõi dừng.
Sử dụng chiến lược DCA, bạn có thể tự động gia tăng vị thế sau khi giá giảm, giảm chi phí giữ vị trí trung bình, và bảo hiểm rủi ro hệ thống.
Hỗ trợ các tham số tùy chỉnh, có thể cấu hình các quy tắc mở vị trí và chiến lược dừng tùy theo các loại và phong cách giao dịch khác nhau.
Tính năng theo dõi ngưng ngưng tích hợp, có thể tự động điều chỉnh vị trí ngưng ngưng theo tình huống, tránh ngưng ngưng ngưng quá sớm.
Thiết lập tham số phản hồi linh hoạt, có thể dễ dàng kiểm tra dữ liệu trong các khoảng thời gian khác nhau để đánh giá hiệu quả của chiến lược.
Kết hợp với nền tảng 3commas, robot thực có thể được cấu hình trực tiếp bằng kết quả phản hồi, không cần phát triển thêm.
Chiến lược DCA có nguy cơ gia tăng rủi ro, nếu thị trường tiếp tục giảm, số lượng nắm giữ sẽ tăng hơn nữa và tổn thất cũng sẽ tăng lên. Cần thiết lập các quy tắc gia tăng rủi ro hợp lý.
Cần thiết thiết lập tracking stop stop. Cần thiết lập tracking stop stop. Cần thiết lập tracking stop stop.
Đánh giá rủi ro có thể ảnh hưởng đến hiệu quả của giao dịch. Cần đánh giá rủi ro.
Cần chú ý đến sự ổn định của hệ thống của các sàn giao dịch và 3commas để tránh các giao dịch dự kiến bị thất bại.
Có thể điều chỉnh động giá lệch phần trăm theo biến động của các giống khác nhau, tối ưu hóa quy tắc gia tăng.
Có thể kết hợp với chỉ số dao động để xác định tỷ lệ dừng khoa học hơn.
Các cửa sổ thời gian phản hồi hợp lý có thể được thiết lập tùy theo thời gian giao dịch của từng giống.
Có thể đưa ra chiến lược dừng lỗ, dừng lỗ và rút ra khi thua lỗ lớn.
Có thể kết hợp với thuật toán học máy để chiến lược động tối ưu hóa tham số.
Nhìn chung, chiến lược này là một chương trình kiểm tra lại DCA rất thực tế. Nó hỗ trợ các thiết lập tham số tùy chỉnh tốt, có thể cấu hình các quy tắc mở và dừng vị trí một cách linh hoạt. Ngoài ra, tính năng theo dõi dừng được tích hợp để bù đắp cho sự thiếu hụt của dừng cố định. Các tham số kiểm tra lại cũng rất linh hoạt, có thể kiểm tra dữ liệu của các giống và khoảng thời gian khác nhau.
/*backtest
start: 2023-09-18 00:00:00
end: 2023-09-25 00:00:00
period: 15h
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/
// © rouxam
// Author: rouxam
// Inspired by the original work of ericlin0122
//@version=4
// strategy("Backtesting 3commas DCA Bot", overlay=true, pyramiding=99, process_orders_on_close=true, commission_type=strategy.commission.percent, commission_value=0.1)
// Strategy Inputs
price_deviation = input(1.0, type=input.float, title='Price deviation to open safety orders (%)', minval=0.0, step=0.1)/100
take_profit = input(1.0, type=input.float, title='Target Take Profit (%)', minval=0.0, step=0.1)/100
ttp = input(0.5, type=input.float, title='Trailing Take Profit (%) [0 = Disabled]', minval=0.0, step=0.1)/100
base_order = input(10.0, type=input.float, title='base order')
safe_order = input(20.0, type=input.float, title='safe order')
safe_order_volume_scale = input(2.0, type=input.float, title='Safety order volume scale', step=0.1)
safe_order_step_scale = input(1.5, type=input.float, title='Safety order step scale', step=0.1)
max_safe_order = input(5, title='Max safe order', minval=1, maxval=99, step=1)
// Date Inputs
from_month = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
from_day = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
from_year = input(defval = 2021, title = "From Year")
to_month = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
to_day = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
to_year = input(defval = 9999, title = "To Year")
start = timestamp(from_year, from_month, from_day, 00, 00) // backtest start window
finish = timestamp(to_year, to_month, to_day, 23, 59) // backtest finish window
window = time >= start and time <= finish ? true : false // create function "within window of time"
var bo_level = 0.0
var latest_so_level = 0.0
var next_so_level = 0.0
var ttp_active = false
var ttp_max = 0.0
var ttp_level = 0.0
var take_profit_level = 0.0
if strategy.position_size <= 0.0
ttp_max := 0.0
ttp_active := false
// First Position
if(strategy.opentrades == 0 and window and close > 0)
// Place Buy Order ASAP
bo_level := open
strategy.entry("BO", limit=bo_level, long=strategy.long, qty=base_order/bo_level)
latest_so_level := open
// Dollar Cost Averaging
place_safety_orders = latest_so_level == bo_level
if place_safety_orders
// Placing all possible exit orders on that candle
for i = 1 to max_safe_order
next_so_level := latest_so_level * (1 - price_deviation * pow(safe_order_step_scale, i - 1))
so_name = "SO" + tostring(i)
strategy.entry(so_name, long=strategy.long, limit=next_so_level, qty=safe_order * pow(safe_order_volume_scale, i - 1)/next_so_level)
latest_so_level := next_so_level
// Take Profit
if strategy.position_size > 0
take_profit_level := strategy.position_avg_price * (1 + take_profit)
if ttp <= 0.0
// No trailing take profit
strategy.exit(id="TP", limit=take_profit_level)
else
// Trailing take profit
if take_profit_level <= close
ttp_max := max(high, ttp_max)
ttp_active := true
if ttp_active
// Update exit order
ttp_level := ttp_max * (1 - ttp)
strategy.exit(id="TTP", stop=ttp_level)