ダブルボトム反転移動平均DCAグリッド戦略


作成日: 2024-02-20 11:09:33 最終変更日: 2024-02-20 11:09:33
コピー: 3 クリック数: 839
1
フォロー
1617
フォロワー

ダブルボトム反転移動平均DCAグリッド戦略

概要

双底反転均線DCA格子戦略は,主として均線価格反転とDCA戦略を実現する格子段階的にポジションを構築する.それは,双底反転形状に基づいて反転の機会を判断する.反転形状を触発すると,複数の異なる価格の委託状を使用して,DCAと組み合わせて段階的に格子ポジションを構築する.

戦略原則

この戦略は,K線が2つの連続した閉盘価格の等しい底に現れるかどうかを判断する.これはの二重底と呼ばれます.二重底が検出された場合,価格逆転の機会が考えられます.このとき,戦略は底辺の近くに複数の限値委託を設置し,これらの委託の価格はATRと波動率に基づいて計算され,格子区を形成します.これはDCAの効果を現わし,トレーダーが逆転した異なる価格点で段階的にポジションを構築することができます.

具体的には,まずta.atrで最近14KラインのATR指標を計算し,次に最近5Kラインの価格変動率を計算する.これは格子区間を決定する主要パラメータである.格子区間は4つの価格点に分かれ,それぞれ底値+変動率,底値+0.75倍変動率,そしてこうして.双底条件が触発された後,この計算式に従って,対応する価格で4つの制限価格委託を設定し,各委託の数は等しくなる.未交付の連鎖は,設定された数後に自動的に撤回する.

さらに,戦略は,ストップ・ロズとストップ・ストップを設定します. ストップ・ロズ価格は,二重底の最低価格 - 最小跳躍位,ストップ・価格は,入場価格+ATR指数の5倍である. ポジションが0でないとき,この2つの価格は,リアルタイムで更新されます.

優位分析

この戦略の利点は以下の通りです.

  1. ダブルボトムで反転時刻を判断することで,偽突破を効果的に回避できます.
  2. DCAの格子設計は,トレーダーが異なる価格で段階的にポジションを構築し,ポジションコストを削減することを可能にします.
  3. ATRと波動率のパラメータは,格子とストップスペースを動的に調整し,市場の変化に適応することができる.
  4. 自動止損システムは,単一損失を効果的に制御できます.

リスク分析

主なリスクは

  1. 価格が逆転せず,直接二重底のサポートレベルを下回る可能性があります. この時点で,ストップがトリガーされ,損失が発生します. ストップ距離を適切に拡大できます.
  2. DCA格子区間設定が不適切で,ほとんどの委託は取引できない。異なるパラメータをテストして取引率を確保することができる。
  3. 市場が激しく揺れると,ストップは頻繁にトリガーされることがあります. ストップの倍数を適切に拡張することを考慮することができます.

最適化の方向

この戦略は以下の方向から最適化できます.

  1. トレンド判断を高め,トレンドを多く見るときに逆転操作を行って,大きなトレンドを逃さないようにする.
  2. 最初の単一ポジションを拡大し,その後の格子ポジションを徐々に減らし,資金使用効率を最適化することを検討する.
  3. 異なるパラメータの組み合わせをテストし,最適なパラメータを見つけます.市場に応じてリアルタイムに調整するダイナミックなパラメータを設計することもできます.
  4. 機械学習を高度なプラットフォームに統合し,パラメータの自動最適化を可能にします.

要約する

双底反転均線DCA格子戦略は,価格形状,均線指標,格子取引など,複数の技術手段を総合的に使用している.判断点精度,コスト制御,撤回保護などの利点がある.この戦略の最適化スペースは広大で,深度な研究と適用に値する.パラメータを適切に調整すれば,震動行情で良い効果を得ることができる.

