Stratégie de négociation d'ordres à limite multi-MA

Auteur:ChaoZhang est là., Date: le 22 septembre 2023 14:16:20
Les étiquettes:

Résumé

Il s'agit d'une stratégie de négociation qui définit des ordres limites basés sur plusieurs moyennes mobiles. Il définira un nombre différent d'ordres limites longs ou courts lorsque le prix franchit différents niveaux de MA, formant une multi-position en forme de pyramide. Lorsque le prix franchit à nouveau le MA, des ordres limites inverses seront ouverts. Lors de la tenue de positions, les positions seront fermées par des ordres de marché inversés si le prix franchit le niveau moyen de MA.

La logique de la stratégie

La stratégie utilise des moyennes mobiles pour déterminer la direction de la tendance. Plus précisément, elle détermine le nombre d'ordres à limite longue en fonction du fait que le prix franchit les 3 lignes MA ascendantes. Et elle détermine le nombre d'ordres à limite courte en fonction du fait que le prix franchit les 3 lignes MA descendantes.

Ainsi, plus la tendance est forte, plus il y aura d'ordres limites dans le même sens. Lorsque le prix montre des signaux d'inversion, des positions inversées seront ouvertes.

L'ensemble de la stratégie combine l'ouverture de type pyramide avec la fermeture de type percée pour former la logique de négociation.

Analyse des avantages

Les avantages de cette stratégie sont les suivants:

  1. Utilisation de MAs pour déterminer les tendances, simple et intuitive à utiliser.

  2. L'ouverture de type pyramide peut obtenir de meilleurs prix moyens au début des tendances.

  3. L'arrêt de perte moyen MA permet d'arrêter les pertes et de contrôler les risques en temps opportun.

  4. Les ordres limités évitent les glissements.

  5. Les paramètres personnalisables s'adaptent aux différents produits.

  6. Structure claire, facile à comprendre et à étendre.

Analyse des risques

Les risques liés à cette stratégie sont les suivants:

  1. Le retard de l'AM peut entraîner des erreurs de jugement.

  2. Les ordres limités échoués peuvent manquer des chances d'entrée.

  3. L'arrêt de perte moyen de MA peut être trop brut pour juger des percées.

  4. Des paramètres incorrects peuvent entraîner des positions trop grandes.

  5. Une période de retest insuffisante peut entraîner un surmontage.

  6. Aucune prise en compte des coûts de transaction.

Les solutions sont les suivantes:

  1. Ajouter d'autres indicateurs pour la confirmation, optimiser les paramètres.

  2. Définissez l'expiration, ajustez les prix limites.

  3. Ajouter la prise de profit ou la logique au milieu de l'arrêt de perte MA.

  4. Optimiser les paramètres, évaluer les rapports risque-rendement.

  5. Élargir la période de backtest, les backtests sur plusieurs marchés.

  6. Ajoutez les coûts de transaction et la logique du glissement.

Directions d'optimisation

La stratégie peut être optimisée dans les aspects suivants:

  1. Optimiser les paramètres pour plus de produits, en utilisant des méthodes d'apprentissage automatique.

  2. Ajouter d'autres indicateurs à titre de confirmation, par exemple MACD, KDJ, etc.

  3. Ajoutez la logique de prise de profit à la ligne moyenne MA.

  4. Ajustez dynamiquement la taille des positions et les niveaux de stop loss.

  5. Optimiser les prix limites pour améliorer les coûts d'entrée, par exemple en fonction de la volatilité.

  6. Gérer les coûts afin d'éviter les tendances à la poursuite excessive.

  7. Test de paramètres sur différents produits pour créer des pools de paramètres.

Conclusion

Cette stratégie ouvre des positions en forme de pyramide avec des ordres limités pour atteindre de meilleurs coûts moyens. Elle utilise le MA moyen pour le stop loss pour contrôler les risques. La structure de la stratégie est simple et claire, facile à comprendre et à étendre. Mais elle peut être améliorée en introduisant d'autres indicateurs, en optimisant les paramètres, en améliorant la logique des ordres limités, etc. pour la rendre plus robuste.


