クロスサイクルトレンド追跡定量戦略


作成日: 2023-12-15 15:59:37 最終変更日: 2023-12-15 15:59:37
コピー: 0 クリック数: 600
1
フォロー
1621
フォロワー

クロスサイクルトレンド追跡定量戦略

概要

この戦略は,価格の傾向を判断するPSAR指標,トレンドの強さを判断するADX指標,超売り区域を判断するRSI指標,資金の流れを判断するCMF指標を総合的に使用し,周期を越えたトレンド追跡型の定量取引戦略を構築する.この戦略は,価格が収束突破して新しいトレンド方向を形成することを判断する際に迅速な位置付けを行い,その後のトレンドで継続的に追跡し,主要なトレンドの収益を把握することを保証しながら,プロセス過渡条件を設定し,ポジションのリスクを軽減する.

戦略原則

この政策の判断の基本は以下の通りです.

  1. 価格が上昇傾向にあるかどうかを判断するためにPSAR指標を使用し,PSARの下破は上昇傾向の終わりとして下落に変換されます.

  2. RSIは,超売り領域が形成される偽のブレイクをフィルターするために,ミドルライン50より高い値を求めます.

  3. ADXは自社のEMA平均線より高い値を求め,トレンド分析の結果が継続的な信号であることを示した.

  4. CMFの要求は0以上で 資金流入として判断されます.

上記の4つの条件を満たすときに買入シグナルを生成する.PSARを満たすときに,RSIが50未満,ADXが自身のEMA平均線より低い,CMFが0未満であるときに売り信号を生成する.

この戦略は,価格のトレンドの方向,トレンドの強度,オーバーバイ・オーバーセール状態,および資金の流れを複数の次元に考慮し,取引規則を設定し,取引信号を生成する判断に厳格な論理判断を設定し,偽の突破状況を効果的にフィルターし,高い確率で持続可能なトレンドの方向を把握することを保証します.

優位分析

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

  1. 複数の指標の設定と取引規則の組み合わせにより,偽の突破を効果的に防ぎ,取引信号の質を保証する.

  2. 新興トレンドの方向を迅速に特定し,追跡し,トレンドの過程から得られる利益を十分に把握する.

  3. フィルタリング条件を追跡するプロセスを設定し,リスクを効果的に制御し,追跡効果を保証します.

  4. トレンドの強度指標の判断と組み合わせれば,収束の困境に陥らないことができます.

リスク分析

この戦略には以下のリスクがあります.

  1. 単一の戦略はリスクを積み重ねやすく,全体的なリスクを制御するためにポジションを適切に調整する必要があります.

  2. 条件のキャンセル後にLoss Cutが発生しないように,フィルター条件の変化を注意深く追跡する必要があります.

  3. この戦略は中長期線を主としており,短期的なコンテンツは波動の影響を受けやすいため,ストップ・ローズリスクが生じます.

対応するリスク管理措置には,ポジション管理規則の最適化,リスク予警線の設定,適切な緩解の止損線距離などが含まれます.

最適化の方向

この戦略には以下の最適化余地があります.

  1. パラメータ設定の最適化,現在のパラメータ設定は主観的であり,機械学習方法の自動最適化を導入できます.

  2. ポジション管理モジュールが追加され,リスク状況に応じてポジションを動的に調整できます.

  3. 追跡停止,時間停止,突破停止などの停止メカニズムを最適化します.

要約する

この戦略は,複数の指標判断ルールを統合し,新興トレンドの迅速な位置付けと継続的な追跡を実現し,トレンドと資金などの多次元分析の有効性を検証した.この戦略は,周期間トレンド追跡の基礎戦略として指数的に運用され,パラメータとモジュールを最適化した後,安定した中長期線形量化戦略として構築することができます.

ストラテジーソースコード
/*backtest
start: 2023-11-14 00:00:00
end: 2023-12-14 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("psar+ adx + cmf + rsi Strategy", overlay=true,initial_capital = 1000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent , commission_value=0.1 )

start = input(1.02)
increment = input(1.02)
maximum = input(1.2)
var bool uptrend = na
var float EP = na
var float SAR = na
var float AF = start
var float nextBarSAR = na
if bar_index > 0
	firstTrendBar = false
	SAR := nextBarSAR
	if bar_index == 1
		float prevSAR = na
		float prevEP = na
		lowPrev = low[1]
		highPrev = high[1]
		closeCur = close
		closePrev = close[1]
		if closeCur > closePrev
			uptrend := true
			EP := high
			prevSAR := lowPrev
			prevEP := high
		else
			uptrend := false
			EP := low
			prevSAR := highPrev
			prevEP := low
		firstTrendBar := true
		SAR := prevSAR + start * (prevEP - prevSAR)
	if uptrend
		if SAR > low
			firstTrendBar := true
			uptrend := false
			SAR := max(EP, high)
			EP := low
			AF := start
	else
		if SAR < high
			firstTrendBar := true
			uptrend := true
			SAR := min(EP, low)
			EP := high
			AF := start
	if not firstTrendBar
		if uptrend
			if high > EP
				EP := high
				AF := min(AF + increment, maximum)
		else
			if low < EP
				EP := low
				AF := min(AF + increment, maximum)
	if uptrend
		SAR := min(SAR, low[1])
		if bar_index > 1
			SAR := min(SAR, low[2])
	else
		SAR := max(SAR, high[1])
		if bar_index > 1
			SAR := max(SAR, high[2])
	nextBarSAR := SAR + AF * (EP - SAR)

//rsi strat
length = input( 50 )
middle_RSI=input(49)
price = close
vrsi = rsi(price, length)

//cmf
lengthCMF = input(20, minval=1)
ad = close==high and close==low or high==low ? 0 : ((2*close-low-high)/(high-low))*volume
mf = sum(ad, lengthCMF) / sum(volume, lengthCMF)

//ADX
adxlen = input(14, title="ADX Smoothing")
dilen = input(14, title="DI Length")
dirmov(len) =>
	up = change(high)
	down = -change(low)
	plusDM = na(up) ? na : (up > down and up > 0 ? up : 0)
	minusDM = na(down) ? na : (down > up and down > 0 ? down : 0)
	truerange = rma(tr, len)
	plus = fixnan(100 * rma(plusDM, len) / truerange)
	minus = fixnan(100 * rma(minusDM, len) / truerange)
	[plus, minus]
adx(dilen, adxlen) =>
	[plus, minus] = dirmov(dilen)
	sum = plus + minus
	adx = 100 * rma(abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen)
sig = adx(dilen, adxlen)
ema_length=input(10)
ema_sig= ema(sig,ema_length)


long = not uptrend  and vrsi > middle_RSI and sig > ema_sig   and mf>0 
short= uptrend   and vrsi < middle_RSI and sig<ema_sig and mf<0

strategy.entry("long",1,when=long)
strategy.close('long',when=short)