Está perdiendo oportunidades comerciales:
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Registro
Entrada
Usted acepta la política del sitio web y las condiciones de uso
Si no tiene cuenta de usuario, regístrese
Entrada de tiempo personalizada en MQL4
¿Es posible escribir un código con MQL4 que pueda dibujar una línea horizontal a partir de una barra definida por el usuario hasta el final del gráfico
Aquí está el mismo código con Metastock
Dy:=Input("Day",1,31,1);
Mn:=Input("Month",1,12,1);
Yr:=Input("Year",2000,2012,2010);
{Time Calculation}
Time:=Dy=DayOfMonth() AND Mn=Month() AND Yr=Year();
{Formula}
Start:= ValueWhen(1,Time,CLOSE);
{Output}
Start;Y aquí está el resultado
Espero poder hacer lo mismo con MQL4
Pruebe como esto :
extern string startFrom = "2012.07.06 00:00";
int init() { return(0); }
int deinit() { ObjectDelete("hLine"); return(0); }
int start()
{
string name = "hLine";
int barShift = iBarShift(NULL,0,StrToTime(startFrom));
ObjectCreate(name,OBJ_TREND,0,0,0,0,0);
ObjectSet(name,OBJPROP_PRICE1,Close);
ObjectSet(name,OBJPROP_PRICE2,Close);
ObjectSet(name,OBJPROP_TIME1,Time);
ObjectSet(name,OBJPROP_TIME2,Time[0]);
return (0);
}Simplemente copie y pegue en algún indicador (es un indicador que ya funciona) y adjúntelo al gráfico.
Es posible escribir un código con MQL4 que pueda dibujar una línea horizontal a partir de una barra definida por el usuario hasta el final del gráfico
Aquí está el mismo código con Metastock
Dy:=Input("Day",1,31,1);
Mn:=Input("Month",1,12,1);
Yr:=Input("Year",2000,2012,2010);
{Time Calculation}
Time:=Dy=DayOfMonth() AND Mn=Month() AND Yr=Year();
{Formula}
Start:= ValueWhen(1,Time,CLOSE);
{Output}
Start;Y aquí está el resultado
Espero poder hacer lo mismo con MQL4Pruebe como esto :
extern string startFrom = "2012.07.06 00:00";
int init() { return(0); }
int deinit() { ObjectDelete("hLine"); return(0); }
int start()
{
string name = "hLine";
int barShift = iBarShift(NULL,0,StrToTime(startFrom));
ObjectCreate(name,OBJ_TREND,0,0,0,0,0);
ObjectSet(name,OBJPROP_PRICE1,Close);
ObjectSet(name,OBJPROP_PRICE2,Close);
ObjectSet(name,OBJPROP_TIME1,Time);
ObjectSet(name,OBJPROP_TIME2,Time[0]);
return (0);
}Eres el mejor muchas gracias mladen
Hola Mladen,
¿Puedes explicarme mejor la razón de ser de las funciones aquí? Todavía no lo entiendo bien. Gracias
Terrance
Prueba con esta función :
{
int openedOrders = 0;
for(int i=0; i < OrdersTotal(); i++)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) break;
if(OrderSymbol() != Symbol()) continue;
if(OrderMagicNumber() != MagicNumber) continue;
if(OrderType() == type) openedOrders++;
}
return(openedOrders);
}
[/PHP]
To count opened buy orders, call it like this :
to count opened sell orders, call it like this :
[PHP]int openedSells = countOpened(OP_SELL);tkuan77
Usted quería limitar las órdenes a 1 compra y 1 venta a la vez.
Así que si llamas al contador de órdenes abiertas antes de abrir cualquiera de las posiciones, puedes controlar cuántas compras o ventas abiertas tienes.
un ejemplo :
si openBuys uis cualquier cosa menos 0 usted no abre una nueva orden de compra. La misma lógica se aplica a la venta (que es el segundo ejemplo en ese post)
Hola Mladen,
¿Puedes explicarme mejor la lógica de las funciones aquí? Todavía no lo entiendo bien. Gracias
TerranceHola Mladen,
Tal vez me he expresado mal. Lo que estoy tratando de conseguir es que cuando se cumplan mis criterios de compra, se desencadene una compra y si se vuelve a cumplir otro criterio de compra, se desencadene otra compra O venta si se cumple el criterio de venta. Sin embargo, el máximo comercio que tendré en cualquier punto del tiempo será 2.
He probado tu método anteriormente y todavía me encuentro con que el sistema abre 2 operaciones al mismo tiempo, por lo que intenté limitarlo con la función Bars con el mismo problema de que el EA abre 2 operaciones al mismo tiempo.
¿Cuál puede ser la causa? ¿Tiene algo que ver con mi lógica?
Saludos
Terrance
tkuan77
Usted quería limitar las órdenes a 1 compra y 1 venta a la vez.
Así que si llamas al contador de órdenes abiertas antes de abrir cualquiera de las posiciones, puedes controlar cuántas compras o ventas abiertas tienes.
un ejemplo :
Puede añadir la comprobación de si ya se ha abierto una orden de algún tipo en una barra actual y así evitará la apertura de una nueva orden en el siguiente tick. Si la respuesta es afirmativa (hubo una orden abierta en una barra actual), entonces no se abre una nueva orden. Si no, puede abrir una nueva orden. Aquí hay una función que puede contar las órdenes de tipo rewuired abiertas en una barra actual
{
int openedAtBar = 0;
datetime startTime = Time[0];
datetime endTime = Time[0]+Period()*60;
for(int i=0; i < OrdersTotal(); i++)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) break;
if(OrderMagicNumber() != MagicNumber) continue;
if(OrderSymbol() != Symbol()) continue;
if(OrderType() != type) continue;
if(OrderOpenTime()=endTime) continue;
openedAtBar++;
break;
}
return(openedAtBar);
}
Hola Mladen,
Tal vez me he expresado mal. Lo que estoy tratando de conseguir es que cuando se cumplan mis criterios de compra, se desencadene una compra y si se vuelve a cumplir otro criterio de compra, se desencadene otra compra O venta si se cumple el criterio de venta. Sin embargo, el máximo comercio que tendré en cualquier punto del tiempo será 2.
He probado tu método anteriormente y todavía me encuentro con que el sistema abre 2 operaciones al mismo tiempo, por lo que intenté limitarlo con la función Bars con el mismo problema de que el EA abre 2 operaciones al mismo tiempo.
¿Cuál puede ser la causa? ¿Tiene algo que ver con mi lógica?
Saludos
TerranceHola Mladen,
Tal vez me haya expresado mal. Lo que estoy tratando de conseguir es que cuando se cumplan mis criterios de compra, se desencadene una compra y si se vuelve a cumplir otro criterio de compra, se desencadene otra compra O una venta si se cumplen los criterios de venta. Sin embargo, el máximo comercio que tendré en cualquier punto del tiempo será 2.
He probado tu método anteriormente y todavía me encuentro con que el sistema abre 2 operaciones al mismo tiempo, por lo que intenté limitarlo con la función Bars con el mismo problema de que el EA abre 2 operaciones al mismo tiempo.
¿Cuál puede ser la causa? ¿Tiene algo que ver con mi lógica?
Saludos
Terranceeso es porque no especificaste como quieres que la segunda operación sea diferente a la primera. La diferenciación podría ser en forma de x número de barras o precio alejado del FirstBuyPrice.
Gracias Mladen por la ayuda, sin embargo, sólo quiero comprobar con usted, ¿pongo el código antes de la función de mi largo / corto, en el medio o en otro lugar? Porque parece que sigue apareciendo el error y no puedo encontrar la fuente de la misma. ¿Y se supone que MagicNumber es un número entero?
Terrance
total = OrdersTotal();
if(total < 2)
{
int countOpenedOnACurrentBar(int type)
{
int openedAtBar = 0;
datetime startTime = Time[0];
datetime endTime = Time[0]+Period()*60;
for(int i=0; i < OrdersTotal(); i++)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) break;
if(OrderMagicNumber() != MagicNumber) continue;
if(OrderSymbol() != Symbol()) continue;
if(OrderType() != tipo) continuar;
if(OrderOpenTime()=endTime) continue;
openedAtBar++;
romper;
}
return(openedAtBar);
}
if(isCrossed == 1 && shortEma > mainshortEma && longEma > mainshortEma)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,Ask-StopLoss*Point,Ask+TakeProfit*Point,
"Mi EA",12345,0,Verde);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("Orden de COMPRA abierta : ",OrderOpenPrice());
}
else Print("Error al abrir la orden de COMPRA : ",GetLastError());
return(0);
}
if(isCrossed == 2 && shortEma < mainshortEma && longEma < mainshortEma)
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,Bid+StopLoss*Point,Bid-TakeProfit*Point,
"Mi EA",12345,0,Rojo);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("Orden de venta abierta : ",OrderOpenPrice());
}
else Print("Error al abrir la orden de VENTA : ",GetLastError());
return(0);
}
return(0);
}
Puede añadir la comprobación de si ya se ha abierto una orden de algún tipo en una barra actual y así evitará la apertura de una nueva orden en el siguiente tick. Si la respuesta es afirmativa (hubo una orden abierta en una barra actual), entonces no se abre una nueva orden. Si no, puede abrir una nueva orden. Aquí hay una función que puede contar las órdenes de tipo rewuired abiertas en una barra actual
{
int openedAtBar = 0;
datetime startTime = Time[0];
datetime endTime = Time[0]+Period()*60;
for(int i=0; i < OrdersTotal(); i++)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) break;
if(OrderMagicNumber() != MagicNumber) continue;
if(OrderSymbol() != Symbol()) continue;
if(OrderType() != type) continue;
if(OrderOpenTime()=endTime) continue;
openedAtBar++;
break;
}
return(openedAtBar);
}
...
Terrance
Eso es una función. Colócala al final de tu EA y coloca llamadas a ella donde creas conveniente para comprobar si una orden ya está abierta en una barra actual
Gracias Mladen por la ayuda, sin embargo, sólo quiero comprobar con usted, ¿pongo el código antes de la mi función de largo / corto, en el medio o en otro lugar? Porque parece que sigue apareciendo el error y me parece que no puedo encontrar la fuente de la misma. ¿Y se supone que MagicNumber es un número entero?
Terrance
total = OrdersTotal();
if(total < 2)
{
int countOpenedOnACurrentBar(int type)
{
int openedAtBar = 0;
datetime startTime = Time[0];
datetime endTime = Time[0]+Period()*60;
for(int i=0; i < OrdersTotal(); i++)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) break;
if(OrderMagicNumber() != MagicNumber) continue;
if(OrderSymbol() != Symbol()) continue;
if(OrderType() != tipo) continuar;
if(OrderOpenTime()=endTime) continue;
openedAtBar++;
romper;
}
return(openedAtBar);
}
if(isCrossed == 1 && shortEma > mainshortEma && longEma > mainshortEma)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,Ask-StopLoss*Point,Ask+TakeProfit*Point,
"Mi EA",12345,0,Verde);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("Orden de COMPRA abierta : ",OrderOpenPrice());
}
else Print("Error al abrir la orden de COMPRA : ",GetLastError());
return(0);
}
if(isCrossed == 2 && shortEma < mainshortEma && longEma < mainshortEma)
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,Bid+StopLoss*Point,Bid-TakeProfit*Point,
"Mi EA",12345,0,Rojo);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("Orden de venta abierta : ",OrderOpenPrice());
}
else Print("Error al abrir la orden de VENTA : ",GetLastError());
return(0);
}
return(0);
}