Se crean ordenes por tickHola.
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.
Re: Se crean ordenes por tickTe 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.
Re: Se crean ordenes por tickDebes 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;
Re: Se crean ordenes por tickGracias 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.
Re: Se crean ordenes por tickHola 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:
Re: Se crean ordenes por tickDefinir 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.
Re: Se crean ordenes por tickHe 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.
10 mensajes
• Página 1 de 2 • 1, 2
|
|
Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados