Pergunte! - página 106

 

Período de tempo do gráfico

Qual é o código para descobrir em que período de tempo o gráfico está rodando? Para que eu possa mudar as configurações variáveis para cada período de tempo.

if(?????) . . .

Dave

 
Dave137:
Qual é o código para saber em que período de tempo o gráfico está rodando? Para que eu possa mudar as configurações variáveis para cada período de tempo.

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

 

Obrigado Michel!

Espero que esta EA que estou criando seja a única! Sua ajuda é muito apreciada!

Dave

 

Olá!

alguns aqui podem me ajudar a acrescentar esta função. Faça com que feche o comércio quando a barra for concluída ou em outra palavra faça com que feche o comércio quando a próxima barra aparecer ( não importa que o comércio seja lucro ou prejuízo )

sistema interno externo SystemMagicNumber=197;

TakeProfit duplo externo = 100;

StopLoss duplo externo = 500;

duplo externo Lots=0,1;

Duplo Exterior TrailingStop = 0;

Exterior int MaxBuyTrades=5;

Exterior int MaxSellTrades=5;

int start()

{

if( HavePosThisBar(SystemMagicNumber)==falso

&&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)==falso

&& 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=OrdensTotal()-1;cnt>=0;cnt--)

{

OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);

se (OrderSymbol() == Symbol())

{

se (OrderType()==OP_SELL)

{

se (TrailingStop>0)

{

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

{

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

{

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

retornar(0);

}

}

}

}

se (OrderType()==OP_BUY)

{

se (TrailingStop>0)

{

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

{

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

{

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

retornar(0);

}

}

}

}

}

}

//----

retorno(0);

}

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

Bool HavePosThisBar(int magic)

{

int cnt;

bool Resultado=falso;

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

if(OrderSelect(cnt, SELECT_BY_POS, MODE_HISTORY))

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

{

Resultado=verdadeiro;

quebra;

}

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

if(OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))

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

{

Resultado=verdadeiro;

quebra;

}

retorno(Resultado);

}

int BuyPositionsCount()

{

int Resultado=0;

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

if(OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))

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

(OrderType()==OP_BUY)

)

{

Resultado++;

}

retorno(Resultado);

}

int SellPositionsCount()

{

int Resultado=0;

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

if(OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))

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

(OrderType()==OP_SELL)

)

{

Resultado++;

}

retorno(Resultado);

}

 
bearfoot090:
Olá!

alguns aqui podem me ajudar a acrescentar esta função. Fazer com que feche o comércio quando a barra for concluída ou em outra palavra fazer com que feche o comércio quando a próxima barra aparecer ( não importa que o comércio seja lucro ou prejuízo )

Para detectar uma nova barra, existem várias soluções:

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 é uma boa solução porque se você tem várias ordens para fechar, você tem todo o tempo necessário para fazer isso.

 

agradece a michel pela resposta.

Vou tentar. Mas o que devo colocar no comentário? qualquer coisa que eu goste?

 
bearfoot090:
obrigado michel pela resposta. Vou tentar. mas o que devo colocar no comentário? qualquer coisa que eu goste?

Coloque o tempo que você deseja para fechar o pedido. O campo Comentário deve ser um fio, é por isso que há ""+ em frente ao valor. por exemplo:

""+(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
 

Obrigado

Michel:
Se necessário, verifique primeiro se você tem mais de 8 horas da manhã:
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;

...

Hi,

Desculpe por demorar tanto tempo para dizer "obrigado".

Agradeço a ajuda de vocês.

Mais uma vez, obrigado.

Shek

 
Michel:
Para detectar uma nova barra, há várias soluções:

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

e para a ordem de fechamento

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

{

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

}

e eu recebi o erro mostrado acima.

Está correto?

 

meu erro, desculpe.

Isto deve funcionar:

if(TimeCurrent() > StringToInteger(OrderComment())
Razão: