Stratégie bidirectionnelle de suivi des tendances basée sur la rupture de gamme

Auteur:ChaoZhang est là., Date: 2024-02-01 14h22 et 26h
Les étiquettes:

img

Résumé

Cette stratégie calcule le dernier prix le plus élevé (lastbull) et le dernier prix le plus bas (lastbear). Elle compare ensuite le prix actuel avec lastbull et lastbear pour déterminer si le prix est entré dans une certaine fourchette et génère ainsi des signaux de trading.

La logique de la stratégie

La stratégie calcule d'abord le dernier prix le plus élevé lastbull et le dernier prix le plus bas lastbear. puis elle calcule le pourcentage de variation ddl du prix courant proche par rapport au lastbull, et le pourcentage de variation dds par rapport au lastbear.

Lorsque ddl est inférieur au signal de long terme configuré, un signal long est généré.

Lorsqu'il reçoit un signal long, il ouvre une position longue si le paramètre needlong est vrai. Lorsqu'il reçoit un signal court, il ouvre une position courte si le paramètre needshort est vrai.

Il ferme une position longue lorsque le prix augmente après une ouverture longue, et ferme une position courte lorsque le prix chute après une ouverture courte.

Analyse des avantages

Cette stratégie combine l'analyse de tendance et de fourchette. Elle peut capturer les tendances et générer des signaux de trading à partir des ruptures de fourchette. Par rapport aux stratégies de suivi de tendance simples, elle peut rapidement capturer une nouvelle direction de tendance après la rupture de fourchette.

Les paramètres sont hautement configurables pour différents produits.

Analyse des risques

Il n'y a pas de mécanisme de stop loss dans cette stratégie pour limiter la perte par transaction.

L'algorithme de dimensionnement de la position peut être personnalisé en fonction des produits pour stabiliser la taille de la position.

Directions d'optimisation

  1. Ajouter le stop loss mobile au contrôle par risque de perte de transaction
  2. Améliorer l'algorithme de dimensionnement de la position, par exemple en utilisant ATR, pour stabiliser la taille de la position
  3. Ajouter un filtre pour les signaux d'entrée, par exemple entrer uniquement lorsque la croix dorée se produit
  4. Échange de produits multiples avec corrélation avec un risque systémique inférieur

Résumé

Cette stratégie combine l'analyse des tendances et la rupture de la fourchette pour générer des signaux de trading, qui peuvent capturer de nouvelles tendances et tirer parti des caractéristiques de la fourchette.


/*backtest
start: 2023-01-25 00:00:00
end: 2024-01-31 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Noro
//2019

//@version=4
strategy(title = "Noro's DDL Strategy", shorttitle = "DDL str", overlay = false, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 3)

//Settings
needlong = input(true, title = "Long")
needshort = input(true, title = "Short")
capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Lot")
signalshort = input(3.0, title = "Short, %")
signallong = input(-3.0, title = "Long, %")
fromyear = input(1900, defval = 1900, minval = 1900, maxval = 2100, title = "From Year")
toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year")
frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month")
tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month")
fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day")
today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day")

//Levels
bull = close > close[1] ? 1 : 0
bear = close < close[1] ? 1 : 0
lastbull = 0.0
lastbull := bull ? close : lastbull[1]
lastbear = 0.0
lastbear := bear ? close : lastbear[1]

//Signals
ddl = ((close / lastbull) - 1) * 100
up = ddl < signallong
dds = ((close / lastbear) - 1) * 100
dn = dds > signalshort

//Lines
plot(dds, style = plot.style_area, color = color.red, transp = 0)
plot(ddl, style = plot.style_area, color = color.lime, transp = 0)
plot(0, color = color.black, linewidth = 2, transp = 0)

//Background
col = (up and needlong) or (dn and needshort) ? color.yellow : na
bgcolor(col, transp = 20)

//Orders
lot = 0.0
lot := strategy.position_size == 0 ? strategy.equity / close * capital / 100 : lot[1]
truetime = true
if up
    strategy.entry("Long", strategy.long, lot, when = needlong and truetime)
if dn
    strategy.entry("Short", strategy.short, lot, when = needshort and truetime)
if strategy.position_size > 0 and close > open
    strategy.entry("Close", strategy.short, 0)
if strategy.position_size < 0 and close < open
    strategy.entry("Close", strategy.long, 0)

Plus de