Stratégie de croisement de moyennes mobiles


Date de création: 2023-10-24 16:39:40 Dernière modification: 2023-10-24 16:39:40
Copier: 0 Nombre de clics: 671
1
Suivre
1617
Abonnés

Stratégie de croisement de moyennes mobiles

Aperçu

Cette stratégie est basée sur le principe de la croisée des moyennes mobiles, et est une stratégie de suivi de tendance typique lorsque la moyenne à court terme est en hausse lorsque la moyenne à long terme est en hausse lorsque la moyenne à court terme est en hausse lorsque la moyenne à long terme est en baisse lorsque la moyenne à court terme est en hausse.

Principe de stratégie

La stratégie consiste principalement à calculer deux moyennes mobiles simples à court et à long terme et à déterminer la direction de la tendance en fonction de leur intersection.

Plus précisément, la stratégie commence par calculer la moyenne à court terme xMA et la moyenne à long terme, la longueur de la moyenne à court terme étant Len et la longueur de la moyenne à long terme étant 2.*Len。

Ensuite, la stratégie détermine si la moyenne à court terme traverse la moyenne à long terme, ce qui génère un signal de multiplication si elle est surpassée. Détermine si la moyenne à court terme traverse la moyenne à long terme, ce qui génère un signal de blanchiment si elle est surpassée.

Après avoir reçu un signal de plus, si vous ne tenez pas de position en ce moment, ouvrez une position plus élevée au prix du marché. Après avoir reçu un signal de moins, si vous ne tenez pas de position en ce moment, ouvrez une position au prix du marché.

En outre, la stratégie définit un point d’arrêt de la perte. Après avoir fait plus, le prix d’arrêt est défini comme le prix d’entrée - pourcentage de perte d’arrêt.*Le prix d’entrée, le prix d’arrêt est le prix d’entrée + le pourcentage de l’arrêt*Le prix d’entrée; le prix d’arrêt après la clôture est le prix d’entrée + le pourcentage de stop loss*Le prix d’entrée, le prix d’arrêt est le prix d’entrée - le pourcentage d’arrêt*Le prix de l’entrée

Enfin, la stratégie fournit une courbe visualisée de la ligne uniforme pour aider à juger de la tendance.

Avantages stratégiques

  • La conception est simple, claire, facile à comprendre et adaptée aux débutants.

  • Les moyennes mobiles permettent de suivre efficacement les tendances du marché.

  • Le risque est maîtrisé par la mise en place d’un point d’arrêt des pertes.

  • La courbe uniforme est affichée visuellement et les changements de tendance sont visuellement reflétés.

Risque stratégique

  • La ligne moyenne est en retard, ce qui peut entraîner le risque de manquer le meilleur moment d’entrée.

  • Le placement déraisonnable des points de rupture peut entraîner une rupture trop légère ou trop stricte;

  • La probabilité que la ligne moyenne génère un faux signal lorsque le cours de l’action fluctue fortement;

  • L’optimisation des paramètres sur la seule base des paramètres de la période moyenne peut entraîner une suradaptation.

Ces risques peuvent être réduits en assouplissant de manière appropriée les arrêts de perte, en optimisant la combinaison de paramètres de périodes de moyenne ligne et en ajoutant des filtres sur d’autres indicateurs.

Orientation de l’optimisation de la stratégie

  • Ajout de filtres pour d’autres indicateurs, tels que MACD, KDJ, etc., afin d’éviter que le décalage uniforme ne génère de faux signaux;

  • Optimisation multicombinatoire de la moyenne courte et de la moyenne longue afin de trouver la meilleure combinaison de paramètres;

  • tester différentes stratégies de stop-loss, telles que le stop-word, le stop-move, etc.;

  • Ajout d’un module de gestion des positions afin d’optimiser l’utilisation des fonds.

Résumer

L’idée générale de cette stratégie est claire et concise, elle est basée sur la direction de la tendance, elle permet de suivre efficacement la tendance, et les risques sont contrôlables. Elle est idéale pour les débutants. Cependant, il peut y avoir des signaux erronés en s’appuyant uniquement sur la même ligne.

