Significado de resultados de optimización con Backtesting en Metatrader

Cuando hacemos una optimización en Metatrader, cada resultado tiene unos valores que nos indican que tan bueno es la prueba hecha. Acá va una pequeña explicación de cada valor.

Pass: Este valor indica el numero de la prueba. Es como el id.

Profit: Es la ganancia en dolares de la prueba.

Total trades: Es el total de operaciones hechas.

Profit factor: Es la relación entre perdidas y ganancias. Si el valor en 1, quiere decir que las perdidas y las ganancias son iguales. Conviene sobre manera, buscar los resultados que esten mas por encima de 1. Si por ejemplo este valor fuera 2, quiere decir que las ganancias fueron el doble que las perdidas.

Expected Payoff: Es el calculo estadistico de cuanto se puede ganar en efectivo en cada operacion. Osea, cuanto podria esperar ganar en una operacion con esta estrategia.

Drawdown $: Esta y la siguiente no las entiendo muy bien. La mayor reducción en relación con el depósito inicial, el depósito en moneda.

Drawdown %: La mayor reducción en relación con el depósito inicial, en porcentaje.

Ejemplo – Pasar array como parametro en funcion MQL4 – Metatrader

Para pasar un array como parametro en una funcion debemos hacer lo siguiente.

string arrayPrueba[10] = {"Cero", "Uno", "Dos", "Tres", "Cuatro", "Cinco", "Seis", "Siete", "Ocho"};

void ArrayComoParametro(string& array[])
{

array[1] = "Otro Numero";

}

int init()
{
Alert(arrayPrueba[1]);
ArrayComoParametro(arrayPrueba);
Alert(arrayPrueba[1]);
}

Función iCustom() para obtener valores de un indicador personalizado

La funicion  iCustom() se utiliza cuando necesitamos utilizar un indicador personalizado. Su estructura es la siguiente.
double iCustom(
                       string symbol,
                       int timeframe,
                       string name,
                       ...,
                       int mode,
                       int shift
)
Esta función devuelve el valor que nos interesa saber de la línea de un indicador.

symbol: Representa la divisa a utilizar. Si se coloca NULL se tomará como la divisa actual.

timeframe: Representa la temporalidad de la grafica. Si es 0 se tomará el periodo actual.

name: Nombre del indicador.

…: Los parámetros del indicador (si es necesario). Estos parámetros deben corresponder con el de las variables externas del indicador, y también con su orden y su tipo.

mode:  Acá colocamos el índice de la línea que nos interesa utilizar. Como solo se puede tener 8 líneas en un indicador, esta valor solo puede ir de 0 a 7.

shift: Debido a que todos los datos de una línea se almacenan en una array, acá colocamos el índice de la barra o vela en este array, de la cual nos interesa saber el valor de la línea que indicamos en mode.

Un ejemplo de utilizacon seria…
double L_1=iCustom(NULL,0,"rocseparate",H,P,B,A,1,0);

Mas info en ingles

Modificar ordenes con OrderModify();

En las órdenes abiertas podemos modificar el StopLoss y el TakeProfit. En las órdenes pendientes podemos modificar todos sus parámetros. Para esto utilizamos OrderModify();. Veamos  su estructura.

bool OrderModify(
              int ticket,
              double price,
              double stoploss,
              double takeprofit,
              datetime expiration,
              color arrow_color=CLR_NONE
)

La función devuelve true si se hace la modificación con éxito, si no, devuelve false.

ticket: El numero único de la orden.

price: El nuevo precio para una orden pendiente, o (no estoy seguro) un precio para una orden nueva de mercado. Aplica solo para las órdenes pendientes (creo).

stoploss: El nuevo precio para el stoploss.

takeprofit: El nuevo precio para el takeprofit.

expiration: La nueva fecha de clausura de la orden. Aplica solo para las órdenes pendientes. Si uno no quiere modificar la fecha de expiración hay que colocar 0.

arrow_color:
Definir el color de la flecha para la orden. Si se deja en blanco no ha flecha.

Para mas info en ingles http://book.mql4.com/trading/ordermodify

Cerrando órdenes opuestas con OrderCloseBy(); para ahorrar dinero

Si uno tiene dos posiciones abiertas, pero contrarias en la misma gráfica, uno puede hacer que se anulen o cierren mutuamente con OrderCloseBy();. Uno se puede ahorrar la diferencia de ganancias de las dos posiciones opuestas, dinero que no se ahorraría si se utiliza OrderClose() para cerrar una por una. Ejemplo.

Utilizando OrderClose() para cerrar una por una

Utilizando OrderCloseBy(); 

bool OrderCloseBy(
            int ticket,
            int opposite,
            color Color=CLR_NONE
);

ticket: Acá colocamos el número de identificación de la orden que queremos cerrar.

opposite: Colocamos el numero de la orden contraria.

color: El color de la flecha que indica en la grafica donde se cerraron las ordenes. Si no se coloca nada, no se muestra la flecha.