/*backtest
start: 2022-09-15 00:00:00
end: 2023-09-21 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Noro
//2019

//@version=4
strategy(title = "Robot WhiteBox MultiMA", shorttitle = "Robot WhiteBox MultiMA", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 3)

//Settings
capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Lot")
len = input(3, minval = 1, title = "MA Length")
s = input(defval = "7. OHLC4", options = ["1. Open", "2. High", "3. Low", "4. Close", "5. HL2", "6. HLC3", "7. OHLC4", "8. OC2", "9. PCMA"], title = "Data")
short3 = input(true, title = "short 3")
short2 = input(true, title = "short 2")
short1 = input(true, title = "short 1")
long1 = input(true, title = "long 1")
long2 = input(true, title = "long 2")
long3 = input(true, title = "long 3")
shortlevel3 = input(15.0, title = "Short line 3")
shortlevel2 = input(10.0, title = "Short line 2")
shortlevel1 = input(5.0, title = "Short line 1")
longlevel1 = input(-5.0, title = "Long line 1")
longlevel2 = input(-10.0, title = "Long line 2")
longlevel3 = input(-15.0, title = "Long line 3")
needoffset = input(true, title = "Offset")
fromyear = input(1900, defval = 1900, minval = 1900, maxval = 2100, title = "From Year")
toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year")
frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month")
tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month")
fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day")
today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day")

//Variables
size = strategy.position_size
mult = 1 / syminfo.mintick
needtime = time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)

//MA
oc2 = (open + close) / 2
pcma = (highest(high, len) + lowest(low, len)) / 2
src = s == "1. Open" ? open : s == "2. High" ? high : s == "3. Low" ? low : s == "4. Close" ? close : s == "5. HL2" ? hl2 : s == "6. HLC3" ? hlc3 : s == "7. OHLC4" ? ohlc4 : s == "8. OC2" ? oc2: close
sma = sma(src, len)
ma = s == "9. PCMA" ? round(pcma * mult) / mult : round(sma * mult) / mult

//Levels
longline1 = long1 ? round(ma * ((100 + longlevel1) / 100) * mult) / mult : close
longline2 = long2 ? round(ma * ((100 + longlevel2) / 100) * mult) / mult : close
longline3 = long3 ? round(ma * ((100 + longlevel3) / 100) * mult) / mult : close
shortline1 = short1 ? round(ma * ((100 + shortlevel1) / 100) * mult) / mult : close
shortline2 = short2 ? round(ma * ((100 + shortlevel2) / 100) * mult) / mult : close
shortline3 = short3 ? round(ma * ((100 + shortlevel3) / 100) * mult) / mult : close

//Lines
colorlong1 = long1 ? color.lime : na
colorlong2 = long2 ? color.lime : na
colorlong3 = long3 ? color.lime : na
colorshort1 = short1 ? color.red : na
colorshort2 = short2 ? color.red : na
colorshort3 = short3 ? color.red : na
offset = needoffset ? 1 : 0
plot(shortline3, offset = offset, color = colorshort3, title = "Short line 3")
plot(shortline2, offset = offset, color = colorshort2, title = "Short line 2")
plot(shortline1, offset = offset, color = colorshort1, title = "Short line 1")
plot(ma, offset = offset, color = color.blue, title = "MA line")
plot(longline1, offset = offset, color = colorlong1, title = "Long line 1")
plot(longline2, offset = offset, color = colorlong2, title = "Long line 2")
plot(longline3, offset = offset, color = colorlong3, title = "Long line 3")

//Trading
lot = 0.0
lot := size == 0 ? strategy.equity / close * capital / 100 : lot[1]
lots = 0.0
if ma > 0
    lots := round(size / lot)
    strategy.entry("L1", strategy.long, lot, limit = longline1, when = (lots == 0 and long1 and needtime))
    lots := round(size / lot)
    strategy.entry("L2", strategy.long, lot, limit = longline2, when = (lots <= 1 and long2 and needtime))
    lots := round(size / lot)
    strategy.entry("L3", strategy.long, lot, limit = longline3, when = (lots <= 2 and long3 and needtime))
    lots := round(size / lot)
    strategy.entry("S1", strategy.short, lot, limit = shortline1, when = (lots == 0 and short1 and needtime))
    lots := round(size / lot)
    strategy.entry("S2", strategy.short, lot, limit = shortline2, when = (lots >= -1 and short2 and needtime))
    lots := round(size / lot)
    strategy.entry("S3", strategy.short, lot, limit = shortline3, when = (lots >= -2 and short3 and needtime))
if size > 0
    strategy.entry("TPL", strategy.short, 0, limit = ma)
if size < 0
    strategy.entry("TPS", strategy.long, 0, limit = ma)
if time > timestamp(toyear, tomonth, today, 23, 59)
    strategy.close_all()

Plus de