¡Pide! - página 106

 

Período de tiempo del gráfico

¿Cuál es el código para saber en qué período de tiempo está funcionando el gráfico? Así puedo cambiar la configuración de las variables para cada período de tiempo.

if(?????) . . .

Dave

 
Dave137:
¿Cuál es el código para saber en qué período de tiempo se está ejecutando el gráfico? Así puedo cambiar la configuración de las variables para cada período de tiempo.

if(?????) . . .

Dave
if(Period() == PERIOD_M15) ...

[/PHP]

or:

switch(Period())

{

case PERIOD_M1:

...

break;

case PERIOD_M5:

...

break;

...

}

[/PHP]

Sometime it maybe easier to work with indices:[PHP]

int tfIndex = ArrayBsearch({PERIOD_M1, PERIOD_M5, PERIOD_M15, ...}, Period());

Example : how to display the period by the string you want:[PHP]

int Periods[] = {PERIOD_M1, PERIOD_M5, PERIOD_M15, ...};

string sPeriods[] = {" M1", " M5", " M15", " M30", " Hourly", " 4 hours", " Daily", " Weekly"...};

int tfIndex = ArrayBsearch(Periods, Period());

comment(Symbol() + sPeriods[tfIndex]);

 

¡Gracias Michel!

¡Espero que este EA que estoy creando sea el indicado! ¡Su ayuda es muy apreciada!

Dave

 

¡hola!

puede alguien aquí ayudarme a añadir esta función. Hacerlo para cerrar el comercio cuando la barra se ha completado o en otra palabra para hacer que se cierre el comercio cuando la próxima barra aparece. ( no importa el comercio es el beneficio o la pérdida )

extern int SystemMagicNumber=197;

extern double TakeProfit = 100;

extern double StopLoss = 500;

extern double Lots=0.1;

extern double TrailingStop = 0;

extern int MaxBuyTrades=5;

extern int MaxSellTrades=5;

int inicio()

{

if( HavePosThisBar(SystemMagicNumber)==false

&&iMA(NULL,0,5,0,MODE_SMA, PRICE_CLOSE,1)<iMA(NULL,0,15,0,MODE_EMA, PRICE_CLOSE,1)

&& iMA(NULL,0,5,0,MODE_SMA, PRICE_CLOSE,2)>iMA(NULL,0,15,0,MODE_EMA, PRICE_CLOSE,2)

&& SellPositionsCount()<MaxSellTrades

)

{

OrderSend(Symbol(),OP_SELL,Lots,Bid,0,Bid+StopLoss*Point,Bid-TakeProfit*Point,"",SystemMagicNumber,0,Red);

return(0);

}

if( HavePosThisBar(SystemMagicNumber)==false

&& iMA(NULL,0,5,0,MODE_SMA, PRICE_CLOSE,1)>iMA(NULL,0,15,0,MODE_EMA, PRICE_CLOSE,1)

&& iMA(NULL,0,5,0,MODE_SMA, PRICE_CLOSE,2)<iMA(NULL,0,15,0,MODE_EMA, PRICE_CLOSE,2)

&& BuyPositionsCount()<MaxBuyTrades

)

{

OrderSend(Symbol(),OP_BUY,Lots,Ask,0,Ask-StopLoss*Point,Ask+TakeProfit*Point,"",SystemMagicNumber,0,Blue);

return(0);

}

for(int cnt=TotalOrdenes()-1;cnt>=0;cnt--)

{

OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);

if (OrderSymbol() == Symbol())

{

if (OrderType()==OP_SELL)

{

si (TrailingStop>0)

{

if (OrderOpenPrice()-Ask>TrailingStop*Point)

{

if (OrderStopLoss() == 0 || OrderStopLoss()>(Ask+Point*TrailingStop))

{

OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Purple);

return(0);

}

}

}

}

if (OrderType()==OP_BUY)

{

si (TrailingStop>0)

{

if (Bid-OrderOpenPrice()>TrailingStop*Point)

{

if (OrderStopLoss()<(Bid-Point*TrailingStop))

{

OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Yellow);

return(0);

}

}

}

}

}

}

//----

return(0);

}

//+------------------------------------------------------------------+

bool HavePosThisBar(int magic)

{

int cnt;

bool Resultado=false;

for(cnt=0; cnt<=OrdersHistoryTotal()-1; cnt++)

if(OrderSelect(cnt, SELECT_BY_POS, MODE_HISTORY))

if((OrderSymbol() == Symbol()) &&(OrderMagicNumber() == magic) && Time[0]<=OrderOpenTime())

{

Resultado=true;

romper;

}

for(cnt=0; cnt<=TotalPedidos()-1; cnt++)

if(OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))

if((OrderSymbol() == Symbol()) &&(OrderMagicNumber() == magic) && Time[0]<=OrderOpenTime())

{

Resultado=true;

romper;

}

return(Resultado);

}

int ComprarPosicionesCuenta()