Ver mas info en ingles http://book.mql4.com/trading/orderclose

Cerrar las posiciones con OrderClose(); y OrderSelect ();

OrderClose();

Esta función se utiliza para cerrar posiciones abiertas. Si se cierra con éxito devuelve true. Si se produce algún error devuelve false.
Veamos la estructura de la función.

bool OrderClose (
                 int ticket,
                 double lots,
                 double price,
                 int slippage,
                 color Color=CLR_NONE
);

ticket: Acá debemos colocar el número de identificación de la orden que queremos cerrar. Este lo recibimos cuando crearnos la orden con OrderSend();.

lots:
La cantidad de lotes que se cerraran. Se pueden cerrar una porción de la posición, más no toda.

price:
Esta parte es muy parecida a OrdenSend();. Aca colocamos el precio al que queremos cerrar la posición, y también podemos colocar un rango de pips en los que también se cerrara la posición aunque el precio no sea exacto.  Queda mas claro viendo la explicación de OrderSend();

slippage: es el mismo slippage que el de OrderSend() pero aplicado al cierre de la posición.

Color: Es el color de la flecha que va a indicar cuándo se cerró la posición en la grafica. Si no se coloca nada no se ve ninguna flecha.

La función OrderClose(); no tiene sentido utilizarla si no tenemos la información sobre las posiciones abiertas. Por esta razón, es vital tener la información de las posiciones abiertas o tener alguna forma de conseguir esta información.

En MQL4, hay unas funciones especiales que sirven precisamente para obtener información de las posiciones abiertas o posiciones pendientes. Por ejemplo, la función OrderOpenPrice() devuelve el  precio con el que se abrió una posición o el precio de ejecución de una orden pendiente. La función OrderLots() devuelve la cantidad de lotes. OrderType() devuelve el tipo de la orden, asi etc.

Todas las funciones que nos dan información de las pociones abiertas o las posiciones pendientes, necesitan antes tener una orden seleccionada. Para esto debemos utilizar OrderSelect().

Función OrderSelect ();

Para obtener información, modificar, cerrar o eliminar posiciones abiertas o ordenes pendientes, primero debemos utilizar OrderSelect();. Por lo que he visto de código OrderSelect() literalmente hace eso, seleccionar una orden, y al hacerlo todas las demás funciones que den información, modifiquen o eliminen una orden, van a trabajar con la orden seleccionada por OrderSelect(). El proceso por el que mediante OrderSelect() se termina seleccionando una orden, funciona parecido a un tamiz, en el cual, mediante un ciclo y varias condicionales, se va filtrando un grupo de órdenes, seleccionando varias órdenes en el proceso, hasta dejar solo la orden que se quiere seleccionar. Veamos su estructura.

bool OrderSelect(
                            int index,
                            int select,
                            int pool=MODE_TRADES
);

OrderSelect(); es una función que devuelve true si se ejecuta correctamente y si no, devuelve false.

index: En este parámetro hay dos opciones. Una es colocar el número único de una orden. La segunda opción es colocar la posición o índice de la orden con respecto a una lista. Cuál de estas dos opciones se elija depende del segundo parámetro.

select: En este parámetro elegimos el tipo de índice que queremos utilizar. Solo hay dos opción que son dos constantes. SELECT_BY_POS y SELECT_BY_TICKET.

  • SELECT_BY_POS: Si colocamos SELECT_BY_POS  en select, encontraremos la orden un índice de una lista.
  • SELECT_BY_TICKET: Si elegimos SELECT_BY_POS en select, encontraremos la orden con el numero único de la orden.

pool: Este parámetro solo es útil si en select elegimos la opciones de encontrar por índice, ósea SELECT_BY_POS . Si en el segundo parámetro seleccionamos SELECT_BY_TICKET deberemos dejar en blanco este parámetro. Este parámetro sirve para seleccionar la lista en la que vamos a utilizar el índice. Solo hay dos opciones. MODE_TRADES y MODE_HISTORY

  • MODE_TRADES (por defecto): Elige la lista donde están las posiciones abiertas y posiciones pendientes.
  • MODE_HISTORY (por defecto): Elige la lista donde están las posiciones abiertas y posiciones pendientes.

Las funciónes MarketInfo(); y RefreshRates();

La función MarketInfo(); permite obtener información de las divisas disponibles. 

double MarketInfo(string symbol, int type);

En symbol colocamos el nombre de la divisa de la que queremos tener información. En type colocamos la información que necesitamos tener. MarketInfo() y RefreshRates() son dos funciones muy útiles porque ayudan a tener la información de los precios lo más actualizada posible, evitando que se generen errores por datos desactualizados. Por esta razón es de vital importancia utilizar estas dos funciones antes de utilizar OrderSend(); con el fin de hacer la orden con los datos más recientes.

Para mas info en ingles http://book.mql4.com/trading/ordersend