You are on page 1of 11

-

SCRIPT

SCRIPT
Qu es un script de MQL4?
El script es un programa que se ejecuta una vez para ejecutar una accin y
se eliminar inmediatamente despus de la ejecucin.
A diferencia de los asesores expertos que se llamarn cada vez que un
nuevo tick llega, el script
se ejecutar slo una vez.
Y a diferencia de los indicadores que tienen la capacidad para dibujar lneas
en el grfico, el script no tiene acceso a funciones del indicador.
En resumen, el script es un asesor experto que puede ejecutar slo una vez.
Vamos a crear nuestro primer script!
Wizards otra vez!
Con la ayuda del asistente para nuevo programa vamos a crear la columna
vertebral de nuestro script. Llega al asistente para nuevo programa,
elijiendo Nuevo en el men Archivo o haciendo clic en las teclas CTRL + N
(Figura 1).
Vamos a crear un script, as que elige el programa Script en el asistente y
haga clic en siguiente.
Esto abrir el segundo paso del asistente (Figura 2).
Rellene los campos Nombre, Autor y enlace con lo que se ve en la figura 2 (o
lo que quieras). A continuacin, haz clic en Finalizar.

Figure 1 New Program wizard


2

Figure 2 Step 2

Al hacer clic en el botn Finalizar, el asistente escribir algo de cdigo para


usted y dejar los lugares para escribir su propio cdigo, este es el cdigo que
hemos recibido del asistente.
//+------------------------------------------------------------------+
//|
My_First_Script.mq4 |
//|
Copyright Coders Guru |
//|
http://www.forex-tsd.com |
//+------------------------------------------------------------------+
#property copyright "Copyright Coders Guru"
#property link
"http://www.forex-tsd.com"
//+------------------------------------------------------------------+
//| script program start function
|
//+------------------------------------------------------------------+
int start()
{
//---//---return(0);
}
//+------------------------------------------------------------------+

Nota: Como usted puede notar fcilmente en el cdigo anterior el asistente no


ha aadido las funciones init() y deinit() y slo se agrega la funcin start().
Esto se debe a que es raro encontrar un script que necesite ejecutar cdigo en
el inicio o deinicializacin del programa, y la funcin start() se ejecutar una
vez.
Pero eso no significa que no puedas aadir las funciones init() y deinit() en un
script. Usted puede agregarlas si lo desea.
Ahora, tenemos que aadir nuestro cdigo para hacer al script ms til.
Este es el cdigo que hemos aadido al cdigo generado por el asistente arriba
(nuestro cdigo agregado est marcado por el tipo de letra negrita):
//+------------------------------------------------------------------+
//|
My_First_Script.mq4 |
//|
Copyright Coders Guru |
//|
http://www.forex-tsd.com |
//+------------------------------------------------------------------+
#property copyright "Copyright Coders Guru"
#property link
"http://www.forex-tsd.com"
#property show_inputs
#include <stdlib.mqh>
extern double
extern double

TakeProfit=250;
StopLoss=35;

//+------------------------------------------------------------------+
//| script program start function
|
//+------------------------------------------------------------------+
int start()
{

//---int total,cnt,err;

total = OrdersTotal();
for(cnt=0;cnt<total;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderType()==OP_BUY)
// long position is opened
{
OrderModify(OrderTicket(),OrderOpenPrice(
), Bid-Point*StopLoss,Bid+Point*TakeProfit,0,Green);
err=GetLastError();
Print("error(",err,"): ",ErrorDescription(err));
Sleep(1000);
}
if(OrderType()==OP_SELL)
{

// short position is opened

OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*StopLos
s, Ask-Point*TakeProfit,0,Red);
err=GetLastError();
Print("error(",err,"): ",ErrorDescription(err));
Sleep(1000);
}
}
//---return(0);
}
//+------------------------------------------------------------------+

Vamos a descifrar el cdigo lnea por lnea, como solamos hacer.


