1. Introducción

Scala es un asesor experto para MT4, creado inicialmente para la ejecución de forma automática de diversas estrategias cuantitativas definidas en el “Curso gratis Interactivo de Estrategias Cuantitativas” impartido por Fernando Martinez Gómez Tejedor.

En este manual no se pretende dar explicación detallada a ninguna técnica, para eso está el curso anteriormente mencionado, sino como poder configurar scala para ejecutarla.

La funcionalidad de Scala tampoco cubre todas las técnicas cuantitativas, si bien está en constante evolución ampliando la funcionalidad constantemente.

Scala no solo tiene la capacidad de ejecutar técnicas aisladas, sino que tiene la capacidad de combinar multiples técnicas y encadenar unas u otras en función de reglas y resultados previos.

Descargar Scala v8.11

Descargar Scala Analyzer v8.10

 

Licencia gratuita durante 1 mes para cuentas creadas a partir de este enlace: Roboforex

2. Ordenes, series y sistemas

 

Es importante saber que son ordenes, series y sistemas, ya que es la base de para poder configurar scala:

  • Órden: una orden es la unidad básica de operación en scala, prácticamente se corresponde con lo que es una órden en mt4. Scala tiene implementado un gestor de órdenes, y según la configuración o evolución de las órdenes creadas, puede traducir una orden de scala en una orden de mt4, pero también puede agrupar varias ordenes de scala en una sola orden de MT4 compactandolas, o hacer al revés, una orden de scala en varias de MT4 (ejemplo claro si tienes una orden de 60 lotes cuando MT4 te permita 50, scala maneja una sola orden y el gestor lo traduce en las necesarias para completar los lotes necesarios).
  • Serie: una serie es un conjunto de órdenes. En función del tipo de serie se crearan unas ordenes u otras. Salvo cierto tipo de series, una serie termina cuando se cierran todas sus órdenes. Las excepciones son series que crean constantemente órdenes.
  • Sistema: Un sistema es una concatenación de series. Un sistema no solo se encarga de ejecutar series una detrás de otra, sino que se la puede dotar de cierta lógica para ejecutar una serie u otra, a la vez que modificar el lotaje en función de la pérdida acumulada y resultado de la serie previa. Scala sabe cuando ha entrado en ganancias y debe reestablecer el lotaje. En scala se pueden crear múltiples sistemas que funcionarían de forma independiente unos de otros, cada sistema sabe gestionar sus ganancias y sus perdidas, analizar las reglas definidas en el y ejecutar una serie u otra sin que le afecte el resultado de otros sistemas, y todos corren concurrentemente.

Por encima de órdenes, series y sistemas, scala tiene un control sobre todo lo abierto para, según se tenga configurado, aplicar Stop Loss, Take Profit o Trailing Stop globales

La configuración de scala para definir las distintas series y reglas de cada sistema es bastante complejo, con una sintaxis bastante concreta, y de ahí la necesidad de la creación de dicho manual.

 

 

3. Generación de sistemas

 

Cuando se arranca scala, lo que se hace es revisar que sistemas hay definidos, y que tipo de sistema hay configurado. Hay 4 tipos de generación de sistemas:

  • UNIDAD_PRECIO: En este caso, los sistemas configurados se ejecutan solo una vez (si bien, como ya se verá, no tienen por que terminar nunca, y aun estando vivos, no tienen porque estar ejecutando series si no se dan las condiciones configuradas). En este caso, hay otro campo donde se indican los pips que tiene una UNIDAD_PRECIO, que a la postre es lo que se configura luego en las series. Para que se entienda un poco mejor, podría tener definidas 2 sistemas uno con una serie 10,20,30 de compra, y otro con una serie 10,20,30 de venta, que cuando termine cada serie la vuelva a ejecutar.
  • FIBO: Hay una lógica para identificar Fibos, pudiendo por configuración indicar la mínima distancia en pips que tiene que tener un Fibo y el % de retroceso para considerar que hemos alcanzado un PHI0 o PHI6. Si bien quizás no sea la mejor forma de identificar un fibo, es la que hay implementada al menos hasta la versión 8.00. En este caso, cada vez que se identifique un PIBO nuevo, se lanzan todos los sistemas que haya definidos. Dado que según vaya cambiando el precio se van a ir identificando Fibos nuevos, hay que tener en cuenta que si se hacen sistemas que no finalicen, estos se van a ir multiplicando por cada Fibo, no pareciendo una configuración muy correcta. Se podría  por ejemplo definir un sistema que ejecute una serie 10,20,30 de compras y finalice una vez finalice la propia serie, y otro sistema con una serie de 10,20,30 de ventas que igualmente finalice. Por cada nuevo Fibo se lanzara de nuevo un sistema de cada.
  • NIVELES DINAMICOS: Si bien no hay nada en el Curso de Programación Cuantitativa al respecto, esto es una variante que trabaja con Gráficos Renko. Al igual que en los Fibo, cuando se identifica una vela Renko nueva se lanzan todos los sistemas.
  • MANUAL: En realidad, el scala manual pretende poder crear series únicamente con unas facilidades gráficas para indicar el tipo de serie y en que punto se crearán las órdenes, y tendrá un manual específico.

 

4. Configuraciones Comunes

 

Desde los parámetros de configuración, se pueden indicar ciertas configuraciones comunes a todas las órdenes, a todas las series, o a todos los sistemas. Principalmente son los siguientes:

  • Cálculo de Lotes:
    • Agrupar Ordenes: Cuando se crean distintas ordenes en el mismo precio, se puede indicar a Scala que las agrupe y mande solo una al bróker. Si bien es cierto, se pueden definir series que regeneren dichas ordenes posteriormente y, aunque sea en el mismo precio, en MT4 no hay hedging y estas siguientes serian ordenes independientes. Como se decía en apartados previso, Scala sabe gestionar las ordenes internas y las que envía al bróker.
    • Tipo Lotes Iniciales: Si bien en cada serie se indica que lotaje tiene cada orden, si este campo es FIJOS, iniciará la primera serie con el lotaje indicado, pero si es LOTES_RIESGO, en base a los parámetros “Cálculo Base” y “Cántidad Cálculo Base” ajustara dicho lote. Por poner un ejemplo, si el Cálculo Base es Balance, y la Cantidad Cálculo Base son 1000 euros, si tienes 10000 euros en la cuenta multiplicará esos lotes definidos en las series por 10. De esta forma, según aumente el balance de la cuenta aumentará el lote de las órdenes. También relacionado con esto está el “Capital Fuera Reinversión”. En el ejemplo anterior, si tienes 5000 euros fuera de la reinversión, descontaría esto de los 10000 euros que tienes, y multiplicaría el lote por 5 en este caso. En caso dar valor al parámetro "Capital Fuera Reinversion Porcentaje Calculo Base (1=100%, 0=0%)", se calcula el porcentaje sobre el cálculo base, es decir, balance, equidad, menor o mayor de ellos según se haya configurado, y se descuenta el mayor entre ambos parámetros de capital fuera de reinversión.
    • Ganancias para reiniciar lotaje: El lote va aumentando y disminuyendo según parámetros que se explicaran más adelante. Este parámetro vale para volver al lotaje inicial una vez alcanzadas ciertas ganancias.
    • Pérdidas para reiniciar lotaje: Igual que el anterior, pero en este caso por haber alcanzado ciertas pérdidas. Esto evita que perdidas consecutivas eleven tanto el lotaje que quemen la cuenta.
  • Max/Min Lotaje: Configuraciones para limitar el lotaje, tanto máximo como mínimo
  • Aumento Lotaje Órdenes: Entre serie y serie de un mismo sistema, se tiene en cuenta el resultado positivo, negativo o neutro de cada orden para multiplicar por un factor en función del resultado. Por ejemplo, si se tiene que incremente el lote en 1.5 cada orden que haya perdido, así lo hará en la siguiente serie
  • Aumento Lotaje Series: En este caso se contabiliza el resultado de la serie completa para multiplicar por un factor u otro todas las ordenes de la siguiente serie. Esto es complementario con el Aumento de Lotaje de Órdenes, es decir, si se define en la de órdenes que multiplique en 1.5, y en las series que multiplique por 2, las ordenes que a su vez hayan perdido de la serie anterior las multiplicará por 3.

A tener en cuenta con los lotajes e incrementos  que scala no tiene límites de decimales de las ordenes, de modo que incrementar en 1.1 un lote de 0.01 (es decir, 0.01 x 1.1 = 0.011), una vez que el lote gestionado por scala supere 0.015, al bróker ya le mandará 0.02.

  • Descartar Histórico: En caso de cerrar Scala, al volverlo a arrancar puede continuar con las órdenes que había creado previamente en caso de que valga false (no descartar histórico). A tener en cuenta que esas órdenes pueden haberse cerrado ya, que el precio sea muy dispar a cuando se cerró scala, o incluso que la configuración de series no fuera la misma. Esto está pensado para cierre accidental del gráfico donde está desplegado scala, un cierre de MT4, etc. En cualquier otro caso, lo aconsejado es tener el valor a true para descartar el histórico.
  • TP y SLs virtuales: Scala tiene la opción de no poner el TP o SL en las órdenes para que el bróker no lo vea, pero cuando llegue el precio scala cierre la orden. Ahora bien, si los TP y SLs son virtuales, para que se ejecuten tiene que estar corriendo scala.
  • Tiempo de cierre automatico de orden (segundos): Es el tiempo de vida que tendrá una orden. Al llegar a ese tiempo, scala la cerrará como esté, ya sea en pérdidas o en ganancias
  • Trailing Stop: Hay 4 tipos de trailing stop, uno de órdenes, otro de series, otro de sistemas, y otro global. En el de órdenes se puede hacer o bien por pips o bien por ganancias de la órden.  Como se verá más adelante, hay series que son infinitas, creando a su vez cada vez más series SE. En este tipo de series, si se quiere hacer un trailing stop al conjunto de ellas, hay que configurar el trailing stop de sistema. El Trailing stop se define en cada caso con 3 parámetros:
    • Disparo: Precio a alcanzar para activar el Trailing Stop
    • Distancia: Una vez activado el Trailing Stop, a la distancia en ganancias a la que se eliminará la orden/serie/sistema/todos los sistemas
    • Salto: Incremento de ganancias para volver a mover el Stop Loss a la distancia indicada en el parámetro anterior

Como ejemplo, podemos configurar un disparo a los 100 euros de ganancia, 80 de distancia, y 10 de salto. Una vez que se alcancen los 100 euros de ganancia, el Stop Loss se pondrá a 80 euros sobre dicha ganancia, es decir, te aseguras 20 euros (100-80). Cuando el precio se mueva 10 euros (el salto definido), es decir, alcanzamos una ganancia de 110 euros, el stop loss se muevo a 80 euros de dicha ganancia, asegurando 30 euros (110-80).

Aplicación del trailing stop:

    • Ordenes: Se aplica el Trailing Stop de forma individual a cada orden abierta en ese momento por Scala.
    • Series: Se aplica el Trailing Stop a la ganancia de todas las ordenes abiertas por cada serie. Se podrán tener ordenes en ganancia o en pérdida, lo que scala considera es la suma de las ganancias de todas ellas
    • Sistema: Se aplica el Trailing Stop a la ganancia de todas las series creadas en dicho sistema. Un Sistema no puede tener varias series abiertas concurrentemente, con lo que tiene en cuenta las ganancias de la serie actual junto a la de series ya terminadas
    • Global: En scala no hay límite en la configuración de número de sistemas. Los sistemas si se ejecutan concurrentemente, y el trailing stop aplicaría a todos los sistemas abiertos de forma global.
  • SL, TP Global: Si se alcanzan unas ganancias (TP) o pérdidas (SL) a nivel global, se cierran todas los sistemas. Si a su vez el parámetro “Parar Scala al alcanzar SL, TP o TS global” es true, scala no lanzará nuevos sistemas.
  • Inicio de Vela: En scala se pueden usar indicadores. Si bien en cada indicador se debe indicar sobre que vela aplicarlo, se puede definir una estrategia a vela cerrada y evaluar los indicadores solo a vela cerrada. El timeframe también es configurable en  el parámetro “TimeFrame considerado para el inicio de vela”.
  • Resultados Pantalla: Scala saca una ventana con diversa información y pinta líneas en función de cada tipo de serie. Se puede indicar si mostrarlos o no.
  • Magic Number: Si se quieren tener varios scala activos sobre el mismo símbolo, el tener un magic number distinto haría que cada uno guarde su propio histórico de resultados y órdenes en caso de que haya que reiniciar scala (parámetro “Descartar resultados Historicos”). También puede ser útil para sistemas externos como myfxbook, y saber que orden corresponde a que instancia de scala.

