定期的に谷間平均価格戦略を追跡する


作成日: 2024-01-17 17:57:58 最終変更日: 2024-01-17 17:57:58
コピー: 4 クリック数: 605
1
フォロー
1617
フォロワー

定期的に谷間平均価格戦略を追跡する

概要

この戦略の主な考えは,短期的な下落が終了した後,定期的に低位平均価格を追跡することである.具体的には,戦略は,毎月の終わりに短期的な下落が終了するタイミングを認識し,定期的にポジションを追加する.また,最後のK線が閉店するときに,ポジションをクリアする.

戦略原則

  1. 定期的な追跡信号の判定: 24回毎*30根K線 ((1ヶ月を表す) の後に,定期追跡地点に到達したとして判断され,最初の信号を出力した.
  2. 短期下落の終了判定:MACD指数を使用してトレンドを判断し,MACDが反転して信号線を下回るとき,短期下落が終了したと判断する.
  3. 入場ルール:定期追跡信号と短期下落の終了信号が同時に満たされると,追跡信号を解放し,ポジションを多めに開きます.
  4. 出場ルール:最後のK線が閉じる時,全ポジションをクリアする.

戦略の基本的取引プロセスと原理です. 策略は,毎月1,000ドルの資金追跡をデフォルトで使用しており,バックテストでは33ヶ月まで拡張され,合計33,000ドルの投資になります.

優位分析

この戦略の最大の利点は,低水準で定期的なポジションを建設することができ,長期的には比較優遇的な購入コストを得ることができ,比較高い収益率を生むことです.また,MACD指標を使用して短期購入点を特定することも,比較信頼性が高く,明瞭であり,行き詰まりに誤って行きません.これは,損失を一定程度に回避することもできます.

総じて,これは費用対効果の戦略であり,中長線保有者が定期的に大量購入し,満足のいく収益を得ることができるように適しています.

リスクと解決策

戦略の主なリスクは,短期的な下落の終点を正確に判断できないことであり,MACD指標が下落の終点を判断するタイミングが遅れている可能性があり,これはコストが最適で購入できないことにつながります.

ブリンライン,KDJなどのトレンド判断のためのより多くの指標を追加することを考えることができる.これらの指標は,逆転のタイミングを事前に判断することができます. また,毎月の投資額を最適化して,稼働コストが収益への影響を減らすことができます.

最適化の方向

この戦略をさらに改善するには,以下の方向から取り組む必要があります.

  1. 定期的な追跡のタイムサイクルを最適化して,例えば,毎月1回から毎月1回まで定期的な追跡に変更し,過剰な取引の問題を減らす.

  2. 短期的な下落が終わるときを判断するより多くの指標と組み合わせて,購入ポイントを最低値に近づけます.

  3. 資金の月額を最適化して,最適配置を見つける.

  4. 損失を防ぐ戦略を組み込んで,深部に落下して損失を避けるようにしましょう.

  5. ポジションの周期が収益に与える影響をテストし,ポジションを保持する最適な日数を特定する.

要約する

この定期的な低谷均等価格戦略の全体的な考え方は明確で分かりやすく,定期的な追加と短期的な判断を組み合わせることで,より有利なコスト価格を得ることができます.中長期線を保持するこの戦略は,安定した収益を得ることができ,長期投資価値を追求する投資家に適しています.同時に,この戦略をさらに完善させ,その業績をさらに向上させることができるように,最適化できる方向にも注意を向けることができます.

ストラテジーソースコード
/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 1h
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/
// © BHD_Trade_Bot

// @version=5
strategy(
 shorttitle            = 'DCA After Downtrend v2',
 title                 = 'DCA After Downtrend v2 (by BHD_Trade_Bot)',
 overlay               = true,
 calc_on_every_tick    = false,
 calc_on_order_fills   = false,
 use_bar_magnifier     = false,
 pyramiding            = 1000,
 initial_capital       = 0,
 default_qty_type      = strategy.cash,
 default_qty_value     = 1000,
 commission_type       = strategy.commission.percent,
 commission_value      = 1.1)



// Backtest Time Period
start_year   = input(title='Start year'   ,defval=2017)
start_month  = input(title='Start month'  ,defval=1)
start_day    = input(title='Start day'    ,defval=1)
start_time   = timestamp(start_year, start_month, start_day, 00, 00)

end_year     = input(title='end year'     ,defval=2050)
end_month    = input(title='end month'    ,defval=1)
end_day      = input(title='end day'      ,defval=1)
end_time     = timestamp(end_year, end_month, end_day, 23, 59)

window() => time >= start_time and time <= end_time ? true : false
h1_last_bar = (math.min(end_time, timenow) - time)/1000/60/60 < 2



// EMA
ema50 = ta.ema(close, 50)
ema200 = ta.ema(close, 200)

// EMA_CD
emacd = ema50 - ema200
emacd_signal = ta.ema(emacd, 20)
hist = emacd - emacd_signal

// BHD Unit
bhd_unit = ta.rma(high - low, 200) * 2
bhd_upper = ema200 + bhd_unit
bhd_upper2 = ema200 + bhd_unit * 2
bhd_upper3 = ema200 + bhd_unit * 3
bhd_upper4 = ema200 + bhd_unit * 4
bhd_upper5 = ema200 + bhd_unit * 5

bhd_lower = ema200 - bhd_unit
bhd_lower2 = ema200 - bhd_unit * 2
bhd_lower3 = ema200 - bhd_unit * 3
bhd_lower4 = ema200 - bhd_unit * 4
bhd_lower5 = ema200 - bhd_unit * 5

// Count n candles after x long entries
var int nPastCandles = 0
var int entryNumber = 0
if window()
    nPastCandles := nPastCandles + 1



// ENTRY CONDITIONS

// 24 * 30 per month
entry_condition1 = nPastCandles > entryNumber * 24 * 30

// End of downtrend
entry_condition2 = emacd < 0 and hist < 0 and hist > hist[2]

ENTRY_CONDITIONS = entry_condition1 and entry_condition2


if ENTRY_CONDITIONS
    entryNumber := entryNumber + 1
    entryId = 'Long ' + str.tostring(entryNumber)
    strategy.entry(entryId, strategy.long)
    
    

// CLOSE CONDITIONS

// Last bar
CLOSE_CONDITIONS = barstate.islast or h1_last_bar

if CLOSE_CONDITIONS
    strategy.close_all()



// Draw
colorRange(src) =>
    if src > bhd_upper5
        color.rgb(255,0,0)
    else if src > bhd_upper4
        color.rgb(255,150,0)
    else if src > bhd_upper3
        color.rgb(255,200,0)
    else if src > bhd_upper2
        color.rgb(100,255,0)
    else if src > bhd_upper
        color.rgb(0,255,100)
    else if src > ema200
        color.rgb(0,255,150)
    else if src > bhd_lower
        color.rgb(0,200,255)
    else if src > bhd_lower2
        color.rgb(0,150,255)
    else if src > bhd_lower3
        color.rgb(0,100,255)
    else if src > bhd_lower4
        color.rgb(0,50,255)
    else
        color.rgb(0,0,255)
        
bhd_upper_line = plot(bhd_upper, color=color.new(color.teal, 90))
bhd_upper_line2 = plot(bhd_upper2, color=color.new(color.teal, 90))
bhd_upper_line3 = plot(bhd_upper3, color=color.new(color.teal, 90))
bhd_upper_line4 = plot(bhd_upper4, color=color.new(color.teal, 90))
bhd_upper_line5 = plot(bhd_upper5, color=color.new(color.teal, 90))

bhd_lower_line = plot(bhd_lower, color=color.new(color.teal, 90))
bhd_lower_line2 = plot(bhd_lower2, color=color.new(color.teal, 90))
bhd_lower_line3 = plot(bhd_lower3, color=color.new(color.teal, 90))
bhd_lower_line4 = plot(bhd_lower4, color=color.new(color.teal, 90))
bhd_lower_line5 = plot(bhd_lower5, color=color.new(color.teal, 90))
// fill(bhd_upper_line5, bhd_lower_line5, color=color.new(color.teal, 95))

plot(ema50, color=color.orange, linewidth=3)
plot(ema200, color=color.teal, linewidth=3)
plot(close, color=color.teal, linewidth=1)
plot(close, color=colorRange(close), linewidth=3, style=plot.style_circles)