Esta estrategia calcula los puntos de pivote en diferentes plazos de tiempo como niveles clave de precios y utiliza el principio de la proporción dorada para determinar la dirección de la tendencia para implementar una estrategia de negociación de compra alta venta baja.
Calcular los puntos de pivote, incluidos los pivotes clásicos y los pivotes de Fibonacci, utilizando el precio de cierre, el precio más alto y el precio más bajo en diferentes períodos de tiempo.
Determine en qué zona de precios se encuentra el precio actualmente en base a las bandas superior e inferior.
Generar señales de compra cuando el precio está en las zonas de compra y señales de venta cuando el precio está en las zonas de venta para implementar una estrategia de compra alta venta baja.
El uso de análisis de marcos de tiempo múltiples para determinar la tendencia evita ser engañado por el ruido del mercado.
La combinación de pivotes clásicos y pivotes de Fibonacci mejora la confiabilidad de los puntos de pivote.
La determinación de la entrada en el mercado en función de las zonas de precios maximiza la evitación de riesgos.
Siguiendo las reglas de negociación de tendencia comprando alto y vendiendo bajo evita la negociación en contra de la tendencia.
Pueden fallar los puntos pivot, por lo que los avances deben ser monitoreados.
Evitar el empeoramiento de las pérdidas por órdenes de stop loss mal colocadas.
Las comisiones de negociación también pueden afectar a la rentabilidad final.
Pruebe diferentes parámetros como los plazos, las direcciones comerciales, etc. para optimizar la estrategia.
Incorporar otros indicadores para confirmar la tendencia y evitar errores.
Añadir mecanismos de stop loss para controlar el importe de las pérdidas de una sola operación.
Esta estrategia integra el análisis técnico clásico y el comercio de tendencias mediante el uso de zonas de punto de pivote para entradas de tiempo y comprar alto y vender bajo para gestionar eficazmente los riesgos comerciales.
/*backtest start: 2022-12-22 00:00:00 end: 2023-12-28 00:00:00 period: 1d basePeriod: 1h 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/ // © HeWhoMustNotBeNamed //@version=4 strategy("BuyHighSellLow - Pivot points", overlay=true, initial_capital = 100000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_type = strategy.commission.percent, pyramiding = 1, commission_value = 0.01, calc_on_order_fills = true) Source = input(close) resolution = input("4D", type=input.resolution) HTFMultiplier = input(4, title="Higher Timeframe multiplier (Used when resolution is set to Same as Symbol)", minval=2, step=1) //ppType = input(title="Pivot points type", defval="classic", options=["classic", "fib"]) ppType = "fib" tradeDirection = input(title="Trade Direction", defval=strategy.direction.long, options=[strategy.direction.all, strategy.direction.long, strategy.direction.short]) backtestBars = input(title="Backtest from ", defval=10, minval=1, maxval=30) backtestFrom = input(title="Timeframe", defval="years", options=["days", "months", "years"]) hideBands = input(true) f_multiple_resolution(HTFMultiplier) => target_Res_In_Min = timeframe.multiplier * HTFMultiplier * ( timeframe.isseconds ? 1. / 60. : timeframe.isminutes ? 1. : timeframe.isdaily ? 1440. : timeframe.isweekly ? 7. * 24. * 60. : timeframe.ismonthly ? 30.417 * 24. * 60. : na) target_Res_In_Min <= 0.0417 ? "1S" : target_Res_In_Min <= 0.167 ? "5S" : target_Res_In_Min <= 0.376 ? "15S" : target_Res_In_Min <= 0.751 ? "30S" : target_Res_In_Min <= 1440 ? tostring(round(target_Res_In_Min)) : tostring(round(min(target_Res_In_Min / 1440, 365))) + "D" f_getBackTestTimeFrom(backtestFrom, backtestBars)=> byDate = backtestFrom == "days" byMonth = backtestFrom == "months" byYear = backtestFrom == "years" date = dayofmonth(timenow) mth = month(timenow) yr = year(timenow) leapYearDaysInMonth = array.new_int(12,0) array.set(leapYearDaysInMonth,0,31) array.set(leapYearDaysInMonth,1,29) nonleapYearDaysInMonth = array.new_int(12,0) array.set(leapYearDaysInMonth,0,31) array.set(leapYearDaysInMonth,1,28) restMonths = array.new_int(10,0) array.set(leapYearDaysInMonth,0,31) array.set(leapYearDaysInMonth,1,30) array.set(leapYearDaysInMonth,2,31) array.set(leapYearDaysInMonth,3,30) array.set(leapYearDaysInMonth,4,31) array.set(leapYearDaysInMonth,5,31) array.set(leapYearDaysInMonth,6,30) array.set(leapYearDaysInMonth,7,31) array.set(leapYearDaysInMonth,8,30) array.set(leapYearDaysInMonth,9,31) array.concat(leapYearDaysInMonth,restMonths) array.concat(nonleapYearDaysInMonth,restMonths) isLeapYear = yr % 4 == 0 and (year%100 != 0 or year%400 == 0) numberOfDaysInCurrentMonth = isLeapYear ? array.get(leapYearDaysInMonth, mth-2) : array.get(nonleapYearDaysInMonth, mth-2) if(byDate) mth := (date - backtestBars) < 0 ? mth - 1 : mth yr := mth < 1 ? yr - 1 : yr mth := mth < 1 ? 1 : mth date := (date - backtestBars) < 0 ? numberOfDaysInCurrentMonth - backtestBars + date + 1 : date - backtestBars + 1 if(byMonth) date := 1 yr := (mth - (backtestBars%12)) < 0 ? yr - int(backtestBars/12) - 1 : yr - int(backtestBars/12) mth := mth - (backtestBars%12) + 1 if(byYear) date := 1 mth := 1 yr := yr - backtestBars [date, mth, yr] f_secureSecurity(_symbol, _res, _src) => security(_symbol, _res, _src[1], lookahead = barmerge.lookahead_on) f_getClassicPivots(HIGHprev, LOWprev, CLOSEprev)=> PP = (HIGHprev + LOWprev + CLOSEprev) / 3 R1 = PP * 2 - LOWprev S1 = PP * 2 - HIGHprev R2 = PP + (HIGHprev - LOWprev) S2 = PP - (HIGHprev - LOWprev) R3 = PP * 2 + (HIGHprev - 2 * LOWprev) S3 = PP * 2 - (2 * HIGHprev - LOWprev) R4 = PP * 3 + (HIGHprev - 3 * LOWprev) S4 = PP * 3 - (3 * HIGHprev - LOWprev) R5 = PP * 4 + (HIGHprev - 4 * LOWprev) S5 = PP * 4 - (4 * HIGHprev - LOWprev) [R5, R4, R3, R2, R1, PP, S1, S2, S3, S4, S5] f_getFibPivots(HIGHprev, LOWprev, CLOSEprev)=> PP = (HIGHprev + LOWprev + CLOSEprev) / 3 R1 = PP + 0.382 * (HIGHprev - LOWprev) S1 = PP - 0.382 * (HIGHprev - LOWprev) R2 = PP + 0.618 * (HIGHprev - LOWprev) S2 = PP - 0.618 * (HIGHprev - LOWprev) R3 = PP + (HIGHprev - LOWprev) S3 = PP - (HIGHprev - LOWprev) R4 = PP + 1.41 * (HIGHprev - LOWprev) S4 = PP - 1.41 * (HIGHprev - LOWprev) R5 = PP + 1.65 * (HIGHprev - LOWprev) S5 = PP - 1.65 * (HIGHprev - LOWprev) [R5, R4, R3, R2, R1, PP, S1, S2, S3, S4, S5] f_getPivotPoints(HTFMultiplier, resolution, ppType)=> derivedResolution = resolution == ""? f_multiple_resolution(HTFMultiplier) : resolution HIGHprev = f_secureSecurity(syminfo.tickerid, derivedResolution, high) LOWprev = f_secureSecurity(syminfo.tickerid, derivedResolution, low) CLOSEprev = f_secureSecurity(syminfo.tickerid, derivedResolution, close) [R5, R4, R3, R2, R1, PP, S1, S2, S3, S4, S5] = f_getClassicPivots(HIGHprev, LOWprev, CLOSEprev) [Rf5, Rf4, Rf3, Rf2, Rf1, PPf, Sf1, Sf2, Sf3, Sf4, Sf5] = f_getFibPivots(HIGHprev, LOWprev, CLOSEprev) [R5, R4, R3, R2, R1, PP, S1, S2, S3, S4, S5] f_getState(Source, R5, R4, R3, R2, R1, PP, S1, S2, S3, S4, S5)=> state = Source > R5 ? 5 : Source > R4 ? 4 : Source > R3 ? 3 : Source > R2 ? 2 : Source > R1 ? 1 : Source > PP ? 0 : Source > S1 ? -1 : Source > S2 ? -2 : Source > S3 ? -3 : Source > S4 ? -4 : Source > S5 ? -5 : -6 state [R5, R4, R3, R2, R1, PP, S1, S2, S3, S4, S5] = f_getPivotPoints(HTFMultiplier, resolution, ppType) [date, mth, yr] = f_getBackTestTimeFrom(backtestFrom, backtestBars) inDateRange = time >= timestamp(syminfo.timezone, yr, mth, date, 0, 0) BBU5 = plot(not hideBands ? R5: na, title="R5", color=color.orange, linewidth=1, transp=50, style=plot.style_linebr) BBU4 = plot(not hideBands ? R4: na, title="R4", color=color.yellow, linewidth=1, transp=50, style=plot.style_linebr) BBU3 = plot(not hideBands ? R3: na, title="R3", color=color.navy, linewidth=1, transp=50, style=plot.style_linebr) BBU2 = plot(not hideBands ? R2: na, title="R2", color=color.olive, linewidth=1, transp=50, style=plot.style_linebr) BBU1 = plot(not hideBands ? R1: na, title="R1", color=color.lime, linewidth=1, transp=50, style=plot.style_linebr) BBM4 = plot(not hideBands ? PP:na, title="PP", color=color.black, linewidth=2, style=plot.style_linebr) BBL1 = plot(not hideBands ? S1: na, title="S1", color=color.lime, linewidth=1, transp=50, style=plot.style_linebr) BBL2 = plot(not hideBands ? S2: na, title="S2", color=color.olive, linewidth=1, transp=50, style=plot.style_linebr) BBL3 = plot(not hideBands ? S3: na, title="S3", color=color.navy, linewidth=1, transp=50, style=plot.style_linebr) BBL4 = plot(not hideBands ? S4: na, title="S4", color=color.yellow, linewidth=1, transp=50, style=plot.style_linebr) BBL5 = plot(not hideBands ? S5: na, title="S5", color=color.orange, linewidth=1, transp=50, style=plot.style_linebr) fill(BBU5, BBU4, title="RZ5", color=color.green, transp=90) fill(BBU4, BBU3, title="RZ4", color=color.lime, transp=90) fill(BBU3, BBU2, title="RZ3", color=color.olive, transp=90) fill(BBU2, BBU1, title="RZ2", color=color.navy, transp=90) fill(BBU1, BBM4, title="RZ1", color=color.yellow, transp=90) fill(BBM4, BBL1, title="SZ1", color=color.orange, transp=90) fill(BBL1, BBL2, title="SZ2", color=color.red, transp=90) fill(BBL2, BBL3, title="SZ3", color=color.maroon, transp=90) fill(BBL3, BBL4, title="SZ4", color=color.maroon, transp=90) fill(BBL4, BBL5, title="SZ5", color=color.maroon, transp=90) strategy.risk.allow_entry_in(tradeDirection) longCondition = crossover(Source[1],R1) and inDateRange shortCondition = crossunder(Source[1], S2) and inDateRange strategy.entry("Buy", strategy.long, when=longCondition, oca_name="oca") strategy.entry("Sell", strategy.short, when=shortCondition, oca_name="oca")