jueves, 4 de junio de 2020

EL SISTEMA "AGORERO"

El sistema "Agorero" opera el SP500 abriendo posiciones cortas cuando hay las siguientes señales bajistas:
  • Baja volatilidad
  • Nuevos mínimos del NYSE marcando peligro
  • Divergencias bajistas con la línea ascenso-descenso
En las simulación alcanza un 94% de aciertos aunque se trata de resultados optimizados. Este sistema se presentó por primera vez en el informe del 4 de noviembre de 2017 que se anexa a continuación:


Si está interesado en sistemas de trading le recomendamos la suscripción al servicio de Informes Onda4 donde se publicó este sistema (entre muchos). A continuación mostramos la curva de capital resultante de la optimización y que aparece en el informe:



















A continuación se incluye el código del sistema AGORERO. Como de costumbre el sistema incluye un dimensionamiento basado en el modelo de volatilidad de Robert Carver que se puede encontrar en su libro "Systematic Trading" y cuyo código Amibroker se encuentra en este Blog. 

Hay que tener en cuenta que este código del sistema Agorero utiliza los ticker de IQFeed para coger los datos de los Nuevos Mínimos del NYSE (FINL.Z) y también carga los datos de la línea Ascenso-Descenso (IIAA.Z y IIAD.Z respectivamente). 

También llama al include "futuros.afl" que tiene los multiplicadores de los futuros y datos adicionales como el tick y el número de decimales. El include se puede encontrar en otras entradas de este blog utilizando el buscador.

ADVERTENCIA:  Este es un sistema optimizado que se proporciona para fines didácticos y que no se recomienda operar en trading real. Salvo excepciones abrir posiciones cortas en los índices suele salir mal debido a su sesgo alcista de largo plazo.

//--------------------------------------
// SISTEMA AGORERO (SP500 SOLO CORTO)
// OSCAR G. CAGIGAS - 28/10/2017
//--------------------------------------

//-------VARIABLES OPTMIZABLES---------------
nstop = 6;
OptimizerSetEngine("spso");
per = Optimize("per",16,6,16,2);
len = Optimize("len",12,3,20,2);
salida = Optimize("salida",18,5,20,2);
volatTH = Optimize("VolatTH",0.8,0.5,0.8,0.1);


//------------------MONEY MANAGEMENT-----------------------------------------

//PARAMETROS DE GESTION DE CAPITAL
Eq = 100000;
tavol = 0.20;  //target volatility %
idm = 2; //instrument diversification multiplier
iw = 0.25;  //instrument weight

//CAPITAL INICIAL Y COMISIONES//  
SetOption( "initialequity", 100000 ); // starting capital     
SetOption("PriceBoundChecking",1);  
SetOption("CommissionMode", 2);  
SetOption("commissionamount",10);  //COMISIÓN INDIVIDUAL (ENTRADA O SALIDA)  
SetOption("WarningLevel", 1 );   
  
//DIMENSIONAMIENTO//   
#include <futuros.afl>   
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;    


//----------------------------------------------------------------------------


//++++++++++ SISTEMA DE TRADING +++++++++++++

//solo cortos//
Buy = Sell = 0;

//DEFINICIONES//
volat = StDev(log(C/Ref(C,-1)),10)/StDev(log(C/Ref(C,-1)),100);
bajaVolat = volat < volatTH;
lineaAD = MA( Foreign("IIAA.Z","C") - Foreign("IIAD.Z","C"),20);
divergAD = LinRegSlope(C,per) > 0 AND LinRegSlope(lineaAD,per) < 0;

//new Lows NYSE
SetForeign("FINL.Z"); 
peligro = Sum( C > 40, 5)  >= 5;
RestorePriceArrays();

//sistema//
Short = setupb = bajaVolat AND divergAD AND peligro;
Cover = StochK(len,1) < salida;

//PANIC STOP//
STOP = Nz(nstop * desv_carver);   
ApplyStop(stopTypeLoss,stopModePoint, STOP,1,0);
Equity(1,0);

//remove excesive signals// 
Buy = ExRem(Buy,Sell OR short); 
Sell = ExRem(Sell,Buy); 
Short = ExRem(Short,Cover OR buy);
Cover = ExRem(Cover,Short);

largo = Flip(Buy,Sell);
corto = Flip(Short,Cover);

//SALIDA GRAFICA//
Color = IIf(setupb,colorBlue,0);
Plot(C,"PRICE",color,styleBar|styleThick, Null, Null, 0,0,1);    
PlotShapes(IIf(Buy,shapeUpArrow,shapeNone),colorGreen,0,L,-15);    
PlotShapes(IIf(Buy,shapehollowCircle,shapeNone),colorGreen,0,BuyPrice,0);    
PlotShapes(IIf(Sell AND NOT Corto,shapeDownArrow,shapeNone),colorRed,0,H,-15);    
PlotShapes(IIf(Sell AND NOT Corto,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 = 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 );     
}     
    
//CHART//    
color = colorLightBlue;
Plot(C,"Last",color,styleBar|styleThick,Null,Null,0,0,1);     
stopprice = ValueWhen(Short,ShortPrice+stop);   
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"+ FullName()+"\n"+EncodeColor(colorBlue)+"SIST SP500"        
+"\n"+EncodeColor(colorGrey40)+"STDEV = "+WriteVal(desv_carver,1.6)+" Pts ; x"   + WriteVal(PointValue,1.0)
+"\n"+EncodeColor(colorRed)+"VOLAT = $"+WriteVal(ivv,1.2)   
+"\n"+ EncodeColor(colorRed)+"SL = " + WriteVal(stopprice,1.2)     
+" ; RISK = "+WriteVal(IIf(largo, C-stopprice,stopprice-C)*PointValue*NumFut,1.0);


//NOMBRE DEL SISTEMA EN GRANDE//
GfxSetOverlayMode(1);
GfxSelectFont("Tahoma", Status("pxheight")/16 );
GfxSetTextAlign( 6 );// center alignment
GfxSetTextColor( ColorRGB( 200, 200, 200 ) );
GfxSetBkMode(1); // transparent
GfxTextOut( "SP", Status("pxwidth")/24, Status("pxheight")/2.6 );







2 comentarios:

  1. Muchas gracias D. Oscar, de nuevo nos sorprende, no solo con su generosidad al abrir el conocimiento a los traders retail, sino tambien de sus contenidos de una calidad inmensa y de una fuente inagotable de enseñanzas que nos hace abrir nuestras mentes y buscar el objetivo de ser UN TRADER en mayusculas como usted ha conseguido ser a lo largo de todos estos años.

    ResponderEliminar
  2. Muchas gracias por este comentario tan amable. Saludos

    ResponderEliminar

ENTRADAS POPULARES