Se crean ordenes por tick

Foro para cuestiones generales sobre la plataforma MetaTrader 4.

Se crean ordenes por tick

Notapor Pepito454 » 12 Abr 2015, 19:57

Hola.

Estoy empezando a programar en MQL4 y estoy creando un programa que se basa en el indicador Ichimoku, el problema está que cuando se cierra la primera orden comienzan a crearse y cerrarse ordenes por cada tick nuevo que se produce y no tengo ni idea por que ocurre esto.
Si alguien me puede ayudar se lo agradecería mucho.

Un saludo.
Pepito454
 
Mensajes: 23
Registrado: 18 Jun 2014, 11:27
Karma: 0

Re: Se crean ordenes por tick

Notapor cdtrader » 13 Abr 2015, 12:59

si pones el codigo o parte de el me puedo fijar donde esta el error.
Avatar de Usuario
cdtrader
 
Mensajes: 1428
Registrado: 23 Ago 2014, 13:47
Karma: 17

Re: Se crean ordenes por tick

Notapor Pepito454 » 13 Abr 2015, 15:55

Te envío lo que estoy haciendo por el momento.

#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict

bool EntrBajista = 0;
bool EntrAlcista = 0;
bool SalBajista = 0;
bool SalAlcista = 0;
bool cierreOrdAlcista = 0;
bool cierreOrdBajista = 0;
bool OrdSel;
bool OrdClo;
bool zonaBajista = 0;
bool zonaAlcista = 0;

int ticket;

int numOrd = 1;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---

//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---

}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
double kijun = iIchimoku(NULL,0,9,26,52,MODE_KIJUNSEN,1);
double spanA = iIchimoku(NULL,0,9,26,52,MODE_SENKOUSPANA,1);
double spanB = iIchimoku(NULL,0,9,26,52,MODE_SENKOUSPANB,1);
double OrdenesMercado = OrdersTotal();
//condiciones para entrada venta

if ((kijun<spanA) && (kijun<spanB))
{
zonaBajista = 1;
if ((High[1]<kijun) && (Low[1]<kijun))
{
EntrBajista = 1;

Comment ("Orden Bajista");
}
else
Comment("");
}

//condiciones para entrada compra

if ((kijun>spanA) && (kijun>spanB))
{
zonaAlcista = 1;
if ((Low[1]>kijun) && (High[1]>kijun))
{
EntrAlcista = 1;

Comment ("Orden Alcista");
}
else
Comment("");
}


//condiciones para salida venta
if (EntrBajista == 1)
{
if (((Low[1]>kijun) && (High[1]>kijun)) || (High[1]>=spanA))
{
SalBajista = 1;

Comment ("Salida Orden Bajista");
}
else
Comment("");
}

//Condicione para salida compra
if (EntrAlcista == 1)
{
if (((High[1]<kijun) && (Low[1]<kijun)) || (Low[1]<=spanA))
{
SalAlcista = 1;
Comment ("Salida Oreden Alcista");
}
else
Comment("");
}
//Entradas en el mercado
if (OrdenesMercado < numOrd)

{
if (EntrBajista == 1)
{
ticket = OrderSend(NULL,OP_SELL,0.03,Bid,3,0,0,NULL,0,0,clrBlack);

}
else if (EntrAlcista == 1)
{
ticket = OrderSend(NULL,OP_BUY,0.03,Ask,3,0,0,NULL,0,0,clrBlue);

}
return;
}
//Salidas del mercado
if (OrdenesMercado == numOrd)

//seleccion de orden para el cierre
OrdSel = OrderSelect (ticket,SELECT_BY_TICKET);


if ((OrderType() == OP_BUY) && (SalAlcista == 1))
{
OrdClo = OrderClose (ticket, 0.03, Bid, 3, clrRed);

}

if ((OrderType() == OP_SELL) && (SalBajista== 1))
{
OrdClo = OrderClose (ticket, 0.03, Ask, 3,clrRed);

}
return;



}
//+------------------------------------------------------------------+

Seguro que se puede mejorar.
Gracias.
Pepito454
 
Mensajes: 23
Registrado: 18 Jun 2014, 11:27
Karma: 0

Re: Se crean ordenes por tick

Notapor MacD » 14 Abr 2015, 17:24

Debes definir una variable bool que realice la funcion a modo de semaforo para cuando hay una orden abierta no abra mas.

Esto quiere decir que esa variable la pondras a FALSE cuando hay una orden abierta y la pondras a TRUE cuando no hay ordenes abiertas.

Esa misma variable la usaras como señal para permitir abrir una nueva orden.


