相対的なボリュームとトレンドに基づいた取引戦略


作成日: 2023-10-17 16:19:59 最終変更日: 2023-10-17 16:19:59
コピー: 0 クリック数: 648
1
フォロー
1617
フォロワー

相対的なボリュームとトレンドに基づいた取引戦略

概要

この戦略は,相対的な取引量指標と価格動向判断のトレンド指標を組み合わせて,トレンド追跡と突破を融合した自動取引システムを実現する.取引量が増加し,変動が少ないときに購入し,ストップポイントと価格動向に基づいてストップまたは損失を判断する.

戦略原則

  1. Bollinger Bandsを使用して,価格の変動が小さいかどうかを判断する.具体的にはATRとBOLLチャネルの帯域を比較する.

  2. 過去N日間の平均取引量を計算し,現在のVolumeと比較して取引量が増加したかどうかを判断します.

  3. 価格が低くなると取引量が増加し,波動が小さい時に購入する.

  4. ストップ・ロスを設定し,最低価格の更新を追跡する.

  5. 価格がダウンして止損点を突破すると止まります.

  6. 価格が多頭吞食パターンを形成すると停止する.

優位分析

  1. 交差量と波動性の指標を組み合わせて,偽突破を効果的にフィルターできます.

  2. トレンドトラッキングのストップ・ロスを用いて,最大限の利潤をロックできます.

  3. 多頭吞食などの形状判断をストップ信号として利用し,トレンドの逆転の前夜にタイムストップを行うことができる.

  4. 戦略は直観的でシンプルで,理解し,追跡しやすい.

  5. 停止・停止の規則は明確で,閉市・アンチシパートの不確実性を軽減する.

リスク分析

  1. 合格指数が遅れているため,ベストエントリーポイントを逃す可能性があります.

  2. 多頭吞食などの形状判断は,停止信号として信頼性が不足し,早めに停止する危険性がある.

  3. ストップ・ロスの後方策は,単一損失の大きなリスクがある.

  4. ATRや取引量周期などの合理的なパラメータの調整が必要である.そうでなければ,頻繁に取引が起こる可能性があります.

  5. ストップ・ストップ・ロスのルールに注目し,それを最適化することで,不必要な平仓の可能性を減らす必要がある.

最適化の方向

  1. MACDなどの他の指標のフィルタリング入場信号と組み合わせてみてください.

  2. ATRと取引量周期のパラメータを最適化し,頻繁な取引のリスクを軽減します.

  3. 価格が下落するなど,Exitメカニズムなどの他の停止信号を試す.

  4. ストップ・ロスを動的に調整することで,より多くの利益をロックする可能性を研究する.

  5. ポジション保持時間の違いがパフォーマンスに与える影響をテストし,最適のポジション保持周期を探します.

  6. 異なる品種の契約効果を測り,最適の品種を見つけます.

要約する

この戦略は全体的に簡潔で直観的であり,交量指標と価格動向の判断を組み合わせてトレンド追跡型の戦略を実現している.信号生成がより明確で,追跡が容易で,逆操作のリスクが軽減されている.しかし,フィルタリング信号の質とストップ・ストップ・ロスの規則を最適化して,戦略をより安定的に信頼できるようにする必要がある.パラメータ設定,出場退場機構などの改善を継続することにより,より優れたパフォーマンスを生み出すことが期待されている.

ストラテジーソースコード
/*backtest
start: 2022-10-10 00:00:00
end: 2023-10-16 00:00:00
period: 1d
basePeriod: 1h
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/
// © DojiEmoji (kevinhhl)

//@version=4
strategy("[KL] Relative Volume Strategy",overlay=true,pyramiding=1)
ENUM_LONG = "Long"
VERBOSE_MODE = false
opened_position = false

// Timeframe {
backtest_timeframe_start = input(defval = timestamp("01 Apr 2016 13:30 +0000"), title = "Backtest Start Time", type = input.time)
USE_ENDTIME = input(false,title="Define backtest end-time (If false, will test up to most recent candle)")
backtest_timeframe_end = input(defval = timestamp("01 May 2021 19:30 +0000"), title = "Backtest End Time (if checked above)", type = input.time)
within_timeframe = true
// }

// Volatility Indicators {
// BOLL:
BOLL_length = 20, BOLL_src = close, SMA20 = sma(BOLL_src, BOLL_length), BOLL_sDEV_x2 = 2 * stdev(BOLL_src, BOLL_length)
BOLL_upper = SMA20 + BOLL_sDEV_x2, BOLL_lower = SMA20 - BOLL_sDEV_x2
plot(SMA20, "Basis", color=#872323, offset = 0)
BOLL_p1 = plot(BOLL_upper, "BOLL Upper", color=color.navy, offset = 0, transp=50)
BOLL_p2 = plot(BOLL_lower, "BOLL Lower", color=color.navy, offset = 0, transp=50)
//fill(BOLL_p1, BOLL_p2, title = "Background", color=#198787, transp=85)
// ATR v. sDev of prices
ATR_x2 = atr(input(10,title="Length of ATR [Trailing Stop Loss] (x2)"))*2
//plot(SMA20+ATR_x2, "SMA20 + ATR_x2", color=color.gray, offset = 0, transp=50)
//plot(SMA20-ATR_x2, "SMA20 - ATR_x2", color=color.gray, offset = 0, transp=50)
//plotchar(ATR_x2, "ATR_x2", "", location = location.bottom)
is_low_volat = ATR_x2 > BOLL_sDEV_x2
// }

// Trailing stop loss {
TSL_source = low

var entry_price = float(0), var stop_loss_price = float(0)

TSL_line_color = color.green
if strategy.position_size == 0 or not within_timeframe
    TSL_line_color := color.black
    stop_loss_price := TSL_source - ATR_x2 
else if strategy.position_size > 0
    stop_loss_price := max(stop_loss_price, TSL_source - ATR_x2)
plot(stop_loss_price, color=TSL_line_color)

// }

// Relative volume indicator {
LEN_RELATIVE_VOL = input(5, title="SMA(volume) length (for relative comparison)")
relative_vol = sma(volume,LEN_RELATIVE_VOL)
// }

// price actions {
bar_range_ratio = abs(close-open)/(high-low)
engulfing = low < low[1] and high > high[1] and abs(close-open) > abs(close-open)[1]
// }

// MAIN:
if within_timeframe
	entry_msg = "", exit_msg = close <= entry_price ? "stop loss" : "take profit"

    // ENTRY :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
	if close > open and volume > relative_vol and is_low_volat
		if strategy.position_size > 0
			entry_msg := "adding"
		else if strategy.position_size == 0
			entry_msg := "initial"

		if strategy.position_size == 0
			entry_price := close
			stop_loss_price := TSL_source - ATR_x2
			ATR_x2 := ATR_x2

		strategy.entry(ENUM_LONG, strategy.long, comment=entry_msg)

    // EXIT ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
	if strategy.position_size > 0
		bExit = false		
		// EXIT: Case (A) touches trailing stop loss
		if TSL_source <= stop_loss_price
			exit_msg := exit_msg + "[TSL]"
			bExit := true
		// EXIT: Case (B)
		else if close < open and not is_low_volat and engulfing and (high-low) > ATR_x2
			exit_msg := VERBOSE_MODE ? exit_msg + "[engulfing bearish]" : exit_msg
			bExit := true
        strategy.close(ENUM_LONG, when=bExit, comment=exit_msg)

// CLEAN UP:
if strategy.position_size == 0
	entry_price := 0
	stop_loss_price := float(0)