viernes, 1 de marzo de 2019

El sistema HVNR4

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;






6 comentarios:

  1. Gracias por este fantastico sistema, me ha parecido muy interesante como todo lo que hace.
    Me 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.

    ResponderEliminar
  2. 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,

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

    ResponderEliminar
  4. Gracias por la información. Efectivamente este sistema fue diseñado y
    probado para futuros. Los sistemas que cogen poco recorrido como este
    solo son rentables con futuros, que tienen un apalancamiento mucho más
    alto. Saludos,

    ResponderEliminar
  5. 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.

    Me 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,

    ResponderEliminar
  6. 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

ENTRADAS POPULARES