¿Cómo codificar? - página 299

 

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

{Customer Inputs}

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 :

#property indicator_chart_window

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.

kappari:
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

{Customer Inputs}

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
 
mladen:
Pruebe como esto :
#property indicator_chart_window

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);

}
Sólo tienes que copiar y pegar en algún indicador (es un indicador que ya funciona) y adjuntarlo al gráfico.

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

mladen:
Prueba con esta función :
int countOpenedOrders(int type)

{

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 :

int openedBuys = countOpened(OP_BUY);

to count opened sell orders, call it like this :

[PHP]int openedSells = countOpened(OP_SELL);
y luego puedes comprobar
:if openedBuys==0 open buy

if openedSells==0 open 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 :

int openedBuys = countOpened(OP_BUY); if (openedBuys==0) code for open a buy order

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)

tkuan77:
Hola Mladen,

¿Puedes explicarme mejor la lógica de las funciones aquí? Todavía no lo entiendo bien. Gracias

Terrance
 

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

Terrance

mladen:
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 :

int openedBuys = countOpened(OP_BUY); if (openedBuys==0) code for open a buy order
si openBuys uis cualquier cosa menos 0 no se abre una nueva orden de compra. La misma lógica se aplica a la venta (que es el segundo ejemplo en ese post)
 

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 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() != type) continue;

if(OrderOpenTime()=endTime) continue;

openedAtBar++;

break;

}

return(openedAtBar);

}

tkuan77:
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

Terrance
 
tkuan77:
Hola 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

Terrance

eso 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);

}

mladen:
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 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() != 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

tkuan77:
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);

}
Razón de la queja: