Tener el precio de apertura de la vela en una hora específica.

 

Hola chicos,

Tengo una nueva pregunta, simple creo.

Así que cuando por ejemplo son las 15:00, quiero saber el precio de apertura de la vela cuya hora era las 9:00.

if (TC >= 15:00)
{
    if (Openprice < iclose(symbol(), period_H1, 1)
    {
       Action
    }
}
Entonces, ¿cómo escribir el código para obtener el precio de apertura de la vela de la hora predefinida?
 

Calcula la hora como una variable de fecha y úsala con iBarshift() para obtener el número de barra, cuando tengas el número de barra úsalo con Open[] o iOpen()

 
RaptorUK:

Calcula la hora como una variable datetime y úsala con iBarshift() para obtener el número de barra, cuando tengas el número de barra úsalo con Open[] o iOpen()


si, no es mala idea :)

Gracias, lo usaré.

 

Y es posible hacerlo:

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


HeureSH es arraysize con las cuatro horas

Porque si es una hora específica la barra tiene que ser diferente, ithough crear un interruptor para tener una sola línea, no cuatro différents líneas.

Oh, ¿es correcto? ¿el código está escrito correctamente?

 
Kane59:

Y es posible hacerlo:


HeureSH es arraysize con las cuatro horas

Porque si es una hora específica la barra tiene que ser diferente, ithough crear un interruptor para tener una sola línea, no cuatro différents líneas.

Oh, ¿es correcto? ¿el código está escrito correctamente?

Supongo que tienes un error de copia/pega ya que tienes el caso 1 dos veces... así que asumiré que el segundo caso 1 debería ser el caso 2

Para que esto funcione los valores almacenados en el array HeureSH[] son 1, 2, 3 o 4, ¿es correcto? sólo pueden ser valores de tipo int. no strings o doubles . . .

En tu llamada a iOpen() supongo que B debería ser Bar? o querías decir que era B(int) ? si quieres usar la función en esa llamada tienes que hacer que la función devuelva el valor correcto.


Te harás a ti mismo, y a todos los demás, un gran favor si utilizas nombres de variables y funciones con sentido... B, k y Bar no son muy descriptivos.

 

Oh, es un error mío, copié mi código pero no sé lo que escribí....... Lo he resuelto.

En mi iopen, escribí B que es "Bar" porque el tiempo es diferente, así que Bar es diferente también.


Ah, sí, los valores de las cadenas de hacer algunos problemas, creo que es el problema, así que voy a tratar de cambiar.

 
  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);
Esto no funcionará. 1) iBarShift asignado a Bar pero iOpen utiliza B. 2) StrToTime("23:00") devolverá la fecha de hoy a las 23:00 que siempre estará en el futuro (o barra H1 actual.)
#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);
   }
 

Hola WHRoeder,

Creo que tu código es más eficiente que el mío y consigue si el valor del tiempo es ayer o hoy. Estoy de acuerdo: las 23:00, con mi código, siempre es el futur o actual cuando es demasiado tarde...


Muchas gracias. Es exactamente lo que buscaba.

 

Hola WHRoeader,

para información:

dijiste que ibarshift estaba asignado a Bar, iOpen a B. Ok

Pero la función B(k), ¿qué es esta función? ¿por qué está aquí?

En mi código, lo puse porque quería una relación entre el tamaño de las cadenas de tiempo (HeuresSH) y los diferentes StrToTime. Es era falso así que.


¿Usted lo utilizó de nuevo, por qué?

Saludos :)

 

Sí, se me olvidó decir que HeureSH[] es un arraySize de cuatro horas diferentes en valores de cadena.

 

¡Ok, he insertado tu código en mi EA y funciona perfectamente ! ¡¡¡Sonreí cuando vi que el EA se ejecutaba como yo quería !!!

Muchas gracias muy muy ......

Está en backtest porque el mercado está cerrado...

Pero hay un problema:

El EA abre correctamente las posiciones, pero las compras nunca se cierran y las ventas se cierran inmediatamente cuando se abren.

Mi estrategia es:

En el mismo tiempo, el EA tiene que abrir vender o comprar si los parámetros son verdaderos. No hay SL o TP.

Y al mismo tiempo, tiene que hacer un bucle y cerrar todas las operaciones si las siguientes funciones son verdaderas:

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);
Tengo que añadir un filtro de beneficios, pero voy a trabajar en esto. Sin eso tiene que cerrar la compra, pero nunca se cierra, y tiene que dejar que la venta se ejecute pero la venta se cierra inmediatamente. ¿Hay algún error en el último código?