Este sistema se mostró en el webinario del pasado 12 de febrero. Sus reglas son las siguientes:
•Setup: La volatilidad histórica (HV, como cociente) cae por debajo de 0.5 o bien tenemos una barra con el menor rango de los últimos 4 días (NR4)
•Compra: Si ayer hubo setup entonces compramos hoy con stop en el precio medio de ayer más un múltiplo del rango
•Salida: Tras sobrecompra en el oscilador RSI.
El código se muestra debajo. Hay un #include que se anexa al final. También se incluye la modificación para convertirlo en el sistema HVNR7.
CÓDIGO SISTEMA HVNR4
//-----------------------------
// SISTEMA HVNR4
// OPERA CAÍDAS DE VOLATILIDAD
// OSCAR G. CAGIGAS
// 1 MARZO 2019
//------------------------------
//PARAMETROS OPTIMIZABLES//
OptimizerSetEngine("spso");
k = Optimize("k",0.4,0.1,1.5,0.1);
DB = Optimize("DB",50,50,120,10);
per = Optimize("per",6,4,14,1);
Volatper = Optimize("volat per",2, 2, 12,2);
volatTH = 0.5;
nstop = 5;
//------------------MONEY MANAGEMENT-----------------------------------------
//POSICIONES Y SU PESO EN LA CARTERA//
iw = 0.25; //peso de cada posición (unas 4 simultaneas en promedio)
//PARAMETROS DE GESTION DE CAPITAL
Eq = 100000;
tavol = 0.20;
idm = 2.0;
//CAPITAL INICIAL Y COMISIONES//
SetOption( "initialequity", 100000 ); // starting capital
SetOption("PriceBoundChecking",1);
SetOption("CommissionMode", 2);
SetOption("commissionamount",50); //COMISIÓN INDIVIDUAL (ENTRADA O SALIDA)
SetOption("WarningLevel", 1 );
//DIMENSIONAMIENTO//
#include <futuros.afl>
SetOption("maxopenpositions",6);
decim = 1 + dec/10; //decimales correctos
//DESVIACION STANDARD EXPONENCIAL
desv_carver = sqrt( EMA( ( C-Ref(C,-1) )^2, 36 ) ) ;
//----NÚMERO DE FUTUROS EN BASE AL FORECAST ANTERIOR, VOLATILIDAD Y EQUITY----
dvt = Eq * tavol / 16; //daily volatility target
ivv = desv_carver * PointValue; //instrument value volatility
vs = Nz(dvt / ivv); //volatility scalar
pos = vs * iw * idm; //forecast de 10 siempre
numfut = round(pos); //el número de contratos
MarginDeposit = 1; PositionSize = NumFut;
//----------------------------------------------------------
//VOLATILIDAD HISTÓRICA COMO COCIENTE
HistVol = StDev(log(C/Ref(C,-1)),Volatper)/StDev(log(C/Ref(C,-1)),100);
//BARRA NR4 DE HOY TIENE MENOR RANGO (ATR(1)) QUE LAS ÚLTIMAS 3
NR4 = ATR(1) < Ref(LLV(ATR(1),3),-1);
//SETUP
setup = HistVol < volatTH AND (NR4 OR Inside()) AND C > Ref(C,-DB) AND RSI(per) < 50;
//SUSTITUIR POR ESTAS LÍNEAS PARA EL SISTEMA HNVR7
//NR7 = ATR(1) < Ref(LLV(ATR(1),6),-1);
//setup = HistVol < volatTH AND (NR7 OR Inside()) AND C > Ref(C,-DB) AND RSI(per) < 50;
//ENTRADA
Buystop = Ref(Avg + k*desv_carver,-1);
Buy = Ref(setup,-1) AND Open < Buystop AND H > Buystop;
BuyPrice = Max(Buystop,Open);
//SALIDA//
Sell = RSI(per) > 70;
//STOP LOSS//
STOP = Nz(nstop * desv_carver);
ApplyStop(stopTypeLoss,stopModePoint, STOP,1,0);
Equity(1,0);
//LONG ONLY//
Short=Cover=0;
InLong=Flip(Buy,Sell);
//CHART//
SetChartOptions(0,chartShowDates);
Title = StrFormat("{{NAME}} - {{INTERVAL}} {{DATE}} Open %g, Hi %g, Lo %g, Close %g (%.1f%%) {{VALUES}}", O, H, L, C, SelectedValue( ROC( C, 1 ) ) )
+"\n"+ EncodeColor(colorRed)+
//SEÑAL DE COMPRA Y STOP LOSS EN PANTALLA//
//Plot(IIf(InLong OR Buy OR Sell,ValueWhen(Buy,BuyPrice-stop*ATR(10)),Null),"",11,styleLine|styleThick);
WriteIf(setup,"BUY "+" "+NumToStr(Ref(H+k*(H-L),-1),1.2),"")
+"\n"+EncodeColor(colorGrey40)+
"ATR = "+WriteVal(ATR(20),1.4)+" Pts"
+"\n"+"Volat = $"+WriteVal(PointValue*ATR(20),1.0);
//---------------------//
//SALIDA GRAFICA//
Color = IIf(setup,colorBlue,0);
Plot(C,"PRICE",color,styleBar|styleThick,Null,Null,0,0,2);
PlotShapes(IIf(Buy,shapeUpArrow,shapeNone),colorGreen,0,L,-15);
PlotShapes(IIf(Buy,shapeHollowCircle,shapeNone),colorGreen,0,BuyPrice,0);
PlotShapes(IIf(Sell ,shapeDownArrow,shapeNone),colorRed,0,H,-15);
PlotShapes(IIf(Sell ,shapeHollowCircle,shapeNone),colorRed,0,SellPrice,0);
PlotShapes(IIf(Short,shapeDownArrow,shapeNone),colorBrown,0,H,-15);
PlotShapes(IIf(Short,shapeHollowCircle,shapeNone),colorBrown,0,ShortPrice,0);
PlotShapes(IIf(Cover AND NOT Largo,shapeUpArrow,shapeNone),colorDarkGreen,0,L,-15);
PlotShapes(IIf(Cover AND NOT Largo,shapeHollowCircle,shapeNone),colorDarkGreen,0,CoverPrice,0);
//PLOTTEXT//
dist = 2*ATR(10);
for( i = 0; i < BarCount; i++ )
{
if( Buy[i] ) PlotText( "Long "+NumToStr(ValueWhen(Buy[i],BuyPrice[i]),1.2), i, L[ i ]-dist[i], colorGreen );
if( Sell[i] AND NOT Short[i]) PlotText( "Exit " + NumToStr(ValueWhen(Sell[i],SellPrice[i]),1.2), i, H[ i ]+dist[i], colorRed );
if( Short[i] ) PlotText( "Short "+NumToStr(ValueWhen(Short[i],ShortPrice[i]),1.2), i, H[ i ]+dist[i], colorBrown );
if( Cover[i] AND NOT Buy[i]) PlotText( "Cover " + NumToStr(ValueWhen(Cover[i],CoverPrice[i]),1.2), i, L[ i ]-dist[i], colorBlack );
}
CÓDIGO DEL #INCLUDE
//---------------------------------------//
// CODIGO DE MULTIPLICADORES DE FUTUROS
// OSCAR G. CAGIGAS
// 15 FEBRERO 2018
//---------------------------------------//
//ESCOGEMOS EL MULTIPLICADOR PARA CADA MERCADO//
switch( Name() )
{
//----------IQFEED SYMBOLS------------------------------------------//
case "@ES#C": mul=50; tick = 0.25; dec = 2; tib = "ESH8-GLOBEX-FUT"; break; //MINI SP500
case "@NQ#C": mul=20; tick = 0.25; dec = 2; tib = "NQH8-GLOBEX-FUT"; break; //MINI NASDAQ
case "@YM#C": mul=5; tick = 1; dec = 0; tib = "YMH8-GLOBEX-FUT"; break; //DOW JONES MINI ($5)
case "@NKD#C": mul=5; tick = 5; dec = 0; tib = "NKDH8-GLOBEX-FUT"; break; //NIKKEI DOLLAR
//----------
case "@AD#C": mul=100000; tick = 0.0001; dec = 4; tib = "6AH8-GLOBEX-FUT"; break; //AUSTRALIAN DOLLAR
case "@SF#C": mul=125000; tick = 0.0001; dec = 4; tib = "6SH8-GLOBEX-FUT"; break; //SWISS FRANC
case "@EU#C": mul=125000; tick = 0.00005; dec = 5; tib = "6EH8-GLOBEX-FUT"; break; //EURODOLLARS
case "@CD#C": mul=100000; tick = 0.0001; dec = 4; tib = "6CH8-GLOBEX-FUT"; break; //CANADIAN DOLLAR
case "@NE#C": mul=100000; tick = 0.0001; dec = 4; tib = "6NH8-GLOBEX-FUT"; break; //NEW ZEALAND DOLLAR
case "@BP#C": mul=62500; tick = 0.0001; dec = 4; tib = "6BH8-GLOBEX-FUT"; break; //BRITISH POUND
case "@JY#C": mul=12500000; tick = 0.000001;dec = 7; tib = "6JH8-GLOBEX-FUT"; break; //YEN
case "@PX#C": mul=500000; tick = 0.00001; dec = 5; tib = "6MH8-GLOBEX-FUT"; break; //MEXICAN PESO
//----------
case "QGC#C": mul=100; tick = 0.1; dec = 2; tib = "GCJ8-NYMEX-FUT"; break; //GOLD
case "QSI#C": mul=5000; tick = 0.005; dec = 3; tib = "SIJ8-NYMEX-FUT"; break; //SILVER
case "QHG#C": mul=25000; tick = 0.0005; dec = 4; tib = "HGJ8-NYMEX-FUT"; break; //COPPER
case "QPA#C": mul=100; tick = 0.05; dec = 2; tib = "PAH8-NYMEX-FUT"; break; //PALADIUM (PA,NYMEX)
case "QPL#C": mul=50; tick = 0.1; dec = 2; tib = "PLJ8-NYMEX-FUT"; break; //PLATINUM
//----------
case "QHO#C": mul=42000; tick = 0.0001; dec = 4; tib = "HOJ8-NYMEX-FUT"; break; //HEATING OIL
case "QRB#C": mul=42000; tick = 0.0001; dec = 4; tib = "HOJ8-NYMEX-FUT"; break; //GASOLINE
case "QCL#C": mul=1000; tick = 0.01; dec = 2; tib = "CLJ8-NYMEX-FUT"; break; //CRUDE OIL
case "QNG#C": mul=10000; tick = 0.001; dec = 3; tib = "NGJ8-NYMEX-FUT"; break; //NATURAL GAS
//----------
case "@HE#C": mul=400; tick = 0.025; dec = 3; tib = "HEJ8-GLOBEX-FUT"; break; //LEAN HOGS
case "@LE#C": mul=400; tick = 0.025; dec = 3; tib = "LEJ8-GLOBEX-FUT"; break; //LIVE CATTLE
case "@GF#C": mul=500; tick = 0.025; dec = 3; tib = "GFJ8-GLOBEX-FUT"; break; //FEEDER CATTLE
//-----------
case "@US#C": mul=1000; tick = 1/32; dec = 3; tib = "ZB MAR 18-ECBOT-FUT"; break; //T-BOND
case "@TY#C": mul=1000; tick = 1/64; dec = 3; tib = "ZN MAR 18-ECBOT-FUT"; break; //TREASURY NOTES 10 YEAR
//-----------
case "@SB#C": mul=1120; tick = 0.01; dec = 4; tib = "SBK8-NYBOT-FUT"; break; //SUGAR
case "@KC#C": mul=375; tick = 0.05; dec = 4; tib = "KCK8-NYBOT-FUT"; break; //COFFE (KC,NYBOT)
case "@CT#C": mul=500; tick = 0.01; dec = 4; tib = "CTH8-NYBOT-FUT"; break; //COTTON
case "@CC#C": mul=10; tick = 1.00; dec = 0; tib = "CCK8-NYBOT-FUT"; break; //COCOA (NYBOT)
//-----------
case "@C#C": mul=50; tick = 0.25; dec = 2; tib = "ZC MAR 18-ECBOT-FUT"; break; //CORN
case "@S#C": mul=50; tick = 0.25; dec = 2; tib = "ZS MAR 18-ECBOT-FUT"; break; //SOYBEANS
case "@SM#C": mul=100; tick = 0.10; dec = 2; tib = "ZM MAR 18-ECBOT-FUT"; break; //SOYBEAN MEAL
case "@BO#C": mul=600; tick = 0.01; dec = 2; tib = "ZM MAR 18-ECBOT-FUT"; break; //SOYBEAN OIL
case "@W#C": mul=50; tick = 0.25; dec = 2; tib = "ZW MAR 18-ECBOT-FUT"; break; //WHEAT (ZW, ECBOT)
case "@KW#C": mul=50; tick = 0.25; dec = 2; tib = "KE MAR 18-ECBOT-FUT"; break; //KC WHEAT (ZW, ECBOT)
//-----------
default: mul = 1; tick = 0.1; dec = 4; break; //EL RESTO
} PointValue = mul; TickSize = tick;
Eres un friki de la programación de algoritmos, sistemas de trading y demás cosas raras? Encuentra aquí el código y herramientas útiles para probar sistemas y gestión de capital. Amibroker Python, Excel...
Suscribirse a:
Enviar comentarios (Atom)
ENTRADAS POPULARES
-
Hoy traigo una aplicación en Amibroker que es a la vez sencilla y práctica. Es una plataforma que sirve para operar acciones y que aprovecha...
-
El primer vídeo que se subió en 2019 al canal YouTube de Onda4 muestra un sistema de trading completo, con su backtesting y con su algoritmo...
-
Vamos a ver un sistema de trading clásico cuya lógica es bien simple. Se trata del sistema de Connors que utiliza un RSI de 2 sesiones para ...
-
Supongamos una acción muy volátil, del mercado americano, cuyo precio es de 20 dólares y cuya desviación estándar anual es de 30 dólares. ...
-
El sistema "Agorero" opera el SP500 abriendo posiciones cortas cuando hay las siguientes señales bajistas: Baja volatilidad Nuevos...
Gracias por este fantastico sistema, me ha parecido muy interesante como todo lo que hace.
ResponderEliminarMe gustaria preguntarle como se operaria este sistema con CFD,s, como se dimensionaria la posicion hablando de un portfolio de sistemas como los futuros sobre los cuales opera, pero en lugar de ese derivado sustituitlo por CFD,s. Si pudiese indicarme como se podria programar en amibroker para trabajar con ellos y hacer pruebas, asi como el capital minimo para dicha operacion, se lo agradeceria.
De nuevo darle las gracias por la gran fuente de conocimiento que aporta en su blog.
Hola Javier, para el dimensionamiento te recomiendo la entrada "El modelo de volatilidad de Robert Carver" donde se explica cómo obtener el número de contratos que producen la volatilidad anual de la cartera deseada. Respecto a CFDs siento no poder ayudarte pues nunca los he operado y no tengo conocimiento ni experiencia al respecto. Saludos,
ResponderEliminarA mero título informativo, el sistema no funciona para acciones USA, al menos para los componentes históricos del SP500 desde enero de 2010, una vez se incluyen las empresas deslistadas y se ajustan dividendos y splits. Entiendo que es un sistema pensado para futuros. Saludos.
ResponderEliminarGracias por la información. Efectivamente este sistema fue diseñado y
ResponderEliminarprobado para futuros. Los sistemas que cogen poco recorrido como este
solo son rentables con futuros, que tienen un apalancamiento mucho más
alto. Saludos,
Sí, pero más que recorrido (entiendo que se refiere con eso a que el sistema sale de la posición en un plazo breve de tiempo o tras un recorrido breve, definido por el RSI (per) pienso que es algo "estructural" con las acciones individuales.
ResponderEliminarMe explico: He estado intentando durante mucho tiempo encontrar un sistema automático de acciones que defina un periodo de mínima volatilidad y/ó rangos mínimos, como preludio de una explosión, y de momento no he encontrado nada para acciones. Y lo curioso es que bueno, si no puedo encontrar edge direccional con acciones vamos a ver si comprando straddles sobre opciones gano por aumento de la volatilidad que se supone se producirá en breve, pero tampoco...
Es como si el mercado de acciones, el americano al menos, estuviera perfectamente arbitrado en estas circunstancias. Tengo que probar con ETFs o índices para ver si hay oportunidades ahí.
Saludos,
Buenas Óscar, puedes subir las métricas de este sistema en el período que lo tengas hecho el backtest? Inlong es una función de amibroker?
ResponderEliminar