
Ini adalah strategi perdagangan kuantitatif yang dirancang khusus untuk pasar cryptocurrency, yang memanfaatkan karakteristik volatilitas tinggi pasar cryptocurrency, dengan kenaikan harga secara dinamis saat harga berbalik melalui rata-rata biaya cerdas (DCA). Strategi ini berjalan pada kerangka waktu 15 menit, yang dapat secara efektif menanggapi fluktuasi cepat pasar cryptocurrency, sambil menghindari risiko yang ditimbulkan oleh perdagangan berlebihan.
Strategi ini terdiri dari empat modul utama:
Strategi ini memberikan solusi otomatisasi yang komprehensif untuk perdagangan cryptocurrency melalui metode DCA yang inovatif dan manajemen risiko yang dinamis. Meskipun pasar cryptocurrency berisiko tinggi, strategi ini dapat mempertahankan stabilitas di sebagian besar lingkungan pasar melalui mekanisme kontrol risiko yang dirancang dengan cermat dan optimasi adaptasi pasar.
/*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