Avere il prezzo aperto della candela in un'ora specifica.

 

Ciao ragazzi,

ho una nuova domanda, semplice credo.

Così, quando per esempio sono le 15:00, voglio sapere il prezzo aperto della candela che era alle 9:00.

if (TC >= 15:00)
{
    if (Openprice < iclose(symbol(), period_H1, 1)
    {
       Action
    }
}
Quindi come scrivere il codice per ottenere l'Openprice della candela dell'ora predefinita?
 

Elaborate il tempo come una variabile datetime e usatela con iBarshift() per ottenere il numero della barra, quando avete il numero della barra usatelo con Open[] o iOpen()

 
RaptorUK:

Elaborate il tempo come variabile datetime e usatelo con iBarshift() per ottenere il numero della barra, quando avete il numero della barra usatelo con Open[] o iOpen()


sì, non è una cattiva idea :)

Grazie, la userò!

 

Ed è possibile farlo:

   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 è arraysize con le quattro ore

Perché se è un'ora specifica la barra deve essere diversa, anche se creare un interruttore per avere solo una linea, non quattro linee diverse.

È corretto? Il codice è scritto correttamente?

 
Kane59:

Ed è possibile farlo:


HeureSH è arraysize con le quattro ore

Perché se si tratta di un'ora specifica la barra deve essere diversa, anche se creare un interruttore per avere una sola linea, non quattro linee diverse.

È corretto? Il codice è scritto correttamente?

Presumo che tu abbia un errore di copia/incolla, dato che hai il caso 1 due volte. . . quindi presumo che il secondo caso 1 dovrebbe essere il caso 2

Perché questo funzioni i valori memorizzati nell'array HeureSH[] sono 1, 2, 3 o 4, è corretto? Possono essere solo valori di tipo int. niente stringhe o doppi. . .

Nella tua chiamata iOpen() presumo che B dovrebbe essere Bar? o volevi dire che è B(int) ? se vuoi usare la funzione in quella chiamata devi fare in modo che la funzione restituisca il valore corretto.


Farai a te stesso, e a tutti gli altri, un grande favore se usi nomi significativi di variabili e funzioni... B, k e Bar non sono molto descrittivi.

 

Oh è un errore da parte mia, ho copiato il mio codice ma non so cosa ho scritto....... Ho risolto così.

Nel mio iopen, ho scritto B che è "Bar" perché il tempo è diverso, quindi anche Bar è diverso.


Ah sì, i valori delle stringhe faranno alcuni problemi, penso che sia il problema, quindi proverò a cambiare.

 
  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);
Questo non funzionerà. 1) iBarShift assegnato a Bar ma iOpen usa B. 2) StrToTime("23:00") restituirà la data di oggi alle 23:00 che sarà sempre nel futuro (o nella barra H1 corrente).
#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);
   }
 

Ciao WHRoeder,

Penso che il tuo codice sia più efficiente del mio e ottiene se il valore del tempo è ieri o oggi. Sono d'accordo: 23:00, con il mio codice, è sempre il futuro o la corrente quando è troppo tardi...


Grazie mille! È esattamente quello che ho cercato.

 

Ciao WHRoeader,

per informazione:

hai detto che ibarshift è stato assegnato a Bar, iOpen a B. Ok

Ma la funzione B(k), cos'è questa funzione? Perché è qui?

Nel mio codice, l'ho messa perché volevo una relazione tra l'arraysize dei tempi delle stringhe (HeuresSH) e i diversi StrToTime. È falso quindi.


L'hai usato di nuovo, perché?

Saluti :)

 

Sì, ho dimenticato di dire che HeureSH[] è un arraySize di quattro ore diverse in valori stringa.

 

Ok, ho inserito il tuo codice nel mio EA e funziona perfettamente! Ho sorriso quando ho visto l'EA eseguirsi come volevo!!!

Grazie mille ......

E' in backtest perché il mercato è chiuso...

Ma c'è un problema:

L'Ea apre correttamente le posizioni, ma gli acquisti non vengono mai chiusi e le vendite vengono immediatamente chiuse quando vengono aperte.

La mia strategia è:

Nello stesso tempo, l'EA deve aprire vendere o comprare se i parametri sono veri. Non c'è SL o TP.

E nello stesso tempo, deve fare un loop e chiudere tutti gli scambi se le funzioni successive sono vere:

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);
Devo aggiungere un filtro di profitto, ma ci lavorerò. Senza questo, deve chiudere l'acquisto, ma non è mai stato chiuso, e deve lasciar correre la vendita, ma la vendita viene chiusa immediatamente. C'è un errore nell'ultimo codice?