5. Configuraciones ESPECÍFICAS DE SERIES

 

En todas las series existentes en scala, las cuales se detallarán en posteriores apartados, se puede indicar de forma específica como aumentará el lotaje de la serie o de las órdenes de la serie en función del resultado de la serie anterior. Los parámetros en este sentido son los siguientes:

  • ASP: Aumento Serie con Pérdidas, multiplicará el lotaje por el valor de este parámetro si la serie anterior terminó en pérdidas.
  • ASG: Aumento Serie con Ganancias, multiplicará el lotaje por el valor de este parámetro si la serie anterior terminó con ganancias
  • ASN: Aumento Serie Neutra, multiplicará el lotaje por el valor de este parámetro si la serie termino neutra, con ganancias 0.
  • AOP: Aumento Orden con Pérdidas, multiplicará la orden que ocupe el mismo orden en la siguiente serie que terminó con pérdidas.
  • AOG: Aumento Orden con Ganancias, multiplicará la orden que ocupe el mismo orden en la siguiente serie que terminó con ganancias.
  • AON: Aumento Orden Neutra, multiplicará la orden que ocupe el mismo orden en la siguiente serie que terminó con ganancias 0.

Al igual que la configuración general, si hay tanto aumento de órdenes como aumento de series, aplicará ambas.

En caso de no existir estos parámetros en la serie usará los comunes en scala para este cometido.

La forma de aplicar esta configuración en las series se entenderá mejor una vez se vea la sintaxis de cada una, pero añadir a la configuración particular de cada serie el parámetro que se quiera usar. Por ejemplo, si en una serie se quiere aumentar el lotaje en 1.5 si la serie anterior terminó con pérdidas, seria añadir ASP=1.5

 

 

6. Sistemas y Reglas

 

Un sistema es un conjunto de series, y una serie es un conjunto de órdenes. En realidad, esto es cierto en las primeras versiones, con la evolución de scala existen series que no tienen órdenes pero realizan ciertas acciones, como se irá detallando en los siguientes apartados.

Scala también ha evolucionado a poner definir una lógica para ejecutar una serie u otra. Si bien en las primeras versiones se iban ejecutando una serie después de terminar la anterior, ahora son las reglas las que indican que serie es la que se ejecuta en cada momento.

En la configuración de scala, hay una serie de parámetros Sistema 1, Reglas 1, Sistema 2, Reglas 2, etc, que permiten configurar 20 sistemas. Si bien pudieran parecer suficientes, no hay limitación, salvo la de rendimiento al ejecutar demasiados sistemas, ya que en el parámetro “Fichero de Sistemas. De existir, solo usa esos sistemas”, donde se definen los sistemas y reglas en un fichero externo.

También existe la limitación por la plataforma MT4, en la que el número de caracteres de un parámetro es limitado, y esta limitación queda solucionada también si los sistemas y reglas se cargan por fichero. En dicho fichero vendrán en líneas alternas el sistema y las reglas.

La sintaxis a la hora de definir Sistemas y Reglas es muy estricta, si algo está mal definido scala no interpretará correctamente lo que debe ejecutar y no ejecutará nada. Si bien hay algunas validación de sintaxis, esta es muy básica y es el usuario de scala el que debe tener cuidado al definirla correctamente.

6.1 Configuracion de sistemas

La sintaxis de la configuración de un sistema es la siguiente:

[{serie1}&{serie2}&{serie3}&…&{serieN}]

El sistema debe empezar y terminar por corchetes […], se pueden definir tantas series como se quiera las cuales deben ir entre llaves {…} y cada serie debe ir separada por el símbolo &.

6.2.Configuracion de Reglas

Las reglas se configuran indicando en el T sub x que debe ejecutar, siendo esto una serie o una regla, y deben definirse de forma consecutiva, si hay 10 reglas la primera debe ser T1 y la última T10.

En las reglas, cada serie esta representada por una ese mayúscula “S” y el orden en el que está definida dentro del sistema.

Por ejemplo, T1=S1 sería una regla que ejecuta la serie 1. Si en este mismo ejemplo no hay más reglas, una vez termine S1 se acabó el sistema, para volver a ejecutarlo habría que volver a desplegar scala.

Es muy importante tener en cuenta que los parametro SL y TP tienen distintas interpretaciones:

  • Si el tipo de sistema es Fibo, indican el nivel PHI del fibo en el que se esté lanzando el sistema
  • Si es de unidad_precio y es un valor numérico, indica el número de Us
  • Si es de unidad_precio pero contiene indicadores, indicará el precio de mercado. Por ejemplo SL=IMA(60,1,9,0,1,0)

  El parámetro TP, a parte de admitir valores numéricos, tambien admite funciones de las reglas, tal como LOTS=ILOTSBUY

6.3.Cargar Sistemas de Fichero Externo

Si el sistema o serie a definir sobrepasa los limites de MT4 en cuanto a longitud de línea, o si se desean crear más de 20 sistemas, la alternativa es cargándolo en un fichero externo. El fichero externo deberá tener en lineas alternas la definicion del sistema y las reglas oportunas, con el prefijo sistema= o reglas= en función de si se define un sistema o sus reglas. Por ejemplo, el contenido del fichero puede ser:

sistema=[{ORD=3;TYPE=BUY;LOTS=0.01,0.01,0.01;TP=30,30,30;SL=10,20,30}]
reglas=T1=S1;T2=GOTO(1)
sistema=[{ORD=3;TYPE=SELL;LOTS=0.01,0.01,0.01;TP=30,30,30;SL=10,20,30}]
reglas=T1=S1;T2=GOTO(1)

El fichero se ha de colocar en el directorio files. Si bien la ventana de operación de MT4 y la simulación lo coge de directorios distintos, habrá que tener en cuenta que en caso de opearar en demo/real, el directorio donde hay que ponerlo es en  ...\MQL4\files, y pare realzar pruebas de estrategia en ...\tester\files.

A dicho fichero se le da un nombre, y ese nombre es el que se indica en el parámetro "Fichero de Sistemas. De existir, solo usa esos sistemas".

7. Tipos de Series

 

Las series en scala tratan de abarcar distintas estrategias cuantitativas. En este manual se explicará cómo configurar cada serie sin entrar en detalle estadístico sobre cada una.

7.1 Serie SE

La serie SE es la más esencial de todas, crea una serie de órdenes en el mismo precio, cada del tipo (BUY/SELL) lote, TP y SL indicados.

Esta tipo de serie sirve para configurar una 10,20,30, aunque no tiene restricciones, al igual que el resto de series, en número de órdenes y resto de parámetros de la serie.

Ejemplo de definición de un sistema con esta serie:

Sistema1 à [{ORD=3;TYPE=BUY;LOTS=0.01;TP=30;SL=10,20,30}]

En este ejemplo, se crean 3 ordenes BUY, de 0.01 lotes, todas con TP=30 y SL 10 la primera, 20 la segunda y 30 la tercera.

Cada orden tendrá definido su lote, su TP y su SL, pero si varias órdenes van a tener el mismo valor, cogerá el último que haya configurado en cada apartado. Para ayudar a comprender esto, la misma serie podría definirse (se resalta la diferencia):

Sistema1 à [{ORD=3;TYPE=BUY;LOTS=0.01,0.01,0.01;TP=30,30,30;SL=10,20,30}]

Hay que prestar atención a que los valores indicados en TP y SL se multiplican por los pips definidos en el paremetro “U” (Unidad Precio). En el ejemplo, si U valiera 1, el TP de todas sería 30 pips, es decir 300 puntos (en caso de brokers con 3 y 5 decimales)

El TYPE, en esta y resto de reglas, admite los valores BUY y B para largos y SELL y S para cortos

Para que scala ejecute la serie, hay que definir también las reglas, en este caso:

Sistema1 à [{ORD=3;TYPE=BUY;LOTS=0.01;TP=30;SL=10,20,30}]

Reglas1 à T1=S1

Se pueden combinar también BUYS y SELLS, y las combinaciones que se quieran con los parámetros de la serie. Por ejemplo, una BUY de 0.01 lote, una SELL de 0.02 y otra BUY de 0.03:

Sistema1 à [{ORD=3;TYPE=BUY,SELL,BUY;LOTS=0.01,0.02,0.03;TP=30;SL=10,20,30}]

 

En la imagen se vería en azul el precio de entrada, en morado los TPs en el mismo sitio y en color claro los SL

 

7.2 Serie DEMO

Una serie DEMO es una serie que no lanza órdenes a mercado. Aunque no lance órdenes a mercado, scala dibuja las líneas de apertura, TP y SL de las órdenes ficticias y las cierra cuando el precio los alcanza.

Esta serie finaliza cuando se den un número de series consecutivas en pérdidas, dicho número indicado en el parámetro DEMO.

La sintaxis de esta serie es la siguiente:

Sistema1 à  [{ORD=3;TYPE=BUY;LOTS=1;TP=3;SL=1,2,3;DEMO=2}]

Si se combina con una serie SE de Ventas detrás de una DEMO de Compras:

Sistema1 à  [{ORD=3;TYPE=BUY;LOTS=1;TP=3;SL=1,2,3;DEMO=2}&{ORD=3;TYPE=SELL;LOTS=0.01;TP=30;SL=10,20,30}]

Reglas 1 à T1=S1;T2=S2

 

7.3 Serie DEMOC

Una serie DEMOC es una serie DEMO Completa, deben perder todas sus ordenes. Se diferencia con la serie DEMO que esta debía tener un resultado negativo, pero alguna de sus órdenes ficticias podían haber acabado en ganancias.

La sintaxis de esta serie es la siguiente:

Sistema1 à  [{ORD=3;TYPE=BUY;LOTS=1;TP=3;SL=1,2,3;DEMOC=2}]

7.4 Serie DEMOINV

Una serie DEMOINV es una serie DEMO INVERSA, es decir, termina cuando haya el número de series indicadas consecutivas en ganancias.

La sintaxis de esta serie es la siguiente:

Sistema1 à  [{ORD=3;TYPE=BUY;LOTS=1;TP=3;SL=1,2,3;DEMOINV=2}]

7.5 Serie DEMOINVC

Una serie DEMOINC es una serie DEMO INVERSA COMPLETA, es decir, termina cuando haya el número de series indicadas consecutivas en ganancias en las que ganan todas sus órdenes.

La sintaxis de esta serie es la siguiente:

Sistema1 à  [{ORD=3;TYPE=BUY;LOTS=1;TP=3;SL=1,2,3;DEMOINVC=2}]

7.6 Serie TI

Una serie TI es una serie de tiempo, deben pasar X pips para activarse la serie. Al igual que el SL y el TP, esa cantidad de pips también va definido en Us

La sintaxis es la siguiente:

Sistema1 à [{ORD=3;TYPE=BUY;LOTS=1;TP=3;SL=1,2,3;TI=1}]

