La stratégie de croisement de la moyenne est une stratégie de négociation courante basée sur la moyenne mobile. Elle utilise un croisement de la moyenne mobile rapide et de la moyenne mobile lente comme signaux d’achat et de vente.
La logique centrale de la stratégie est basée sur la théorie de la ligne de parité. La ligne de parité mobile est capable d’aplanir efficacement les fluctuations des prix et de refléter la tendance des prix. La ligne de parité rapide est plus sensible aux changements de prix et peut capturer les points de basculement de la tendance. La ligne de parité lente est moins sensible aux changements de prix et peut filtrer les fluctuations à court terme.
La stratégie définit d’abord une moyenne de 50 jours et une moyenne de 200 jours. Ensuite, la stratégie définit un entrée à plusieurs niveaux pour une moyenne lente sur la moyenne rapide, et une entrée à vide pour une moyenne lente sous la moyenne rapide. Afin d’éviter les transactions qui se chevauchent, la stratégie utilise les symboles isEntry et isExit pour le contrôle.
En outre, la stratégie définit un point d’arrêt et de perte. L’utilisateur peut définir la distance d’arrêt et de perte en entrant le pourcentage. Le prix d’arrêt et de perte est calculé en fonction de la variation en pourcentage du prix d’entrée.
Cette stratégie présente les avantages suivants:
Les opérations sont simples et faciles à mettre en œuvre. Les transactions peuvent être effectuées en se basant uniquement sur un croisement homogène, ce qui convient parfaitement aux débutants sans expérience de trading.
Les retraits sont contrôlables, avec un certain mécanisme de gestion des risques. Les courbes mobiles permettent de filtrer efficacement les fluctuations de prix à court terme et d’éviter le arbitrage.
Paramètres personnalisables et adaptatifs. L’utilisateur peut définir lui-même les paramètres de la moyenne et les paramètres de stop-loss pour optimiser la stratégie.
La stratégie consiste à tracer directement sur le graphique les lignes de moyenne, les points d’entrée et les points d’arrêt et de perte.
Le cadre de la stratégie est complet, il suffit de modifier les signaux de négociation clés, d’ajouter des indicateurs, etc. pour améliorer la stratégie.
Cette stratégie comporte aussi des risques:
Les événements inattendus sur le marché entraînent des pertes massives. Les courbes rapides sont plus sensibles aux variations de prix et ne peuvent pas répondre efficacement aux événements inattendus.
Il est facile de se faire piéger dans des conditions de choc. Si les conditions de choc sont longues, les pertes se répéteront.
Le coût de transaction n’est pas pris en compte. Les frais de transaction et les pertes de points de glissement dans les transactions réelles ont un impact important sur les bénéfices.
Risque de correspondance des données de retour. Les situations en direct sont complexes et variables, et les résultats de retour ne sont pas représentatifs de la performance en temps de combat.
La réponse:
Il est possible de définir des normes de stop plus souples et d’ajouter des stop supplémentaires.
Il est possible d’élargir la distance de la ligne moyenne, de réduire la fréquence des transactions ou de filtrer les signaux avec d’autres indicateurs.
Il est préférable de limiter les marges de manœuvre en tenant compte des coûts réels de la transaction.
Les paramètres d’optimisation et de réduction progressive de l’adéquation doivent être pris en compte dans la mesure du possible, compte tenu de l’évolution du marché.
Cette stratégie peut être optimisée dans les domaines suivants:
Testez différentes combinaisons de paramètres pour trouver le meilleur. Vous pouvez tester le nombre de jours de la moyenne rapide, les combinaisons de paramètres, etc.
Filtrez avec d’autres indicateurs afin d’éviter les erreurs de transaction dans les conditions de choc. Par exemple, MACD, KD et autres indicateurs.
Optimiser les stratégies d’arrêt-stop pour une gestion plus efficace des risques. Par exemple, suivre les arrêts, suspendre les arrêts, etc.
L’augmentation de la taille de la position, l’utilisation du levier pour l’amplification, l’augmentation de la marge de profit. Mais contrôler le risque.
En tenant compte des coûts de transaction du disque dur, les paramètres de retracement sont ajustés et optimisés pour que les paramètres stratégiques soient plus adaptés à la guerre.
L’évaluation de la stabilité des paramètres combinée à des méthodes statistiques réduit le risque de correspondance des données et améliore la stabilité.
En résumé, la stratégie globale de la stratégie de croisement uniforme est claire, simple à mettre en œuvre et adaptée à l’apprentissage de la stratégie d’entrée pour le trading quantitatif. Cependant, la stratégie présente également certains risques et insuffisances, nécessitant une optimisation minutieuse des paramètres et des filtres, et une attention particulière à la maîtrise des risques de négociation sur disque dur pour obtenir des gains stables.
/*backtest
start: 2023-10-02 00:00:00
end: 2023-10-09 00:00:00
period: 3m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © gjfsdrtytru
//@version=4
strategy("Backtest Engine", "Backtest", overlay=true, commission_type=strategy.commission.percent, commission_value=0.07, initial_capital = 1000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, currency = currency.USD)
// Start code here...
fastMA = sma(close,50)
slowMA = sma(close,200)
plot(fastMA, "Fast MA", color.blue)
plot(slowMA, "Slow MA", color.red)
// Long Enrty/Exit
longCondition = crossover(fastMA,slowMA)
closeLong = crossover(slowMA,fastMA)
// Short Enrty/Exit
shortCondition = crossover(slowMA,fastMA)
closeShort = crossover(fastMA,slowMA)
// Bot web-link alert - {{strategy.order.comment}}
botLONG = "ENTRY LONG ALERT"
botCLOSELONG = "CLOSE LONG ALERT"
botSHORT = "ENTRY SHORT ALERT"
botCLOSESHORT = "CLOSE SHORT ALERT"
//////////////////////////////////////////////////////////////////
//////////////////////// BACKTEST ENGINE \\\\\\\\\\\\\\\\\\\\\\\\\
/////////////////// [NO USER INPUT REQUIRED] /////////////////////
//////////////////////////////////////////////////////////////////
// Time period
testStartYear = input(2020, "Backtest Start Year")
testStartMonth = input(5, "Backtest Start Month")
testStartDay = input(11, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)
periodLength = input(3650, "Backtest Period (days)", minval=0,tooltip="Days until strategy ends") * 86400000 // convert days into UNIX time
testPeriodStop = testPeriodStart + periodLength
testPeriod() =>
time >= testPeriodStart and time <= testPeriodStop ? true : false
// Convert Take profit and Stop loss to percentage
longTP = input(title="Long Take Profit (%)", type=input.float, minval=0.0, step=0.1, defval=0) * 0.01 // Set levels with input options
longSL = input(title="Long Stop Loss (%)", type=input.float, minval=0.0, step=0.1, defval=0) * 0.01 // Set levels with input options
shortTP = input(title="Short Take Profit (%)", type=input.float, minval=0.0, step=0.1, defval=0) * 0.01 // Set levels with input options
shortSL = input(title="Short Stop Loss (%)", type=input.float, minval=0.0, step=0.1, defval=0) * 0.01 // Set levels with input options
// 0% TP/SL = OFF (a value of 0 turns off TP/SL feature)
longProfitPerc = longTP == 0 ? 1000 : longTP
longStopPerc = longSL == 0 ? 1 : longSL
shortProfitPerc = shortTP == 0 ? 1 : shortTP
shortStopPerc = shortSL == 0 ? 1000 : shortSL
// Determine TP/SL price based on percentage given
longProfitPrice = strategy.position_avg_price * (1 + longProfitPerc)
longStopPrice = strategy.position_avg_price * (1 - longStopPerc)
shortProfitPrice = strategy.position_avg_price * (1 - shortProfitPerc)
shortStopPrice = strategy.position_avg_price * (1 + shortStopPerc)
// Anti-overlap
isEntry_Long = false
isEntry_Long := nz(isEntry_Long[1], false)
isExit_Long = false
isExit_Long := nz(isExit_Long[1], false)
isEntry_Short = false
isEntry_Short := nz(isEntry_Short[1], false)
isExit_Short = false
isExit_Short := nz(isExit_Short[1], false)
entryLong = not isEntry_Long and longCondition
exitLong = not isExit_Long and closeLong
entryShort = not isEntry_Short and shortCondition
exitShort = not isExit_Short and closeShort
if (entryLong)
isEntry_Long := true
isExit_Long := false
if (exitLong)
isEntry_Long := false
isExit_Long := true
if (entryShort)
isEntry_Short := true
isExit_Short := false
if (exitShort)
isEntry_Short := false
isExit_Short := true
// Order Execution
if testPeriod()
if entryLong
strategy.entry(id="Long", long=true, when = entryLong, comment=botLONG) // {{strategy.order.comment}}
if entryShort
strategy.entry(id="Short", long=false, when = entryShort, comment=botSHORT) // {{strategy.order.comment}}
// TP/SL Execution
if (strategy.position_size > 0)
strategy.exit(id="Long SL/TP", from_entry="Long", limit=longProfitPrice, stop=longStopPrice)
strategy.close(id="Long", when=exitLong, comment=botCLOSELONG) // {{strategy.order.comment}}
if (strategy.position_size < 0)
strategy.exit(id="Short TP/SL", from_entry="Short", limit=shortProfitPrice, stop=shortStopPrice)
strategy.close(id="Short", when=exitShort, comment=botCLOSESHORT) // {{strategy.order.comment}}
// Draw Entry, TP and SL Levels for Long Positions
plot(strategy.position_size > 0 ? longTP == 0 ? na : longProfitPrice : na, style=plot.style_linebr, color=color.green, title="Long TP")
plot(strategy.position_size > 0 ? strategy.position_avg_price : na, style=plot.style_linebr, color=color.blue, title="Long Entry")
plot(strategy.position_size > 0 ? longSL == 0 ? na : longStopPrice : na, style=plot.style_linebr, color=color.red, title="Long SL")
// Draw Entry, TP and SL Levels for Short Positions
plot(strategy.position_size < 0 ? shortTP == 0 ? na : shortProfitPrice : na, style=plot.style_linebr, color=color.green, title="Short TP")
plot(strategy.position_size < 0 ? strategy.position_avg_price : na, style=plot.style_linebr, color=color.blue, title="Short Entry")
plot(strategy.position_size < 0 ? shortSL == 0 ? na : shortStopPrice : na, style=plot.style_linebr, color=color.red, title="Short SL")