
Esta estrategia se basa en el principio de cruce de las medias móviles, y es una estrategia típica de seguimiento de tendencias, cuando las medias a corto plazo cruzan las medias a largo plazo desde abajo y las medias a corto plazo cruzan las medias a largo plazo desde arriba.
La estrategia se basa en el cálculo de dos promedios móviles simples a corto y largo plazo y en la dirección de la tendencia en función de su cruce.
Concretamente, la estrategia primero calcula el promedio a corto plazo xMA y el promedio a largo plazo, con una longitud de promedio a corto plazo de Len y una longitud de promedio a largo plazo de 2.*Len。
Luego, la estrategia determina si la media corta se cruza con la media larga, y si se cruza, produce una señal de multiplicación; determina si la media corta se cruza con la media larga, y si se cruza, produce una señal de blanqueo.
Después de recibir la señal de hacer más, si no tiene posiciones en ese momento, abra una posición más al precio de mercado; después de recibir la señal de hacer menos, si no tiene posiciones en ese momento, abra una posición vacía al precio de mercado.
Además, la estrategia también establece un punto de parada de pérdidas. Después de hacer más, establece el precio de parada como el precio de entrada - porcentaje de pérdidas.*El precio de entrada, el precio de parada es el precio de entrada + el porcentaje de parada*Precio de entrada; el precio de parada después del cierre se establece como precio de entrada + porcentaje de parada*El precio de entrada, el precio de parada es el precio de entrada - porcentaje de parada*Precio de la entrada
Finalmente, la estrategia también genera una curva de visualización de la línea media para ayudar a juzgar la tendencia.
La idea es simple, clara, fácil de entender y adecuada para el aprendizaje de principiantes.
Los promedios móviles permiten un seguimiento eficiente de las tendencias del mercado.
El sistema de control de riesgo se basa en el establecimiento de puntos de parada de pérdidas.
Las curvas de línea uniforme se muestran visualmente y las tendencias se reflejan de forma intuitiva.
La línea media tiene un retraso que puede provocar el riesgo de perder el mejor momento de entrada;
La configuración irrazonable de los puntos de parada puede conducir a que los parámetros de parada sean demasiado flexibles o demasiado estrictos;
La probabilidad de que la línea media produzca falsas señales cuando los precios de las acciones fluctúan fuertemente;
La optimización de los parámetros basados solo en los parámetros de ciclo medíocre puede causar sobreajuste.
Estos riesgos pueden reducirse mediante la adecuada relajación de los pérdidas, la optimización de la combinación de parámetros de ciclo equilibrado y la adición de filtros de otros indicadores.
La adición de otros indicadores para filtrar, como MACD, KDJ, etc., evita que la desviación de la línea uniforme genere una señal errónea;
Optimización multicombinativa de la longitud de la línea media a corto y largo plazo para encontrar la combinación óptima de parámetros;
Prueba de diferentes estrategias de detención de pérdidas, tales como detención verbal, detención móvil, etc.
Agrega un módulo de gestión de posiciones para optimizar la eficiencia de la utilización de fondos.
La idea general de esta estrategia es clara y concisa, se basa en la dirección de la tendencia de juzgamiento cruzado de la línea de equilibrio, se puede seguir la tendencia de manera efectiva, y el riesgo es controlable, es adecuado para los principiantes de referencia de aprendizaje. Pero dependiendo solo de la línea de equilibrio puede haber señales erróneas, el espacio de optimización es grande, se puede optimizar mejoras en muchos aspectos, para que la estrategia sea más estable y confiable.
/*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')