ストラテジーソースコード
/*backtest
start: 2024-02-12 00:00:00
end: 2024-02-19 00:00:00
period: 3m
basePeriod: 1m
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/
// © cherepanovvsb

//@version=5
strategy("Reversal (only long)", overlay=true, margin_long=1, margin_short=1,initial_capital=1000,commission_type = strategy.commission.percent,commission_value =0.1,currency='USD', process_orders_on_close=true)
plotshape(low == low[1], style=shape.triangleup, location=location.belowbar, color=color.blue, title="1 Setup")
plotshape(low == low[1] and low[1]==low[2], style=shape.triangleup, location=location.belowbar, color=color.red, title="Triple Setup")

ATRlenght   = input.int(title="ATR length for taking profit", defval=14, group="Strategy Settings")
rewardMultiplier= input.int(title="ATR multiplier", defval=5, group="Strategy Settings")
Volatility_length=input.int(title='Volatility length',defval=5,group="Strategy Settings")
Volatility_multiplier=input.float(title='Volatility multiplier',defval=0.5,step=0.1, group="Strategy Settings")
Candles_to_wait=input.int(title='How many candles to wait after placing orders grid?',defval=4,group="Strategy Settings")

// Get ATR
atr1 = ta.atr(ATRlenght)

//Get volatility values (not ATR) 
float result = 0
for i = 0 to Volatility_length
	result+=high[i]-low[i]
volatility=result*Volatility_multiplier/Volatility_length

//Validate entrance points
validlow =  low [2]== low[1] and not na(atr1) 
validlong = validlow and strategy.position_size == 0  and low[1]<low


// Calculate SL/TP
longStopPrice = low[1]-syminfo.mintick
longStopDistance = close - longStopPrice
longTargetPrice = close + (longStopDistance * rewardMultiplier)
strategy.initial_capital = 50000
//Assign all variables
var tradeStopPrice = 0.0
var tradeTargetPrice = 0.0
var point1=0.0
var point2=0.0
var point3=0.0
var point4=0.0
var contracts = int(strategy.initial_capital/close)/4
if validlong 
    tradeStopPrice := longStopPrice
    tradeTargetPrice := longTargetPrice
    point1:=low[1]+volatility
    point2:=low[1]+volatility*0.75
    point3:=low[1]+volatility*0.5
    point4:=low[1]+volatility*0.25

strategy.entry ("Long1", strategy.long,limit=point1,qty=contracts, when=validlong)
strategy.entry ("Long2", strategy.long,limit=point2,qty=contracts, when=validlong)
strategy.entry ("Long3", strategy.long,limit=point3,qty=contracts, when=validlong)
strategy.entry ("Long4", strategy.long,limit=point4,qty=contracts, when=validlong)

stopcondition = ta.barssince(validlong) == Candles_to_wait

strategy.cancel("Long1",when=stopcondition)
strategy.cancel("Long2",when=stopcondition)
strategy.cancel("Long3",when=stopcondition)
strategy.cancel("Long4",when=stopcondition)
    
strategy.exit(id="Long Exit", limit=tradeTargetPrice, stop=tradeStopPrice, when=strategy.position_size > 0)

plot(strategy.position_size != 0 or validlong ? tradeStopPrice : na, title="Trade Stop Price", color=color.red, style=plot.style_linebr, linewidth=3)
plot(strategy.position_size != 0 or validlong ? tradeTargetPrice : na, title="Trade Target Price", color=color.green, style=plot.style_linebr, linewidth=3)

plot(strategy.position_size != 0? point1 : na, title="Long1", color=color.green, style=plot.style_linebr, transp=0)
plot(strategy.position_size != 0? point2 : na, title="Long2", color=color.green, style=plot.style_linebr, transp=0)
plot(strategy.position_size != 0? point3 : na, title="Long3", color=color.green, style=plot.style_linebr, transp=0)
plot(strategy.position_size != 0? point4 : na, title="Long4", color=color.green, style=plot.style_linebr, transp=0)