Sie haben den offenen Preis der Kerze zu einer bestimmten Stunde.

 

Hallo Leute,

ich habe eine neue Frage, einfach denke ich.

Also, wenn es zum Beispiel 15:00 ist, möchte ich den offenen Preis der Kerze wissen, die Zeit war 9:00.

if (TC >= 15:00)
{
    if (Openprice < iclose(symbol(), period_H1, 1)
    {
       Action
    }
}
Wie kann man also einen Code schreiben, um den Eröffnungskurs der Kerze der vordefinierten Zeitstunde zu erhalten?
 

Ermitteln Sie die Zeit als Datetime-Variable und verwenden Sie diese mit iBarshift(), um die Taktnummer zu erhalten. Wenn Sie die Taktnummer haben, verwenden Sie diese mit Open[] oder iOpen().

 
RaptorUK:

Ermitteln Sie die Zeit als Datetime-Variable und verwenden Sie diese mit iBarshift(), um die Bar-Nummer zu erhalten. Wenn Sie die Bar-Nummer haben, verwenden Sie diese mit Open[] oder iOpen().


Ja, keine schlechte Idee :)

Danke, ich werde es verwenden!

 

Und es ist möglich, das zu tun:

   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 ist arraysize mit den vier Stunden

Denn wenn es eine bestimmte Stunden der Balken müssen unterschiedlich sein, ithough erstellen einen Schalter, um nur eine Zeile, nicht vier différents Zeilen haben.

Oh ist es richtig? ist der Code richtig geschrieben?

 
Kane59:

Und es ist möglich, das zu tun:


HeureSH ist arraysize mit den vier Stunden

Denn wenn es eine bestimmte Stunden der Balken müssen unterschiedlich sein, ithough erstellen einen Schalter, um nur eine Zeile, nicht vier différents Zeilen haben.

Oh ist es richtig? ist der Code richtig geschrieben?

Ich nehme an, Sie haben einen Copy/Paste-Fehler, da Sie Fall 1 zweimal haben ... also nehme ich an, der zweite Fall 1 sollte Fall 2 sein

Damit dies funktioniert, sind die Werte, die im HeureSH[] Array gespeichert sind, 1, 2, 3 oder 4, ist das korrekt? sie können nur int-Typ-Werte sein. keine Strings oder Doubles . . .

In Ihrem iOpen()-Aufruf nehme ich an, dass B Bar sein sollte ? oder meinten Sie, dass es B(int) sein sollte ? wenn Sie die Funktion in diesem Aufruf verwenden wollen, müssen Sie dafür sorgen, dass die Funktion den richtigen Wert zurückgibt.


Sie tun sich selbst und allen anderen einen großen Gefallen, wenn Sie aussagekräftige Variablen- und Funktionsnamen verwenden ... B, k und Bar sind nicht sehr aussagekräftig.

 

Oh es ist ein Fehler von mir, ich habe meinen Code kopiert, aber ich weiß nicht, was ich geschrieben habe....... Ich habe es so gelöst.

In meinem iopen habe ich B geschrieben, was "Bar" ist, weil die Zeit anders ist, also ist Bar auch anders.


Ah ja Strings Werte werden einige Probleme machen, ich denke, es ist das Problem, so werde ich versuchen, zu ändern.

 
  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);
Dies wird nicht funktionieren. 1) iBarShift ist Bar zugewiesen, aber iOpen verwendet B. 2) StrToTime("23:00") gibt das heutige Datum um 23:00 Uhr zurück, das immer in der Zukunft liegt (oder im aktuellen H1-Bar).
#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);
   }
 

Hallo WHRoeder,

Ich denke, dass dein Code effizienter ist als meiner und herausfindet, ob der Zeitwert gestern oder heute ist. Ich bin einverstanden: 23:00, mit meinem Code, ist immer die Zukunft oder Gegenwart, wenn es zu spät ist...


Vielen Dank! Es ist genau das, was ich gesucht habe.

 

Hallo WHRoeader,

zur Information:

Du sagtest, ibarshift wurde Bar zugewiesen, iOpen zu B. Ok

Aber die Funktion B(k), was ist diese Funktion? warum ist sie hier?

In meinem Code habe ich sie platziert, weil ich eine Beziehung zwischen der Arraygröße von Strings Zeiten (HeuresSH) und den verschiedenen StrToTime wollte. Es war also falsch.


Sie haben es wieder verwendet, warum?

Mit freundlichen Grüßen :)

 

Ja, ich vergaß zu sagen, HeureSH[] ist ein arraySize von vier verschiedenen Stunden in String-Werten.

 

Ok, ich eingefügt Ihren Code in meinem EA und es funktioniert perfekt! Ich lächelte, als ich sah, dass der EA so ausgeführt wurde, wie ich es wollte!!!

Vielen Dank sehr sehr ......

Es ist auf Backtest, weil der Markt geschlossen ist...

Aber es gibt ein Problem:

Ea Open korrekt Positionen, aber kaufen sind nie geschlossen und verkaufen immediatelly geschlossen, wenn geöffnet.

Meine Strat ist:

In der gleichen Zeit, die EA haben zu öffnen, verkaufen ODER kaufen, wenn Parameter wahr sind. Es gibt keine SL oder TP.

Und in der gleichen Zeit, hat es zu Schleife und schließen alle Handel, wenn nächste Funktionen wahr sind:

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);
Ich habe einen Gewinn-Filter hinzufügen, aber ich werde über diese Arbeit. Ohne das muss es Buy schließen, aber nie geschlossen, und es muss sell laufen lassen, aber sell sind sofort geschlossen. Gibt es einen Fehler im letzten Code?