miércoles, 2 de septiembre de 2020

El sistema CONVERGENCE

El sistema CONVERGENCE está basado en el indicador del mismo nombre que aparece en el libro de Lars Kestner (el del ratio K). Este indicador se construye comparando un total de 20 parejas de medias donde la media lenta tiene un periodo 4 veces mayor que la rápida. Son estas:

  • MA(1) con MA(4)
  • MA(2) con MA(8)
  • MA(3) con MA(12)
  • ....
  • MA(19) con MA(76)
  • MA(20) con MA(80)

Si la media rápida está por encima de la lenta sumamos 5 puntos. Y como son 20 parejas al final tenemos un indicador que va de 0 a 100 y que nos permite comprar cuando supere un cierto nivel. Debajo vemos el indicador:


Si compramos cuando el indicador supere el nivel 80 y nos salimos con un cruce de medias (que tendrá que estar alcista en el momento de la compra) pues ya tenemos un sistema de trading. En realidad uno que tiene una curva de capital tan estupenda como la siguiente:



Pues ese es el sistema CONVERGENCE. Este sistema salió publicado en el informe de Onda4 del pasado 23 de junio que aún está disponible en la zona de clientes de Onda4.

CÓDIGO DEL SISTEMA CONVERGENCE

//*******************************
// SISTEMA CONVERGENCE 2020
// OSCAR G. CAGIGAS
// 18 JUNIO 2020
//*******************************

//Variables optimizables
objVolat = 800; //objetivo de volatilidad
nstop = 6;//Optimize("stop",6,4,6,1); //stop loss en desv estándar
med = Optimize("med1",13,1,20,1); //periodo de la media
th = Optimize("th",80,50,90,10);  //threshold


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

//DESVIACION STANDARD EXPONENCIAL      
desv_carver = sqrt( EMA( ( C-Ref(C,-1) )^2, 36 ) );   
   
//CAPITAL INICIAL Y COMISIONES//  
SetOption("maxopenpositions",6);  //máximo 6 posiciones simultáneas      
SetOption("WarningLevel", 1 ); SetOption( "initialequity", 100000 );     
SetOption("CommissionMode", 2); SetOption("commissionamount",50);     //margen de seguridad o no va a funcionar ($100/trade)  
MarginDeposit = 1; PositionSize = Ctos = Ref( round( Nz(ObjVolat/(desv_carver*PointValue) ) ),-1);   
//-----------------------------------------------------------------------     

//************ indicador CONVERGENCE *********************
//ponemos el indicador a cero
ind = 0;

//bucle por los 20 periodos
for( i = 1; i < 21; i++ )
{  
  ind =  iif( MA(C,i) > MA(C,i*4), ind + 5, ind );
  //_TRACE("i = " + i + " ; ind = " + ind);  //comprobación debugview
}
//********************************************************


//SISTEMA DE TRADING
Buy = ind > th AND MA(C,med) > MA(C,med*4);
Sell = Cross(MA(C,med*4),MA(C,med));

Short = ind < 100-th AND MA(C,med) < MA(C,med*4);
Cover = Cross(MA(C,med),MA(C,med*4));

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

//REMOVE EXTRA BUY and SHORT SIGNALS//    
Buy=ExRem(Buy,Sell);     
Short=ExRem(Short,Cover);      
Sell=ExRem(Sell,Buy);      
Cover=ExRem(Cover,Short);     

//PARTE GRÁFICA
color = colorLightBlue;
SetChartOptions(0,chartShowArrows|chartShowDates);
_N(Title = StrFormat("{{NAME}} - {{INTERVAL}} {{DATE}} Open %g, Hi %g, Lo %g, Close %g (%.1f%%) {{VALUES}}", O, H, L, C, SelectedValue( ROC( C, 1 ) ) ));
Plot( C, "Close", color, styleBar | styleThick,Null,Null,0,0,2); 
Plot(MA(C,med),"MA(" + med + ")",colorRed,styleThick);
Plot(MA(C,med*4),"MA(" + med*4 + ")",colorBlue,styleThick);

//SALIDA GRAFICA//     
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 ,shapeUpArrow,shapeNone),colorDarkGreen,0,L,-15);     
PlotShapes(IIf(Cover ,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 );      
}      



4 comentarios:

  1. Buenos dias Oscar, Gracias por este sistema. Tengo un par de dudas que te agradeceria me echaras una mano:
    1) que tipo de datos usas para tus sistemas. Datos Sin ajustar por dividendos o datos sin Ajustar por dividendos . En ambos casos ajustados por Splits y reverse splits.
    2) cuando sabemos que in sistema deja de funcionar??
    3) REspecto al sistema Convergence, se aplica sobre datos diarioso semanales y en que universo???
    Muchas gracias

    ResponderEliminar
    Respuestas
    1. Hola. El sistema se ha probado en futuros, concretamente en el futuro continuo ajustado, así que no hay splits o dividendos. El sistema está probado en intervalo diario. Responder a cuándo un sistema ha dejado de funcionar me ocuparía mucho más espacio del que hay disponible aquí. Es un tema que he tratado ampliamente en los informes de Onda4. Tiene que ver con si el sistema sigue cumpliendo sus parámetros estadísticos con un cierto grado de confianza. Saludos,

      Eliminar
  2. Muchas gracias por el sistema. Me surge la duda de cuáles son los precios de las operaciones, ¿a la apertura de la barra siguiente o son limitados?

    ResponderEliminar
  3. Está implementado al cierre. Saludos,

    ResponderEliminar

ENTRADAS POPULARES