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

 

Ok, ok, te lo concedo:

#define HR0900 14400  //All times were changed for the test to see which is the Reference.
#define HR1500 10800
#define HR1900 7200
#define HR2300 3600

extern string     Heures="11:41;11:42;12:00;11:42;"; // Times for my test today...
string            HeureSH[];

datetime TC = TimeCurrent();

int times[]={HR1500, HR2300, HR0900, HR1900};
                
    for(int k=0; k<ArraySize(HeureSH); k++)
    {
      datetime    want= TC - times[k];
    }

int iBar= iBarShift(Symbol(), PERIOD_H1, want);
double OpenPrice= iOpen(Symbol(), PERIOD_H1, iBar);
Solo uno di #define è considerato. L'Array HeureSH[] viene eseguito correttamente e se il tempo scritto arriva, è vero, è corretto, questo è solo times[k] non considera tutti e quattro i #define.
 
Kane59:

Ok, ok, te lo concedo:

Solo uno di #define è considerato. L'array HeureSH[] viene eseguito correttamente e se il tempo scritto arriva, è vero, è corretto, questo è solo times[k] non considera tutti e quattro i #define.

Il problema è abbastanza ovvio . . .

string            HeureSH[];

quindi questa matrice ha una dimensione di 0 in quanto l'hai dichiarata in quel modo . . . quindi questo ciclo . . .

for(int k=0; k < ArraySize(HeureSH); k++)

inizia da 0 e finisce quando k >= 0 (essendo 0 la dimensione dell'array)

 

Ok, l'ho scritto perché ho pensato:

extern string     Heures="11:41;11:42;12:00;11:42;"; // Times for my test today...
      
                            0     1     2     3

int times[]={HR1500, HR2300, HR0900, HR1900};

               0        1       2       3
 
Kane59:

Ok, l'ho scritto perché ho pensato:

Penso che tu abbia bisogno di fare un po' di manipolazione delle stringhe, devi spezzare la tua stringa in tempi individuali, convertire ognuno di questi in un datetime e memorizzarli nel tuo array HeureSH[] . . . lavorare con le stringhe in questo modo può essere un po' complicato, non difficile ma facile da sbagliare. Poi il tuo codice potrebbe iniziare ad avere un po' di senso . . .


A proposito, queste sono le funzioni di stringa con cui dovete lavorare, studiatele attentamente, divertitevi.
 

Ciao

Ci lavoro ma non capisco questo:

RaptorUK:

Il problema è abbastanza ovvio . . .

quindi questo array ha una dimensione di 0 come l'hai dichiarato in quel modo . . . quindi questo ciclo . . .

inizia da 0 e finisce quando k >= 0 (essendo 0 la dimensione dell'array)

Puoi provare a dirmelo con più dettagli?


Per HeureSH[] ho usato delle linee per tagliare questo in 4 parti di stringhe per avere 4 ore diverse.

Modifica di nuovo:

Ho scritto ArraySize(HeureSH) in una funzione di stampa e mi dà: 4

Print("Open:", DoubleToStr(OpenPrice, digits), /*" Time:", TimeToStr(Time[iBar], */" ArraySise=", ArraySize(HeureSH));

2013.01.19 13:57:21 2012.11.19 19:00 Tester EURUSD,H1: Open:1.27701 ArraySise=4

Ho testato di nuovo e seleziona solo l'ultimo di questo:

int times[]={36000,21600,14400,14400};

Quindi l'ultimo "14400". Perché non seleziona gli altri nello stesso ordine dell'Array "HeureSH[]"?


C'è un problema con il ciclo "For"?
 
Kane59:

Ciao

Ci lavoro ma non capisco questo:

Puoi provare a dirmelo con più dettagli?


Per HeureSH[] ho usato delle linee per tagliare questo in 4 parti di stringhe per avere 4 ore diverse.

Modifica di nuovo:

Ho scritto ArraySize(HeureSH) in una funzione di stampa e mi dà: 4

2013.01.19 13:57:21 2012.11.19 19:00 Tester EURUSD,H1: Open:1.27701 ArraySise=4

Il codice che hai mostrato si tradurrà in quello che ho descritto, se hai più codice che ha un impatto sulla domanda che stai chiedendo allora è necessario mostrarlo . . . . o non mostrarlo se non hai bisogno di più aiuto.
 

Ok ok scusate.

extern string     Heures="09:00;15:00;19:00;23:00;";
string            HeureSH[];

int start()
  {
//---- 
int times[]= {36000,21600,14400,14400};

   for(int i=0; i<ArraySize(Heures); i++)
   {
      datetime    want = TC - times[i];
   }

   int iBar= iBarShift(Symbol(), PERIOD_H1, want);
   double OpenPrice= iOpen(Symbol(), PERIOD_H1, iBar);

   if (HeureSH(TimeToStr(iTime(Symbol(),PERIOD_H1,0),TIME_MINUTES)))
   {
      if(iOpen(Symbol(), PERIOD_H1, 0) < OpenPrice)
      {
         OrderSend( OP_SELL, .......);
      }
      if(iOpen(Symbol(), PERIOD_H1, 0) > OpenPrice)
      {
         OrderSend( OP_BUY, .......);
      }
   }

//----
   return(0);
  }

//+------------------------------------------------------------------+
void UpdateHSeSpeciales()
   {
      string hour1 = "";
      int count1 = 0;
      for(int k=0; k<StringLen(Heures); k++)
      {
         if(StringSubstr(Heures, k, 1) != ";")
         {
            hour1= hour1+ StringSubstr(Heures, k, 1);
         }
         else
         {
            ArrayResize(HeureSH, ArraySize(HeureSH)+1);
            HeureSH[count1] = hour1;
            hour1 ="";
            count1 +=1;
         }   
      }
   }
   bool HeureSH(string now1)
   {
      for(int k=0; k<ArraySize(HeureSH); k++)
      {
         if(now1 == HeureSH[k])
         {
            return(true);
         }
      }
   
      return(false);
   }

Quindi, per esempio, quando sono le 09:00, l'iBar è la barra di ieri 23:00, 10 ore in meno di TimeCurrent. Quando sono le 15:00, la iBar è la barra di oggi 09:00, ....... Cosa voglio: Se arriva l'ora selezionata, avere una barra di riferimento che è prima di Now (TimeCurrent). Il mio problema è che il programma prende solo l'ultimo elemento di "times[]", nessun altro. Voglio che se HeureSH[0], usi times[0] e continui. Cosa posso fare?


PS: è tutto quello che ho e di cui ho bisogno.

 

Ciao,

oh qualcuno può aiutarmi?

 
Kane59:

Ciao,

oh qualcuno può aiutarmi?

Non rendi facile a nessuno aiutarti, posti pezzi e bocconi del tuo codice qua e là. . sto cercando di capire il tuo codice, non posso eseguirlo per vedere cosa fa perché non ho il codice completo, hai una funzione con lo stesso nome del tuo array, questo va bene ma non aiuta la leggibilità.

Quando viene chiamata UpdateHSeSpeciales() ?

 

Mi dispiace molto,

Ho solo quello ma è vero che dimentico "UpdateHSeSpeciales".


Si chiama in "init" quando inizia il programma.