
Đây là một chiến lược giao dịch định lượng được thiết kế đặc biệt cho thị trường tiền điện tử, tận dụng các đặc điểm biến động cao của thị trường tiền điện tử, tích lũy động khi giá cả thay đổi thông qua trung bình chi phí thông minh ((DCA)). Chiến lược này hoạt động trong khung thời gian 15 phút, có thể đáp ứng hiệu quả với sự biến động nhanh chóng của thị trường tiền điện tử, đồng thời tránh rủi ro do giao dịch quá mức.
Chiến lược bao gồm bốn mô-đun cốt lõi:
Chiến lược này cung cấp một giải pháp tự động hóa toàn diện cho giao dịch tiền điện tử thông qua các phương pháp DCA sáng tạo và quản lý rủi ro động. Mặc dù thị trường tiền điện tử có rủi ro cao, chiến lược này có thể duy trì sự ổn định trong hầu hết các môi trường thị trường thông qua các cơ chế kiểm soát rủi ro được thiết kế cẩn thận và tối ưu hóa khả năng thích ứng của thị trường.
/*backtest
start: 2020-08-29 15:00:00
end: 2025-02-18 17:22:45
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Binance","currency":"TRB_USDT"}]
*/
//@version=5
strategy('Autotrade.it DCA', overlay=true, pyramiding=999, default_qty_type=strategy.cash, initial_capital=10000, commission_value=0.02)
// Date Ranges
from_month = 1
from_day = 1
from_year = 2021
to_month = 1
to_day = 1
to_year = 9999
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"
source_type = 'OHLC4'
source_function(type) =>
if type == 'Close'
close
else if type == 'Open'
open
else if type == 'High'
high
else if type == 'Low'
low
else if type == 'HL2'
hl2
else if type == 'HL3'
hlc3
else if type == 'OHLC4'
ohlc4
else if type == 'Median Body'
(open + close) / 2
else if type == 'Weighted Close'
(high + low + 2 * close) / 4
else if type == 'Trend Biased'
close > open ? (high + close) / 2 : (low + close) / 2
else if type == 'Trend Biased Extreme'
close > open ? high : low
truncate(number, decimals) =>
factor = math.pow(10, decimals)
int(number * factor) / factor
// Strategy Inputs
price_deviation = input.float(1.0, title='Price deviation to open safety orders (%)', minval=0.0) / 100
take_profit = 1.0 / 100
base_order = 10.0
safe_order = 10.0
safe_order_volume_scale = 1.1
safe_order_step_scale = 1.1
max_safe_order = 30
var current_so = 0
var initial_order = 0.0
var previous_high_value = 0.0
var original_ttp_value = 0.0
// Calculate our key levels
take_profit_level = strategy.position_avg_price * (1 + take_profit)
startTrade = input.int(defval=1, title='Trade Start')
margin = input.float(title='Margin', defval=1, step=1, tooltip='USDT')
leverage = input.int(title='Leverage', defval=50, tooltip='it only used on futures trade')
multi = 1.125
var float multiplier = 1
symbol = str.replace_all(syminfo.ticker, '.P', '')
var float totalMargin = 0.0
var bool isTrade =false
var float totalPrice = 0.0
var int totalTrade = 0
var float totalQtys = 0
var float sellPrice = 0
var float sellQty = 0
// // First Position
if strategy.position_size == 0 and window and source_function(source_type) > 0 and previous_high_value == 0.0
strategy.entry('No Position', strategy.long, qty=base_order / source_function(source_type))
initial_order := source_function(source_type)
current_so := 1
previous_high_value := 0.0
original_ttp_value := 0
original_ttp_value
threshold = 0.0
if safe_order_step_scale == 1.0
threshold := initial_order - initial_order * price_deviation * safe_order_step_scale * current_so
threshold
else
threshold := initial_order - initial_order * ((price_deviation * math.pow(safe_order_step_scale, current_so) - price_deviation) / (safe_order_step_scale - 1))
threshold
// Average Down
if current_so > 0 and source_function(source_type) <= threshold and current_so <= max_safe_order and previous_high_value == 0.0
if(startTrade<=current_so)
margin := math.round(margin * multiplier * 100) / 100
multiplier *= multi
totalMargin += margin
avePrice = (totalPrice/totalTrade)
qty = margin*leverage/close
isTrade := true
totalPrice+=close
totalTrade+=1
totalQtys+=qty
alert('{"category": "linear", "mode": 3, "tradeMode": 0, "symbol": "' + str.tostring(symbol) + '", "leverage": "' + str.tostring(leverage) + '", "side": "Buy", "orderType": "Market", "marketUnit": "quoteCoin", "qty": "' + str.tostring(margin) + '", "reduceOnly": false, "positionIdx": 1 }')
strategy.entry('Trade # ' + str.tostring(current_so) +"---Margin: $" + str.tostring(margin), direction=strategy.long, qty=safe_order * math.pow(safe_order_volume_scale, current_so - 1) / source_function(source_type))
else
strategy.entry('Trade # ' + str.tostring(current_so) +" No position", direction=strategy.long, qty=safe_order * math.pow(safe_order_volume_scale, current_so - 1) / source_function(source_type))
current_so += 1
current_so
// Take Profit!
if take_profit_level <= source_function(source_type) and strategy.position_size > 0 or previous_high_value > 0.0
if(isTrade)
avePrice = totalMargin * leverage / totalQtys * 1.002 // Include fee directly
percentGain = math.round((close - avePrice) / avePrice * 100 * 100) / 100
gain = math.round(percentGain * leverage * totalMargin / 100 * 100) / 100
isTrade := false
sellPrice := avePrice*0.95
sellQty := totalMargin * leverage/sellPrice
loop = current_so-1
testQty = sellQty/loop
strategy.close_all(comment= "Take Profit: $" + str.tostring(gain))
alert('{"category": "linear", "mode": 3, "tradeMode": 0, "symbol": "' + str.tostring(symbol) + '", "leverage": "' + str.tostring(testQty) + '", "side": "Sell", "orderType": "Market", "marketUnit": "baseCoin", "qty": "' + str.tostring(sellQty) + '", "reduceOnly": true, "positionIdx": 1, "loop": "' + str.tostring(loop) + '" }')
else
strategy.close_all(comment='No Position')
current_so := 0
previous_high_value := 0
original_ttp_value := 0
multiplier:=1
totalMargin:=0.0
totalPrice:=0
totalTrade:=0
totalQtys:=0