lunes, 24 de septiembre de 2018

Los multiplicadores de los futuros

Cómo decirle a Amibroker que si el ticker que está revisando actualmente es el Oro debe multiplicar por 100 pero si es el mini SP500 debería hacerlo por 50?

El siguiente código extrae los primeros 3 caracteres del nombre del ticker  empezando por la izquierda, y así le asigna el PointValue correspondiente. Lo mejor es tenerlo en un #include y llamarlo al principio de cada código que hagamos.

Es formato IQFeed así que si p.e. se trata del futuro continuo del mini SP500 entonces el ticker es @ES#C y los tres primeros caracteres son @ES. Igualmente si se tratara del vencimiento de diciembre de 2018 el ticker sería @ESZ18 pero los tres primeros caracteres serán @ES.

Este código funciona tanto para el futuro continuo como para los diferentes vencimientos. Es formato IQFeed pero no cuesta mucho adaptarlo a otros formatos para aquel que utilice eSignal o cualquier otro proveedor de datos.

En IQFeed existen tres mercados que en lugar de tener tres caracteres iniciales tienen solo dos: El trigo (@W), la Soja (@S) y el maíz (@C). Afortunadamente da la casualidad de que los tres tienen el mismo multiplicador, 50, así que lo he incluido en la última parte, valor por defecto. Si no fuera así el código sería algo más complicado.





//---------------------------------------//
// CODIGO DE MULTIPLICADORES DE FUTUROS
// OSCAR G. CAGIGAS
// 19 AGOSTO 2018
//---------------------------------------//

//ESCOGEMOS EL MULTIPLICADOR PARA CADA MERCADO//
switch( StrLeft( Name(), 3) )
{
 //----------IQFEED SYMBOLS------------------------------------------//
 case "@ES": mul=50; tick = 0.25; dec = 2; break; //MINI SP500 
 case "@NQ": mul=20; tick = 0.25; dec = 2; break; //MINI NASDAQ 
 case "@YM":  mul=5; tick = 1; dec = 0; break;  //DOW JONES MINI ($5)
 case "@NK": mul=5;  tick = 5; dec = 0; break; //NIKKEI DOLLAR
 //----------
 case "@AD": mul=100000; tick = 0.0001; dec = 4; break; //AUSTRALIAN DOLLAR
 case "@SF": mul=125000;  tick = 0.0001; dec = 4; break; //SWISS FRANC 
 case "@EU": mul=125000; tick = 0.00005; dec = 5; break; //EURODOLLARS
 case "@CD": mul=100000; tick = 0.0001; dec = 4; break; //CANADIAN DOLLAR
 case "@NE": mul=100000; tick = 0.0001; dec = 4; break; //NEW ZEALAND DOLLAR
 case "@BP": mul=62500; tick = 0.0001; dec = 4; break; //BRITISH POUND 
 case "@JY": mul=12500000; tick = 0.000001;dec = 7; break; //YEN
 case "@PX": mul=500000; tick = 0.00001; dec = 5; break; //MEXICAN PESO
 //----------
 case "QGC":  mul=100; tick = 0.1; dec = 2; break; //GOLD
 case "QSI":  mul=5000;  tick = 0.005; dec = 3; break; //SILVER 
 case "QHG":  mul=25000;  tick = 0.0005; dec = 4; break; //COPPER
 case "QPA": mul=100; tick = 0.05; dec = 2; break; //PALADIUM (PA,NYMEX)
 case "QPL":  mul=50; tick = 0.1; dec = 2; break; //PLATINUM
 //----------
 case "QHO":  mul=42000;  tick = 0.0001; dec = 4; break; //HEATING OIL
 case "QRB":  mul=42000;  tick = 0.0001; dec = 4; break; //GASOLINE
 case "QCL":  mul=1000;    tick = 0.01; dec = 2; break; //CRUDE OIL
 case "QNG":  mul=10000;  tick = 0.001; dec = 3; break; //NATURAL GAS
 //----------
 case "@HE":  mul=400;    tick = 0.025; dec = 3; break; //LEAN HOGS 
 case "@LE":  mul=400;    tick = 0.025; dec = 3; break; //LIVE CATTLE 
 case "@GF":  mul=500;    tick = 0.025; dec = 3; break; //FEEDER CATTLE
//-----------
 case "@US": mul=1000; tick = 1/32; dec = 3; break; //T-BOND 
 case "@TY": mul=1000; tick = 1/64; dec = 3; break; //TREASURY NOTES 10 YEAR 
 //-----------
 case "@SB":  mul=1120;  tick = 0.01; dec = 4; break; //SUGAR 
 case "@KC":  mul=375; tick = 0.05; dec = 4; break; //COFFE (KC,NYBOT)
 case "@CT": mul=500; tick = 0.01; dec = 4; break; //COTTON 
 case "@CC": mul=10; tick = 1.00; dec = 0; break; //COCOA (NYBOT)
 //-----------
 case "@SM": mul=100; tick = 0.10; dec = 2; break; //SOYBEAN MEAL 
 case "@BO": mul=600; tick = 0.01; dec = 2; break; //SOYBEAN OIL
 case "@KW":  mul=50;    tick = 0.25; dec = 2; break; //KC WHEAT  (ZW, ECBOT)
 //-----------
 default: mul = 50; tick = 0.25; dec = 2; break;  //EL RESTO (@W,@S,@C) CON SOLO 2 CARACTERES


//ASIGNAMOS A LOS NOMBRES RESERVADOS
PointValue = mul; TickSize = tick;

4 comentarios:

  1. Buenas Óscar.
    Cuando pones por ejemplo Case "@ES"..............
    No coincide con el símbolo @ES#C de Iqfeed.
    Precisamente coincide con el nombre del ticker en Tradestation.
    Podría haber algún error en lo que has escrito? No debe coincider el metadato?

    ResponderEliminar
    Respuestas
    1. La primera instrucción “switch( StrLeft( Name(), 3) )” dice que Amibroker leerá los primeros tres caracteres, así que @ES sirve para el SP500 continuo (símbolo @ES#C) así como para los distintos vencimientos. Funciona bien, hace años que lo uso con IQFeed.

      Eliminar
  2. Hola Oscar! Para Norgate no hace falta, no? Esa base de datos en teoria viene con los datos de cada futuro incorporado. Es así? Gracias!

    ResponderEliminar
  3. Sí, Norgate ya trae los multiplicadores y no haría falta añadir este código.

    ResponderEliminar

ENTRADAS POPULARES