En este ejemplo, el precio debe retroceder 1U para crear la serie. TI puede ser tanto positivo como negativo, si es positivo el precio debe retroceder teniendo en cuenta el tipo de la primera orden de la serie. Es decir, si la primera orden es BUY, retroceder significa que el precio debe bajar antes de crear la serie, y si fuera SELL, retroceder significa que el precio debe subir.

En esta serie aplican a su vez 2 parámetros mas:

  • TO: Trailing Open: En caso de estar definida, el precio de entrada va siguiendo al precio. Si el precio en vez de retroceder, avanza lo indicado en TO (medido en Us), ajusta el TI en función de hasta donde llegue el precio. De esta forma, una vez que retroceda el precio, pero ya no desde donde se lanzó la serie, sino desde donde alcanzó el precio, comienza a generar las órdenes.
  • PD: Precio de Descarte: Si el precio en vez de retroceder avanza, si el PD (medido en Us) está definido, al alcanzarlo, anula la serie. El precio de descarter siempre debe ser positivo, ya que se descarta una serie solo si el precio va en sentido contrario a donde se debe crear la orden.

 

Ejemplo de TI con TO y PD:

Sistema1 à [{ORD=3;TYPE=BUY;LOTS=1;TP=3;SL=1,2,3;TI=1;TO=1;PD=3}]

En este ejemplo, si el precio retrocede de inicio 1U crea las ordenes. Por el contrario si avanza, una vez que avance 1U provoca que si a partir de ese precio vuelve a retroceder otra U crea las órdenes. Si el precio sigue subiendo, siempre algo menos que 3U, en cuanto retroceda 1U crea las ordenes. Si el precio avanza 3 Us sin haber creado ninguna orden, anula la serie.

7.7 Serie OTI

Una serie OTI es una serie de tiempo entre órdenes, se define la distancia en Us a la que se ejecuta cada orden.

Los valores que se indican en el parámetro OTI van referenciados siempre al precio de comienzo de la serie, por ejemplo si quiero que la primera orden se ejecute al crear la serie, la segunda a 1U de la primera, y la segunda a 1U de la segunda, hay que pensarlo siempre referenciado al punto inicial, es decir, la primera a 0Us, la segunda a 1Us y la tercera a 2Us.

La sintaxis seria la siguiente:

Sistema1 à [{ORD=3;TYPE=BUY;LOTS=1;TP=3;SL=1,2,3;OTI=1,2,3;TO=1;PD=3}]

Como se aprecia, la serie OTI también admite los parámetros TO y PD, aunque aquí el PD, si hay órdenes creadas pero falta alguna, en vez de cancelar la serie, dejará que terminen las órdenes abiertas pero no abrirá nuevas.

Las órdenes se crearán en orden, es decir, hasta que no se crea la primera no se podrá crear la segunda. En el siguiente ejemplo se define un OTI que crea un BUY si retrocede 3Us, crea un SELL si vuelve al precio de entrada y vuelve a crear otro BUY si de nuevo retrocede 3Us:

Sistema1 à [{ORD=3;TYPE=BUY,SELL,BUY;LOTS=1,3,9;TP=3;SL=1;OTI=3,0,3;TO=1;PD=1}]

 

Esto sería un ejemplo de OTI, donde se ven en azul donde se abriría cada orden, en morado donde tendrían los TPs y en color claro los SL

7.8 Serie OTIC

Una serie OTIC es una OTI Condicionada. Se crea la siguiente orden si la primera fue ganadora, o lo va siendo si aún sigue abierta.

La sintaxis es similar a la OTI:

Sistema1 à [{ORD=3;TYPE=BUY;LOTS=1;TP=3;SL=1;OTIC=1,0,-1;TO=1;PD=3}]

En este ejemplo creará un BUY si el precio retrocede 1U. Si el precio sigue retrocediendo y la orden sale por SL, aunque vuelva a subir el precio al que había al comenzar la serie, ya no creará la segunda y sucesivas órdenes por haber cerrado en pérdidas la primera.

Si todo va bien, retrocedería 1U, y el precio avanzaría creando dos nuevas compras mas arriba.

7.9 Serie OTIR

Una serie OTIR es una serie OTI Random, se crean todas las órdenes pendientes al comienzo de la ejecución de la serie y así no llevar un orden a la hora de ejecutar las órdenes.

En este tipo de serie se usan 2 precios de descarte, uno superior PDU y otro inferior PDD. A tener en cuenta que ambos parámetros están referenciados al precio de comienzo de la serie. Por tanto, el PDU deberá tener un valor positivo y el PDD un valor negativo, de modo que según comience la serie no se haya alcanzado un Predio de Descarte.

Ejemplo de sintaxis:

Sistema1 à [{ORD=4;TYPE=BUY,BUY,SELL,SELL;LOTS=1;TP=3;SL=1;PDU=7;PDD=-6;OTIR=-1,2,-3,4}]

7.10 Serie OTIRR

Una serie OTIR es una serie OTI Random Recursiva, se crean todas las órdenes pendientes al comienzo de la ejecución de la serie y así no llevar un orden a la hora de ejecutar las órdenes y a su vez, si una orden se cierra y el precio vuelve a pasar por el precio de apertura de dicha orden, se vuelve a crear otra orden igual.

Al igual que en la serie anterior, aquí también aplican los parámetros PDU y PDD

El sentido del precio en vez de venir determinado por el tipo de la primera orden, tiene un parámetro específico, SENT, que si vale 1 es hacia arriba y -1 hacia abajo.

Ejemplo de sintaxis:

Sistema1 à [{ORD=4;TYPE=BUY,BUY,SELL,SELL;LOTS=1;TP=3;SL=1;PDU=7;PDD=-6;OTIRR=-1,2,-3,4;SENT=1}]

7.11 Serie BS

Una serie BS es una serie balanceada, la cual crea varias series SE separadas según indique en el parámetro BS.

La sintaxis básica sería algo así:

Sistema1 à [{ORD=3;TYPE=BUY;LOTS=1;TP=3;SL=1,2,3;BS= 1}]

En este ejemplo, crearía una serie SE cada 1U según avance el precio hacia arriba. El número de series a crear lo determina el mayor valor de TP y SL. En el ejemplo el mayor coincide tanto el SL y el TP que es 3, y como crea series cada 1, crearía 3 series (3 entre 1).

El resultado de la serie BS es el resultado de todas las órdenes creadas por todas las series.

 

A la hora de que scala gestione una serie BS, hasta que no termine de ejecutarse por completo con todas las subseries internas, no la dará por terminada. Por tanto la decisión de modificación del lotaje en función de la pérdida o ganancia de la serie será una vez termine por completo, momento también en el cual analizará la siguiente regla.

Una BS admite también los parámetros TI, TO y PD, y el valor de BS puede ser , puede ser – o - en función de si se quiere que las series se creen en sentido progresión del precio (si la primera orden es BUY y BS es , las series las creará hacia arriba, y si la primera orden es SELL y BS es , las series las creará hacia abajo. Si la primera orden es BUY y BS es -, la siguiente serie la creará hacia abajo y si la primera orden es SELL y BS es -, la siguiente serie la creará hacia arriba), o hacia ambos lados.

El que una serie BS tenga el parámetro TI, implica que la primera serie la crea a la distancia indicada en TI. Si a su vez tiene TO, irá persiguiendo el precio, y abrirá cuando retroceda lo indicado en TI, explicado en apartados anteriores.

 

7.12 Serie BSI

Una serie BSI es una serie balanceada infinita, la cual crea varias series SE separadas según indique en el parámetro BSI, y es una serie que no termina nunca. Aún así, tiene en cuenta los ciclos en los que se crea de nuevo un BS para recalcular el lotaje en función de las pérdidas.

Entre BS y BS, aunque recalcule el lotaje de referencia de la siguiente BS, la anterior no tiene por que haber terminado, lo que implica que hace el cálculo en base al resultado de las órdenes cerradas, y la ganancia que tengan en ese momento las abiertas.

Una serie BSI admite los parámetros TI, TO y PD. El valor de BSI también puede ser , puede ser –, o puede ser - al igual que las BS.

Ejemplo de sintaxis:

Sistema1 à [{ORD=3;TYPE=BUY;LOTS=0.1;TP=3;BSI= -1;SL=1,2,3;TI=3;TO=1}]

7.13 Serie BSICL

Una serie BSICL es una BSI con Lotaje Controlado, crea las ordenes igual que el BSI, pero por arriba siempre va con el lotaje mínimo, y por debajo lo calcula en función del mayor lotaje de las ordenes abiertas

Ejemplo de sintaxis:

Sistema1 à [{ORD=3;TYPE=BUY;LOTS=0.01;TP=1;SL=0;BSICL= 1}]

7.14 Serie BSISP

Una serie BSISP es una BSI Scalping Pending, que es como una serie BSI con órdenes pendientes donde se recrean aquellas órdenes que ya se hayan cerrado. En esta serie se indica desde que precio se quiere empezar (PC, precio de comienzo), y que precios abarcará por arriba y por abajo, (PFH, precio fin high, y PFL, precio fin low). También tiene el parámetro NS, que es el número de series abiertas por arriba y por abajo.

Esta serie tiene la opción de cambiar el lotaje de una serie que haya sido regenerada, es decir, que se hayan cerrado sus ordenes y el precio vuelva de nuevo al precio de comienzo, y se pueden cambiar los lotes de las órdenes de esa serie regenerada con los parámetros AOG, AOP y AON;

En el parametro BSISP se indica cada cuantas Us se quiere crear una nueva serie SE, pudiendo hacer series con precio ascendente si se indica como primer caracter el signo menos, descendente si no se indica nada o se indica el signo más, y ambas si se indican ambos -.

Ejemplo de sintaxis:

Sistema1 à [{BSISP= -1;ORD=1;TYPE=BUY;LOTS=0.01;TP=1;SL=0;PC=1.00000;PFH=1,20000;PFL=0.98000;NS=10}]

 

7.15 Serie MBSI

Una serie MBSI es una multi serie balanceada infinita, crea un BSI cada X distancia. Para que se entienda esto la siguiente imagen muestra como se comporta un BSI tras otro, duplicando lotaje en la segunda BSI

 

UN MBSI, crearía un nuevo BSI desde el principio en el momento que el primer BSI crea el segundo ciclo de BS y así sucesivamente. En la siguiente imagen se ve como se formaría el segundo BSI:

 

La sintaxis de un MBSI es la siguiente:

Sistema1 à [{ORD=1;TYPE=BUY;LOTS=1;TP=10;SL=0;MBSI= -1;MBSI_INT= 10 }].

En cada orden de cada BSI se calcula el lote que debe tener teniendo en cuenta el resultado que tendria dicha serie si se cierran las órdenes en el peor de los casos, es decir, cerrando en su SL. De modo que la primera orden tendra como lote el indicado en LOTS, y las siguientes se calcularan según el parámetro genérico "Aumento lotaje tras perdidas" o, en caso de estar definida en la serie, el valor de ASP.

En esta serie se puede usar también el parámetro ADSI (aumento distancia Serie interior), que lo que hace es aumentar la distancia progresivamente en cada serie, para que en tendencias largas ponga las series cada vez más lejos. Lo que hace es aumentar la distancia lo que indique este parámetroen Us. Por ejemplo, si se pone 1, se sumará 1 U de distancia (se corre el riesgo de no cerrar nunca una serie, pero mejor eso que la bancarrota).

El parámetro PD (precio de descarte) también su puede utilizar en las series MBSI para descartar la serie si sobrepasa dicho precio.

También se puede usar el parámetro CS (Cierre Serie)  para cerrar un BSI en cuanto cierre un BS y el computo del BSI termine en ganancias. De esta forma, si volviera el precio donde comenzó dicho BSI volvería a crearse otro con lotaje inicial, pero en otro caso ya se quedaría terminado y no generaría mas BSs.

Ejemplo de sintaxis:

