
La stratégie est basée sur le croisement des prix d’ouverture et de clôture. Les signaux de négociation sont basés sur le croisement des prix d’ouverture et de clôture. La stratégie utilise des moyennes mobiles pour lisser les données de prix et réduire le bruit des transactions.
Déterminez si vous utilisez une résolution de cycle de remplacement (useRes) en fonction des paramètres d’entrée. Si c’est le cas, définissez le cycle en fonction de stratRes.
Déterminez si vous utilisez une moyenne mobile en fonction des paramètres d’entrée ((useMA)). Si oui, choisissez le type de moyenne mobile en fonction de baseType et baseLen définit la durée de la période.
Obtenir des séries de données pour les prix d’ouverture (open) et de clôture (close). Si vous utilisez une moyenne mobile, appliquez le type de moyenne mobile et le traitement des paramètres de votre choix.
Comparer le prix de départ actuel x avec le prix de départ de la série openSeries. Si x est supérieur à openSeries, alors l’état de tendance tendanceState est pluriel, sinon vide.
Un signal longCond est généré lorsque le prix est au-dessus de la moyenne mobile de l’ouverture et un signal shortCond lorsque le prix est en dessous de la moyenne mobile de l’ouverture.
Si le suivi de stop loss est activé, définissez le point de stop loss et la distance de déviation.
Les signaux de négociation sont jugés à l’aide de deux séries distinctes de prix d’ouverture et de prix élevé, évitant ainsi les limites d’une seule série de données.
L’application de la technologie des moyennes mobiles permet de filtrer le bruit du marché à court terme et de localiser les principales tendances.
Les types de moyennes mobiles peuvent être configurés de manière flexible et les paramètres peuvent être ajustés pour un effet optimal.
Vous pouvez choisir d’utiliser le suivi des pertes pour contrôler les risques et bloquer les bénéfices.
Il y a beaucoup d’espace pour optimiser les stratégies et pour ajuster les paramètres en fonction des variétés et des conditions du marché.
La source du signal de transaction est unique, le signal est rare et il est facile de manquer de billets.
Les moyennes mobiles sont en retard et risquent de manquer des opportunités à court terme.
Une mauvaise configuration de stop-loss peut entraîner un stop-loss prématuré ou trop important.
Une mauvaise configuration des paramètres peut entraîner des transactions virtuelles trop fréquentes et affecter l’efficacité du disque réel.
Les variétés et les environnements de marché ont besoin d’ajuster les paramètres, ce qui rend l’optimisation plus difficile.
Il est possible d’enrichir la source de signal en ajoutant d’autres indicateurs de jugement ou en introduisant des modèles d’apprentissage automatique. Ajuster le type de moyenne mobile et les paramètres pour un effet de smoothing optimal.
L’ajout d’autres indicateurs techniques, tels que les bandes de Brin, KD, etc., enrichit le signal de négociation.
Appliquer des modèles d’apprentissage automatique pour le traitement des signaux.
Optimiser les paramètres des moyennes mobiles pour trouver la meilleure combinaison de paramètres
Optimiser le suivi des paramètres de stop loss et équilibrer le stop loss et le profit.
Ajout d’une fonction d’optimisation des paramètres pour trouver automatiquement les paramètres optimaux.
Développer des modèles de paramètres exclusifs pour les différentes variétés.
Développer un cadre de rétroaction quantitative et une stratégie d’itération rapide.
Cette stratégie est basée sur le croisement des prix élevés et des prix élevés pour juger des signaux de négociation, en utilisant la technologie des moyennes mobiles pour filtrer le bruit. Les paramètres peuvent être configurés de manière flexible et obtenir de multiples effets.
/*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 ===