por ejemplo, asi quedaria en tu codigo:

bool permiso;
.
,
,

if (EntrBajista == 1 && permiso == TRUE)
{
ticket = OrderSend(NULL,OP_SELL,0.03,Bid,3,0,0,NULL,0,0,clrBlack);
permiso = FALSE;
}

else if (EntrAlcista == 1 && permiso == TRUE)
{
ticket = OrderSend(NULL,OP_BUY,0.03,Ask,3,0,0,NULL,0,0,clrBlue);
permiso = FALSE;
}


if (OrdenesMercado == 0)
permiso = TRUE;
MacD
 
Mensajes: 79
Registrado: 08 Jul 2014, 03:48
Karma: 0

Re: Se crean ordenes por tick

Notapor Pepito454 » 16 Abr 2015, 10:47

Gracias MacD, por las molestias que te has tomado, pero sigue sin funcionar. Es curioso lo que ocurre pero creo que es un fallo del programa, por la forma de crear una orden y cerrarla al siguiente Tick que cuando te quieres dar cuenta te ha ejecutado 100 ordenes y no cumplen las condiciones reales de apertura y cierre que están escritas en el programa. He conseguido que esto no ocurra pero colocando dos condiciones para el cierre, claro esto no me vale pues ya no se ejecuta la orden como yo quiero.
Supongo que ha cualquiera de vosotros que tenéis mucha mas experiencia en esto que yo también os habrá ocurrido.
Gracias de nuevo MacD.
Pepito454
 
Mensajes: 23
Registrado: 18 Jun 2014, 11:27
Karma: 0

Re: Se crean ordenes por tick

Notapor cdtrader » 16 Abr 2015, 16:37

Hola pepito, tu error esta en que una vez que haces que la variable sea 1 nunca la pones nuevamente como 0, lo que tienes que hacer es declarar las variables justo despues de
"Void OnTick" en lugar de como variables globales, asi:
Código: Seleccionar todo
void OnTick()
{
bool EntrBajista = 0;
bool EntrAlcista = 0;
bool SalBajista = 0;
bool SalAlcista = 0;
bool cierreOrdAlcista = 0;
bool cierreOrdBajista = 0;
bool OrdSel;
bool OrdClo;
bool zonaBajista = 0;
bool zonaAlcista = 0;
.
.
.
Avatar de Usuario
cdtrader
 
Mensajes: 1428
Registrado: 23 Ago 2014, 13:47
Karma: 17

Re: Se crean ordenes por tick

Notapor MacD » 16 Abr 2015, 17:22

Definir esas variables como globales e inicializarlas esta bien, el fallo sera que en el bucle principal del EA ( OnTick()) esas variables no las gestiona bien y no las actualiza al valor que deberian de tener segun su estado.

Si esas variables las defines dentro del cuerpo de la funcion OnTick(), a cada nuevo tick se inicializan a 0 y perderan su funcion de variable de estado.

La unica manera de que no se ejecuten mas ordenes que una sola es de la manera que te he comentado, no es nada nuevo y podras verlo implementado en muchos EAs que encuentres en la red.
No he leido detenidamente tu programa como para buscar un error de programacion, lo unico que he visto es lo que te he comentado en anterior post, la parte de codigo que abre las ordenes estan insuficientemente condicionadas. Tambien cabe decir que puede ser que la parte de codigo que manda cerrar las ordenes este mal condicionado y eso provoque que las ordenes que se abren acto seguido se cierran sin mas.

Te aconsejo que utilices la estructura de uno de ellos y sobre ese montes tu logica de trading. La mt4 trae dos Eas como muestra que podras usar, por ejemplo el de Emas.(MovinAverage.mq4).

Por otra parte no se cual es tu nivel y experiencia en Programacion ( sea cual sea el lenguaje que manejes) estos conceptos son basicos en programacion generica, independientemente del lenguaje que se utilice.
MacD
 
Mensajes: 79
Registrado: 08 Jul 2014, 03:48
Karma: 0

Re: Se crean ordenes por tick

Notapor MacD » 16 Abr 2015, 17:57

He leido mas detenidamente el codigo y yo me centraria mas en depurar como se actualizan las variables SalAlcista y SalBajista, esas son las que dan la confirmacion de que la oden se cierre. Me da la impresion que las condiciones que has puesto y que ponen esas vaiables a 1, se cumplen nada mas abierta la orden, porque entrara en el circulo vicioso de abrir cerrar ordenes.
MacD
 
Mensajes: 79
Registrado: 08 Jul 2014, 03:48
Karma: 0

Siguiente

Volver a MetaTrader 4

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 2 invitados