Ter o preço aberto da vela a uma hora específica.

 

Oi, pessoal,

tenho uma nova pergunta, simples, acho eu.

Por exemplo, quando são 15h00, quero saber o preço aberto da vela, que era às 9h00.

if (TC >= 15:00)
{
    if (Openprice < iclose(symbol(), period_H1, 1)
    {
       Action
    }
}
Então, como escrever o código para obter o preço aberto da vela de hora pré-definida?
 

Trabalhe a hora como variável de data e use-a com iBarshift() para obter o número da barra, quando tiver o número da barra use aquele com Open[] ou iOpen()

 
RaptorUK:

Trabalhe a hora como variável de data e use-a com iBarshift() para obter o número da barra, quando tiver o número da barra use aquele com Open[] ou iOpen()


sim não é má idéia :)

Obrigado eu vou usá-lo!

 

E é possível fazer isso:

   int Bar;
   double OpenPrice;
   
   int B(k);
   {
      switch(HeureSH[k])
      {
         case 0: Bar= iBarShift(Symbol(), PERIOD_H1, StrToTime("23:00"));
         break;
            
         case 1: Bar= iBarShift(Symbol(), PERIOD_H1, StrToTime("09:00"));
         break;
            
         case 1: Bar= iBarShift(Symbol(), PERIOD_H1, StrToTime("15:00"));
         break;
            
         case 3: Bar= iBarShift(Symbol(), PERIOD_H1, StrToTime("19:00"));
         break;
      }
   }
   OpenPrice= iOpen(Symbol(), PERIOD_H1, B);


O HeureSH é arraysize com as quatro horas

Porque se for uma hora específica a barra tem que ser diferente, mas crie um interruptor para ter apenas uma linha, não quatro linhas diferentes.

Está correto? o código está bem definido?

 
Kane59:

E é possível fazer isso:


O HeureSH é arraysize com as quatro horas

Porque se for uma hora específica, o bar tem que ser diferente, mas crie um interruptor para ter apenas uma linha, não quatro linhas diferentes.

Está correto? o código está bem definido?

Presumo que você tenha um erro de cópia/colagem, pois você tem o caso 1 duas vezes ... então eu assumo que o segundo caso 1 deve ser o caso 2

Para que isto funcione, os valores armazenados na matriz HeureSH[] são 1, 2, 3 ou 4 , é correto ? eles só podem ser valores int tipo. sem cordas ou duplas . . .

Em sua chamada iOpen() assumo que B deve ser Bar? ou você quis dizer que B(int) ? se você quiser usar a função naquela chamada você tem que fazer a função retornar o valor correto.


Você mesmo, e todos os outros, fará um grande favor se usar nomes significativos de variáveis e funções . . B, k e Bar não são muito descritivos.

 

Oh é um erro meu, copiei meu código mas não sei o que escrevi....... Eu resolvi isso.

No meu iopen, eu escrevi B que é "Bar" porque o tempo é diferente, então Bar também é diferente.


Ah sim os valores das cordas farão alguns problemas, eu acho que é o problema, então eu tentarei mudar.

 
  int B(k);
   {
      switch(HeureSH[k])
      {
         case 0: Bar= iBarShift(Symbol(), PERIOD_H1, StrToTime("23:00"));
         break;
            
         case 1: Bar= iBarShift(Symbol(), PERIOD_H1, StrToTime("09:00"));
         break;
            
         case 1: Bar= iBarShift(Symbol(), PERIOD_H1, StrToTime("15:00"));
         break;
            
         case 3: Bar= iBarShift(Symbol(), PERIOD_H1, StrToTime("19:00"));
         break;
      }
   }
   OpenPrice= iOpen(Symbol(), PERIOD_H1, B);
Isto não vai funcionar. 1) iBarShift designado para Bar mas iOpen usa B. 2) StrToTime("23:00") retornará hoje às 23:00 que sempre será no futuro (ou na barra H1 atual).
#define HR2400      86400           // 24 * 3600
datetime TimeOfDay(datetime when){  return( when % HR2400          );       }
datetime DateOfDay(datetime when){  return( when - TimeOfDay(when) );       }
  int B(k);
   {
    #define HR0900 23400    // 9*3600
    #define HR1500 54000
    #define HR1900 68400
    #define HR2300 59800
    int times[]={ HR2300, HR0900, HR1500, HR1900 };
    datetime    now = TimeCurrent(),
                Bod = DateOfDay(now),
                want= Bod + times[HeureSH[k]];
    if (want > now){    // Yesterdays?
        datetime prevTradingDate = iTime(Symbol(), PERIOD_D1, 1);
        want = prevTradingDate + times[HeureSH[k]];
    }
   int iBar= iBarShift(Symbol(), PERIOD_H1, want);
   OpenPrice= iOpen(Symbol(), PERIOD_H1, iBar);
   }
 

Olá WHRoeder,

Eu acho que o seu código é mais eficiente do que o meu e obtém-se se o valor do tempo é ontem ou hoje. Concordo: 23:00, com meu código, é sempre o futuro ou corrente quando é tarde demais...


Muito obrigado! É exatamente o que eu procurei.

 

Olá WHRoeader,

para informação:

você disse que ibarshift foi designado para Bar, iOpen to B. Ok

Mas a função B(k), qual é essa função? por que ela está aqui?

Em meu código, eu a coloquei porque queria uma relação entre os tempos de arraysize das cordas (HeuresSH) e os diferentes tempos de StrToTime. Era falso assim.


Você o usou novamente, por quê?

Cumprimentos :)

 

Sim, eu esqueci de dizer, HeureSH[] é um arraySize de quatro horas diferentes em valores de corda.

 

Ok, eu inseri seu código no meu EA e ele funciona perfeitamente! Eu sorri quando vejo o EA executar como eu queria!!!

Muito obrigado, muito obrigado ......

Está no backtest porque o mercado está fechado...

Mas há um problema:

Ea Abrir posições corretamente, mas comprar nunca é fechado e vender imediatamente fechado quando aberto.

Meu estrato está:

Ao mesmo tempo, o EA tem que abrir Vender OU Comprar se os parâmetros forem verdadeiros. Não há SL ou TP.

E, ao mesmo tempo, tem que fazer loop e fechar todas as negociações se as próximas funções forem verdadeiras:

if(OrdersTotal()>0)
            { 
               for(int i=OrdersTotal()-1; i>=0; i--)
               {
                  if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
                  {
                     if(OrderMagicNumber() == MagicSH && OrderOpenTime() > iTime(Symbol(), PERIOD_H1, 1))
                     {
                        if(OrderType() == OP_BUY)
                        {
                           OrderClose(OrderTicket(),LotsSH, bid, 300, CLR_NONE);
                        }
                        if(OrderType() == OP_SELL)
                        {
                           OrderClose(OrderTicket(),LotsSH, ask, 300, CLR_NONE);
Tenho que adicionar um filtro de lucro, mas vou trabalhar sobre isso. Sem isso ele tem que fechar Comprar, mas nunca fechar, e tem que deixar a venda correr, mas a venda é fechada imediatamente. Há algum erro no último código?
Razão: