
La estrategia calcula los puntos de apoyo de diferentes períodos de tiempo como áreas clave de precios, en combinación con el principio de la línea divisoria de oro para determinar la dirección de la tendencia y lograr una estrategia de negociación de alto precio y bajo precio.
Calcular los puntos de apoyo de cierre, máximo y mínimo en diferentes períodos de tiempo. Incluye el punto de apoyo clásico y el punto de apoyo de división de oro.
En función de la subida y bajada de los precios, juzgue la zona de precios en la que se encuentra actualmente. Se divide en 5 zonas de compra y 5 zonas de venta.
Emite una señal de compra en la zona de compra, emite una señal de venta en la zona de venta y adopta una estrategia de compra alta y venta baja.
Utiliza múltiples ciclos de tiempo para juzgar las tendencias y evitar ser engañado por el ruido del mercado.
Al mismo tiempo, la combinación de soporte clásico y soporte de división dorada aumenta la fiabilidad del soporte.
En el caso de los mercados de divisas, los mercados de divisas son los mercados de divisas que se encuentran dentro de una zona de precios.
Utiliza estrategias de compra y venta de alto y bajo precio, de acuerdo con las reglas de la tendencia de comercio, evitando el comercio de contravalor.
El punto de apoyo puede fallar y se debe tener en cuenta la ruptura del punto de apoyo.
La prevención del seguimiento de pérdidas es perjudicial y agrava las pérdidas.
Los gastos de transacción también afectan a la ganancia final.
Se pueden probar diferentes parámetros, como parámetros de ciclo de tiempo, parámetros de dirección de la operación, etc., para optimizar la estrategia.
Se puede combinar con otros indicadores para determinar tendencias y evitar falsos breaks.
Se puede agregar un mecanismo de suspensión de pérdidas para controlar las pérdidas individuales.
La estrategia integra métodos clásicos de análisis técnico con estrategias de comercio de tendencias, utiliza zonas de apoyo para determinar el momento de entrar en el mercado, y adopta el principio de compra y venta altas y bajas, que puede controlar eficazmente el riesgo de comercio, que vale la pena comprobar y optimizar en el mercado.
/*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")