Cette stratégie génère des signaux de trading basés sur le croisement entre les prix ouverts et les prix élevés. Il va long lorsque le prix ouvert dépasse le prix élevé et court lorsque le prix ouvert dépasse le prix élevé. Les moyennes mobiles peuvent être utilisées pour lisser les données de prix et réduire les transactions bruyantes. Divers types et paramètres de moyennes mobiles sont configurables.
Déterminer si une résolution alternative doit être utilisée en fonction du paramètre d'entrée useRes. Si elle est activée, définir la résolution avec stratRes.
Décidez si vous voulez utiliser la moyenne mobile (useMA) en fonction du paramètre d'entrée.
Obtenez les données des séries de prix d'ouverture (ouvert) et de prix de fermeture (fermé). Appliquez le MA sélectionné avec les paramètres configurés si useMA est activé.
Comparez le prix d'ouverture actuel x avec la série ouverte openSeries. Si x est supérieur à openSeries, définissez trendState sur long, sinon sur short.
Générer un signal long longCond lorsque le prix d'ouverture dépasse la série d'ouverture MA. Générer un signal court shortCond lorsque le prix d'ouverture dépasse la série d'ouverture MA.
Entrez des positions longues ou courtes en fonction des signaux longs et courts.
Utilise deux séries de prix différentes, ouvertes et élevées, en évitant les limitations d'une seule série.
Les techniques de MA filtrent le bruit à court terme et se concentrent sur la tendance majeure.
Configuration flexible des types et paramètres d'AM pour un effet optimal.
Stop-loss optionnel pour contrôler le risque et sécuriser les bénéfices.
Un espace d'optimisation élevé pour ajuster les paramètres pour différents produits et environnements de marché.
Une seule source de signal conduit à des signaux rares et à des transactions potentiellement manquées.
Le décalage de l'AM peut entraîner une perte d'opportunités à court terme.
Une configuration incorrecte du stop loss pourrait entraîner une sortie prématurée ou une perte excessive.
Un mauvais réglage des paramètres pourrait entraîner des échanges fictifs excessifs affectant la performance en direct.
L'optimisation des paramètres est difficile pour différents produits et environnements.
Ajouter plus d'indicateurs ou de modèles ML pour enrichir les sources de signaux. Améliorer les types et les paramètres MA. Fixer soigneusement le stop loss avec un tampon pour capturer plus de profit. Backtest et optimiser les paramètres.
Incorporer des indicateurs supplémentaires tels que les bandes de Bollinger, KD, etc. pour élargir les sources de signaux.
Appliquer des modèles d'apprentissage automatique pour la génération de signaux.
Optimiser les paramètres MA pour trouver les meilleures configurations.
Équilibrer les niveaux de stop loss entre le risque et la capture des bénéfices.
Ajoutez des méthodes d'optimisation de paramètres pour trouver automatiquement les paramètres optimaux.
Développer des modèles de paramètres spécialisés pour différents produits.
Construire des cadres de backtesting quantitatif pour des itérations rapides de stratégie.
Cette stratégie génère des signaux basés sur des croisements ouverts et utilise des MA pour filtrer le bruit. Elle offre une flexibilité grâce à des paramètres configurables. La stratégie présente des avantages mais aussi des problèmes tels que des signaux rares et un décalage. Des améliorations supplémentaires peuvent être apportées grâce à plus d'indicateurs, de modèles d'apprentissage automatique, etc. Un réglage et une optimisation de paramètres étendus sont nécessaires pour une meilleure performance dans différents produits et environnements de marché.
/*backtest start: 2022-10-17 00:00:00 end: 2023-10-17 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=2 //strategy(title = "Open Close Cross Strategy", shorttitle = "OCC Strategy", overlay = true, pyramiding = 0, default_qty_type = strategy.percent_of_equity, default_qty_value = 10) // Revision: 1 // Author: @JayRogers // // Description: // - Strategy based around Open-Close Crossovers. // Setup: // - I have generally found that setting the strategy resolution to 3-4x that of the chart you are viewing // tends to yield the best results, regardless of which MA option you may choose (if any) // - Don't aim for perfection. Just aim to get a reasonably snug fit with the O-C band, with good runs of // green and red. // - Option to either use basic open and close series data, or pick your poison with a wide array of MA types. // - Optional trailing stop for damage mitigation if desired (can be toggled on/off) // - Positions get taken automagically following a crossover - which is why it's better to set the resolution // of the script greater than that of your chart, so that the trades get taken sooner rather than later. // - If you make use of the trailing stops, be sure to take your time tweaking the values. Cutting it too fine // will cost you profits but keep you safer, while letting them loose could lead to more drawdown than you // can handle. // === INPUTS === useRes = input(defval = true, title = "Use Alternate Resolution? ( recommended )") stratRes = input(defval = "120", title = "Set Resolution ( should not be lower than chart )") useMA = input(defval = true, title = "Use MA? ( otherwise use simple Open/Close data )") basisType = input(defval = "DEMA", title = "MA Type: SMA, EMA, DEMA, TEMA, WMA, VWMA, SMMA, HullMA, LSMA, ALMA ( case sensitive )") basisLen = input(defval = 14, title = "MA Period", minval = 1) offsetSigma = input(defval = 6, title = "Offset for LSMA / Sigma for ALMA", minval = 0) offsetALMA = input(defval = 0.85, title = "Offset for ALMA", minval = 0, step = 0.01) useStop = input(defval = true, title = "Use Trailing Stop?") slPoints = input(defval = 200, title = "Stop Loss Trail Points", minval = 1) slOffset = input(defval = 400, title = "Stop Loss Trail Offset", minval = 1) // === /INPUTS === // === BASE FUNCTIONS === // Returns MA input selection variant, default to SMA if blank or typo. variant(type, src, len, offSig, offALMA) => v1 = sma(src, len) // Simple v2 = ema(src, len) // Exponential v3 = 2 * v2 - ema(v2, len) // Double Exponential v4 = 3 * (v2 - ema(v2, len)) + ema(ema(v2, len), len) // Triple Exponential v5 = wma(src, len) // Weighted v6 = vwma(src, len) // Volume Weighted v7 = na(v5[1]) ? sma(src, len) : (v5[1] * (len - 1) + src) / len // Smoothed v8 = wma(2 * wma(src, len / 2) - wma(src, len), round(sqrt(len))) // Hull v9 = linreg(src, len, offSig) // Least Squares v10 = alma(src, len, offALMA, offSig) // Arnaud Legoux type=="EMA"?v2 : type=="DEMA"?v3 : type=="TEMA"?v4 : type=="WMA"?v5 : type=="VWMA"?v6 : type=="SMMA"?v7 : type=="HullMA"?v8 : type=="LSMA"?v9 : type=="ALMA"?v10 : v1 // security wrapper for repeat calls reso(exp, use, res) => use ? request.security(syminfo.tickerid, res, exp) : exp // === /BASE FUNCTIONS === // === SERIES SETUP === // open/close //closeSeries = useMA ? reso(variant(basisType, close, basisLen, offsetSigma, offsetALMA), useRes, stratRes) : reso(close, useRes, stratRes) openSeries = useMA ? reso(variant(basisType, open, basisLen, offsetSigma, offsetALMA), useRes, stratRes) : reso(open, useRes, stratRes) x = openSeries[1] trendState = x > openSeries ? true : x < openSeries ? false : trendState[1] // === /SERIES === // === PLOTTING === barcolor(color = x > openSeries ? #006600 : #990000, title = "Bar Colours") // channel outline closePlot = plot(x, title = "Close Line", color = #009900, linewidth = 2, style = line, transp = 90) openPlot = plot(openSeries, title = "Open Line", color = #CC0000, linewidth = 2, style = line, transp = 90) // channel fill closePlotU = plot(trendState ? x : na, transp = 100, editable = false) openPlotU = plot(trendState ? openSeries : na, transp = 100, editable = false) closePlotD = plot(trendState ? na : x, transp = 100, editable = false) openPlotD = plot(trendState ? na : openSeries, transp = 100, editable = false) fill(openPlotU, closePlotU, title = "Up Trend Fill", color = #009900, transp = 40) fill(openPlotD, closePlotD, title = "Down Trend Fill", color = #CC0000, transp = 40) // === /PLOTTING === // === STRATEGY === // conditions longCond = crossover(openSeries, x) shortCond = crossunder(openSeries, x) // entries and base exit strategy.entry("long", true, when = longCond) strategy.entry("short", false, when = shortCond) // if we're using the trailing stop //if (useStop) // strategy.exit("XL", from_entry = "long", trail_points = slPoints, trail_offset = slOffset) // strategy.exit("XS", from_entry = "short", trail_points = slPoints, trail_offset = slOffset) // not sure needed, but just incase.. //strategy.exit("XL", from_entry = "long", when = shortCond) //strategy.exit("XS", from_entry = "short", when = longCond) // === /STRATEGY ===