//+------------------------------------------------------------------+
//|
My_First_Script.mq4 |
//|
Copyright Coders Guru |
//|
http://www.forex-tsd.com |
//+------------------------------------------------------------------+
#property copyright "Copyright Coders Guru"
#property link
"http://www.forex-tsd.com"

Aqu el asistente ha escrito el bloque de comentario que contiene el nombre


del script que hemos elegido, el derecho de autor y el enlace que hemos
escrito.
Luego, dos directivas property se han aadido, segn los datos que hemos
metido, estas son las propiedades de autor y enlace.
#property show_inputs

Hemos agregado la directiva property show_inputs a nuestro script.


Sin esta property el script no aceptar entradas del usuario por lo que
aperecer una ventana de entrada para el usuario como la que se muestra en
la figura 3.

En nuestro script, el usuario puede establecer los valores TakeProfit y


Stoploss desde la ventana de entrada o puede dejar los valores por defecto
que hemos establecido en nuestro cdigo.
Nota: Si usted tiene la intencin de escribir un script que no necesita las
aportaciones de los usuarios, es preferible eliminar la directiva property
show_inputs.

#include <stdlib.mqh>

Figure 3 Script Input window

Ms adelante en el cdigo vamos a utilizar la funcin ErrorDescription funcin


que devuelve una descripcin string del nmero de error pasado. Esta funcin
se incluye en el archivo "stdlib.mqh", por lo que hemos incluido este archivo
en nuestro programa usando la directiva include. Eso significa que el
contenido de "stdlib.mqh" es una parte de nuestro cdigo ahora y que
libremente podemos usar la funcin ErrorDescription.
extern double
extern double

TakeProfit=250;
StopLoss=35;

Aqu hemos declarado dos variables extern que el usuario puede establecer
desde la ventana de entradas del script (Figura 2) o puede dejar los valores
por defecto.
Vamos a utilizar estas variables en nuestra funcin start() para establecer los
valores de takeprofit y stoploss de todas las rdenes ya abiertas.
int start()
{
//---int total,cnt,err;
total = OrdersTotal();
....
}

Estamos dentro de la funcin start() que se llamar slo una vez al adjuntar
el script al grfico.
Hemos declarado tres variables enteras usando un mtodo de declaracin de
lnea nica. Luego asignamos el valor devuelto por la funcin OrdersTotal a la
variable total.
Como recordars la funcin OrdersTotal devuelve el nmero de rdenes
abiertas y pendientes.
for(cnt=0;cnt<total;cnt++)
{
....
}

Aqu entramos en un bucle que comienza en 0 y termina con el total de las


rdenes ya abiertas y pendientes. Vamos a utilizar la variable de bucle cnt
con la funcin OrderSelect para seleccionar cada orden abierta por su ndice.
En cada ciclo del bucle se aumenta la variable cnt en 1.
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);

Hemos seleccionado la orden por su ndice mediante la funcin OrderSelect


y la variable de bucle cnt.
Tenemos que usar la funcin OrderSelect andes de llamar a OrderType en la
lnea siguiente.

if(OrderType()==OP_BUY)
{
....
}

// long position is opened

La funcin OrderType devuelve el tipo de la orden seleccionada que ser uno


de:

OP_BUY,

OP_SELL,

OP_BUYLIMIT,

OP_BUYSTOP,

OP_SELLLIMIT

OP_SELLSTOP.
En lo anterior se chequea si el tipo de orden es una orden de compra o no.
Si se trata de una orden de compra, el cdigo dentro del bloque se ejecutar.
OrderModify(OrderTicket(),OrderOpenPrice(),
Bid-Point*StopLoss,Bid+Point*TakeProfit,0,Green);

Es un tipo de orden Buy, por lo que queremos modificar los valores de


stoploss y takeoprofit a los valores de las variables Stoploss y TakeProfit que
el usuario ha establecido.
Usamos la funcin OrderModify que modifica las propiedades de una
determinada orden abierta o pendiente con los nuevos valores que pasas a la
funcin.
Hemos utilizado los siguientes parmetros:
ticket: Tenemos el ticket de la actual orden seleccionada con la funcin
OrderTicket.
8

