Acceder

Duda con MQL4

8 respuestas
Duda con MQL4
Duda con MQL4
Página
1 / 2
#1

Duda con MQL4

Buenas. Hasta ahora he programado algo en visualchart y prorealtime. Decidí programar mis sistemas en MQL4 y ayer me puse a ello.

El problema que tengo es que con este código (resumido, y copiado de otros sistemas públicos), me sale un error de "invalid ticket for orderclose function" y no doy con él.

Las órdenes de compra se producen, pero si pongo una de venta, al permitirse el hedging no se cierra la anterior, y ese es mi problema.

A ver si me podeis ayudar. Gracias.

if (OrdersTotal()==0) // COMPROBACIÓN DE QUE ESTEMOS FUERA DEL MERCADO
{
if (COND1) // CONDICIÓN DE COMPRA
{
IDticket=OrderSend(Symbol(),OP_BUY,Lots,Bid,1000,0,50000,"",20000,0,Blue);
}
}

if (OrderType()==OP_BUY) // COMPROBACIÓN DE QUE ESTEMOS LARGOS
{
if (COND2) // CONDICIÓN DE CIERRE LARGO
{
OrderClose(IDticket,Lots,Ask,1000,Red);
}
}

#2

Re: Duda con MQL4

Hola Kosparuk,
A ver si conseguimos ayudarte...
¿Qué es exactamente lo que intentas, abrir una posición de venta mientras mantienes otra de compra abierta o lo que no te permite es cerrar la compra antes de abrir la venta?
Aprovecho para guiarte en tus inicios en programación en MQL, ya que parece que tienes base suficiente en sistemas, y te adjunto la página más completa http://www.mql4.com/search/ERR_INVALID_TICKET por ejemplo, aquí podrás leer acerca de ese posible error e investigar la razón... además tienes nuemerosos artículos interesantísimos, código de indicadores, scripts, sistemas automáticos, etc. y manuales y documentación para parar un tren.
Para los que se preguntan cómo empezar con los sistemas automáticos pueden navegar en la sección especial de RANKIA, patrocinada por XTB, leer los artículos, participar en los foros...
Un saludo!

#3

Re: Duda con MQL4

Intento cerrar una orden de compra. Si consigo eso luego ya "copio y pego" a la inversa para la de venta.

La web la tengo en favoritos, y ando ojeando por los sistemas que ya hay por allí. El problema es que todos los que he visto cierran sus órdenes con trailings, o cierran todas las posiciones a la vez en una sola función independiente. Vamos, que son sistemas más avanzados de lo que pretendo, y no encuentro el más sencillo sistema de cruce de medias, que sería el que me serviría para copiar las órdenes.

PD: ayer asistí al cursillo de sistemas. Muy bien presentado, y una herramienta muy interesante la que usais para darlos. Lo único que el contenido fue demasiado light para mi, que ya ando metido en mejorar el MM e intentar crear un portfolio.

#4

Re: Duda con MQL4

Entiendo, voy a intentar copiar aquí el código de uno de los ejemplos que trae de serie la plataforma XTB Trader, muy similar a lo que pretendes con cruces de medias pero con alguna cosa más que te vendrá bien para entender el código, no creo que te resulte difícil leerlo, ya empezar de cero es otra historia...
//+------------------------------------------------------------------+
//| Moving Average.mq4 |
//| Copyright © 2005, MetaQuotes Software Corp. |
//| http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#define MAGICMA 20050610

