Jede Anfängerfrage, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Nirgendwo ohne dich - 6. - Seite 175

 

Der EA beendet den Handel nach 33 Bars:

static datetime t;

if (условие)
      {
      Opn_B = true; 
      t=Time[0];
      minimum = iLow(Symbol(),Period(),0);
      }
if (Time[33]>t) 
          {                                      
          Cls_B=true;              
          }

In der realen und in der Testversion wurde er bei 43 Takten beendet. Ich habe versucht, die Exit-Parameter auf den fünften Balken zu setzen, alles ist normal. Worin könnte Ihrer Meinung nach das Problem liegen?

 
Forexman77:

Der EA beendet den Handel nach 33 Bars:

In der realen und in der Testversion wurde er bei 43 Takten beendet. Ich habe versucht, die Exit-Parameter auf den fünften Balken zu setzen, alles ist normal. Worin könnte Ihrer Meinung nach das Problem liegen?


Vielleicht wurde if (Bedingung) mehrmals ausgeführt (z.B. noch einmal bei 10 Balken) und diese Ausführung verzögerte die Lebensdauer?

 
ALXIMIKS:


Vielleicht wurde if (Bedingung) mehrmals ausgeführt (z.B. einmal mehr bei 10 Balken) ? und diese Ausführung verzögerte die Lebensdauer

Ein Handel: Einstieg 15:37, Ausstieg 16:19. Ausstieg bei Takt 41, um genau zu sein.
 
Forexman77:
Ein Handel: Einstieg 15:37, Ausstieg 16:19. Exit bei 41 Bars, um genau zu sein.


Und wenn wir es mit iBarShift ersetzen, frage ich mich, ob der Fehler bleiben wird? Vielleicht fehlende Balken in der Geschichte (es gibt doch keine Löcher?) ?

Nachdem die Bedingung erfüllt ist, geben Sie die geöffneten Balken ein, um zu sehen, wie viele von ihnen wirklich geöffnet wurden, denn der Bezug auf die Zeit ist nicht sehr korrekt.

 
ALXIMIKS:


Wenn wir es mit iBarShift ersetzen, frage ich mich, ob der Fehler bleibt? Vielleicht fehlen die Balken in der Geschichte (es gibt doch keine Löcher?) ?

Nachdem die Bedingung erfüllt ist, geben Sie die Anzahl der offenen Balken ein, um zu sehen, wie viele Balken wirklich offen sind, da es nicht richtig erscheint, sich auf die Zeit zu beziehen.

Sollte der Code so lauten?

static datetime t;
datetime s=Time[33]>t;

if (условие)
    {
      Opn_B = true; 
      t=Time[0];
      int shif= iBarShift(Symbol(),PERIOD_M1,t,false);
      minimum = iLow(Symbol(),Period(),0);
      }
if (iBarShift(Symbol(),PERIOD_M1,s,false)) 
    {                                      
     Cls_B=true;              
    }

Diese Art von Code sperrt den Expert Advisor.

 

Hallo, können Sie mir bitte dabei helfen, dass der Alarm einmal pro Bar in jeder Zeile durchläuft, nicht nur in der ersten,

Ich habe die Anzahl der Warnungen zeitlich begrenzt, aber ich verstehe nicht, wie ich einen Puffer für einen Balken erstellen kann

 datetime LastAlertTime = 0;
int start()
  {

  string namesymb=Symbol();
  string tf=Period();

       for(int i = ObjectsTotal()-1; i >= 0; i--)
      {
         string name = ObjectName(i);
         
         if(ObjectType(name) == OBJ_TREND)
         {
            double value = ObjectGetValueByShift(name, 0);                    
             if(Bid <= value + Point && Bid >= value - Point)          
            {
            if (LastAlertTime < Time[0]){
            LastAlertTime = Time[0];
            
               Alert(namesymb,"  M",tf,"   ",name);
             }
                Comment("\n\n Alert running \n ", TimeToStr(TimeLocal(), TIME_DATE|TIME_SECONDS),"\n\n M",tf,"   ",name); 
            } 
         }      
}
 
Forexman77:

Der EA beendet den Handel nach 33 Bars:

In der realen und in der Testversion wurde er bei 43 Takten beendet. Ich habe versucht, die Exit-Parameter auf den fünften Balken zu setzen, alles ist normal. Worin liegt Ihrer Meinung nach das Problem?


Lassen Sie uns mit einem klaren Kopf beginnen.

Der Zeitpunkt des Flags Opn_B = true ist nicht aussagekräftig, da der Auftrag nicht in der gleichen Sekunde eröffnet werden darf.

Sie können die Eröffnungszeit des Auftrags OrderOpenTime verwenden oder der Variablen t den Wert der Zeit nach der erfolgreichen Eröffnung zuweisen.

Weiter: Sie haben verwendet

minimum = iLow(Symbol(),Period(),0);

1) Brauchen Sie iLow, oder wäre es besser, nur Low zu verwenden, wenn Sie die gleiche Währung und den gleichen Zeitrahmen verwenden?