price: Tenemos el precio de apertura de la orden actual seleccionada con la


funcin OrderOpenPrice
stoploss: Aqu hemos establecido el valor de stoploss de la orden actual
seleccionada por el importe de la resta del precio bid actual y el valor de
Stoploss que el usuario ha establecido.
takeprofit: Aqu hemos establecido el valor de takeprofit de la orden actual
seleccionada con el valor de la suma del precio bid actual y el valor del
takeprofit que se ha establecido por el usuario.
expiration: No hemos fijado una fecha de caducidad a nuestra orden, as que
utilizamos 0.
arrow_color: Se ha ajustado el color de la flecha a Green.
err=GetLastError();
Print("error(",err,"): ",ErrorDescription(err));
Sleep(1000);

Hemos asignado el valor devuelto por la funcin GetLastError a la variable


err. El GetLastError devuelve el nmero del ltimo error ocurrido despus de
una operacin (OrderModify en nuestro caso).
Pero queremos imprimir no slo el nmero de error, sino la descripcin del
error, por lo que
hemos utilizado la funcin ErrorDescription para la descripcin string del
nmero de error y hemos utilizado la funcin print para la salida de este
mensaje en el registro del experto.
A continuacin, hemos utilizado la funcin Sleep para dar a la terminal y
nuestro script el momento de tomar su descanso durante un segundo (1000
milisegundos).
Nota: La funcin Sleep suspende la ejecucin del programa para un intervalo
especificado, este intervalo pasa a la funcin en milisegundos.
if(OrderType()==OP_SELL)
{
....
}

// short position is opened

En lo anterior se chequea si el tipo de orden es una orden de venta o no.


Si se trata de una orden de venta, el cdigo dentro del bloque se ejecutar.
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*StopLoss,
Ask-Point*TakeProfit,0,Red);

Es un tipo de orden de venta, por lo que queremos modificar los valores de


stoploss y takeprofit a los valores de las variables de Stoploss y TakeProfit que
el usuario ha colocado.
Usamos la funcin OrderModify de nuevo con los siguientes parmetros:
9

ticket: Tenemos el ticket de la actual orden seleccionada con la funcin


OrderTicket.
price: Tenemos el precio de apertura de la orden actual seleccionada con la
funcin OrderOpenPrice.
stoploss: Aqu hemos establecido el valor del stoploss de la orden actual
seleccionada con el valor de la adicin del actual precio ask y el valor de
Stoploss establecido por el usuario.
takeprofit: Aqu hemos establecido el valor de takeprofit de la orden actual
seleccionada con el valor de la resta del actual precio ask y el valor del
TakeProfit establecido por el usuario.
expiration: No hemos fijado una fecha de caducidad a nuestra orden, as que
utilizamos 0.
arrow_color: Se ha ajustado el color de la flecha en Red.
err=GetLastError();
Print("error(",err,"): ",ErrorDescription(err));
Sleep(1000);

Lo mismo que en las lneas explicadas arriba.


return(0);

Es el momento de terminar nuestro script utilizando la funcin return.


Vamos a compilar el script pulsando la tecla F5, tan pronto como se compila
el script, aparecer en la ventana del navegador en la categora script (Figura
4)
Nota: El asistente ha creado el archivo "My_First_Script.mq4" y lo ha puesto
en la carpeta
"experts\scripts" para nosotros.
Usted tiene que poner todos sus scripts en esta carpeta y compilarlos antes
de usarlos en el terminal.

Figure 4 Execute your script


10

Para ejecutar el script simplemente apuntalo con el ratn y haga doble clic en
l, o haga clic en el botn izquierdo del ratn y un men como se muestra en
la figura 4 aparece a continuacin, seleccione Ejecutar en el grfico.
La ventana de entrada (Figura 3) aparecer y usted puede establecer nuevos
valores para Stoploss y TakeProfit o dejar los valores por defecto.
Script_I (No funciona)
BUYv2 (Funciona)

11

You might also like