{

int Resultado=0;

for(int cnt=0; cnt<=TotalOrdenes()-1; cnt++)

if(OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))

if((OrderSymbol() == Symbol()) &&(OrderMagicNumber() == SystemMagicNumber) &&

(OrderType()==OP_BUY)

)

{

Resultado++;

}

return(Resultado);

}

int VenderPosicionesCuenta()

{

int Resultado=0;

for(int cnt=0; cnt<=TotalOrdenes()-1; cnt++)

if(OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))

if((OrderSymbol() == Symbol()) &&(OrderMagicNumber() == SystemMagicNumber) &&

(OrderType()==OP_SELL)

)

{

Resultado++;

}

return(Resultado);

}

 
bearfoot090:
¡hola!

puede alguien ayudarme a añadir esta función. Hacer que se cierre la operación cuando se complete la barra o en otra palabra hacer que se cierre la operación cuando aparezca la siguiente barra (no importa si la operación es de ganancia o de pérdida).

Para detectar una nueva barra hay varias soluciones:

1)

if(Volume[0] == 1) CloseOrders(); [/PHP] Not very reliable, for example if the terminal has to be restarted you may loose the first tick of the bar.

2)

if(BarsCnt < Bars) {BarsCnt = Bars; CloseOrders();}[/PHP] Not very reliable, for example if new bars are added to the left of the chart.

3)

if(Time1 < Time[0]) {Time1 = Time[0]; CloseOrders();}

Better, but again, restarting the terminal may produce wrong behaviors.

So my opinion is that the best is to write the lifetime max of each order into the order itself, using the "Comment" field :[PHP]OrderSend(..., ""+(Time[0] + Period()*60), ..);
Then you can scan the orders and check :[PHP]if(TimeCurrent() > OrderComment()) OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0, CLR_NONE);

. Esta es una buena solución porque si tienes varias órdenes que cerrar, tienes todo el tiempo necesario para hacerlo.

 

gracias michel por la respuesta.

Lo intentaré, pero ¿qué debo poner en el comentario?

 
bearfoot090:
gracias michel por la respuesta, lo intentaré, pero ¿qué debo poner en el comentario?

Ponga la hora a la que quiere cerrar el pedido. El campo Comentario debe ser una cadena, por eso hay ""+ delante del valor. por ejemplo:

""+(Time[0] + Period()*60) // begin of the next bar on the current timeframe

""+(TimeCurrent() + 2*360 + 30*60) // 2 hours 30 minutes after the openning

""+(iTime(NULL,PERIOD_D1,0) + 23*360 + 45*60) // today at 23:45 (server time)

""+(iTime(NULL,PERIOD_W1,0) + (PERIOD_W1 - 10)*60) // next friday at 23:50
 

Gracias

Michel:
Si es necesario, comprueba primero que estás más tarde de las 8 de la mañana:
if(Hour() < 8) return;[/PHP]

Then, find the max and min of the current day. (if its ok for you, its easier than from 8 am): [PHP]double Max = iHigh(Symbol(), PERIOD_D1, 0);

double Min = iLow(Symbol(), PERIOD_D1, 0);

int Range = (Max - Min) / Point;

if(Range > 90) return;

...

Hola,

Disculpa por tardar tanto en decir "gracias".

Aprecio su ayuda.

Gracias de nuevo.

Shek

 
Michel:
Para detectar una nueva barra hay varias soluciones:

1)

if(Volume[0] == 1) CloseOrders(); [/PHP] Not very reliable, for example if the terminal has to be restarted you may loose the first tick of the bar.

2)

if(BarsCnt < Bars) {BarsCnt = Bars; CloseOrders();}[/PHP] Not very reliable, for example if new bars are added to the left of the chart.

3)

if(Time1 < Time[0]) {Time1 = Time[0]; CloseOrders();}[/PHP] Better, but again, restarting the terminal may produce wrong behaviors.

So my opinion is that the best is to write the lifetime max of each order into the order itself, using the "Comment" field :

OrderSend(..., ""+(Time[0] + Period()*60), ..);[/PHP] Then you can scan the orders and check :[PHP]if(TimeCurrent() > OrderComment()) OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0, CLR_NONE);
. This is a good solution because if you have several orders to close, you have all the time needed to do it.

i got the error below.what does ot mean?

[PHP]'>' - different types in comparison F:\Program Files\MetaTrader - FXOpen\experts\EMA_10.mq4 (88, 22)

I make it like this

for the send order

[PHP]OrderSend(Symbol(),OP_BUY,Lots,Ask,0,Ask-25*Point,Ask+TakeProfit*Point, ""+(Time[0] + Period()*60),SystemMagicNumber,0,Blue);

y para la orden de cierre

[PHP]if(TimeCurrent() > OrderComment())

{

OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0, CLR_NONE);

}

y tengo el error que se muestra arriba.

¿Es correcto?

 

mi error, lo siento.

Esto debería funcionar:

if(TimeCurrent() > StringToInteger(OrderComment())