Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 1534

 
Eugen8519:

So wird der Auftrag abgeschlossen

Tun Sie, was ich oben geschrieben habe...

Oder posten Sie den OnTick()-Code

 
Eugen8519:

So wird der Auftrag abgeschlossen

Diese Struktur sollte sein

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(UseTimeLimit)
     {
       YesStop=true;
       MqlDateTime str1;
       TimeToStruct(TimeCurrent() , str1);
       if(str1.hour > startHour && str1.hour < stopHour)
          YesStop=false;
     }
   if(YesStop==false)
     {
      if(EMA0...)
        {
         .....
         OPENORDER("Sell");
        }
   
      if(EMA0...)
        {
         .....
         OPENORDER("Buy");
        }
     }
//---
   if(EMA0...)
     {
      .....
      CLOSEORDER("Sell");
     }

   if(EMA0...) 
     {
      .....
      CLOSEORDER("Buy");
     }
  }
//+------------------------------------------------------------------+
void CLOSEORDER(string ord)
  {
   .....
  }
//---
void OPENORDER(string ord)
  {
   .....
  }
 
Danke für den Tipp, ich werde es heute Abend ausprobieren und später berichten.
 
MakarFX:

Diese Struktur sollte sein

Wenn ich mich nicht irre, kann sie wie folgt geschrieben werden

   if(UseTimeLimit)
     {
       YesStop=true;
       MqlDateTime str1;
       TimeCurrent(str1);
       if(str1.hour > startHour && str1.hour < stopHour)
          YesStop=false;
     }
 
Eugen8519:
Danke für den Rat, ich werde es heute Abend ausprobieren und später berichten.

wenn UseTimeLimit in den Einstellungen beim Starten der Eule eingestellt ist, dann

diese Funktion ist besser in OnInit() als in OnTick()

 
Vitaly Muzichenko:

Wenn ich mich nicht irre, kann man das so schreiben

Ich schreibe es eigentlich so.

if(TimeHour(time[i])>=Time_Start&&TimeHour(time[i])<TimeFinish)

oder noch einfacher

if(Hour()>=Time_Start&&Hour()<TimeFinish)
 

Guten Tag, könnten Sie mir bitte sagen, wie man den Durchschnitt der Indikatorlinie korrekt ermittelt? Die Basiskurve mit der Periode Per_1 wird normal gezeichnet (Puffer_1[]), bis ich einen Block mit einfacher Mittelung mit Puffer_2[] mit der Mittelungsperiode Per_2 hinzufüge.

int OnCalculate(Standardparameter)

{

int i, j, Grenze;

if(rates_total <= Per_1)

zurück(0);

//Der zuletzt berechnete Takt wird neu berechnet

limit = rates_total - prev_calculated - Per_1;

if(vorher_berechnet > 0)

Limit++;

//Berechnen und Ausfüllen von Indikatorpuffern

for(i=0; i < Limit; i++)

{

//Berechnen Sie die Hauptlinie des Indikators

Puffer_1[i] = Formel der Kurve

double Summe = 0;

for(j = i; j < Per_2 + i; j++)

{

//Berechnung der Mittelungslinie

Summe += Puffer_1[j];

Puffer_2[i] = Summe/Per_2;

}

}

return(rates_total);

}

 
Eugen8519:
Das ist das Problem, es öffnet und schließt nur die Aufträge starthour->stophour
Und offene Aufträge werden nach der Stoppstunde nicht geschlossen.

Weil Sie nach der Stophour nicht mehr handeln können

Ich habe die Logik des Öffnens vor dem Schließen, der Schleppnetzfischerei und anderer Positionserhaltung schon seit langem geschrieben. In den meisten Fällen stimmt es, dass man, bevor man etwas anderes öffnet, prüfen muss, was bereits geöffnet ist.

Ihre Logik ist richtig, Sie müssen nur die Blöcke vertauschen:

MqlDateTime str;
void OnTick()
 {
 // Close Positions
 TrailingStop();

 if(условие_закрытия)
  {
   ClosePos();
  }

 // Open Positions
 if(UseTimeLimit)
  {
    TimeCurrent(str);
    if(str.hour > startHour && str.hour < stopHour)
     {
      OpesPos(...);
      ...
     }
  }
// end
}
 

Super! Es funktioniert, vielen Dank!