Perguntas de Iniciantes MQL5 MT5 MetaTrader 5 - página 865

 
Aleksey Vyazmikin:

Por favor, ajude-me a resolver este problema.

Suponhamos que tenho um período de tempo actual M1, preciso de saber a hora da última barra N da barra dada de qualquer TF superior, a hora pode não ser 60 minutos, mas 45 ou qualquer outra hora, e para além de haver fins de semana, preciso de saber a data da última barra da TF actual de qualquer TF.

Como é que faço isto?

Especifica-se o número de barras, o nome do símbolo e o período de tempo requerido:

//+------------------------------------------------------------------+ 
//| Get Time for specified bar index                                 | 
//+------------------------------------------------------------------+ 
datetime iTime(const int index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT)
  {
   if(symbol==NULL)
      symbol=Symbol();
   if(timeframe==0)
      timeframe=Period();
   datetime Time[1];
   datetime time=0; // datetime "0" -> D'1970.01.01 00:00:00'
   int copied=CopyTime(symbol,timeframe,index,1,Time);
   if(copied>0)
      time=Time[0];
   return(time);
  }

Verificar (só por precaução) - se a função retorna a hora D'1970.01.01.01 00:00:00' - então há um erro.

 

Encontrei um problema com uma ordem de venda que não foi feita

2018.05.23 12:07:55.002 Trades  '50250084': market sell 0.01 EURUSD tp: 1.17397
2018.05.23 12:07:55.112 Trades  '50250084': accepted market sell 0.01 EURUSD tp: 1.17397
2018.05.23 12:07:55.113 Trades  '50250084': market sell 0.01 EURUSD tp: 1.17397 placed for execution
2018.05.23 12:07:55.114 Trades  '50250084': rejected market sell 0.01 EURUSD tp: 1.17397 (rejected)

Compreendo bem que o corretor aceitou a ordem e depois a rejeitou?

Com que fundamentos então e porque não? Não há mais erros nos registos. Antes deste erro existiam mais de 50 encomendas sem erros. Após este erro, também não registámos quaisquer erros.

É possível livrar-se deste problema?

 
Vladimir Karputov:

Especificar número de barras, nome do símbolo e período de tempo requerido:

Verificar (só por precaução) - se a função retorna a hora D'1970.01.01.01 00:00:00' - então há um erro.

Eu uso esta função, é pior do que a que sugere?

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
datetime iTime(string symbol,int tf,int index)
  {
   if(index < 0) return(-1);
   ENUM_TIMEFRAMES timeframe=TFMigrate(tf);
   datetime Arr[];
   if(CopyTime(symbol,timeframe,index,1,Arr)>0)
      return(Arr[0]);
   else return(-1);
  }

O problema é que se o tempo actual é de 1 minuto, quero saber o número da última barra do tempo actual no tempo seleccionado, mas já passou muito tempo (um intervalo por causa do fim-de-semana ou porque a sessão da noite fechou às 23-50, e a seguinte abriu apenas às 10-00), depois volto às 09:59 e não às 23:49:00, peço a hora assim

datetime         StopDt=iTime(Symbol(),TF_iDeltaP,_Shift-1)-60;

Foi por isso que perguntei, como obter este tempo do último bar com quaisquer combinações de TFs?

 
Aleksey Vyazmikin:

...

O problema é que se eu tiver um período de tempo actual de 1 minuto, quero saber o número da última barra do período de tempo actual no período de tempo seleccionado, ...

Na frase destacada, o meu cérebro explodiu.

 
Vladimir Karputov:

Na frase destacada, o meu cérebro explodiu.

Há aí uma gralha, preciso da data da última barra do prazo actual, que se refere à barra seleccionada do prazo superior.

Está claro?
 
Aleksey Vyazmikin:

Há aí uma gralha, preciso da data da última barra do prazo actual, que se refere à barra seleccionada do prazo superior.

Está claro?

Não, não é claro. O meu cérebro continua a borbulhar e a explodir :). Uma barra pertence apenas ao seu próprio período de tempo.

 
Aleksey Vyazmikin:

Uma gralha aí, preciso da data da última barra do prazo actual, que se refere à barra seleccionada do prazo superior.

Está isto claro?

Se entendi bem o seu pedido, então:

1. determinar a hora de fecho da barra desejada do intervalo de tempo superior.

2. Calcular o tempo da barra da TF baixa que se fecha juntamente com a barra da TF alta.

3. Neste período de tempo peça a barra da TF mais jovem (o pedido não é rigoroso) - obtenha a barra mais próxima da esquerda na linha temporal - a que precisa.

4. Verificar, se necessário, se esta barra está localizada dentro da barra da TF superior (excluir a variante quando as barras da TF júnior não estão presentes dentro da barra da TF sénior por alguma razão).

 
Vladimir Karputov:

Não, não tem. O cérebro continua a borbulhar e a explodir :). Uma barra pertence apenas ao seu período de tempo.

Ok, passando à visualização dos pensamentos :)

Em branco mostrei onde estamos a fazer o pedido, em amarelo o tempo de bar que deveríamos obter.

É mais claro? Caso contrário, queira fazer perguntas.

 
Aleksey Vyazmikin:

OK, passando à visualização dos pensamentos :)

O branco mostra onde estamos a fazer o pedido, amarelo o tempo de bar que devemos conseguir.

Será isto mais claro? Caso contrário, queira fazer perguntas para esclarecer.

1. A imagem é pequena - na próxima vez coloque 2m por 2m :)

2. Mais uma vez, não compreendo o que quer dizer: mostrou-me uma tabela em algum tempo. Qual é o problema de solicitar o número de barra N neste período de tempo?

 
Vladimir Karputov:

1. O quadro é pequeno - da próxima vez, colocar 2 metros por dois ao mesmo tempo :)

2. Não compreendo o pensamento outra vez - mostrou um gráfico em algum tempo. Qual é o problema em solicitar um número de barras N neste período de tempo?

1. Posso fazer mais - sem problemas ;)

2. o período de tempo indicado no canto superior esquerdo é M5. Não posso pedir o número de barra N porque não sei exactamente como o saber, especialmente se o turno não for 1 barra do TF superior, mas mais barras.

Tentarei um deslocamento de uma barra com o seguinte algoritmo:

1. Descobrir quantas barras passaram desde o início da actual TF superior

2. Desloque o número obtido por 1 barra e descubra o tempo usando a função iTime