Code source de la stratégie
/*backtest
start: 2023-09-23 00:00:00
end: 2023-10-23 00:00:00
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
//@strategy_alert_message {{strategy.order.alert_message}} 
////////////////////////////////////////////////////////////
//  Copyright by HPotter v2.0 19/09/2023
// MA Crossover Bot for OKX Exchange
////////////////////////////////////////////////////////////
var ALERTGRP_CRED = "entry"
signalToken = input("", "Signal Token", inline = "11", group = ALERTGRP_CRED)
OrderType = input.string("market", "Order Type", options = ["market", "limit"], inline = "21", group = ALERTGRP_CRED)
OrderPriceOffset = input.float(0, "Order Price Offset", minval = 0, maxval = 100, step = 0.01, inline = "21", group = ALERTGRP_CRED)
InvestmentType = input.string("percentage_balance", "Investment Type", options = ["margin", "contract", "percentage_balance", "percentage_investment"], inline = "31", group = ALERTGRP_CRED)
Amount = input.float(100, "Amount", minval = 0.01, inline = "31", group = ALERTGRP_CRED)

getAlertMsg(action, instrument, signalToken, orderType, orderPriceOffset, investmentType, amount) =>
    str = '{'
    str := str + '"action": "' + action + '", '
    str := str + '"instrument": "' + instrument + '", '
    str := str + '"signalToken": "' + signalToken + '", '
    //str := str + '"timestamp": "' + str.format_time(timenow, "yyyy-MM-dd'T'HH:mm:ssZ", "UTC+0") + '", '
    str := str + '"timestamp": "' + '{{timenow}}' + '", '
    str := str + '"orderType": "' + orderType + '", '
    str := str + '"orderPriceOffset": "' + str.tostring(orderPriceOffset) + '", '
    str := str + '"investmentType": "' + investmentType + '", '
    str := str + '"amount": "' + str.tostring(amount) + '"'
    str := str + '}'
    str

getOrderAlertMsgExit(action, instrument, signalToken) =>
    str = '{'
    str := str + '"action": "' + action + '", '
    str := str + '"instrument": "' + instrument + '", '
    str := str + '"signalToken": "' + signalToken + '", '
    str := str + '"timestamp": "' + '{{timenow}}' + '", '
    str := str + '}'
    str

strategy(title='OKX: MA Crossover', overlay=true)
Len = input(13)
Profit = input.float(7, title='Take Profit %', minval=0.01) / 100
Stop =  input.float(7, title='Stop Loss %', minval=0.01) / 100
xMA = ta.sma(close, Len)
//Robot State
isLong = strategy.position_size > 0 
isShort = strategy.position_size < 0 
isFlat = strategy.position_size == 0 
//Current Signal
doLong = low < xMA[1] ? true : false
doShort =   high > xMA[1] ? true:  false
//Backtest Start Date
tm =  timestamp(2022, 01, 01, 09, 30)
//Entry and exit orders
if  doLong[2] == false and isLong == false and doLong and time > tm
    strategy.cancel_all()
    buyAlertMsgExit = getOrderAlertMsgExit(action = 'EXIT_LONG', instrument = syminfo.ticker, signalToken = signalToken)
    buyAlertMsg = getAlertMsg(action = 'ENTER_LONG', instrument = syminfo.ticker, signalToken = signalToken, orderType =  OrderType, orderPriceOffset =  OrderPriceOffset, investmentType =  InvestmentType, amount = Amount)
    strategy.entry('Long', strategy.long, limit = close, comment='Long', alert_message =buyAlertMsg)
    strategy.exit("ExitLong", 'Long', stop=close - close * Stop  , limit = close + close * Profit , qty_percent = 100, alert_message = buyAlertMsgExit)  
if doShort[2] == false and isShort == false and doShort and time > tm
    strategy.cancel_all()
    sellAlertMsgExit = getOrderAlertMsgExit(action = 'EXIT_SHORT', instrument = syminfo.ticker, signalToken = signalToken)
    sellAlertMsg = getAlertMsg(action = 'ENTER_SHORT', instrument = syminfo.ticker, signalToken = signalToken, orderType =  OrderType, orderPriceOffset =  OrderPriceOffset, investmentType =  InvestmentType, amount = Amount)
    strategy.entry('Short', strategy.short, limit=close, comment='Short', alert_message = sellAlertMsg)
    strategy.exit("ExitShort", 'Short', stop=close + close * Stop  , limit = close - close * Profit  , qty_percent = 100, alert_message = sellAlertMsgExit)  
//Visual
barcolor(isShort  ? color.red : isLong ? color.green : color.blue)
plot(xMA, color=color.new(color.red, 0), title='MA')