DCA Bot Strategi

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

Gambaran umum

Ini adalah strategi backtesting pada mekanisme rata-rata biaya dolar (DCA) untuk skala ke posisi setelah entri awal. Ini dapat menambahkan ke posisi berdasarkan persentase deviasi harga yang telah ditetapkan dan aturan piramida. Strategi ini juga mencakup mengambil keuntungan dan mengikuti mengambil keuntungan fungsi.

Logika Strategi

Strategi ini pertama kali membuka posisi panjang pada harga penutupan setelah berada di atas 0 dalam kerangka waktu backtest. Harga masuk ini dicatat sebagai harga dasar bo_level. Kemudian menempatkan semua pesanan keluar yang mungkin pada lilin saat ini jika tidak ada pesanan keamanan (jadi). Secara khusus, harga pesanan keamanan dihitung berdasarkan harga pesanan keamanan terakhir terbaru_so_level dan skala langkah aman aman_order_step_scale. Ini berputar sampai jumlah pesanan keamanan maksimum max_safe_order tercapai.

Selama memegang posisi, jika ukuran posisi lebih besar dari 0, harga take profit take_profit_level dihitung berdasarkan harga dasar dan persentase target take profit. Jika trailing take profit dinonaktifkan, harga take profit tetap ini digunakan. Jika tidak, harga tertinggi ttp_max diperbarui berdasarkan candle high untuk trailing take profit price for trailing take profit.

Analisis Keuntungan

  • Menggunakan mekanisme DCA untuk rata-rata biaya dasar turun ketika harga turun, lindung nilai risiko sistemik.

  • Mendukung parameter yang dapat disesuaikan untuk konfigurasi aturan masuk yang fleksibel dan mengambil strategi keuntungan untuk aset dan gaya perdagangan yang berbeda.

  • Memiliki fungsi mengambil keuntungan yang terintegrasi untuk secara otomatis menyesuaikan mengambil keuntungan berdasarkan tindakan harga, menghindari pemicu mengambil keuntungan yang dini.

  • Pengaturan parameter backtest yang fleksibel membuat pengujian data jangka waktu yang berbeda mudah untuk mengevaluasi kinerja strategi.

  • Dapat secara langsung mengkonfigurasi bot hidup pada 3komma menggunakan hasil backtest tanpa coding tambahan.

Analisis Risiko

  • DCA berisiko meningkatkan posisi dan kerugian lebih lanjut jika pasar terus menurun.

  • Persentase tetap mengambil keuntungan tidak dapat menyesuaikan dengan volatilitas pasar, risiko awal atau akhir keluar.

  • Backtest risiko overfit, kinerja hidup dipengaruhi oleh biaya transaksi dll. Evaluasi yang tepat diperlukan.

  • Risiko stabilitas platform gagal pelaksanaan.

Arahan Optimasi

  • Sesuaikan secara dinamis penyimpangan harga berdasarkan volatilitas aset yang berbeda untuk mengoptimalkan aturan piramida.

  • Masukkan indikator volatilitas untuk menentukan persentase keuntungan yang lebih ilmiah.

  • Tetapkan jangka waktu backtest yang wajar berdasarkan sesi perdagangan aset tertentu.

  • Memperkenalkan stop loss untuk memotong kerugian ketika posisi turun secara signifikan.

  • Menggunakan pembelajaran mesin untuk mengoptimalkan parameter secara dinamis.

Kesimpulan

Secara keseluruhan ini adalah backtester DCA yang sangat praktis. Ini mendukung kustomisasi yang besar untuk masuk dan mengambil aturan keuntungan. Mengikuti mengambil keuntungan juga melengkapi fixed take profit dengan baik. Parameter backtest yang fleksibel memungkinkan pengujian aset dan kerangka waktu yang berbeda. Dengan pengaturan parameter yang tepat, strategi ini dapat menghasilkan hasil yang sangat baik untuk aset peluang tinggi dengan lindung nilai risiko sistemik dengan DCA. Tetapi risiko seperti piramida dan mengambil keuntungan harus diwaspadai dalam perdagangan langsung, bersama dengan stabilitas platform. Optimasi lebih lanjut seperti parameter dinamis, stop loss dapat membuat ini menjadi bot perdagangan DCA yang sangat kuat.


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