Sistema1 à [{ORD=1;TYPE=BUY;LOTS=1;TP=10;SL=0;MBSI= -1;MBSI_INT= 10;ADSI=1;CS=1}]

A partir de la version 8.3, se incorlopran los siguientes parámetros:

  • SPU: Stop Profit Us: Una vez que la última orden de una BSI alcance lo indicado en este parámetro de ganancias en Us, si además la serie en su conjunto tiene beneficios, se cierra dicha BSI. 
  • SPM: Stop Profit Money: Una vez que la serie BSI en su conjunto alcance el beneficio indicado en este parámetro, se cierra la serie BSI
  • SPB: Stop Profit Balnace: Una vez que la serie BSI en su conjunto alcance la ganacia en % del balance indicado en este parámetro (valores de 0 a 1, siendo 0 el 0% y 1 el 100%).

  Si están definidos SPM y SPB, se coge el menor valor de ambos. Si el beneficio de una BSI alcanza dicho valor, se cierra. Si además está definido el SPU, se cierra si la última orden alcanza esas Us de ganancia y el beneficio de la serie es positivo. No tiene por que llegar al SPU o SPB, aunque si estos están definidos y se cumplen antes, cerrara la serie.

  Pongamos como ejemplo una MBSI que lo que hace es que cada U crea una nueva serie BSI (MBSI= -1), y cada BSI crea una nueva orden cada 5 Us (MBSI_INT=5). Queremos que cada nueva orden de cada BSI duplique el lote (ASP=2), y si la ultima orden llega al precio de la anterior se cierre la BSI entera. En este ejemplo, para que la ultima orden llegue al precio de la anterior tiene que recorrer 5 Us que es la distancia entre cada orden (SPU)5). Con estas premisas, la configuración quedaria de la siguiente forma

Sistema1 à [{ORD=1;TYPE=BUY;LOTS=0.01;TP=0;SL=0;MBSI= -1;MBSI_INT= 5;ASP=2;SPU=5}]

Si en vez de poner el TP=0 se pone a TP=5, pero no se pone el parámetro SPU, cuando una orden llega a su TP cerraría dicha orden pero no cerraria la BSI.

Una vez que se cierra una BSI, si el precio llega de nuevo al precio donde se inició, creará de nuevo otra BSI

Por otro lado también se ha añadido en la version 8.03 y trailing stop particular para cada BSI, ya sea definido en dinero o definido en % de balance. Los parametros en los que se indica dinero serian:

  • TSD: TS Disparo, es dedir, las ganancias que tiene que tener el BSI para activar el TS
  • TSP: TS Proteccion, es decir, la distancia en dinero en la que se cerrará el BSI sobre el máximo alcanzado, el cual se actualiza en función del siguiente parametro TSS.
  • TSS: TS Salto. Cuando el TS está activado, la protección se mueve cuando se incrementen las ganancias segun el salto.

Como ejemplo, si queremos que la serie se empiece a proteger cuando lleve 100 euros de ganancia, se indica TSD=100. Si en ese momento queremos que la serie al menos gane 20 euros, se define la proteccion como TSP=80, es decir, se permite que las ganancias bajen hasta 80 euros antes de cerrarla, ganando 20 euros en ese momento. Y si queremos que se vaya moviendo esa ganancia asegurada cada 10 euros, cuando la ganancia llegue a 110 ya se aseguran 30, cuando se llegue a 120 se aseguran 40, es decir, se mantienen los 80 euros de distancia.

De igual forma se puede indicar la ganancia según el balance:

  • TSBD: TS Balance Disparo, que indica el % del balance en valores entre 0 y 1 en el que comienza el TS
  • TSBP: TS Balance Proteccion
  • TSBS: TS Balance Salto

Ejemplo de sintaxis de ambos tipos de TS:

Sistema1 con TS à [{ORD=1;TYPE=BUY;LOTS=0.01;TP=0;SL=0;MBSI= -1;MBSI_INT= 5;ASP=2;TSD=1000;TSP=1000;TSS=100}]

Sistema1 con TSB à [{ORD=1;TYPE=BUY;LOTS=0.01;TP=0;SL=0;MBSI= -1;MBSI_INT= 5;ASP=2;TSBD=0.01;TSBP=0.001;TSBS=0.001}]

A partir de la version 8.05 de scala, se introducen 2 nuevos parámetros:

  • POH (Precio Operacion High)
  • POL (Precio Operacion Low).

Si POH está definido, si el precio de mercado supera su valor, no se crearán nuevas BSIs, y cuando termine la última, se da por terminada la MBSI. Si POL está definico, si el precio de mercado baja de su valor, tampoco se crerán nuevos BSIs y se dará por terminada la serie MBSI cuando ya no tenga ordenes abiertas. La utilidad de POH y POL es, por ejemplo, deinir un MBSI de compras si el mercado esta muy bajo (por debajo de POH), o de ventas si está muy alto (por encima de POL). Claro está que esto tiene sentido si hay definido un Stop Profit y que no solo dejen de crearse nuevos BSIs, sino que los BSIs actuales terminen.

En la versión 8.10 de scala, se introducen 2 nuevos parámetros

  • POHU (Precio Operacion High Medido en Us)
  • POLU (Precio Operacion Low Medido en Us).

Los parametros POHU y POLU, que tienen preferencia sobre POH y POL, indican las Us a las que está el Precio de Operacion High y Precio Operacoin Low sobre el precio de comienzo de la serie. Ambos toman valores positivos (el POLU indica las Us por debajo de precio)

 

Por ejemplo, en el VIX, se puede definir un MBSI de compras si está en la zona baja y de ventas si está en la zona alta:

Sistema1 à [{ORD=1;TYPE=BUY;LOTS=1;TP=0;SL=0;MBSI= -10;MBSI_INT= 10;ASP=2;SPU=10;POH=20}]

Sistema2 à [{ORD=1;TYPE=SELL;LOTS=10;TP=0;SL=0;MBSI= -10;MBSI_INT= 10;ASP=2;SPU=10;POL=30}]

7.16 Serie PREPRO

Una serie PREPRO es una serie de órdenes preprogramadas. La idea de este tipo de serie es indicar en rango de precios puede operar y que pérdida máxima se puede generar, y scala calculará cuantas órdenes creará y con que lotaje. Tambíen habrá 2 formas de configurarlo en función de los parámetros usados, con precios fijos de mercado, con precios relativos al precio de mercado medidos en Us.

Los parámetros comunes a ambas configuraciones son los siguientes:

  • PREPRO: dinero máximo de pérdida. Parámetro obligatorio que es el que va a identificar que se trata de una serie PREPRO.
  • PBLANCE: Pocentaje de balance máximo de pérdida. Los valores van de 0 a 1, siendo 0 un 0% y 1 un 100%, y en caso de estar defiinido, la pérdida máxima se calculara de esta forma, no hará caso a lo indicado en el parámetro PREPRO, aunque siga siendo obligatorio indicarlo.
  • TYPE: Tipo de órdenes, puede tomar los valores BUY o SELL
  • MOTI: Separación mínima entre órdenes. Al calcular cuantas ordenes crear y en que precios, se mantendrá una distancia mínima entre órdenes indicada en este parámetro, medido en Us
  • AL: Aumento de lotaje entre la primera y la última órden. En función de la pérdida definida y el rango de mercado indicado, se tratará de que la última orden sea superior respecto a la primera según este parámetro. Si no se define, el valor por defecto es 10, es decir, si scala decide que la primera orden vale 0.01 lotes, la última valdría 0.1

Parámetros de precios fijos de mercado:

  • PC: Precio de comienzo, que es donde se creará la primera orden
  • PF: Precio de fin, que es donde se crerá la última orden
  • PPT: Precio de pérdida total, que es donde se fijará el SL de todas las órdenes
  • PS: Precio de salida, que es donde se fijará el TP de todas las órdenes
  • PD: Predio de descarte. Si se alcanza dicho precio de mercado, se cancela la serie

Parámetros de precios relativos al precio de mercado, medidos en Us. Estos parámetros se definen con valor positivo si supera al precio de mercado y negativo si es inferior al precio de mercado.

  • PCU: Precio de comienzo. Por ejemplo, si vale 1, el precio de comienzo es una U por encima del precio de mercado y si vale -1, sería una U por debajo del precio de mercado
  • PFU: Precio de fin, medido en Us
  • PPTU: Precio de pérdida total, medido en Us.
  • PSU: Precio de salida, medido en Us
  • PDU: Precio de descarte, medido en Us. Si el precio alcanza el precio de descarte, ya no se crearía la serie. Un ejemplo de uso es que si se quiere defnir una serie PREPRO BUY, pero el precio en vez de bajar sube, se puede definir un PDU=3, y si el precio de mercado sube 3Us ya no crearía la serie.
  • TO: Trailing open, que de estar definido debe indicarse igual a 1 (TO=1), y que si el precio de mercado va en contra del precio de comienzo, mueve todos los precios indicados según se mueva el mercado. Por ejemplo, si se quiere hacer una PREPRO BUY, y el precio de comienzo se define 1U por debajo del precio actual. Si el precio sube 2U, la PREPRO comenzará 1U por debajo respecto de esa subida de 2U.

Ejemplo de sintaxis con precios de mercado:

Sistema1 à  [{PREPRO=1000;TYPE=BUY;PC=1.17;PF=1.12;PPT=1.10;PS=1.20;MOTI=1;AL=5}]

Ejemplo de sintaxis con precios relativos a U, con órdenes BUY, donde los valores de comienzo, fin y perdida total son negativos, y el de salida y descarte positivos:

Sistema1 à [{PREPRO=1000;TYPE=BUY;PCU=-1;PFU=-10;PPTU=-12;PSU=2;MOTI=0.1;PDU=5;TO=1;PBALANCE=1}]

Ejemplo de sintaxis con precios relativos a U, con órdenes SELL, donde los valores de comienzo, fin y perdida total son positivos, y el de salida y descarte negativos:

Sistema à  [{PREPRO=5000;TYPE=SELL;PCU=1;PFU=20;PPTU=50;PSU=-4;MOTI=0.01;TO=1;AL=20}]

 

7.17 Serie SCSV

Una serie SCSV es una serie de Simplemente Comprar y Simplemente Vender, a partir de un precio hacia arriba hace solo compras, y a partir de un precio hacia abajo hace solo ventas.

Este tipo de serie se puede configurar para que lance a su vez nuevos SCSV a otro precio sin que la primera serie haya terminado.

Los parámetros de esta orden son SCSV, donde se indica la separación de la creación de las primeras ordenes BUY por arriba y SELL por abajo, como siempre medido en Us. SO sería la separación entre órdenes. LOTS el lotaje de la primera orden. AL el aumento de Lotaje, es un multiplicador que por defecto en caso de no definirse sería 1. MULT indica si se generan multiples SCSV a distintas distancias, indicando justo la distancia en este parámetro. TP es el dinero ganado en el cual se cierra la serie. TPP es el porcentaje de dinero ganado respecto al balance de la cuenta en el que se cierra la serie. SL el dinero perdido para que se cierre la serie.

Ejemplo de sintaxis:

Sistema1 à [{SCSV=2;SO=1;LOTS=0.01;AL=1.2;MULT=1;TP=1000;SL=100}]

7.18 Serie SCSV_PEND

Una serie SCSV_PEND es una serie de Simplemente Comprar y Simplemente Vender que crea las órdenes pendientes en vez de crearlas a mercado según avanza el precio. En este caso hay que indicar cuantas órdenes se van a crear., a partir de un precio hacia arriba hace solo compras, y a partir de un precio hacia abajo hace solo ventas.

Los parámetros son SCSV_LIMIT que indica donde activar la serie (Us sumadas al precio actual), ORD que indica el número de órdenes, OPEN la distancia de apertura de la primera orden, SO la separación entre órdenes, TPO el TP de las ordenes respecto a OPEN, TP el take profit en dinero de la serie, SL el stop loss en dinero de la serie.