2) Die Werte von Symbol() und Periode() sollten bei wiederholter Verwendung besser in Variablen gespeichert werden. Alles wirkt sich auf die Leistung aus - gewöhnen Sie sich daran.

Der Minutendiagramm - wenn es eine Minute lang keinen einzigen Tick gab - wird kein neuer Balken gezeichnet (kann ein Trick sein).

Und was ist mit iBarShift?

static datetime t;

if (условие)
      {
      Opn_B = true; 
      t=Time[0];
      minimum = iLow(Symbol(),Period(),0);
      }
if (iBarShift(Symbol(),1,t,false)>33) 
          {                                      
          Cls_B=true;              
          }

Am besten geeignet scheinen derzeit zu sein

if ((TimeCurrent-t)/60)>33) Cls_B=true;
 
oleksaz:

Hallo, können Sie mir bitte dabei helfen, dass der Alarm einmal pro Bar in jeder Zeile durchläuft, nicht nur in der ersten,

Ich habe die Anzahl der Warnungen zeitlich begrenzt, aber ich verstehe nicht, wie man für einen Balken puffert

string namesymb=Symbol();
string tf=Period();

Lohnt es sich, die Variablen bei jedem Tick neu zu bewerten?

Beeinträchtigt string tf = Zeitraum() die Leistung bei 1000000 Schleifendurchläufen oder ist int tf = Zeitraum() korrekter? Ich weiß es selbst nicht.

 if(Bid <= value + Point && Bid >= value - Point)  

Ist diese Bedingung korrekt? Und was ist, wenn die Schleife 4 Spitzen hat?

if (LastAlertTime < Time[0])
LastAlertTime = Time[0];
          

Hier haben wir ein weiteres Problem. Das heißt, wenn die Bedingung für die erste Zeile zutrifft, ist sie für die zweite offensichtlich falsch, und die Meldung wird nicht angezeigt,

Sie wird nicht einmal beim nächsten Tick auftauchen, da sich die Öffnungszeit der Kerze erst mit dem Eintreffen einer neuen Kerze ändert.

 
ALXIMIKS:


Die geeignetste Option scheint im Moment zu sein


Es tut mir leid, aber der Versuch, die Anzahl der Balken nach Zeit zu berechnen, ist ein sehr unzureichender Ansatz.
 
ALXIMIKS:

Sollen die Variablen bei jedem Tick neu berechnet werden?

Beeinträchtigt string tf = Zeitraum() die Leistung bei 1000000 Schleifendurchläufen, oder ist int tf = Zeitraum() korrekter? Ich weiß es selbst nicht.

Ist diese Bedingung korrekt? Und was ist, wenn die Schleife 4 Spitzen hat?

Hier haben wir ein weiteres Problem. Das heißt, wenn die Bedingung für die erste Zeile zutrifft, ist sie für die zweite offensichtlich falsch, und die Meldung wird nicht angezeigt,

Sie erscheint nicht einmal beim nächsten Tick, da sich die Öffnungszeit der Kerze erst mit dem Eintreffen einer neuen Kerze ändert.


int start()
  {
string scrdate,nametf;

        if (Period()==PERIOD_M1)  nametf="9_M1";
        if (Period()==PERIOD_M5)  nametf="8_M5";
        if (Period()==PERIOD_M15) nametf="7_M15";
        if (Period()==PERIOD_M30) nametf="6_M30";
        if (Period()==PERIOD_H1)  nametf="5_H1";
        if (Period()==PERIOD_H4)  nametf="4_H4";
        if (Period()==PERIOD_D1)  nametf="3_D1";
        if (Period()==PERIOD_W1)  nametf="2_W1";
        if (Period()==PERIOD_MN1) nametf="1_Monthly";
/////////////////  
       for(int i = ObjectsTotal()-1; i >= 0; i--)//мониторим все объекты
      {
         string name = ObjectName(i);//имя объектов берем из i переменной
         
         scrdate=StringConcatenate(Symbol()," ",TimeToStr(TimeCurrent(), TIME_DATE),"_",Hour(),".",Minute()," ",nametf," ",".jpg");//,name

         if(ObjectType(name) == OBJ_TREND)//отбираем тип по имени 
         {
            double value = ObjectGetValueByShift(name, 0);//функция для объектов
            
            Comment("\n\n Alert running \n ", TimeToStr(TimeLocal(), TIME_DATE|TIME_SECONDS),"\n\n M",Period(),"   ",name);           
            
             if(Bid <= value + Point && Bid >= value - Point)
             
            {
            if (LastAlertTime < Time[0]){
            LastAlertTime = Time[0];
            
               Alert(Symbol(),"  M",Period(),"   ",name);
               /////////////////////////////////////////////////
               WindowScreenShot(scrdate,1920,1200,0,-1,-1);
               ////////////////////////////////////////////////////////
             }               
            }
         }
}
   return(0);
  }

1. entfernt

2. ich stimme zu, wenn die Lücke nicht ein Signal ist (es sollte) kein Signal -> kein Preis -> kein Handel

3. dies ist, was ich oben sagte, aber was zu tun ist

PS Danke für die Antwort