Stratégie de négociation de croisement de deux lignes équivalentes en calculant une ligne équivalente avec deux paramètres différents et en effectuant des opérations d’achat et de vente à travers la croix de la ligne équivalente. Cette stratégie est simple et directe et convient aux transactions à court et moyen terme.
La stratégie consiste à calculer les moyennes rapides et les moyennes lentes en entrant des paramètres tels que la période de la moyenne rapide, la période de la moyenne lente et le type de la moyenne. L’opération d’achat est effectuée lorsque la moyenne rapide traverse la moyenne lente sur la moyenne rapide et l’opération de vente lorsque la moyenne lente traverse la moyenne rapide en dessous.
La logique de cette stratégie est la suivante:
Paramètres d’entrée: période moyenne rapide maLen1, période moyenne lente maLen2, type moyenne maTypeChoice
Calcul de la moyenne rapide maValue1 et moyenne lente maValue2 en fonction des paramètres d’entrée
Comparer deux lignes de grandeur équivalentes pour définir les conditions d’achat et de vente:
Conditions de l’achat: maValue1 est porté avec maValue2
Conditions de vente: maValue1 avec maValue2
Opération de transaction au moment où les conditions d’achat et de vente sont réunies
Affichage visuel de l’équilibre et de la relation entre la taille de l’équilibre avec différentes couleurs
Envoyer des signaux d’achat et de vente
Utilisez le principe de la croix biuniversale pour éviter d’être induit en erreur par une seule oscillation universale
Les paramètres de la ligne moyenne sont réglables pour s’adapter à différents cycles
La logique des transactions est simple, directe et facile à comprendre.
Les signaux d’achat et de vente personnalisables vous permettent de connaître le moment de la transaction.
Visualisation des mouvements de la courbe moyenne pour former un indicateur de négociation intuitif
Optimisation des paramètres pour trouver la meilleure combinaison de paramètres
Peut être utilisé pour la rétro-analyse pour trouver des paramètres optimaux ou pour les transactions sur disque dur
Le croisement de l’équilibre est susceptible de générer de faux signaux et doit être jugé en fonction des tendances et des formes.
Les positions fréquentes peuvent entraîner des pertes de frais de transaction en cas d’oscillation de la courbe
Des paramètres incorrects peuvent entraîner des transactions trop ou peu fréquentes
Les événements imprévus peuvent entraîner des situations extrêmes qui ne peuvent être évitées.
L’indicateur de courte période peut être désactivé lors d’une rupture du grand cycle
Il faut une surveillance fréquente, pas automatique
Comment gérer les risques:
Les indicateurs de tendance peuvent être combinés pour éviter les chocs.
Combiné avec des indicateurs de forme, confirme l’efficacité du signal
Optimisation des paramètres pour une fréquence de transaction raisonnable
Réglez le point d’arrêt pour contrôler les pertes individuelles
Vérifier la stabilité des paramètres sur plusieurs périodes
Filtrage du temps ou des signaux pour éviter les fausses percées
Tester différents paramètres de moyenne pour trouver le paramètre optimal
Tester différents types de moyenne et choisir la moyenne qui produit le signal le plus précis
Combiner les indicateurs de tendance pour éviter les écarts de tendance
Le meilleur moment pour jouer, combiné à des indicateurs de volatilité
Ajouter des filtres de temps ou de signal pour réduire les signaux erronés
Configurer le contrôle des points de glissement pour optimiser l’effet de la transaction sur le disque dur
Stabilité vérifiée sur plusieurs cycles
Adhésion à une stratégie de stop-loss automatique
Des technologies telles que l’apprentissage automatique pour améliorer les résultats de la détection
La stratégie de double équilibre est une stratégie d’indicateur technique très typique. Elle utilise le principe de la croix équilibre rapide et lente pour générer des signaux de négociation, qui peuvent obtenir de bons résultats de retracement grâce à l’optimisation des paramètres. Mais la stratégie comporte également un certain risque, qui doit être vérifié avec d’autres indicateurs techniques tels que la tendance, la forme, etc., afin de réduire le taux de signaux erronés.
/*backtest
start: 2023-10-05 00:00:00
end: 2023-10-05 22:00:00
period: 15m
basePeriod: 5m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
// © sehweijun
//study( title="Arch1tect's New Toy", shorttitle="Arch1tect's New Toy", overlay=true, resolution="")
// strategy( title="Arch1tect's New Toy (Strategy Tester Version)", shorttitle="Arch1tect's New Toy (Strategy Tester Version)", overlay=true, initial_capital = 100000, commission_value=0.07, commission_type=strategy.commission.cash_per_contract)
maTypeChoice = input( "EMA", title="MA Type", options=["EMA", "WMA", "SMA"] )
maSrc = input( close, title="MA Source" )
maLen1 = input( 15, minval=1, title="MA Length" )
maLen2 = input( 95, minval=1, title="MA Length" )
maValue1 = if ( maTypeChoice == "EMA" )
ema( maSrc, maLen1 )
else if ( maTypeChoice == "WMA" )
wma( maSrc, maLen1 )
else if ( maTypeChoice == "SMA" )
sma( maSrc, maLen1 )
else
0
maValue2 = if ( maTypeChoice == "EMA" )
ema( maSrc, maLen2 )
else if ( maTypeChoice == "WMA" )
wma( maSrc, maLen2 )
else if ( maTypeChoice == "SMA" )
sma( maSrc, maLen2 )
else
0
buySignal = crossover( maValue1, maValue2 )
sellSignal = crossunder( maValue1, maValue2 )
mainMAColour = ( maValue1 > maValue2 ) ? color.green : color.red
plot( maValue1, title="Arch1tect's New Toy", color=mainMAColour, offset=0, linewidth=4 )
//plot( maValue2, title="Arch1tect's Filter", color=color.black, offset=0, linewidth=2 )
var color buyCandleColour = #00ff0a
var color sellCandleColour = #ff1100
barcolor( buySignal ? buyCandleColour : sellSignal ? sellCandleColour : na, title="Signal Bar Colour" )
bgcolor( color=buySignal ? buyCandleColour : sellSignal ? sellCandleColour : na, transp=85, title="Signal Background Colour")
alertcondition( buySignal or sellSignal, title="Signal change!", message="Signal change!")
alertcondition( buySignal, title="Buy signal!", message="Buy signal!")
alertcondition( sellSignal, title="Sell signal!", message="Sell signal!")
// Strategy Tester
stratTesterOn = input( title="Strategy Tester [ON/OFF]", group="Strategy Tester", type=input.bool, defval=true)
entryTime = input( "2200-1200", title = "Daily trading time session (in Exchange GMT)", group="Strategy Tester", type = input.session )
startTime = input( "2200-2201", title = "Start Time", group="Strategy Tester", type = input.session )
maxDailyLoss = input( 2500, title = "Max daily loss", group="Strategy Tester", type = input.integer )
maxTotalDrawdown = input( 12000, title = "Max daily loss", group="Strategy Tester", type = input.integer )
contractSize = input( 1, title = "Contract size", group="Strategy Tester", type = input.integer )
tradeOnStartSess = input( title="First trade on session start [ON/OFF]", group="Strategy Tester", type=input.bool, defval=true)
fixedTPSL = input( title="Fixed TP/SL PIPS [ON/OFF]", group="Strategy Tester", type=input.bool, defval=false)
fixedTPValue = input ( 10.00, minval=0.01, type=input.float, title="TP", group="Strategy Tester" )
fixedSLValue = input ( 10.00, minval=0.01, type=input.float, title="SL", group="Strategy Tester" )
fromDay = input(defval = 1, title = "From Day", group="Date Range", type = input.integer, minval = 1, maxval = 31)
fromMonth = input(defval = 1, title = "From Month", group="Date Range", type = input.integer, minval = 1, maxval = 12)
fromYear = input(defval = 2020, title = "From Year", group="Date Range", type = input.integer, minval = 1970)
thruDay = input(defval = 1, title = "Thru Day", group="Date Range", type = input.integer, minval = 1, maxval = 31)
thruMonth = input(defval = 1, title = "Thru Month", group="Date Range", type = input.integer, minval = 1, maxval = 12)
thruYear = input(defval = 2112, title = "Thru Year", group="Date Range", type = input.integer, minval = 1970)
start = timestamp(fromYear, fromMonth, fromDay, 00, 00) // backtest start window
finish = timestamp(thruYear, thruMonth, thruDay, 23, 59) // backtest finish window
window() => time >= start and time <= finish ? true : false // create function "within window of time"
// strategy.risk.max_intraday_loss( maxDailyLoss, strategy.cash )
// strategy.risk.max_drawdown( maxTotalDrawdown, strategy.cash )
isTime(_position) =>
range = time( timeframe.period, _position + ':1234567' )
bgcolor( color=isTime( entryTime ) and stratTesterOn and window() ? color.yellow : na, title="Daily trading time session (in Exchange GMT)", transp=75 )
if ( stratTesterOn and window() )
if ( buySignal and isTime( entryTime ) )
if ( not fixedTPSL )
strategy.close_all()
strategy.entry( "Buy", strategy.long, contractSize )
if ( fixedTPSL and strategy.position_size == 0 )
strategy.entry( "Buy", strategy.long, contractSize )
strategy.exit( "TP/SL", "Buy", stop=close[0]-fixedSLValue, limit=close[0]+fixedTPValue )
if ( sellSignal and isTime( entryTime ))
if ( not fixedTPSL )
strategy.close_all()
strategy.entry( "Sell", strategy.short, contractSize )
if ( fixedTPSL and strategy.position_size == 0 )
strategy.entry( "Sell", strategy.short, contractSize )
strategy.exit( "TP/SL", "Sell", stop=close[0]+fixedSLValue, limit=close[0]-fixedTPValue )
if ( isTime( startTime ) and tradeOnStartSess and strategy.position_size == 0 )
if ( maValue1 > maValue2 )
strategy.entry( "Buy", strategy.long, contractSize )
if ( fixedTPSL )
strategy.exit( "TP/SL", "Buy", stop=close[0]-fixedSLValue, limit=close[0]+fixedTPValue )
else
strategy.entry( "Sell", strategy.short, contractSize )
if ( fixedTPSL )
strategy.exit( "TP/SL", "Sell", stop=close[0]+fixedSLValue, limit=close[0]-fixedTPValue )
strategy.close_all( when=not isTime( entryTime ) )
plot( strategy.equity )