7.19 Serie CLOSE

Una serie CLOSE es un tipo de serie atípico que no crea ordenes, y que a su vez afecta a todos los sistemas que en ese momento estén corriendo. Esta clase cierra órdenes abiertas de todos los sistemas, y admite distintos valores para cerrar unas órdenes u otras:

  • ALL: Cierra todas las órdenes de todos los sistemas y además finaliza las series. Esto último es importante, porque puede haber series que aun tenga órdenes pendientes de crear, o series infinitas. También reinicia el lotaje multiplicador , es decir, la siguiente serie comienza por el lote que tenga definido sin aplicar los aumentos de lote previos.
  • BUY: Cierra todas las órdenes BUY que haya creadas hasta ese momento
  • SELL: Cierra todas las órdenes SELL que haya creadas hasta ese momento
  • BE_BUY: En vez de cerrar, pone en Break Even las ordenes BUY que haya en ese momento, y claro está, que vayan ganando.
  • BE_SELL: Pone en break even las ordenes SELL que haya en ese momento
  • WIN_BUY: Cierra las órdenes BUY que vayan ganando en ese momento
  • WIN_SELL: Cierra las órdenes SELL que vayan ganando en ese momento

La sintaxis de la serie es:

Sistema1 à {CLOSE=ALL}

7.20 Serie CHANGEU

Una serie CHANGEU, al igual que la CLOSE, tampoco crea órdenes y afecta a todos los sistemas, y lo que hace es cambiar la U (Unidad Precio). Hay varias formas de cambiar la U, cada una con una sintaxis distinta porque necesita de parámetros distintos:

  • [{CHANGEU=FIX;U=20}]: Cambia la U a un valor fijo
  • [{CHANGEU=MULTIPLY;FACTOR=1.5;MAX=50;MIN=10}]: Multiplica la U anterior por "x", Si MAX y MIN están definidos no superará esos valores.
  • [{CHANGEU=ZIGZAG;TF=60;DEPTH=12;DEVIATION=6;BACKSTEP=3;PORC=10;MAX=50;MIN=10}]: Para usar este método es necesario que se tenga instalado el indicador “ZigZag”. TF sería el TimeFrame en minutos, DEPTH, DEVIATION y BACKSETP son los parámetros de entrada del indicador ZigZag. Con estos parámetros se busca el máximo y mínimo previo al precio, y se calcula la U como esa distancia aplicándole el porcentaje indicado en el parámetro PORC (que debe tomar valores enteros, usualmente del 1 al 100). También admite los parámetros MAX y MIN para poner unos límites al valor de U.
  • [{CHANGEU=CANDLES;TF=60;N_CANDLES=50;PORC=10;MAX=50;MIN=10}]: Calcula el High y el Low del número de velas indicado en el parámetro N_CANDLES en el TimeFrame TF,  y  le aplica a la diferencia entre ellos el porcentaje indicado en PORC (número entero, usualmente entre 1 y 100). También admite los parámetros MAX y MIN para poner unos límites al valor de U.
  • [{CHANGEU=RESET}]: Cambia la U al valor configurado inicialmente en scala.

8. Reglas

Las reglas son las que van a permitir ejecutar las series. En un sistema se definen un conjunto de series, pero estas series se lanzan tras una lógica programable. Cada sistema tiene su propio conjunto de reglas.

Las reglas se identifican por un Tx, por ejemplo T1, T2,…T10, y es necesario que sean consecutivas, no se puede, por ejemplo crear T1,T2 y T4, debe comenzar por T1 y ser consecutivas. Cada regla va separada por punto y coma y la sintaxis es: Tx=Regla.

8.1 REGLA “S”

La regla S simplemente indica la serie que se quiere ejecutar, y tendrá que venir seguida por el orden de la serie que se quiere ejecutar.

Por poner un ejemplo, imaginemos que tenemos 2 series y queremos ejecutar primero la serie 1 y cuando termine esta, la serie 2:

Sistema1 à  [{ORD=3;TYPE=BUY;LOTS=0.01;TP=30;SL=10,20,30}&{ORD=3;TYPE=SELL;LOTS=0.01;TP=30;SL=10,20,30}]

Reglas1 à T1=S1;T2=S2

De esta forma, el sistema1 tiene 2 series, una SE de tipo BUY y otra SE de tipo SELL. Scala analiza las reglas, y ve que en T1, tiene que ejecutar S1. Mientras se ejecuta S1, scala calcula si tiene que aplicar algún Trailing Stop, algún Stop Loss o Take Profit global, etc. Una vez finalice S1, scala determina si tiene que cambiar el lotaje de referencia, y lanza seguidamente la regla S2. Una vez finaliza la serie S2 ya no hay definido un T3, con lo que el sistema1 finaliza.

8.2 REGLA GOTO

La regla GOTO permite dar saltos entre las reglas, es decir, permite saltar a cualquier regla de las que haya definidas para, generalmente, formar bucles. Seguido de GOTO, entre paréntesis, se indica el número de la regla a ejecutar, por ejemplo GOTO(1)

Por ejemplo, imaginemos que tengo un sistema con una serie que quiero que se ejecute constantemente, es decir, que una vez finalice la serie cree otra igual:

Sistema1 à  [{ORD=3;TYPE=BUY;LOTS=0.01;TP=30;SL=10,20,30}]

Reglas1 à T1=S1;T2=GOTO(1)

Se ha definido un Sistema1 con una orden SE de tipo BUY. La primera regla ejecuta la serie 1 y al finalizar, la regla T2 lleva el flujo de control a la Regla T1.  De esta forma, scala estaría constantemente iniciando una nueva serie una vez finalice, recalculando el lotaje tras finalizar cada serie.

Por desarrollar un poco mas este ejemplo, imaginemos que se tiene configurado un aumento de lotaje para series perdedoras de 1.5. Empieza la ejecución del sistema, se ejecuta la serie 1, y termina en pérdidas. Scala calcula el lotaje multiplicador, partiendo siempre de modo neutro, es decir, si las órdenes se deben crear con 0.01 lotes respetará ese valor, pero al terminar la serie, la siguiente serie se ejecutará con 0.01 x 1.5, es decir 0.015, que en este caso se ajusta a 0.01 (esto depende del MODE_MINLOT, MODE_MAXLOT, MODE_LOTSIZE y MODE_LOTSTEP del símbolo donde se esté operando). Si vuelve a perder, se vuelve a incrementar por 1.5, es decir, 0.015 x 1.5 = 0.0225, ajustando a 0.02 en este caso, y así sucesivamente. Si una serie es ganadora, según este ejemplo no se incrementaría, pero también se revisa si la suma de ganancias de todas las series previas es positiva o negativa. Si fuera positiva, se reinicia el lotaje y la siguiente serie la crearía de nuevo con 0.01, pero si fuera negativa, la crearía con el lotaje de la serie anterior.

Sirva este ejemplo para saber como se calculan los lotajes entre serie y serie, porque esto es algo común para todas las series.

8.3 REGLA END

La regla END finaliza un sistema. La sintaxis seria T1=END

8.4 REGLA CONDICIONAL

La regla condicional evalúa una condición para ejecutar después una regla u otra. Es importante saber que una regla condicional no tiene como resultado ejecutar una Serie, siempre tendrá como salida que Regla debe evaluar después.

La sintaxis de esta regla seria: T1= Condicion ? T2 : T3

Si se da la Condición, definida entre el igual y el signo de interrogación, se ejecutaría T2, y si no se cumple, se ejecutaría T3. Luego T2 y T3 pueden a su vez ser reglas condicionales, o reglas que ejecutan una Serie, un GOTO, etc.

Las condiciones, en general, son comparación de 2 cosas, y dicha comparación admite los operandos >, >=, <, <= e ==. Por poner un ejemplo, si se compara algo que vale 3 con algo que vale 4 con el comparador < (es decir, 3<4), el resultado será verdadero

Lo interesante de esta regla es la diversidad que hay en la configuración de condiciones, pudiendo aplicar distintas funciones, ya sea cálculo de resulta de series previas, como valores relativos a la vela, valor de indicadores, etc.

 

9. Funciones de las Reglas Condicionales

Las reglas condicionales permiten a scala programar cierta lógica para ejecutar una serie u otra. Al igual que en la configuración de series, la sintaxis es muy importante que sea correcta, un error a la hora de definir una condición puede provocar que scala no ejecute nada al no saber interpretarlo.

Para implementar dichas condiciones, scala tiene la capacidad de interpretar una diversidad de funciones que, en función del resultado de la función dentro de la condición, dará un resultado de verdadero o falso para saber si ejecutar lo que hay detrás de la interrogación, o lo que hay detrás de los dos puntos.

Las funciones admiten operadores aritméticos, suma, resta, multiplicación y división con los símbolos -*/, y operadores lógicos como AND y OR, con los símbolos && para AND y || para OR

 

9.1 Función Resultado ANTERIOR

La función resultado anterior devuelve el resultado de la serie anterior, admitiendo entre paréntesis el número de series previas de los que se quiere saber su resultado.

Una condición que use la función Resultado Anterior, suele usarse para saber si dicho resultado fue mayor o menor que cero para tomar una decisión, aunque no hay restricción para usarse como mejor convenga en cada momento.

Cuando se evalúa el resultado anterior de varias series, todas deben cumplir la condición indicada. Por ejemplo, si se quiere tomar una decisión si las 3 últimas series fueron perdedoras, será cierto si las 3 lo fueron, y no que la suma del resultado de las 3 lo fueran, siendo una de ellas ganadora.

La sintaxis solo para la última serie: RA.

La sintaxis para varias series: RA(n), donde n es el número de series a revisar.

Para mostrar un ejemplo de uso, se define un sistema con una serie SE de BUYs y otra de SELLs, y se ejecutan BUYS mientras la anterior BUY sea ganadora. En caso de que sea perdedora, se ejecuta una SELL y se continuará ejecutando mientras siga siendo ganadora:

Sistema1 à  [{ORD=3;TYPE=BUY;LOTS=0.01;TP=30;SL=10,20,30}&{ORD=3;TYPE=SELL;LOTS=0.01;TP=30;SL=10,20,30}]

Reglas1 à T1=S1;      T2=RA>0?T1:T3;                 T3=S2;                   T4=RA>0?T3:T1

Se separan un poco las reglas para que se vean mejor.

Explicando las reglas, scala ejecuta la regla T1, que ejecuta la serie S1. Al terminar, se ejecuta la regla T2, que revisa si el resultado de la anterior fue positivo, en cuyo caso vuelve a T1. Si no es positivo va a T3. En T3 ejecuta la serie S2, y al terminar, en T4 evalua si el resultado fue positivo. Si fue positivo, vuelve a T3 a ejecutar otra SELL, y en otro caso vuelve a T1 para ejecutar un BUY.

9.2 Función Resultado GLOBAL

La función resultado global devuelve el resultado de la serie anterior, al igual que en la función de resultado anterior, pero cuando se indica entre paréntesis el número de series previas, se calcula el resultado acumulado entre ellas.

La diferencia por tanto con la función de resultado anterior es que si, por ejemplo, quiero revisar el resultado de las 3 últimas series y ver si es mayor que 0, se revisa si la suma de las 3 sea positivo, aunque alguna de ellas haya sido negativa.

La sintaxis solo para la última serie: RG.

La sintaxis para varias series: RG(n), donde n es el número de series a revisar.

Partiendo del ejemplo anterior, si en vez de ver el resultado anterior se mira el resultado global de las 3 últimas series, quedaría de esta forma:

Sistema1 à  [{ORD=3;TYPE=BUY;LOTS=0.01;TP=30;SL=10,20,30}&{ORD=3;TYPE=SELL;LOTS=0.01;TP=30;SL=10,20,30}]

