Tamaño de orden incremental Tendencia de retroceso de Fibonacci siguiendo la estrategia

El autor:¿ Qué pasa?, Fecha: 2023-10-18 11:40:01
Las etiquetas:

img

Resumen general

Esta es una estrategia de ruptura de impulso relativamente compleja que incorpora múltiples indicadores técnicos para el juicio e implementa órdenes piramidal de múltiples etapas en diferentes direcciones y fases para lograr el objetivo de escalar dentro y fuera.

Principios

La estrategia combina principalmente el indicador de impulso MACD, el indicador de sobrecompra y sobreventa RSI y las bandas de Bollinger para el juicio direccional. Cuando la línea MACD está por encima de 0 y la RSI está por debajo de la línea de sobreventa, es una señal larga. Cuando la línea MACD está por debajo de 0 y la RSI está por encima de la línea de sobrecompra, es una señal corta. También incorpora la ruptura de los carriles superiores e inferiores de las bandas de Bollinger para confirmar más las señales comerciales.

En la implementación específica, la estrategia primero juzga el rendimiento de la línea MACD y el RSI para confirmar los fundamentos. Luego, de acuerdo con la ruptura de la línea superior e inferior de las bandas de Bollinger, toma órdenes piramidal en diferentes tamaños. En la frase alcista, se extenderá gradualmente con un tamaño creciente cerca de la línea inferior de las bandas de Bollinger. En la frase bajista, se acortará gradualmente con un tamaño creciente cerca de la línea superior de las bandas de Bollinger. Al escalar hacia dentro y hacia fuera en diferentes direcciones y precios diferentes, puede obtener un beneficio acumulado mayor.

Mientras tanto, la estrategia también rastrea el precio más alto y más bajo para establecer stop loss y tomar ganancias, administrando las órdenes en consecuencia.

Ventajas

  1. La combinación de múltiples indicadores evita una evaluación errónea de un solo instrumento.

  2. La escala con múltiples etapas puede amplificar el margen de ganancia.

  3. Establecer stop loss y take profit ayuda a evitar pérdidas por picos altos.

  4. Descenso controlado, no verá pérdidas enormes.

Riesgos y soluciones

  1. Breakout de Bollinger Bands tren superior e inferior no es 100% confiable, puede ver algunas señales falsas. Puede considerar la adición de otros indicadores como patrones de velas, volumen para confirmación.

  2. La pirámide escalonada requiere una comprensión precisa del ritmo del mercado, las inversiones rápidas pueden conducir a una gran pérdida.

  3. Necesidad de vigilar la liquidez de los instrumentos de negociación, baja liquidez no es adecuada para grandes lotes de pirámide.

  4. Backtest ≠ en vivo, los costos como el spread y la comisión deben considerarse en el comercio en vivo.

Optimización

  1. Puede probar diferentes combinaciones de parámetros como período de Bollinger, multiplicador de STD, parámetros RSI para encontrar óptimo.

  2. Puede explorar otras técnicas de escala como fracción fija, criterio de Kelly, etc.

  3. Puede implementar la optimización dinámica de parámetros con aprendizaje automático, etc.

  4. Puede incorporar más fuentes de datos como análisis de sentimientos, datos sociales para ayudar a juzgar.

  5. Puede explorar el calendario de futuros para el arbitraje, ampliar aún más el espacio de ganancias.

Resumen de las actividades

Esta estrategia utiliza ampliamente múltiples indicadores técnicos, toma la pirámide escalonada, gestiona los riesgos con stop loss y take profit, por lo que es una tendencia relativamente completa después de la estrategia. Pero los riesgos como señales falsas y reversiones rápidas deben ser alertados, el ajuste adecuado de parámetros y dimensionamiento de posición puede conducir a retornos excedentes más constantes.


