DCA Bot Strategi

Penulis:ChaoZhang, Tarikh: 2023-09-26 17:28:27
Tag:

Ringkasan

Ini adalah strategi backtesting pada mekanisme purata kos dolar (DCA) untuk skala ke dalam kedudukan selepas kemasukan awal. Ia boleh menambah kedudukan berdasarkan peratusan penyimpangan harga yang telah ditetapkan dan peraturan piramid. Strategi ini juga merangkumi mengambil keuntungan dan fungsi mengambil keuntungan.

Logika Strategi

Strategi ini mula-mula membuka kedudukan panjang pada harga penutupan apabila ia di atas 0 dalam jangka masa backtest. Harga kemasukan ini direkodkan sebagai harga asas bo_level. Ia kemudian meletakkan semua pesanan keluar yang mungkin pada lilin semasa jika tidak ada pesanan keselamatan (jadi) wujud. Khususnya, harga pesanan keselamatan dikira berdasarkan harga pesanan keselamatan terakhir terbaru_so_level dan skala langkah pesanan keselamatan safe_order_step_scale. Ini berlusuk sehingga jumlah pesanan keselamatan maksimum max_safe_order dicapai.

Semasa memegang kedudukan, jika saiz kedudukan lebih besar daripada 0, harga mengambil keuntungan mengambil_profit_level dikira berdasarkan harga asas dan peratusan mengambil keuntungan sasaran. Jika mengambil keuntungan yang mengikuti dimatikan, harga mengambil keuntungan tetap ini digunakan. Jika tidak, harga tertinggi ttp_max dikemas kini berdasarkan lilin tinggi untuk mengikuti harga mengambil keuntungan untuk mengambil keuntungan yang mengikuti.

Analisis Kelebihan

  • Menggunakan mekanisme DCA untuk rata-rata asas kos turun apabila harga jatuh, lindung nilai risiko sistemik.

  • Menyokong parameter yang boleh disesuaikan untuk konfigurasi peraturan kemasukan yang fleksibel dan mengambil strategi keuntungan untuk aset dan gaya perdagangan yang berbeza.

  • Mempunyai fungsi mengambil keuntungan terbina dalam untuk menyesuaikan mengambil keuntungan secara automatik berdasarkan tindakan harga, mengelakkan pemicu mengambil keuntungan yang lebih awal.

  • Tetapan parameter backtest yang fleksibel menjadikan ujian data jangka masa yang berbeza mudah untuk menilai prestasi strategi.

  • Boleh secara langsung mengkonfigurasi bot hidup pada 3komma menggunakan hasil backtest tanpa pengekodan tambahan.

Analisis Risiko

  • DCA berisiko menambah lagi kedudukan dan kerugian jika pasaran terus menurun.

  • Peratusan tetap mengambil keuntungan tidak dapat menyesuaikan diri dengan turun naik pasaran, risiko keluar awal atau lewat.

  • Backtest risiko overfit, prestasi hidup terjejas oleh kos transaksi dan lain-lain Penilaian yang betul diperlukan.

  • Risiko kestabilan platform gagal pelaksanaan.

Arahan pengoptimuman

  • Sesuaikan penyesuaian harga secara dinamik berdasarkan volatiliti aset yang berbeza untuk mengoptimumkan peraturan piramid.

  • Masukkan penunjuk turun naik untuk menentukan peratusan keuntungan yang lebih saintifik.

  • Tetapkan jangka masa backtest yang munasabah berdasarkan sesi dagangan aset tertentu.

  • Memperkenalkan stop loss untuk mengurangkan kerugian apabila kedudukan turun dengan ketara.

  • Menggunakan pembelajaran mesin untuk mengoptimumkan parameter secara dinamik.

Kesimpulan

Secara keseluruhan, ini adalah backtester DCA yang sangat praktikal. Ia menyokong penyesuaian yang hebat untuk masuk dan mengambil keuntungan peraturan. Pengambilan keuntungan yang mengikuti juga melengkapkan keuntungan yang tetap. Parameter backtest yang fleksibel membolehkan menguji aset dan jangka masa yang berbeza. Dengan penyesuaian parameter yang betul, strategi ini dapat menghasilkan hasil yang sangat baik untuk aset peluang tinggi dengan lindung nilai risiko sistemik dengan DCA. Tetapi risiko seperti piramid dan mengambil keuntungan harus diperhatikan dalam perdagangan langsung, bersama dengan kestabilan platform. Pengoptimuman lanjut seperti parameter dinamik, stop loss boleh menjadikan ini bot perdagangan DCA yang sangat berkuasa.


/*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)


Lebih lanjut