Reglas1 à T1=S1;      T2=RG(3)>0?T1:T3;            T3=S2;                   T4=RG(3)>0?T3:T1

9.3 Función ICLOSE

La función ICLOSE devuelve el valor de cierre de una vela. Entre paréntesis lleva el TimeFrame en minutos, y la vela, siendo 0 la vela actual 1, la anterior y así sucesivamente

La sintaxis es ICLOSE(TF,vela). Por ejemplo, si se quiere obtener el cierre de vela de H1 de la vela anterior: ICLOSE(60,1)

9.4 Función IOPEN

La función IOPEN devuelve el valor de apertura de una vela. Entre paréntesis lleva el TimeFrame en minutos, y la vela, siendo 0 la vela actual 1, la anterior y así sucesivamente

La sintaxis es IOPEN(TF,vela). Por ejemplo, si se quiere obtener la apertura de vela de H4 de la vela actual: IOPEN(240,0)

9.5 Función IHIGH

La función IHIGH devuelve el valor más alto de una vela. Entre paréntesis lleva el TimeFrame en minutos, y la vela, siendo 0 la vela actual 1, la anterior y así sucesivamente

La sintaxis es IHIGH(TF,vela). Por ejemplo, si se quiere obtener el high de vela de M15 de la vela anterior: IHIGH(15,1)

9.6 Función ILOW

La función ILOW devuelve el valor más bajo de una vela. Entre paréntesis lleva el TimeFrame en minutos, y la vela, siendo 0 la vela actual 1, la anterior y así sucesivamente

La sintaxis es ILOW(TF,vela). Por ejemplo, si se quiere obtener el low de vela de M5 de la vela anterior: ILOW(5,1)

9.6 Función IVOLUME

La función IVOLUME devuelve el volumen de una vela (ticks de una vela, que es lo que se considera volumen en MT4). Entre paréntesis lleva el TimeFrame en minutos, y la vela, siendo 0 la vela actual 1, la anterior y así sucesivamente

La sintaxis es IVOLUME(TF,vela). Por ejemplo, si se quiere obtener el volumen de la vela de M5 de la vela anterior: IVOLUME(5,1)

9.7 Función IBID

La función IBID devuelve el valor del Bid en ese momento.

La sintaxis es IBID.

9.8 Función IASK

La función IASK devuelve el valor del Ask en ese momento.

La sintaxis es IASK.

9.9 Función ISPREAD

La función ISPREAD devuelve el valor del Spread en puntos en ese momento

La sintaxis es ISPREAD.

9.10 Función IPOINT

La función IPOINT devuelve el valor del punto del símbolo donde está desplegado scala

La sintaxis es IPOINT. Por ejemplo si se quiere calcular el valor del Spread sin usar la función ISPREAD, habría que calcularlo de la siguiente forma (IASK-IBID)/IPOINT.

9.11 Función IMA

La función IMA se corresponde con la media móvil. A esta función hay que indicarle ciertos parámetros necesarios: TF,vela,Periodo,Desplazamiento,Metodo,Aplicar a

La sintaxis es IMA(TF,vela,Periodo,Desplazamiento,Metodo,Aplicar a), donde TF es el TimeFrame en minutos, vela es la vela a la que aplicar el indicador, siendo 0 la vela actual, 1 la anterior y así sucesivamente. Estos 2 parámetros son comunes a todas las funciones correspondientes a indicadores El resto de parámetros son los parámetros del propio indicador de MT4, donde:

  • Periodo es el Periodo de la Media Movil, valor entero
  • Desplazamiento es el desplazamiento, valor entero.
  • Método es el método, y puede tener los siguientes valores:
    • 0: MODE_SMA.Simple averaging
    • 1: MODE_EMA, Exponential averaging
    • 2: MODE_SMMA, Smoothed averaging
    • 3: MODE_LWMA, Linear-weighted averaging
  • Aplicar a, puede tomar los siguientes valores:
    • 0: PRICE_CLOSE
    • 1: PRICE_OPEN
    • 2: PRICE_HIGH
    • 3: PRICE_LOW
    • 4: PRICE_MEDIAN
    • 5: PRICE_TYPICAL
    • 6: PRICE_WEIGHTED

Un ejemplo de condición usando la función IMA:

T1=IMA(60,1,14,0,1,0)>ICLOSE(60,1)?T2:T3

En esta regla, si la EMA de 14 periodos a cierre de vela de la vela anterior en H1 es superior al cierre de vela en H1 de la vela anterior, ejecutar T2 y en caso contrario, ejecutar T3.

9.12 Función IMACD

La función IMACD se corresponde con el indicador MACD. A esta función hay que indicarle ciertos parámetros necesarios: TF, vela, Fast_ema_period, Slow_ema_period, signal_period, applied_price, mode.

La sintaxis sería: IMACD(TF, vela, Fast_ema_period, Slow_ema_period, signal_period, applied_price, mode)

Los parámetros propios del indicador son:

  • Fast EMA period, que es la EMA rápida
  • Slow EMA period, que es laEMA lenta
  • Signal Period, que es el MACD SMA
  • Applied Price, que es el aplicar A, que puede tomar los siguientes valores:
    • 0: PRICE_CLOSE
    • 1: PRICE_OPEN
    • 2: PRICE_HIGH
    • 3: PRICE_LOW
    • 4: PRICE_MEDIAN
    • 5: PRICE_TYPICAL
    • 6: PRICE_WEIGHTED

Por último está el parámetro mode. El indicador MACD puede devolver 2 valores, tiene 2 buffers de datos, el mode 0 se corresponde con el propio MACD, lo que se representa en mt4 con barras verticales, y el mode 1 se corresponde con la línea continua o Signal.

 

Ejemplo de sintaxis:

IMACD(60,1,12,26,9,0,0): Se corresponde con el MACD de la vela 1 en H1, con parámetros 12,26,9 para la EMA rápida, EMA lenta y SMA respectivamente, aplicado a cierre de vela, y retornando el valor de la barra vertical (mode 0)

9.13 Función IRSI

La función IRSI se corresponde con el indicador RSI. A esta función hay que indicarle ciertos parámetros necesarios: TF,vela,Periodo,Aplicar a.

La sintaxis sería: IRSI(TF, vela, Periodo, Aplicar a)

Los parámetros propios del indicador son:

  • Periodo, que es el periodo a usar en el RSI
  • Aplicar A, que es el propio aplicar A, que puede tomar los siguientes valores:
    • 0: PRICE_CLOSE
    • 1: PRICE_OPEN
    • 2: PRICE_HIGH
    • 3: PRICE_LOW
    • 4: PRICE_MEDIAN
    • 5: PRICE_TYPICAL
    • 6: PRICE_WEIGHTED

 

Ejemplo de sintaxis:

IRSI(60,1,14, 0): Se corresponde con el RSI de la vela 1 en H1, con periodo 14, aplicado a cierre de vela.

9.14 Función IBANDS

La función IBANDS se corresponde con el indicador Bandas de Bollinger. A esta función hay que indicarle ciertos parámetros necesarios: TF, vela, Periodo, Desviaciones, Desplazamiento, Aplicar a, mode.

La sintaxis sería: IBANDS(TF,vela,Periodo,Desviaciones,Desplazamiento,Aplicar a,mode)

Los parámetros propios del indicador son:

  • Periodo
  • Desviaciones
  • Desplazamiento
  • Aplicar A, que es el propio aplicar A, que puede tomar los siguientes valores:
    • 0: PRICE_CLOSE
    • 1: PRICE_OPEN
    • 2: PRICE_HIGH
    • 3: PRICE_LOW
    • 4: PRICE_MEDIAN
    • 5: PRICE_TYPICAL
    • 6: PRICE_WEIGHTED

Esta función tiene 3 buffers de datos que puede devolver, que se indican en el parámetro mode, o que se corresponde con los siguientes valores:

  • 0: MODE_MAIN, que es la línea central
  • 1: MODE_UPPER, que es la línea superior
  • 2: MODE_LOWER, que es la línea inferior

 

Ejemplo de sintaxis:

IBANDS(60,1,14,2,0,0,1): Se corresponde con las bandas de bollinguer de la vela 1 en H1, con periodo 14, desviaciones 2, desplazamiento 0, aplicado a cierre de vela, retornando el valor de la línea superior.

Por ejemplo, si se quiere hacer una regla comprobando que la vela ha cerrado por encima de la banda superior de bollinguer:

T1=ICLOSE(60,1)>IBANDS(60,1,14,2,0,0,1)?T2:T3

En el ejemplo se comprueba si el valor del cierre de vela en H1 es mayor que la línea superior de la banda de bollinguer en H1 de periodo 14. Si efectivamente cierra por fuera de la banda bollinguer, se ejecuta T2 y en otro caso T3.

9.15 Función ITEND

La función ITEND  es una función que internamente comprueba si una EMA es superior a otra. Los parámetros de la función son los siguientes: TF, vela, periodoEMA1, periodoEMA2.

La sintaxis seria: ITEND(TF,vela,periodoEMA1,periodoEMA2)

A parte del TF y la vela, se le pasa el periodo de la EMA1 y el periodo de la EMA2. Lo normal es pasar el periodo menor como EMA1 y el mayor como EMA2, y esta función devuelve 1 si la EMA1 está por encima de la EMA2, y -1 si la EMA1 está por debajo de la EMA2. Si coinciden, devuelve 0.

9.16 Función INDICATOR

La función INDICATOR  es una función que invoca a cualquier indicador personalizado que se quiera. Si bien la libertad que ofrece este indicador es enorme, hay que asegurarse muy bien de que parámetros necesita dicho indicador, y cuantos buffer de datos o modos tiene.

Los parámetros de este indicador serian:TF, vela, nombre del indicador, argumentos del indicador, modo.

Muy importante que el indicador esté en la carpeta de indicadores de MT4, y coincida el nombre exactamente, sin incluir la extensión a la hora de utilizar la función INDICATOR.

A tener en cuenta que hay indicadores que no tienen valor en todas las velas, al invocar al indicador en este caso, este devolverá un EMPTY_VALUE, que tiene el valor 2147483647  (0x7FFFFFFF). Este valor no es un capricho de scala, es como funciona MT4, pero es necesario conocerlo, sobre todo aquellos que no hayan programado nunca en MQL4 que desconocerán por completo este hecho.

Como ejemplo, imaginemos que disponemos de un indicador cuyo fichero se llama OsMA.ex4, que admite los parámetros Fast EMA Period, Slow EMA Period y Signal SMA Period, y tiene un solo buffer de datos. Y queremos detectar que cruza al alza a cierre de vela de negativo a positivo, es decir, comparando la vela 1 con la 2 con el valor 0. Si cruza al alza se ejecuta T2 y en otro caso T3

T1=INDICATOR(60,1,OsMA,12,26,9,0)>0 && INDICATOR(60,2,OsMA,12,26,9,0)<=0?T2:T3

 

9.17 Función ILOTSBUY

La función ILOTSBUY devuelve los lotes de ordenes BUY que haya en mercado en ese momento.

La sintaxis sería sencillamente dicha palabra clave, ILOTSBUY, sin paréntesis ni nada mas.

 

9.18 Función ILOTSSELL

La función ILOTSSELL devuelve los lotes de ordenes SELL que haya en mercado en ese momento.

La sintaxis sería sencillamente dicha palabra clave, ILOTSSELL, sin paréntesis ni nada mas.

 

9.19 Función IPROFITBUY

La función IPROFITBUY devuelve las ganancias actuales de las ordenes BUY que haya en mercado en ese momento.

La sintaxis sería sencillamente dicha palabra clave, IPROFITBUY , sin paréntesis ni nada mas.

 

9.20 Función IPROFITSELL

La función IPROFITSELL devuelve las ganancias actuales de las ordenes SELL que haya en mercado en ese momento.