/*backtest
start: 2022-10-11 00:00:00
end: 2023-10-17 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2
strategy(title="Incremental Order size +", shorttitle="Strategy", overlay=true, default_qty_value=1, pyramiding=10)

//Heiken Ashi
isHA = input(false, "HA Candles", bool)

//MACD
fastLength = 12
slowlength = 26
MACDLength = 9

MACD = ema(close, fastLength) - ema(close, slowlength)
aMACD = ema(MACD, MACDLength)
delta = MACD - aMACD

//Bollinger Bands Exponential
src = open
len = 18
e = ema(src,len)
evar = (src - e)*(src - e)
evar2 = (sum(evar,len))/len
std = sqrt(evar2)
Multiplier = input(3, minval = 0.01, title = "# of STDEV's")
upband = e + (Multiplier * std)
dnband = e - (Multiplier * std)

//EMA
ema3 = ema(close, 3)

//RSIplot
length = 45
overSold = 90
overBought = 10
price = close

vrsi = rsi(price, length)

notna = not na(vrsi)

macdlong = crossover(delta, 0)
macdshort = crossunder(delta, 0)
rsilong = notna and crossover(vrsi, overSold)
rsishort = notna and crossunder(vrsi, overBought)

lentt = input(14, "Pivot Length")
    //The length defines how many periods a high or low must hold to be a "relevant pivot"

h = highest(lentt)
    //The highest high over the length
h1 = dev(h, lentt) ? na : h
    //h1 is a pivot of h if it holds for the full length
hpivot = fixnan(h1)
    //creates a series which is equal to the last pivot

l = lowest(lentt)
l1 = dev(l, lentt) ? na : l
lpivot = fixnan(l1)
    //repeated for lows


last_hpivot = h1 ? time : nz(last_hpivot[1])
last_lpivot = l1 ? time : nz(last_lpivot[1])

long_time = last_hpivot > last_lpivot ? 0:1

//FIBS

z = input(100, "Z-Index")
p_offset= 2
transp = 60
a=(lowest(z)+highest(z))/2
b=lowest(z)
c=highest(z)
fibonacci = input(0, "Fibonacci") / 100

//Fib Calls
fib0 = (((hpivot - lpivot)* fibonacci) + lpivot)
fib1 = (((hpivot - lpivot)*.21) + lpivot)
fib2 = (((hpivot - lpivot)*.3) + lpivot)
fib3 = (((hpivot - lpivot)*.5) + lpivot)
fib4 = (((hpivot - lpivot)*.62) + lpivot)
fib5 = (((hpivot - lpivot)*.7) + lpivot)
fib6 = (((hpivot - lpivot)* 1.00) + lpivot)
fib7 = (((hpivot - lpivot)* 1.27) + lpivot)
fib8 = (((hpivot - lpivot)* 2) + lpivot)
fib9 = (((hpivot - lpivot)* -.27) + lpivot)
fib10 = (((hpivot - lpivot)* -1) + lpivot)

//Heiken Ashi Candles

data2 = isHA ? heikenashi(syminfo.tickerid) : syminfo.tickerid
res5 = input("5", "Resolution")

//HT Fibs

hfib0 =  security(data2, res5, fib0[1])
hfib1 =  security(data2, res5, fib1[1])
hfib2 =  security(data2, res5, fib2[1])
hfib3 =  security(data2, res5, fib3[1])
hfib4 =  security(data2, res5, fib4[1])
hfib5 =  security(data2, res5, fib5[1])
hfib6 =  security(data2, res5, fib6[1])
hfib7 =  security(data2, res5, fib7[1])
hfib8 =  security(data2, res5, fib8[1])
hfib9 =  security(data2, res5, fib9[1])
hfib10 =  security(data2, res5, fib10[1])

vrsiup = vrsi > vrsi[1] and vrsi[1] > vrsi[2]
vrsidown = vrsi < vrsi[1] and vrsi[1] < vrsi[2]

long =  cross(close, fib0) and delta > 0 and vrsi < overSold and vrsiup 
short = cross(close, fib6) and delta < 0  and vrsi > overBought and vrsidown

// long2 =  cross(close, fib0) and delta > 0 and vrsi < overSold and vrsiup 
// short2 = cross(close, fib6) and delta < 0  and vrsi > overBought and vrsidown
// long =  cross(close, fib0) and delta > 0 and vrsi < overSold and vrsiup 
// short = cross(close, fib6) and delta < 0  and vrsi > overBought and vrsidown
// long =  cross(close, fib0) and delta > 0 and vrsi < overSold and vrsiup 
// short = cross(close, fib6) and delta < 0  and vrsi > overBought and vrsidown
// long =  cross(close, fib0) and delta > 0 and vrsi < overSold and vrsiup 
// short = cross(close, fib6) and delta < 0  and vrsi > overBought and vrsidown
// long =  cross(close, fib0) and delta > 0 and vrsi < overSold and vrsiup 
// short = cross(close, fib6) and delta < 0  and vrsi > overBought and vrsidown
// long =  cross(close, fib0) and delta > 0 and vrsi < overSold and vrsiup 
// short = cross(close, fib6) and delta < 0  and vrsi > overBought and vrsidown
// long =  cross(close, fib0) and delta > 0 and vrsi < overSold and vrsiup 
// short = cross(close, fib6) and delta < 0  and vrsi > overBought and vrsidown
// long =  cross(close, fib0) and delta > 0 and vrsi < overSold and vrsiup 
// short = cross(close, fib6) and delta < 0  and vrsi > overBought and vrsidown

reverseOpens = input(false, "Reverse Orders", bool)
if (reverseOpens)
	tmplong = long
	long := short
	short := tmplong

//Strategy
ts = input(99999, "TS")
tp = input(30, "TP")
sl = input(10, "SL")

last_long = long ? time : nz(last_long[1])
last_short = short ? time : nz(last_short[1])

in_long = last_long > last_short
in_short = last_short > last_long

long_signal = crossover(last_long, last_short)
short_signal = crossover(last_short, last_long)

last_open_long = long ? open : nz(last_open_long[1])
last_open_short = short ? open : nz(last_open_short[1])

last_open_long_signal = long_signal ? open : nz(last_open_long_signal[1])
last_open_short_signal = short_signal ? open : nz(last_open_short_signal[1])

last_high = not in_long ? na : in_long and (na(last_high[1]) or high > nz(last_high[1])) ? high : nz(last_high[1])
last_low = not in_short ? na : in_short and (na(last_low[1]) or low < nz(last_low[1])) ? low : nz(last_low[1])

long_ts = not na(last_high) and high <= (last_high - ts) and high >= last_open_long_signal
short_ts = not na(last_low) and low >= (last_low + ts) and low <= last_open_short_signal

long_tp = high >= (last_open_long + tp) and long[1] == 0
short_tp = low <= (last_open_short - tp) and short[1] == 0

long_sl = low <= (last_open_long - sl) and long[1] == 0
short_sl = high >= (last_open_short + sl) and short[1] == 0

last_hfib_long = long_signal ? fib1 : nz(last_hfib_long[1])
last_hfib_short = short_signal ? fib5 : nz(last_hfib_short[1])

last_fib7 = long ? fib7 : nz(last_fib7[1])
last_fib10 = long ? fib10 : nz(last_fib10[1])
last_fib8 = short ? fib8 : nz(last_fib8[1])
last_fib9 = short ? fib9 : nz(last_fib9[1])

last_long_signal = long_signal ? time : nz(last_long_signal[1])
last_short_signal = short_signal ? time : nz(last_short_signal[1])

last_long_tp = long_tp ? time : nz(last_long_tp[1])
last_short_tp = short_tp ? time : nz(last_short_tp[1])

last_long_ts = long_ts ? time : nz(last_long_ts[1])
last_short_ts = short_ts ? time : nz(last_short_ts[1])

long_ts_signal = crossover(last_long_ts, last_long_signal)
short_ts_signal = crossover(last_short_ts, last_short_signal)

last_long_sl = long_sl ? time : nz(last_long_sl[1])
last_short_sl = short_sl ? time : nz(last_short_sl[1])

long_tp_signal = crossover(last_long_tp, last_long)
short_tp_signal = crossover(last_short_tp, last_short)

long_sl_signal = crossover(last_long_sl, last_long)
short_sl_signal = crossover(last_short_sl, last_short)

last_long_tp_signal = long_tp_signal ? time : nz(last_long_tp_signal[1])
last_short_tp_signal = short_tp_signal ? time : nz(last_short_tp_signal[1])

last_long_sl_signal = long_sl_signal ? time : nz(last_long_sl_signal[1])
last_short_sl_signal = short_sl_signal ? time : nz(last_short_sl_signal[1])

last_long_ts_signal = long_ts_signal ? time : nz(last_long_ts_signal[1])
last_short_ts_signal = short_ts_signal ? time : nz(last_short_ts_signal[1])

true_long_signal = long_signal and last_long_sl_signal > last_long_signal[1] or long_signal and last_long_tp_signal > last_long_signal[1] or long_signal and last_long_ts_signal > last_long_signal[1]
true_short_signal = short_signal and last_short_sl_signal > last_short_signal[1] or short_signal and last_short_tp_signal > last_short_signal[1] or short_signal and last_short_ts_signal > last_short_signal[1]  


// strategy.entry("BLUE", strategy.long, when=long)
// strategy.entry("RED", strategy.short, when=short)

g = delta > 0 and vrsi < overSold and vrsiup
r = delta < 0  and vrsi > overBought and vrsidown

long1 = cross(close, fib1) and g and last_long_signal[1] > last_short_signal// and last_long_signal > long
short1 = cross(close, fib5) and r and last_short_signal[1] > last_long_signal// and last_short_signal > short

last_long1 = long1 ? time : nz(last_long1[1])
last_short1 = short1 ? time : nz(last_short1[1])

last_open_long1 = long1 ? open : nz(last_open_long1[1])
last_open_short1 = short1 ? open : nz(last_open_short1[1])

long1_signal = crossover(last_long1, last_long_signal)
short1_signal = crossover(last_short1, last_short_signal)

last_long1_signal = long1_signal ? time : nz(last_long1_signal[1])
last_short1_signal = short1_signal ? time : nz(last_short1_signal[1])


long2 = cross(close, fib2) and g and last_long1_signal > last_long_signal[1] and long1_signal == 0 and last_long_signal[1] > last_short_signal
short2 = cross(close, fib4) and r and last_short1_signal > last_short_signal[1] and short1_signal == 0 and last_short_signal[1] > last_long_signal

last_long2 = long2 ? time : nz(last_long2[1])
last_short2 = short2 ? time : nz(last_short2[1])

last_open_short2 = short2 ? open : nz(last_open_short2[1])

long2_signal = crossover(last_long2, last_long1_signal) and long1_signal==0
short2_signal = crossover(last_short2, last_short1_signal) and short1_signal==0

last_long2_signal = long2_signal ? time : nz(last_long2_signal[1])
last_short2_signal = short2_signal ? time : nz(last_short2_signal[1])

//Trade 4

long3 = cross(close, fib3) and g and last_long1_signal > last_long_signal[1] and long1_signal == 0 and last_long_signal[1] > last_short_signal
short3 = cross(close, fib3) and r and last_short1_signal > last_short_signal[1] and short1_signal == 0 and last_short_signal[1] > last_long_signal

last_long3 = long3 ? time : nz(last_long3[1])
last_short3 = short3 ? time : nz(last_short3[1])

last_open_short3 = short3 ? open : nz(last_open_short3[1])

long3_signal = crossover(last_long3, last_long2_signal) and long2_signal==0
short3_signal = crossover(last_short3, last_short2_signal) and short2_signal==0

last_long3_signal = long3_signal ? time : nz(last_long3_signal[1])
last_short3_signal = short3_signal ? time : nz(last_short3_signal[1])


//Trade 5
long4 = long and last_long1_signal > last_long_signal[1] and long1_signal == 0 and last_long_signal[1] > last_short_signal
short4 = short and last_short1_signal > last_short_signal[1] and short1_signal == 0 and last_short_signal[1] > last_long_signal

last_long4 = long4 ? time : nz(last_long4[1])
last_short4 = short4 ? time : nz(last_short4[1])

long4_signal = crossover(last_long4, last_long3_signal) and long2_signal==0 and long3_signal==0
short4_signal = crossover(last_short4, last_short3_signal) and short2_signal==0 and short3_signal==0

last_long4_signal = long4_signal ? time : nz(last_long4_signal[1])
last_short4_signal = short4_signal ? time : nz(last_short4_signal[1])

//Trade 6
long5 = long and last_long1_signal > last_long_signal[1] and long1_signal == 0 and last_long_signal[1] > last_short_signal
short5 = short and last_short1_signal > last_short_signal[1] and short1_signal == 0 and last_short_signal[1] > last_long_signal

last_long5 = long5 ? time : nz(last_long5[1])
last_short5 = short5 ? time : nz(last_short5[1])

long5_signal = crossover(last_long5, last_long4_signal) and long3_signal==0 and long4_signal==0
short5_signal = crossover(last_short5, last_short4_signal) and short3_signal==0 and short4_signal==0

last_long5_signal = long5_signal ? time : nz(last_long5_signal[1])
last_short5_signal = short5_signal ? time : nz(last_short5_signal[1])

//Trade 7
long6 = long and last_long1_signal > last_long_signal[1] and long1_signal == 0 and last_long_signal[1] > last_short_signal
short6 = short and last_short1_signal > last_short_signal[1] and short1_signal == 0 and last_short_signal[1] > last_long_signal

last_long6 = long6 ? time : nz(last_long6[1])
last_short6 = short6 ? time : nz(last_short6[1])

long6_signal = crossover(last_long6, last_long5_signal) and long2_signal==0 and long4_signal==0 and long5_signal==0
short6_signal = crossover(last_short6, last_short5_signal) and short2_signal==0 and short4_signal==0 and short5_signal==0

last_long6_signal = long6_signal ? time : nz(last_long6_signal[1])
last_short6_signal = short6_signal ? time : nz(last_short6_signal[1])


//Trade 8
long7 = long and last_long1_signal > last_long_signal[1] and long1_signal == 0 and last_long_signal[1] > last_short_signal
short7 = short and last_short1_signal > last_short_signal[1] and short1_signal == 0 and last_short_signal[1] > last_long_signal

last_long7 = long7 ? time : nz(last_long7[1])
last_short7 = short7 ? time : nz(last_short7[1])

long7_signal = crossover(last_long7, last_long6_signal) and long2_signal==0 and long4_signal==0 and long5_signal==0 and long6_signal==0
short7_signal = crossover(last_short7, last_short6_signal) and short2_signal==0 and short4_signal==0 and short5_signal==0 and short6_signal==0

last_long7_signal = long7_signal ? time : nz(last_long7_signal[1])
last_short7_signal = short7_signal ? time : nz(last_short7_signal[1])


//Trade 9
long8 = long and last_long1_signal > last_long_signal[1] and long1_signal == 0 and last_long_signal[1] > last_short_signal
short8 = short and last_short1_signal > last_short_signal[1] and short1_signal == 0 and last_short_signal[1] > last_long_signal

last_long8 = long8 ? time : nz(last_long8[1])
last_short8 = short8 ? time : nz(last_short8[1])

long8_signal = crossover(last_long8, last_long7_signal) and long2_signal==0 and long4_signal==0 and long5_signal==0 and long6_signal==0 and long7_signal==0
short8_signal = crossover(last_short8, last_short7_signal) and short2_signal==0 and short4_signal==0 and short5_signal==0 and short6_signal==0 and short7_signal==0

last_long8_signal = long8_signal ? time : nz(last_long8_signal[1])
last_short8_signal = short8_signal ? time : nz(last_short8_signal[1])

//Trade 10
long9 = long and last_long1_signal > last_long_signal[1] and long1_signal == 0 and last_long_signal[1] > last_short_signal
short9 = short and last_short1_signal > last_short_signal[1] and short1_signal == 0 and last_short_signal[1] > last_long_signal

last_long9 = long9 ? time : nz(last_long9[1])
last_short9 = short9 ? time : nz(last_short9[1])

long9_signal = crossover(last_long9, last_long8_signal) and long2_signal==0 and long4_signal==0 and long5_signal==0 and long6_signal==0 and long7_signal==0 and long8_signal==0
short9_signal = crossover(last_short9, last_short8_signal) and short2_signal==0 and short4_signal==0 and short5_signal==0 and short6_signal==0 and short7_signal==0 and short8_signal==0

last_long9_signal = long9_signal ? time : nz(last_long9_signal[1])
last_short9_signal = short9_signal ? time : nz(last_short9_signal[1])


strategy.entry("Long", strategy.long, qty=1, when=long_signal)
strategy.entry("Short", strategy.short, qty=1, when=short_signal)
strategy.entry("Long", strategy.long, qty=2, when=long1_signal)
strategy.entry("Short1", strategy.short, qty=2, when=short1_signal)
strategy.entry("Long", strategy.long, qty=4, when=long2_signal)
strategy.entry("Short2", strategy.short, qty=4, when=short2_signal)
strategy.entry("Long", strategy.long, qty=8, when=long3_signal)
strategy.entry("Short3", strategy.short, qty=8, when=short3_signal)
strategy.entry("Long", strategy.long, qty=5, when=long4_signal)
strategy.entry("Short", strategy.short, qty=5, when=short4_signal)
strategy.entry("Long", strategy.long, qty=6, when=long5_signal)
strategy.entry("Short", strategy.short, qty=6, when=short5_signal)
strategy.entry("Long", strategy.long, qty=7, when=long6_signal)
strategy.entry("Short", strategy.short, qty=7, when=short6_signal)
strategy.entry("Long", strategy.long, qty=8, when=long7_signal)
strategy.entry("Short", strategy.short, qty=8, when=short7_signal)
strategy.entry("Long", strategy.long, qty=9, when=long8_signal)
strategy.entry("Short", strategy.short, qty=9, when=short8_signal)
strategy.entry("Long", strategy.long, qty=10, when=long9_signal)
strategy.entry("Short", strategy.short, qty=10, when=short9_signal)

short1_tp = low <= (last_open_short1 - tp) and short1[1] == 0
short2_tp = low <= (last_open_short2 - tp) and short2[1] == 0
short3_tp = low <= (last_open_short3 - tp) and short3[1] == 0
short1_sl = high >= (last_open_short1 + sl) and short1[1] == 0
short2_sl = high >= (last_open_short2 + sl) and short2[1] == 0
short3_sl = high >= (last_open_short3 + sl) and short3[1] == 0

close_long = cross(close, fib6)
close_short = cross(close, fib0)

// strategy.close("Long", when=close_long)
// strategy.close("Long", when=long_tp)
// strategy.close("Long", when=long_sl)

// strategy.close("Short", when=long_signal)
// strategy.close("Short1", when=long_signal)
// strategy.close("Short2", when=long_signal)
// strategy.close("Short3", when=long_signal)
strategy.close("Short", when=short_tp)
strategy.close("Short1", when=short1_tp)
strategy.close("Short2", when=short2_tp)
strategy.close("Short3", when=short3_tp)
strategy.close("Short", when=short_sl)
strategy.close("Short1", when=short1_sl)
strategy.close("Short2", when=short2_sl)
strategy.close("Short3", when=short3_sl)


Más.