Punto de inflexión Ratio de oro Comprar alto Vender estrategia baja

El autor:¿ Qué pasa?, Fecha: 2023-12-29 16:48:06
Las etiquetas:

img

Resumen general

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.

Estrategia lógica

  1. 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.

  2. Determine en qué zona de precios se encuentra el precio actualmente en base a las bandas superior e inferior.

  3. 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.

Análisis de ventajas

  1. El uso de análisis de marcos de tiempo múltiples para determinar la tendencia evita ser engañado por el ruido del mercado.

  2. La combinación de pivotes clásicos y pivotes de Fibonacci mejora la confiabilidad de los puntos de pivote.

  3. La determinación de la entrada en el mercado en función de las zonas de precios maximiza la evitación de riesgos.

  4. Siguiendo las reglas de negociación de tendencia comprando alto y vendiendo bajo evita la negociación en contra de la tendencia.

Análisis de riesgos

  1. Pueden fallar los puntos pivot, por lo que los avances deben ser monitoreados.

  2. Evitar el empeoramiento de las pérdidas por órdenes de stop loss mal colocadas.

  3. Las comisiones de negociación también pueden afectar a la rentabilidad final.

Dirección de optimización

  1. Pruebe diferentes parámetros como los plazos, las direcciones comerciales, etc. para optimizar la estrategia.

  2. Incorporar otros indicadores para confirmar la tendencia y evitar errores.

  3. Añadir mecanismos de stop loss para controlar el importe de las pérdidas de una sola operación.

Resumen de las actividades

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")


Más.