La sintaxis sería sencillamente dicha palabra clave, IPROFITSELL , sin paréntesis ni nada mas.

 

9.21 Función IEQUITY

Devuelve la equidad teniendo en cuenta solo ordenes de la instancia de SCALA en ejecución, es decir, es el balance de la cuenta mas las ganancias de las ordenes abiertas en ese momento

 

9.22 Función IBALANCE

Devuelve el balance de la cuenta

 

9.23 Función IAC

Calcula el indicador Bill Williams' Accelerator/Deceletartor, y retorna su valor. La sintáxis es la siguiente: IAC(TF,vela)

Este indicador está disponible a partir de la versión 8.10

 

9.24 Función IAD

Calcula el indicador Accumulation/Distribution, y retorna su valor. La sintáxis es la siguiente: IAD(TF,vela)

Este indicador está disponible a partir de la versión 8.10

 

9.25 Función IADX

Calcula el indicador  Average Directional Movement Index, y retorna su valor. La sintáxis es la siguiente: IADX(TF,vela,Periodo,Aplicar a,modo,tipo_calculo,nivel).

El parametro "Aplicar a" puede tomar los siguientes valores:

  • PRICE_CLOSE: 0
  • PRICE_OPEN: 1
  • PRICE_HIGH: 2
  • PRICE_LOW: 3
  • PRICE_MEDIAN: 4
  • PRICE_TYPICAL: 5
  • PRICE_WEIGHTED: 6

El parámetro "modo" puede tomar los siguientes valores:

  • 0: MODE_MAIN Base indicator line
  • 1: MODE_PLUSDI DI indicator line
  • 2: MODE_MINUSDI -DI indicator line

El parámetro "tipo_calculo" puede tomar los siguientes valores:

  • 0, se retorna el modo solicitado, no se mira nivel
  • 1, si se quiere ver si el DI esta por endima -DI, siempre y cuando la Base supere el nivel. si no supera nivel devuelve 0, en otro caso 1 si DI superior y -1 si -DI superior
  • 2, si se quiere ver si hubo un cruce hacia arriba (devuelve 1) o hacia abajo (devuelve -1). Se compara la vela indicada con la siguiente, y siempre cuando la linea base supere el nivel 

Este indicador está disponible a partir de la versión 8.10

 

 

9.26 Función IAO

Calcula el indicador Awasome Oscillator, y retorna su valor. La sintáxis es la siguiente: IAO(TF,vela)

Este indicador está disponible a partir de la versión 8.10

 

9.27 Función IALLIGATOR

Calcula el indicador Alligator, y retorna su valor. La sintáxis es la siguiente: 

IALLIGATOR(TF,vela,Jaw line averaging period,Jaw line shift,Teeth line averaging period,Teeth line shift,Lips line averaging period,Lips line shift,averaging method,applied price,modo)

El parámetro ma_method puede tomar los siguientes valores:

  • MODE_SMA: 0 Simple averaging
  • MODE_EMA: 1 Exponential averaging
  • MODE_SMMA :2 Smoothed averaging
  • MODE_LWMA :3 Linear-weighted averaging

El applied_price puede tomar los siguientes valores:

  • PRICE_CLOSE: 0
  • PRICE_OPEN: 1
  • PRICE_HIGH: 2
  • PRICE_LOW: 3
  • PRICE_MEDIAN: 4
  • PRICE_TYPICAL: 5
  • PRICE_WEIGHTED: 6

El parámetro mode puede tomar los siguientes valores:

  • 1: MODE_GATORJAW - Gator Jaw (blue) balance line,
  • 2: MODE_GATORTEETH - Gator Teeth (red) balance line,
  • 3: MODE_GATORLIPS - Gator Lips (green) balance line.

Un ejemplo de invocación seria: IALLIGATOR(15,0,13,8,8,5,5,3,0,0,1)

Este indicador está disponible a partir de la versión 8.10

 

9.28 Función IATR

Calcula el indicador Average True Range, y retorna su valor. La sintáxis es la siguiente: IATR(TF,vela,Periodo)

Este indicador está disponible a partir de la versión 8.10

 

9.29 Función IBEARSPOWER

Calcula el indicador Bears Power, y retorna su valor. La sintáxis es la siguiente: IBEARSPOWER(TF,vela,Periodo,Aplicar a)

El  parámetro Aplicar a puede tomar los siguientes valores:

  • PRICE_CLOSE: 0
  • PRICE_OPEN: 1
  • PRICE_HIGH: 2
  • PRICE_LOW: 3
  • PRICE_MEDIAN: 4
  • PRICE_TYPICAL: 5
  • PRICE_WEIGHTED: 6

Este indicador está disponible a partir de la versión 8.10

 

9.30 Función IBULLSPOWER

Calcula el indicador BullsPower, y retorna su valor. La sintáxis es la siguiente: IBULLSPOWER(TF,vela,Periodo,Aplicar a)

El parámetro Aplicar a puede tomar los siguientes valores:

  • PRICE_CLOSE: 0
  • PRICE_OPEN: 1
  • PRICE_HIGH: 2
  • PRICE_LOW: 3
  • PRICE_MEDIAN: 4
  • PRICE_TYPICAL: 5
  • PRICE_WEIGHTED: 6

Este indicador está disponible a partir de la versión 8.10

 

9.31 Función IBWMFI

Calcula el indicador Market Facilitation Index, y retorna su valor. La sintáxis es la siguiente: IBWMFI(TF,vela)

Este indicador está disponible a partir de la versión 8.10

 

9.32 Función ICCI

Calcula el indicador Comodity Channel Index, y retorna su valor. La sintáxis es la siguiente: ICCI(TF,vela,Periodo,Aplicar a)

El  parámetro Aplicar a puede tomar los siguientes valores:

  • PRICE_CLOSE: 0
  • PRICE_OPEN: 1
  • PRICE_HIGH: 2
  • PRICE_LOW: 3
  • PRICE_MEDIAN: 4
  • PRICE_TYPICAL: 5
  • PRICE_WEIGHTED: 6

Este indicador está disponible a partir de la versión 8.10

 

9.33 Función IDEMARKER

Calcula el indicador DeMarker, y retorna su valor. La sintáxis es la siguiente: IDEMARKER(TF,vela,Periodo)

Este indicador está disponible a partir de la versión 8.10

 

9.34 Función IENVELOPES

Calcula el indicador Envelopes, y retorna su valor. La sintáxis es la siguiente: IENVELOPES(TF,vela,ma_period,ma_method,ma_shift,applied_price,deviation,mode)

El parámetro ma_method puede tomar los siguientes valores:

  • MODE_SMA: 0 Simple averaging
  • MODE_EMA: 1 Exponential averaging
  • MODE_SMMA :2 Smoothed averaging
  • MODE_LWMA :3 Linear-weighted averaging

El  parámetro Aplicar a puede tomar los siguientes valores:

  • PRICE_CLOSE: 0
  • PRICE_OPEN: 1
  • PRICE_HIGH: 2
  • PRICE_LOW: 3
  • PRICE_MEDIAN: 4
  • PRICE_TYPICAL: 5
  • PRICE_WEIGHTED: 6

El parámetro mode puede tener los siguientes valores:

  • 0: MODE_MAIN
  • 1: MODE_UPPER
  • 2: MODE_LOWER

Un ejemplo de invocación seria: IENVELOPES(15,0,14,0,0,0,0.1,1)

Este indicador está disponible a partir de la versión 8.10

 

9.35 Función IFORCE

Calcula el indicador Force Index, y retorna su valor. La sintáxis es la siguiente: IFORCE(TF,vela,ma_period,ma_method,applied_price)

El parámetro ma_method puede tomar los siguientes valores:

  • MODE_SMA: 0 Simple averaging
  • MODE_EMA: 1 Exponential averaging
  • MODE_SMMA :2 Smoothed averaging
  • MODE_LWMA :3 Linear-weighted averaging

El  parámetro Aplicar a puede tomar los siguientes valores:

  • PRICE_CLOSE: 0
  • PRICE_OPEN: 1
  • PRICE_HIGH: 2
  • PRICE_LOW: 3
  • PRICE_MEDIAN: 4
  • PRICE_TYPICAL: 5
  • PRICE_WEIGHTED: 6

Este indicador está disponible a partir de la versión 8.10

 

9.36 Función IFRACTALS

Calcula el indicador Fractals, y retorna su valor. La sintáxis es la siguiente: IFRACTALS(TF,vela,mode)

El parámetro mode puede tener los siguientes valores:

  • 1: MODE_UPPER
  • 2: MODE_LOWER

Este indicador está disponible a partir de la versión 8.10

 

9.37 Función IGATOR

Calcula el indicador Gator oscilator, y retorna su valor. La sintáxis es la siguiente: IGATOR(TF,vela,jaw_period,jaw_shift,teeth_period,teeth_shift,lips_period,lips_shift,ma_method,applied_price,mode)

El parámetro ma_method puede tomar los siguientes valores:

  • MODE_SMA: 0 Simple averaging
  • MODE_EMA: 1 Exponential averaging
  • MODE_SMMA :2 Smoothed averaging
  • MODE_LWMA :3 Linear-weighted averaging

El  parámetro Aplicar a puede tomar los siguientes valores:

  • PRICE_CLOSE: 0
  • PRICE_OPEN: 1
  • PRICE_HIGH: 2
  • PRICE_LOW: 3
  • PRICE_MEDIAN: 4
  • PRICE_TYPICAL: 5
  • PRICE_WEIGHTED: 6

El parámetro mode puede tener los siguientes valores:

  • 1: MODE_UPPER
  • 2: MODE_LOWER

Este indicador está disponible a partir de la versión 8.10

 

9.38 Función ICHIMOKU

Calcula el indicador Ichimoku Kinko Hyo, y retorna su valor. La sintáxis es la siguiente: ICHIMOKU(TF,vela,tenkan_sen,kijun_sen,senkou_span_b,mode)

El parámetro mode puede tener los siguientes valores:

  • 1: MODE_TENKANSEN
  • 2: MODE_KIJUNSEN
  • 3: MODE_SENKOUSPANA
  • 4: MODE_SENKOUSPANB
  • 5: MODE_CHIKOUSPAN

Este indicador está disponible a partir de la versión 8.10

 

9.39 Función IMFI

Calcula el indicador Money Flow Index, y retorna su valor. La sintáxis es la siguiente: IMFI(TF,vela,Periodo)

Este indicador está disponible a partir de la versión 8.10

 

9.40 Función IMOMENTUM

Calcula el indicador Momentum, y retorna su valor. La sintáxis es la siguiente: IMOMENTUM(TF,vela,Periodo,Aplicar a)

El  parámetro Aplicar a puede tomar los siguientes valores:

  • PRICE_CLOSE: 0
  • PRICE_OPEN: 1
  • PRICE_HIGH: 2
  • PRICE_LOW: 3
  • PRICE_MEDIAN: 4
  • PRICE_TYPICAL: 5
  • PRICE_WEIGHTED: 6

Este indicador está disponible a partir de la versión 8.10

 

9.41 Función IOBV

Calcula el indicador On Balance Volume, y retorna su valor. La sintáxis es la siguiente: IOBV(TF,vela,Aplicar a)

El  parámetro Aplicar a puede tomar los siguientes valores:

  • PRICE_CLOSE: 0
  • PRICE_OPEN: 1
  • PRICE_HIGH: 2
  • PRICE_LOW: 3
  • PRICE_MEDIAN: 4
  • PRICE_TYPICAL: 5
  • PRICE_WEIGHTED: 6

Este indicador está disponible a partir de la versión 8.10

 

9.42 Función IOSMA

Calcula el indicador Moving Average of Oscillator, y retorna su valor. La sintáxis es la siguiente: IOSMA(TF,vela,Fast_ema_period,Slow_ema_period,signal_period,applied_price)

