
La stratégie est basée sur les moyennes mobiles à large spectre, qui forment un signal de transaction par un croisement entre des moyennes mobiles rapides et lentes. Les moyennes mobiles à large spectre couvrent de nombreux types, allant des moyennes mobiles simples aux moyennes mobiles oscillatrices, et peuvent être librement ajustées par paramètres, avec une forte adaptabilité.
La stratégie utilise une fonction de moyenne mobile variable qui peut générer 12 types différents de moyennes mobiles. Le principe de base est de calculer deux moyennes mobiles: une moyenne rapide (Close MA) et une moyenne lente (Open MA) qui génère un signal d’achat lorsque la ligne rapide traverse la ligne lente et un signal de vente lorsque la ligne rapide traverse la ligne lente.
La logique clé est de générer deux moyennes mobiles avec des fonctions variantes:closeSeries = variant(basisType, close, basisLen, offsetSigma, offsetALMA)etopenSeries = variant(basisType, open, basisLen, offsetSigma, offsetALMA)Les fonctions variantes contiennent 12 types différents de méthodes de calcul des moyennes, qui peuvent être choisis librement via les paramètres de baseType. Ainsi, une combinaison de moyennes mobiles à large spectre est réalisée.
La logique de base de génération de signaux de transaction est la suivante:longCond = xlong et shortCond = xshortC’est-à-dire que si vous traversez la ligne lente sur la ligne rapide, vous faites plus, et si vous traversez la ligne lente sous la ligne rapide, vous faites moins.
La règle d’entrée de la stratégie est de faire plus de blanchiment lorsque les conditions de longCond ou de shortCond sont remplies. La règle d’arrêt de perte est de s’arrêter ou de s’arrêter lorsque le mouvement de prix atteint le nombre de points d’arrêt de perte prédéfinis.
Le plus grand avantage de cette stratégie réside dans la possibilité de combiner librement plusieurs types de moyennes mobiles différentes. La stratégie offre une forte capacité de personnalisation, car il n’est pas certain quel type de moyenne mobile convient le mieux à différents cycles de différents marchés. Les utilisateurs peuvent déterminer la meilleure combinaison de paramètres en testant à plusieurs reprises, ce qui permet de concevoir la meilleure solution pour un marché particulier.
Un autre avantage est que la logique de la stratégie est simple et claire, mais offre des fonctionnalités puissantes. Il est facile pour les utilisateurs de comprendre et d’utiliser la stratégie. De plus, la richesse des paramètres d’entrée offre suffisamment d’espace d’optimisation aux utilisateurs avancés.
Le plus grand risque de cette stratégie réside dans le fait qu’il existe un certain retard dans la moyenne mobile à large spectre elle-même. Des pertes importantes peuvent être causées en cas de rupture de prix anormale. En outre, si les paramètres sont mal choisis, cela peut entraîner une fréquence de négociation excessive ou générer des signaux supplémentaires.
Pour réduire le risque, il est recommandé de juger de l’efficacité du signal en combinaison avec d’autres indicateurs, afin d’éviter les fausses ruptures. En outre, l’optimisation et le retesting des paramètres sont également nécessaires, et des tests répétés sont nécessaires pour trouver la meilleure combinaison de paramètres.
La stratégie présente les principales améliorations suivantes:
L’optimisation de ces directions permet d’améliorer continuellement les performances de la stratégie sur le terrain.
La stratégie de négociation est basée sur des moyennes mobiles à large spectre et offre une grande flexibilité. Elle offre une fonctionnalité de personnalisation puissante, permettant aux utilisateurs de choisir et de combiner librement différents types de moyennes. La logique de la stratégie est simple et claire, facile à utiliser, tout en offrant un vaste espace d’optimisation.
/*backtest
start: 2023-01-18 00:00:00
end: 2024-01-24 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
//
strategy(title="Long/Short", shorttitle="Banana Maker", overlay=true, pyramiding=0, default_qty_type=strategy.percent_of_equity, default_qty_value=100, calc_on_every_tick=false)
// === INPUTS ===
useRes = input(defval=true, title="Use Alternate Resolution?")
intRes = input(defval=7, title="Multiplier for Alernate Resolution")
stratRes = timeframe.ismonthly ? tostring(timeframe.multiplier * intRes, "###M") :
timeframe.isweekly ? tostring(timeframe.multiplier * intRes, "###W") :
timeframe.isdaily ? tostring(timeframe.multiplier * intRes, "###D") :
timeframe.isintraday ? tostring(timeframe.multiplier * intRes, "####") : '60'
basisType = input(defval="DEMA", title="MA Type: ", options=["SMA", "EMA", "DEMA", "TEMA", "WMA", "VWMA", "SMMA", "HullMA", "LSMA", "ALMA", "SSMA", "TMA"])
basisLen = input(defval=8, 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)
scolor = input(false, title="Show coloured Bars to indicate Trend?")
delayOffset = input(defval=0, title="Delay Open/Close MA (Forces Non-Repainting)", minval=0, step=1)
tradeType = input("BOTH", title="What trades should be taken : ", options=["LONG", "SHORT", "BOTH", "NONE"])
// === /INPUTS ===
// Constants colours that include fully non-transparent option.
green100 = #008000FF
lime100 = #6ad279
red100 = #FF0000FF
blue100 = #0000FFFF
aqua100 = #00FFFFFF
darkred100 = #8B0000FF
gray100 = #808080FF
// === BASE FUNCTIONS ===
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 = 0.0
sma_1 = sma(src, len) // Smoothed
v7 := na(v7[1]) ? sma_1 : (v7[1] * (len - 1) + src) / len
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
v11 = sma(v1, len) // Triangular (extreme smooth)
// SuperSmoother filter
// © 2013 John F. Ehlers
a1 = exp(-1.414 * 3.14159 / len)
b1 = 2 * a1 * cos(1.414 * 3.14159 / len)
c2 = b1
c3 = -a1 * a1
c1 = 1 - c2 - c3
v12 = 0.0
v12 := c1 * (src + nz(src[1])) / 2 + c2 * nz(v12[1]) + c3 * nz(v12[2])
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 : type == "TMA" ? v11 : type == "SSMA" ? v12 : v1
// security wrapper for repeat calls* NEEDS REFINEMENT- backtesting this shows repaint. need new wrapper
reso(exp, use, res) =>
security_1 = security(syminfo.tickerid, res, exp, gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_on)
use ? security_1 : exp
// === /BASE FUNCTIONS ===
// === SERIES SETUP ===
closeSeries = variant(basisType, close[delayOffset], basisLen, offsetSigma, offsetALMA)
openSeries = variant(basisType, open[delayOffset], basisLen, offsetSigma, offsetALMA)
// === /SERIES ===
// === PLOTTING ===
// alt resulution
closeSeriesAlt = reso(closeSeries, useRes, stratRes)
openSeriesAlt = reso(openSeries, useRes, stratRes)
//
trendColour = closeSeriesAlt > openSeriesAlt ? color.green : color.red
bcolour = closeSeries > openSeriesAlt ? lime100 : red100
barcolor(scolor ? bcolour : na, title="Bar Colours")
closeP = plot(closeSeriesAlt, title="Close Series", color=trendColour, linewidth=0, style=plot.style_line, transp=1)
openP = plot(openSeriesAlt, title="Open Series", color=trendColour, linewidth=0, style=plot.style_line, transp=1)
fill(closeP, openP, color=trendColour, transp=80)
// === /PLOTTING ===
//
//
// === ALERT conditions
xlong = crossover(closeSeriesAlt, openSeriesAlt)
xshort = crossunder(closeSeriesAlt, openSeriesAlt)
longCond = xlong // alternative: longCond[1]? false : (xlong or xlong[1]) and close>closeSeriesAlt and close>=open
shortCond = xshort // alternative: shortCond[1]? false : (xshort or xshort[1]) and close<closeSeriesAlt and close<=open
// === /ALERT conditions. needs work in study mode. the banana maker is the study script.
// Create alert for cross, shunt back 1 if source is not 'open', this should prevent repaint issue.
//shunt = RSIsrc == open ? 0 : 1
//shunt = 0
//c_alert = (buy[shunt]==1 or sell[shunt]==1)
//alertcondition(c_alert, title="QQECROSS Alert", message="QQECROSS Alert")
// show only when alert condition is met and bar closed.
//plotshape(c_alert,title= "Alert Indicator Closed", location=location.bottom, color=sell[shunt]==1?red:green, transp=0, style=shape.circle)
//Repaint city, study mode will help but wont trigger the alerts
// === STRATEGY ===
// stop loss
slPoints = input(defval=0, title="Initial Stop Loss Points (zero to disable)", minval=0)
tpPoints = input(defval=0, title="Initial Target Profit Points (zero for disable)", minval=0)
// Include bar limiting algorithm
ebar = input(defval=1000, title="Number of Bars for Back Testing", minval=0)
dummy = input(false, title="- SET to ZERO for Daily or Longer Timeframes")
//
// Calculate how many mars since last bar
tdays = (timenow - time) / 60000.0 // number of minutes since last bar
tdays := timeframe.ismonthly ? tdays / 1440.0 / 5.0 / 4.3 / timeframe.multiplier :
timeframe.isweekly ? tdays / 1440.0 / 5.0 / timeframe.multiplier :
timeframe.isdaily ? tdays / 1440.0 / timeframe.multiplier :
tdays / timeframe.multiplier // number of bars since last bar
//
//set up exit parameters
TP = tpPoints > 0 ? tpPoints : na
SL = slPoints > 0 ? slPoints : na
// Make sure we are within the bar range, Set up entries and exit conditions
if (ebar == 0 or tdays <= ebar) and tradeType != "NONE"
strategy.entry("long", strategy.long, when=longCond == true and tradeType != "SHORT")
strategy.entry("short", strategy.short, when=shortCond == true and tradeType != "LONG")
strategy.close("long", when=shortCond == true and tradeType == "LONG")
strategy.close("short", when=longCond == true and tradeType == "SHORT")
strategy.exit("XL", from_entry="long", profit=TP, loss=SL)
strategy.exit("XS", from_entry="short", profit=TP, loss=SL)
// === /STRATEGY ===
// eof