Cette stratégie est basée sur le principe de croisement de la moyenne mobile. Elle va long lorsque la moyenne mobile à court terme franchit le seuil supérieur de la moyenne mobile à long terme depuis le bas, et va court lorsque la moyenne mobile à court terme franchit le seuil inférieur de la moyenne mobile à long terme depuis le haut.
La stratégie calcule principalement les moyennes mobiles simples à court et à long terme et détermine la direction de la tendance en fonction de leur croisement.
Plus précisément, il calcule d'abord la moyenne mobile à court terme xMA et la moyenne mobile à long terme, où la période à court terme est Len et la période à long terme est 2*Len.
Ensuite, il vérifie si l'AM à court terme dépasse l'AM à long terme et génère un signal long si le croisement se produit.
Lorsqu'il reçoit un signal long, il ouvre une position longue au prix du marché s'il n'y a pas de position. Lorsqu'il reçoit un signal court, il ouvre une position courte au prix du marché s'il n'y a pas de position.
En outre, les points de stop loss et de take profit sont configurés. Pour les transactions longues, le stop loss est défini au prix d'entrée - pourcentage de stop loss * prix d'entrée, et le profit au prix d'entrée + pourcentage de profit * prix d'entrée. Pour les transactions courtes, le stop loss est défini au prix d'entrée + pourcentage de stop loss * prix d'entrée, et le profit au prix d'entrée - pourcentage de profit * prix d'entrée.
Enfin, les moyennes mobiles sont tracées pour visualisation afin d'aider à la détermination de la tendance.
Simple et facile à comprendre, adapté aux débutants.
Peut suivre efficacement les tendances du marché en fonction des moyennes mobiles croisées.
Les risques sont contrôlés en configurant le stop loss et le take profit.
La visualisation des moyennes mobiles reflète intuitivement les changements de tendance.
Les moyennes mobiles ont des effets de retard, ce qui peut entraîner le manque des meilleurs points d'entrée.
Une mauvaise configuration de stop loss peut entraîner des stops trop larges ou trop serrés.
Les prix à la scie peuvent générer de faux signaux.
L'optimisation basée uniquement sur les périodes moyennes mobiles peut entraîner un surajustement.
Ces risques peuvent être réduits par l'utilisation d'arrêts plus lâches, l'optimisation des combinaisons de périodes de moyenne mobile, l'ajout d'indicateurs filtrants, etc.
Ajouter d'autres indicateurs comme MACD, KDJ pour filtrer pour éviter les faux signaux.
Optimiser les combinaisons de périodes moyennes mobiles courtes et longues pour trouver les paramètres optimaux.
Testez différentes stratégies stop loss/take profit comme les trailing stops.
Ajoutez la taille des positions pour optimiser l'utilisation du capital.
La stratégie a une logique claire et simple, peut suivre efficacement les tendances basées sur des croisements de moyennes mobiles et présente des risques contrôlables. Elle convient aux débutants pour en tirer des leçons. Mais s'appuyer uniquement sur les moyennes mobiles peut générer de faux signaux. Il y a encore beaucoup de place pour l'optimiser dans divers aspects pour le rendre plus robuste.
/*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')