El  parámetro Aplicar a puede tomar los siguientes valores:

  • PRICE_CLOSE: 0
  • PRICE_OPEN: 1
  • PRICE_HIGH: 2
  • PRICE_LOW: 3
  • PRICE_MEDIAN: 4
  • PRICE_TYPICAL: 5
  • PRICE_WEIGHTED: 6

Este indicador está disponible a partir de la versión 8.10

 

9.43 Función IRVI

Calcula el indicador Relative Vigor Index, y retorna su valor. La sintáxis es la siguiente: IRVI(TF,vela,Periodo,Aplicar a)

El  parámetro Aplicar a puede tomar los siguientes valores:

  • PRICE_CLOSE: 0
  • PRICE_OPEN: 1
  • PRICE_HIGH: 2
  • PRICE_LOW: 3
  • PRICE_MEDIAN: 4
  • PRICE_TYPICAL: 5
  • PRICE_WEIGHTED: 6

Este indicador está disponible a partir de la versión 8.10

 

9.44 Función ISAR

Calcula el indicador Parabolic Stop and Reverse system, y retorna su valor. La sintáxis es la siguiente: ISAR(TF,vela,step,maximum)

Este indicador está disponible a partir de la versión 8.10

 

9.45 Función ISTDDEV

Calcula el indicador Standard Deviation, y retorna su valor. La sintáxis es la siguiente: ISTDDEV(TF,vela,ma_period,ma_shift,ma_method,applied_price)

El parámetro ma_method puede tomar los siguientes valores:

  • MODE_SMA: 0 Simple averaging
  • MODE_EMA: 1 Exponential averaging
  • MODE_SMMA :2 Smoothed averaging
  • MODE_LWMA :3 Linear-weighted averaging

El  parámetro Aplicar a puede tomar los siguientes valores:

  • PRICE_CLOSE: 0
  • PRICE_OPEN: 1
  • PRICE_HIGH: 2
  • PRICE_LOW: 3
  • PRICE_MEDIAN: 4
  • PRICE_TYPICAL: 5
  • PRICE_WEIGHTED: 6

Este indicador está disponible a partir de la versión 8.10

9.46 Función ISTOCHASTIC

Calcula el indicador Oscilador Estoásctico , y retorna su valor. La sintáxis es la siguiente: ISTOCHASTIC(TF,vela,K,D,ralentizacion, metodo MA,Aplicar a,modo)

El parámetro ma_method puede tomar los siguientes valores:

  • MODE_SMA: 0 Simple averaging
  • MODE_EMA: 1 Exponential averaging
  • MODE_SMMA :2 Smoothed averaging
  • MODE_LWMA :3 Linear-weighted averaging

El  parámetro Aplicar a puede tomar los siguientes valores:

  • LOW/HIGH: 0
  • CLOSE/CLOSE: 1

  El parámetro mode puede tomar los valores:

  • 0 - MODE_MAIN
  • 1 - MODE_SIGNAL
  •  

9.47 Función IWPR

Calcula el indicador Larry Williams' Percent Range, y retorna su valor. La sintáxis es la siguiente: IWPR(TF,vela,periodo)

Este indicador está disponible a partir de la versión 8.10

 

9.48 Función INTIME

Calcula si la hora actual está dentro de un intervalo de tiempos. La sintáxis es la siguiente: INTIME(horaInicial,horaFinal)

La sintáxis de horaInicial y horaFinal es: hh:mm. Si se quiere indicar las 8 de la mañana, es necesario poner 08:00, la sintaxis no sería correcta si se pone 8:00

Si se está dentro del intervalo horario, la función devuelve el valor 1, y 0 en caso contrario

Este indicador está disponible a partir de la versión 8.10

 

9.49 Función IHIGHEST

Calcula el valor más alto del precio alcanzado en el timeframe y número de velas indicado. La sintáxis es la siguiente: IHIGHEST(TF,numVelas)

Este indicador está disponible a partir de la versión 8.10

 

9.50 Función ILOWEST

Calcula el valor más bajo del precio alcanzado en el timeframe y número de velas indicado. La sintáxis es la siguiente: ILOWEST(TF,numVelas)

Este indicador está disponible a partir de la versión 8.10

 

9.51 Función IDAYOFWEEK

Devuelve el día de la semana  (0-Domingo,1,2,3,4,5,6). La sintáxis es la siguiente: IDAYOFWEEK

Este indicador está disponible a partir de la versión 8.10

 

9.52 Función IDAYOFMONTH

Devuelve del día del mes. La sintáxis es la siguiente: IDAYOFMONTH

Este indicador está disponible a partir de la versión 8.10

 

9.53 Función IDAYOFYEAR

Devuelve de día actual del año. La sintáxis es la siguiente: IDAYOFYEAR

Este indicador está disponible a partir de la versión 8.10

 

9.54 Función IMONTH

Devuelve el mes actual del año (1-Enero,2,3,4,5,6,7,8,9,10,11,12). La sintáxis es la siguiente: IMONTH

Este indicador está disponible a partir de la versión 8.10

 

9.55 Función IHOUR

Devuelve la última hora conocida por el broker. La sintáxis es la siguiente: IHOUR

Este indicador está disponible a partir de la versión 8.10

 

9.56 Función IMINUTE

Devuelve el minuto de la última hora conocida del broker La sintáxis es la siguiente: IMINUTE

Este indicador está disponible a partir de la versión 8.10

 

9.57 Función ISECONDS

Devuelve los segundos del último minuto conocido por el broker La sintáxis es la siguiente: ISECONDS

Este indicador está disponible a partir de la versión 8.10

 

9.58 Función IYEAR

Devuelve el ultimo año conocido por el broker La sintáxis es la siguiente: IYEAR

Este indicador está disponible a partir de la versión 8.10

 

 

10. Persistencia de Sistemas, Series y Órdenes

Scala tiene la posibilidad de tratar de continuar los sitemas por donde estaban en caso de reiniciar el MT4 o quitar y volver a poner el EA. Esto se hace en función del parámetro "Descartar resultados Historicos". Si es true descartarian los sistemas previos, si es false tratará de seguir por donde estaba. Hay factores por los que no se cargarán bien los sistemas previos, como que no cumpla la condición de la regla que hizo ejecutar la serie actual, porque haya pasado tiempo y el precio se haya movido mucho, se hayan cerrado ordenes a mano, etc. etc.

Si bien esto está pensado para continuar en caso de caida del MT4, si cuando carga un sistema o serie ya no está como debería por lo anteriormente indicado, cargará sistemas con órdenes que ya no están, y aparentemente puede que SCALA no haga lo que debería hacer en caso de empezar desde cero. 

La forma de que SCALA no tenga problemas con datos antiguos, bien puede ser poner el parámetro "Descartar resultados Historicos", bien cambiar de Magic Number, o bien borrar los ficheros del MT4 que, al abrir la carpeta de datos, cuelgan del directorio MQL4/Files

 

11. Analizador de Funciones

La configuración de reglas no es fácil, y en ocasiones Scala puede hacer algo distinto a como se esperaba. Bien puede ser fallos de diseño o por fallos en la configuración de reglas o sistemas. Se ha creado el "Scala Analyzer", que lo que permite analizar hasta 10 funciones que ayudan al menos, a verificar que se han puesto correctamente. Si una función no se puede calcular, siempre dará como resultado el valor 0.

Por poner un ejemplo, se puede indicar que analice la funcion IRSI(15,0,14,0), que lo que hará será poner el valor del RSI en M15 de 14 periodos a vela cerrada sobre la vela 0. Imaginemos que la funcion se pone mal, por ejemplo RSI(15,0,14,0), en vez de poner IRSI se pone RSI, la sintaxis es incorrecta y dará siempre valor 0.

 

12. Series Estrategia

Aprovechando la potencia de Scala sobre todo en cuanto a la gestión del capital se refiere, se ha creado un nuevo tipo de serie denominado STRAGEGY, donde se irán implementando diversas estragegias de trading completas cada una con su estrategia.

Esto es una novedad incorporada en la versión 8.10, y de que en principio solo se ha incorporado una estrategia en dicha versión. La documentación se irá ajustando según se vayan creando estrategias nuevas. A tener en cuenta que gracias a la gestión de capital de scala, una estrategia que incialmente pueda ser relativamente neutra, puede ser ganadora incrementando gradualmente el lote y reajustando según se vayan alcanzando las ganancias.

La sintaxis de esta serie dependerá de cada estrategia en cuestion, tenienco como nexo común que todas serán del estilo [{STRATEGY=NombreEstrategia;Lista de parametros}]

 

12.1 Estrategia Hedge

Esta estrategia, implementada en la version 8.10 de scala, consiste en definir un rango de precios con un límite superior y un límite inferior. Si el precio rebasa el límite superior o inferior, crea la primera orden. El TP y SL de dicha orden, de las siguientes que se creen, será siempre del ancho del rango definido. Si una orden sale ganadora, se termina la serie. Si sale en pérdidas, se crea una nueva orden de tipo contrario, pero aumentando el lote. De esta forma, las ordenes se crearán o de compra en el límite superior, o de venta en el límite inferior, y en cuanto una orden salga ganadora, la serie en todal saldrá ganadora. 

Esta estrategia, si no se limita el número de rebotes, puede llegar a hacer quebrar la cuenta, ya que el incremento de lote se hace de forma exponencial. Concretamente, el primer incremento de lote se suma al lote inicial el doble de este (por ejemplo, si el lote inicial es 0.01, la segunda orden tendría 0.03 lotes). Y a partir de la segunda, se dobla el lote (por ejemplo, si la segunda orden es de 0.03 lotes, la tercera sería de 0.06, la siguiente de 0.12, y así sucesivamente).

Por tanto, no es una estrategia apta para todos los mercados, refiriendose con esto al símbolo en cuestión con el que operar, como la volatilidad o amplitud de movimientos de dicho símbolo. Scala proporciona multitud de funciones para determinar si es buen momento para usar dicha estrategia, aquí se dará un simple ejemplo.

Los parámetros que admite esta serie son:

  • STRATEGY=HEDGE: Indica la estrategia en cuestión.
  • NS: Nivel superior del rango. Puede tomar valores de mercado o el calculado por algún indicador
  • NI: Nivel inferior del rango. Igualmente, puede tomar valores de mercado o el calculado por algún indicador
  • MAXR: Máximo de rebotes. Por ejemplo, si se definen 3 rebotes, como máximo la serie generaría 4 órdenes. Si la cuarta orden sale negativa, la serie saldrá negativa
  • LOTS: El lote inicial con el que comienza la primera orden (sujeta a la gestión de capital configurada en scala).

 

Un ejemplo de configuración:

Sistema1: [{STRATEGY=HEDGE;NS=IHIGHEST(60,14);NI=ILOWEST;MAXR=5;LOTS=0.01}]

Reglas1: T1=INTIME(14:00,14:01)==1?T2:T1?T2=S1;T3=GOTO(1)

En el sistema se indica como nivel superior NS, el valor mayor de las ultimas 14 velas en H1, como nivel inferior el valor menor de las últimas 14 velas en H1, y un máximo de rebotes de 5, asumiendo las pérdidas en el supuesto de que se cree una sexta orden y esta salga negativa.

En las reglas, se lanza la serie al alcanzar las 14:00 horas, es decir, que la hora actual este entre las 14:00 y las 14:01. En caso de que la serie termine antes de las 14:01, se volvería a lanzar de nuevo. A tener en cuenta, que una vez que la serie empieza, hasta que no termina no se vuelven a evaluar nuevas reglas, es decir, si al día siguiente la serie aun continua, no volverá a crearse una nueva serie a las 14:00.

Este ejemplo está pensado para mercados como el Nasdaq.

 

 

Descargar Scala v8.11

Descargar Scala Analyzer v8.10