La estrategia combina las señales de compra y venta de los dos indicadores TMO y AMA desarrollados por LuxAlgo para capturar la oportunidad de comenzar una tendencia en un resumen de la oscilación. Se realiza un extra shorting después de satisfacer varias condiciones, como la señal de compra y venta del indicador TMO, el máximo de compra y venta del indicador AMA, el aumento gradual de la cantidad de entidades de la línea K. El método de parada de pérdida es el precio mínimo más alto de la línea NK más reciente.
El indicador TMO refleja la movilidad de los precios. Es un tipo de indicador oscilante que emite una señal de negociación cuando los precios se desvían. El indicador AMA es un indicador de media móvil plana.
La lógica principal de la estrategia es que el indicador TMO refleja la tendencia de los precios y proporciona una señal de negociación, el indicador AMA muestra las áreas en las que los precios pueden revertirse, mientras que se combina con el aumento de la cantidad de entidades de la línea K para confirmar el inicio de la tendencia. Por lo tanto, su combinación puede mejorar la tasa de éxito de las operaciones. En concreto, la estrategia se abre o se cierra en las siguientes situaciones:
De esta manera se resuelve el problema de las falsas señales causadas por un solo indicador. El método de stop loss elige el precio más alto y más bajo en la línea N-raíz K más reciente, lo que permite un mejor control del riesgo.
La estrategia tiene las siguientes ventajas:
Combinación de indicadores para mejorar la precisión de la señal. Los indicadores TMO y AMA se verifican entre sí para reducir las falsas señales y, por lo tanto, mejorar la precisión de la señal.
Combinación de varias condiciones para el inicio de la captura de tendencias. La estrategia establece una serie de condiciones, como la señal del indicador TMO, el valor máximo del indicador AMA y el aumento de la cantidad de entidades de la línea K, que pueden capturar eficazmente el momento en que comienza la tendencia, que es el objetivo de la estrategia de Scalping.
El método de control de riesgo de la línea K. El uso del precio más alto y más bajo de la línea K como método de control de riesgo puede controlar mejor el riesgo de cada unidad. Al mismo tiempo, no se revertirá el riesgo de retraso generado por el recálculo de los indicadores.
Una estrategia de negociación sencilla y efectiva. La estrategia utiliza solo dos indicadores para lograr una estrategia de scalping más completa, no es compleja, la lógica es sencilla y clara. Y, según los resultados del ejemplo, la estrategia logra una buena ganancia.
El principal riesgo de esta estrategia es:
El riesgo de entrada es frecuente. Como estrategia de Scalping, su tiempo de tenencia es corto, y si los costos de negociación son altos, afectará a las ganancias.
El riesgo de que el K-line stop sea demasiado radical. El uso de los precios más bajos y más altos recientes como método de stop puede ser más radical y no puede filtrar completamente el ruido del mercado, lo que aumenta la probabilidad de que el stop se active.
El riesgo de dificultad de optimización de parámetros. La estrategia involucra varios parámetros, y puede ser difícil encontrar la combinación óptima de parámetros.
La estrategia también puede ser optimizada en las siguientes direcciones:
Añadir más indicadores de filtración, como el volumen de transacciones del mercado, puede filtrar algunas señales falsas y mejorar aún más la calidad de la señal.
Intenta añadir condiciones de filtración a la manera de parar para evitar que el parar sea demasiado radical. Por ejemplo, espera que varias raíces de la línea K se confirmen antes de disparar el parar y luego parar.
Optimiza los parámetros para encontrar la mejor combinación de parámetros indicadores. Esto puede filtrar más ruido y mejorar la tasa de éxito de la estrategia. Optimiza principalmente los parámetros como la longitud del indicador TMO, la longitud del indicador AMA y el múltiplo.
Trate de hacer retroalimentación y disco duro en diferentes variedades y períodos de tiempo para encontrar la variedad y el período de negociación que mejor se ajusten a la lógica de la estrategia.
La estrategia utiliza una combinación de señales de negociación de los indicadores TMO y AMA para buscar el momento en que comienza la tendencia en situaciones de crisis. Tiene la ventaja de una alta precisión de la señal, de capturar la tendencia temprano y de controlar el riesgo. Después de optimizar más los parámetros y las reglas, la estrategia puede convertirse en una estrategia de scalping intraday con un gran valor de batalla real.
/*backtest
start: 2023-11-23 00:00:00
end: 2023-11-30 00:00:00
period: 10m
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/
// © Kaspricci
//@version=5
strategy("TradeIQ - Crazy Scalping Trading Strategy [Kaspricci]", overlay=true, initial_capital = 1000, currency = currency.USD)
headlineTMO = "TMO Settings"
tmoLength = input.int(7, "TMO Length", minval = 1, group = headlineTMO)
tmoSource = input.source(close, "TMO Source", group = headlineTMO)
// calculate values
osc = ta.mom(ta.sma(ta.sma(tmoSource, tmoLength), tmoLength), tmoLength)
// determine color of historgram
oscColor = osc > osc[1] and osc > 0 ? #00c42b : osc < osc[1] and osc > 0 ? #4ee567 : osc < osc[1] and osc < 0 ? #ff441f : osc > osc[1] and osc < 0 ? #c03920 : na
// plot histogram
//plot(osc, "OSC", oscColor, linewidth = 3, style = plot.style_histogram)
// conditon to find highs and lows
up = ta.highest(tmoSource, tmoLength)
dn = ta.lowest(tmoSource, tmoLength)
// define conditions to be used for finding divergence
phosc = ta.crossunder(ta.change(osc), 0)
plosc = ta.crossover (ta.change(osc), 0)
// test for divergence
bear = osc > 0 and phosc and ta.valuewhen(phosc,osc,0) < ta.valuewhen(phosc,osc,1) and ta.valuewhen(phosc,up,0) > ta.valuewhen(phosc,up,1) ? 1 : 0
bull = osc < 0 and plosc and ta.valuewhen(plosc,osc,0) > ta.valuewhen(plosc,osc,1) and ta.valuewhen(plosc,dn,0) < ta.valuewhen(plosc,dn,1) ? 1 : 0
// -------------------------------------------------------------------------------------------------------------
headlineAMA = "AMA Settings"
amaSource = input.source(defval = close, title = "AMA Source", group = headlineAMA)
amaLength = input.int(defval = 50, title = "AMA Length", minval = 2, group = headlineAMA)
amaMulti = input.float(defval = 2.0, title = "Factor", minval = 1)
amaShowCd = input(defval = true , title = "As Smoothed Candles")
amaShowEx = input(defval = true, title = "Show Alternating Extremities")
amaAlpha = input.float(1.0, "Lag", minval=0, step=.1, tooltip='Control the lag of the moving average (higher = more lag)', group= 'AMA Kernel Parameters')
amaBeta = input.float(0.5, "Overshoot", minval=0, step=.1, tooltip='Control the overshoot amplitude of the moving average (higher = overshoots with an higher amplitude)', group='AMA Kernel Parameters')
// -------------------------------------------------------------------------------------------------------------
headlineSL = "Stop Loss Settings"
slLength = input.int(defval = 10, title = "SL Period", minval = 1, group = headlineSL, tooltip = "Number of bars for swing high / low")
// -------------------------------------------------------------------------------------------------------------
var b = array.new_float(0)
var float x = na
if barstate.isfirst
for i = 0 to amaLength - 1
x := i / (amaLength - 1)
w = math.sin(2 * 3.14159 * math.pow(x, amaAlpha)) * (1 - math.pow(x, amaBeta))
array.push(b, w)
// local function to filter the source
filter(series float x) =>
sum = 0.
for i = 0 to amaLength - 1
sum := sum + x[i] * array.get(b,i)
sum / array.sum(b)
// apply filter function on source series
srcFiltered = filter(amaSource)
deviation = ta.sma(math.abs(amaSource - srcFiltered), amaLength) * amaMulti
upper = srcFiltered + deviation
lower = srcFiltered - deviation
//----
crossHigh = ta.cross(high, upper)
crossLow = ta.cross(low, lower)
var os = 0
os := crossHigh ? 1 : crossLow ? 0 : os[1]
ext = os * upper + (1 - os) * lower
//----
os_css = ta.rsi(srcFiltered, amaLength) / 100
extColor = os == 1 ? #30FF85 : #ff1100
plot(srcFiltered, "MA", amaShowCd ? na : color.black, 2, editable = false)
plot(amaShowEx ? ext : na, "Extremities", ta.change(os) ? na : extColor, 2, editable=false)
// handle smoothed candles
var float h = na
var float l = na
var float c = na
var float body = na
if amaShowCd
h := filter(high)
l := filter(low)
c := filter(amaSource)
body := math.abs(math.avg(c[1], c[2]) - c)
ohlc_os = ta.rsi(c, amaLength) / 100
plotcandle(math.avg(c[1], c[2]), h, l, c, "Smooth Candles", #434651, bordercolor = na, editable = false, display = amaShowCd ? display.all : display.none)
// -------------------------------------------------------------------------------------------------------------
plotshape(bull ? ext : na, "Bullish Circle", shape.circle, location.absolute, color = #00c42b, size=size.tiny)
plotshape(bear ? ext : na, "Bearish Circle", shape.circle, location.absolute, color = #ff441f, size=size.tiny)
plotshape(bull ? ext : na, "Bullish Label", shape.labeldown, location.absolute, color = #00c42b, text="Buy", textcolor=color.white, size=size.tiny)
plotshape(bear ? ext : na, "Bearish Label", shape.labelup, location.absolute, color = #ff441f, text="Sell", textcolor=color.white, size=size.tiny)
// -------------------------------------------------------------------------------------------------------------
candleSizeIncreasing = body[2] < body[1] and body[1] < body[0]
longEntryCond = os == 1 and bull
shortEntryCond = os == 0 and bear
longEntry = strategy.opentrades == 0 and candleSizeIncreasing and not candleSizeIncreasing[1] and ta.barssince(longEntryCond) < ta.barssince(os == 0) and ta.barssince(longEntryCond) < ta.barssince(bear)
shortEntry = strategy.opentrades == 0 and candleSizeIncreasing and not candleSizeIncreasing[1] and ta.barssince(shortEntryCond) < ta.barssince(os == 1) and ta.barssince(shortEntryCond) < ta.barssince(bull)
longExit = strategy.opentrades > 0 and strategy.position_size > 0 and (bear or os == 0)
shortExit = strategy.opentrades > 0 and strategy.position_size < 0 and (bull or os == 1)
recentSwingHigh = ta.highest(high, slLength) // highest high of last candles
recentSwingLow = ta.lowest(low, slLength) // lowest low of recent candles
bgcolor(longEntry ? color.rgb(76, 175, 79, 90) : na)
bgcolor(shortEntry ? color.rgb(255, 82, 82, 90) : na)
slLong = (close - recentSwingLow) / syminfo.mintick // stop loss in ticks
slShort = (recentSwingHigh - close) / syminfo.mintick // stop loss in ticks
newOrderID = str.tostring(strategy.closedtrades + strategy.opentrades + 1)
curOrderID = str.tostring(strategy.closedtrades + strategy.opentrades)
alertMessageForEntry = "Trade {0} - New {1} Entry at price: {2} with stop loss at: {3}"
if (longEntry)
alertMessage = str.format(alertMessageForEntry, newOrderID, "Long", close, recentSwingLow)
strategy.entry(newOrderID, strategy.long, alert_message = alertMessage)
strategy.exit("Stop Loss Long", newOrderID, loss = slLong, alert_message = "Stop Loss for Trade " + newOrderID)
if(longExit)
strategy.close(curOrderID, alert_message = "Close Trade " + curOrderID)
if (shortEntry)
alertMessage = str.format(alertMessageForEntry, newOrderID, "Short", close, recentSwingLow)
strategy.entry(newOrderID, strategy.short, alert_message = alertMessage)
strategy.exit("Stop Loss Short", newOrderID, loss = slShort, alert_message = "Stop Loss for Trade " + newOrderID)
if(shortExit)
strategy.close(curOrderID, alert_message = "Close Trade " + curOrderID)