extern double Lots = 0.1;
extern double MaximumRisk = 0.02;
extern double DecreaseFactor = 3;
extern double MovingPeriod = 12;
extern double MovingShift = 6;
//+------------------------------------------------------------------+
//| Calculate open positions |
//+------------------------------------------------------------------+
int CalculateCurrentOrders(string symbol)
{
int buys=0,sells=0;
//----
for(int i=0;i0) return(buys);
else return(-sells);
}
//+------------------------------------------------------------------+
//| Calculate optimal lot size |
//+------------------------------------------------------------------+
double LotsOptimized()
{
double lot=Lots;
int orders=HistoryTotal(); // history orders total
int losses=0; // number of losses orders without a break
//---- select lot size
lot=NormalizeDouble(AccountFreeMargin()*MaximumRisk/1000.0,1);
//---- calcuulate number of losses orders without a break
if(DecreaseFactor>0)
{
for(int i=orders-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Error in history!"); break; }
if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;
//----
if(OrderProfit()>0) break;
if(OrderProfit()<0) losses++;
}
if(losses>1) lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1);
}
//---- return lot size
if(lot<0.1) lot=0.1;
return(lot);
}
//+------------------------------------------------------------------+
//| Check for open order conditions |
//+------------------------------------------------------------------+
void CheckForOpen()
{
double ma;
int res;
//---- go trading only for first tiks of new bar
if(Volume[0]>1) return;
//---- get Moving Average
ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);
//---- sell conditions
if(Open[1]>ma && Close[1]ma)
{
res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,0,0,"",MAGICMA,0,Blue);
return;
}
//----
}
//+------------------------------------------------------------------+
//| Check for close order conditions |
//+------------------------------------------------------------------+
void CheckForClose()
{
double ma;
//---- go trading only for first tiks of new bar
if(Volume[0]>1) return;
//---- get Moving Average
ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);
//----
for(int i=0;ima && Close[1]ma) OrderClose(OrderTicket(),OrderLots(),Ask,3,White);
break;
}
}
//----
}
//+------------------------------------------------------------------+
//| Start function |
//+------------------------------------------------------------------+
void start()
{
//---- check for history and trading
if(Bars<100 || IsTradeAllowed()==false) return;
//---- calculate open orders by current symbol
if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
else CheckForClose();
//----
}
//+------------------------------------------------------------------+

Aprovecho para darte las gracias por lo del seminario de ayer y espero que pronto seas cliente de XTB para ver el 2º (más avanzado, entramos en código, usamos herramientas de ayuda, optimización y mucho más) Te recuerdo que estamos a tu disposición en el 91 570 67 05 para lo que quieras.
Un saludo!

#5

Re: Duda con MQL4

Resuelto al poner OrderTicket() dentro de OrderClose, en vez de la variable.

Gracias.

#6

Re: Duda con MQL4

Me alegro!
Gracias a ti, para eso estamos

#7

Re: Duda con MQL4

Hola Kosparuk,

por si te sirve de ayua adcional comentar algo de tu codigo:

if (OrdersTotal()==0) // COMPROBACIÓN DE QUE ESTEMOS FUERA DEL MERCADO
{
if (COND1) // CONDICIÓN DE COMPRA
{
IDticket=OrderSend(Symbol(),OP_BUY,Lots,Bid,1000,0,50000,"",20000,0,Blue);
}
}

if (OrderType()==OP_BUY) // COMPROBACIÓN DE QUE ESTEMOS LARGOS
{
if (COND2) // CONDICIÓN DE CIERRE LARGO
{
OrderClose(IDticket,Lots,Ask,1000,Red);
}
}

... este codigo que pones... posiblemente (de hecho seguro que es asi) entres al mercado con una compra... pero en la vela en que entras... no se producen las condiciones para el cierre.
Dicha condicion de cierre se procudirá en algun momento futuro, pero cuando ocurre la condicion de cierre.... la variable NO CONTIENE EL VALOR DEL TICKET de la orden de compra que hiciste en su momento.

Me explico?. Comentarte a todo esto que la funcion Start se ejecuta en cada tick... con lo cual es obvio la idea que intento transmitirte (las variables locales declarades dentro de un EA se "resetean" en cada instancia de ejecucion.

Saludos

#8

Re: Duda con MQL4

Gracias. No sabía que se reseteasen todas. Por eso los programas que veo crean funciones de compra y venta aparte, y las llaman en el start.

Por otro lado, no pretendo que la orden cierre en la misma vela de entrada. Es un sistema en 30 minutos en SPA35, y sólo me da 1 orden a la semana, más o menos.

La verdad es que después de programarlo no obtuve los resultados que obtengo ni en PRT ni en visualchart; ni se parecen. Al principio le eché la culpa a la horquilla del SPA35 de 10 puntos, pero yendo con 0.1 lotes en un fondo de 10.000€, debería salirme parecido al mini-ibex, y no. Corregidme si me equivoco, porque no sé cómo plantearlo.