DCA戦略


作成日: 2023-09-26 17:28:27 最終変更日: 2023-09-26 17:28:27
コピー: 0 クリック数: 976
1
フォロー
1617
フォロワー

概要

この戦略は,ドルコスト平均 (DCA) の原理を利用して加仓取引を行う回報手順である.これは,初期開設後に,設定された価格偏差パーセントと加仓回数ルールに従って,ポジションを追加することができる.また,戦略には,ストップストップ戦略と追跡ストップストップ機能が含まれている.

戦略原則

この戦略は,まず,追溯時間窓の中で,その日の閉盘価格が0より大きいとき,直ちにポジションを開け,その時の開場価格を基礎価格としてbo_levelする.その後,もし安全注文がない場合, (<) の場合,設定された価格の比率と加仓回数に応じて,可能な平仓注文をすべて現在のに置く.具体的には,安全注文の価格は,最新の安全注文の価格latest_so_levelをベースに,安全注文のステップを縮小して,次の安全注文の価格next_so_levelを計算する.最大安全注文数max_safe_orderに達するまで,このように循環する.

持仓段階では,持仓量が0以上である場合,基本価格とターゲットストップのパーセントに基づいてストップ価格を計算します. ストップを追跡する機能がオフになっている場合は,この固定ストップ価格を使用します.

戦略的優位分析

  • DCA戦略を利用して,価格下落後に自動的にポジションを上げ,平均ポジションのコストを低くし,システムリスクをカバーすることができる.

  • カスタムパラメータをサポートし,異なる品種と取引スタイルに応じてポジション開設ルールとストップストップ戦略を柔軟に配置できます.

  • ストップを追跡する機能が内蔵されており,ストップの位置を状況に応じて自動的に調整して,ストップが早めに発動するのを防ぐことができます.

  • 回測パラメータの設定は柔軟で,異なる時間帯のデータをテストし,戦略の効果を評価することができます.

  • 3commasプラットフォームと組み合わせると,フィードバック結果を直接使って,追加開発を必要とせずに,実体ロボットを配置できます.

戦略的リスク分析

  • DCA戦略には,加仓のリスクがあり,市場が下がり続けば,保有額がさらに増加し,損失も増加する.合理的な配置加仓規則が必要である.

  • 固定パーセンテージストップは,市場の変動幅に合わせて調整できないため,早めにストップまたはストップをオフにすることがあります. ストップを追跡するストップを配置する必要があります.

  • 合致リスクがあることを推測し,実盤効果は取引コストなどの要因に影響する. リスク評価を行う必要がある.

  • 交易所や3コマスのシステムの安定性には注意が必要で,計画された取引の実行が失敗しないようにする.

戦略最適化の方向性

  • 価格の偏差のパーセントを,異なる品種の変動率に応じて動的に調整し,加仓規則を最適化することができる.

  • 波動率指数と組み合わせて,より科学的ストップパーセンテージを決定することができる.

  • 品種ごとに異なる取引時間に応じて,合理的な反省時間窓を設定できます.

  • ストップ・ロスの策略を導入し,大きな損失の時にストップ・ロスを退出することができる.

  • 機械学習アルゴリズムを組み合わせて,戦略の動的最適化パラメータを設定できます.

要約する

この戦略は,全体として非常に実用的なDCA反測プログラムである. それは,良好なカスタムパラメータ設定をサポートし,ポジション開設と停止のルールを柔軟に構成することができる. 同時に,固定ストップの不足を補うために,ストップを追跡する機能が内蔵されている.反測パラメータは,異なる品種と時間帯のデータをテストすることができるように,非常に柔軟である.

ストラテジーソースコード
/*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)