Alle Fragen von einem PROFI an einen SUPER PROFI - 1. - Seite 42

 
swanhearts:

Hallo, ich habe einen MA-Indikator mit allen benötigten Stufen erhalten. Das Problem ist, dass, wenn ich mit der Maus über den Indikator (jeden MA) fahre, der Zeitraum dieses MA nicht angezeigt wird. Wie kann man das beheben? Es gibt einen konstanten Syntaxfehler beim Ändern des NamensIndicatorShortName("MASHKI =)"); Bitte helfen Sie.

der Name des Indikatorpuffers wird mit SetIndexLabel gesetzt

 

1. Wie kann man am einfachsten feststellen, dass der Funktionsaufruf zum gleichen Zeitpunkt erfolgt wie der vorherige Aufruf?

bool tick_already_processed()
{
   return( ??? );
}

void some_func()
{
   if ( tick_already_processed() ) return;

   // recalculate only once on each tick
}

void OnTick()
{
   if ( A ) some_func();
   if ( B ) some_func();
   if ( C ) some_func();
}

Zeit (TimeCurrent) kann gleich bleiben, Zeit in ms von SymbolInfoTick, theoretisch auch.

Der Vergleich der Bid-, Ask- und Ms-Zeiten ist recht teuer.

Ich schlage nicht vor, die Steuerung im Expert Advisor selbst zu organisieren, ich möchte eine universelle unabhängige Funktion erhalten.


Die gleiche Frage stellt sich bei Handelsgeschäften. Woher wissen wir, dass sich in der Liste der Aufträge/Positionen (einschließlich der offenen Level, SL und TP) seit dem letzten Lauf etwas geändert hat?

Ich müsste ein Kennzeichen in OnTrade setzen (und es zurücksetzen, wenn ich fertig bin), das ist der billigste Weg.

Aber auch hier würde ich mir eine universelle Lösung wünschen.


Wer hat eine Idee?

 

Andrey Khatimlianskii: 

Beispiel https://www.mql5.com/ru/code/16997

Resources.mqh-Datei.

Funktion IsNewPeriod


Die Grundidee besteht darin, eine Funktion mit statischem Inhalt zu verwenden.

Sie können sie in ID = GetMicroSecondsCount speichern, um sie zu speichern und zu überprüfen.

Dasselbe gilt für die Bestellungen - check magic

Ich habe den Pseudocode unten nicht überprüft :)

bool IsNewTick(ulong newId) // GetMicrosecondCount() or magic
{
  static ulong id = 0;
  
  if (id != newId) 
  {
    id = newId;
    return true;
  }
  
  return false; 
}
 
Andrey Khatimlianskii:

2. ähnliche Frage für Berufe. Wie erkenne ich, ob sich seit dem letzten Lauf etwas in der Liste der Aufträge/Positionen (einschließlich offener Level, SL und TP) geändert hat?

In A müssen wir eine Art Flag in OnTrade setzen (und es nach der Ausführung zurücksetzen), das ist der billigste Weg.

Aber auch hier würde ich mir eine universelle Lösung wünschen.


Wer hat eine Idee?

Fügen Sie hier Ihre Bedingungen (SL/TP usw.) ein.

Forum zum Thema Handel, automatisierte Handelssysteme und Strategietests

Organisieren eines Auftragsüberlaufs

fxsaber, 2017.10.18 12:29

struct HISTORY_UNIT
{
  long Ticket;
  int Type;
  double Lots; 
    
  HISTORY_UNIT( void ) : Ticket(::OrderTicket()), Type(::OrderType()), Lots(::OrderLots())
  {
  }

  bool operator !=( const HISTORY_UNIT &Unit ) const
  {
    return((this.Ticket != Unit.Ticket) || (this.Type != Unit.Type) || (this.Lots != Unit.Lots));
  }
      
  bool IsChange( void )
  {
    const HISTORY_UNIT Tmp;
    const bool Res = (this != Tmp);
    
    if (Res)
      this = Tmp;
      
    return(Res);
  }
};

// Возвращает true только в случае, если с последнего вызова произошли торговые изменения
bool IsChange( void )
{
  static HISTORY_UNIT History[];  

  const int Total = OrdersTotal();  
  bool Res = (ArraySize(History) != Total);

  for (int i = 0, j = Res ? ArrayResize(History, 0, Total) : 0; i < Total; i++)      
    if (OrderSelect(i, SELECT_BY_POS))
    {
      if (Res || (Res = History[j].IsChange()))
        ArrayResize(History, j + 1, Total);
      
      j++;
    }
  
  return(Res);
}
 
Andrey Khatimlianskii:

1. Wie kann man am einfachsten feststellen, dass der Funktionsaufruf zum gleichen Zeitpunkt erfolgt wie der vorherige Aufruf?

Zeit (TimeCurrent) kann gleich bleiben, Zeit in ms von SymbolInfoTick, theoretisch auch.

Der Vergleich von Geld-, Brief- und ms-Zeiten ist zu teuer.

Ich schlage nicht vor, die Steuerung im EA selbst zu organisieren, ich möchte eine universelle unabhängige Funktion erhalten.

Hier geht es nicht um Billigkeit, sondern um die Zuverlässigkeit der Zeckennummerierung. Ich tue die folgenden Dinge in meinem EA.

#ifdef __MQL5__
#else // __MQL5__
  // В false-режиме если засекли изменения, то последующие вызовы не делают проверку.  
  static bool IsNotChange( const bool bInit = false )
  {
    static bool IsChange = false;
     
    if (bInit)
      IsChange = false;
      
  #ifdef  HISTORYTICKS_ISCHANGE
    if (bInit)
      HISTORYTICKS::IsChange();
    else if (!IsChange)
      IsChange = HISTORYTICKS::IsChange();
  #endif // HISTORYTICKS_ISCHANGE
    
    return(!IsChange);
  }
#endif // __MQL5__

Dies ist die Version der Funktion für MT4. Nummerierung durch Spionageanzeige.


Ich füge die Version der gleichen Funktion für MT5 nicht bei, da unnötige Dinge entfernt werden sollten. Aber sie basiert auf dieser Funktion.

  // Свежие тики с последнего вызова
  static int GetFreshTicks( MqlTick &Ticks[], const datetime dFrom = 0 )
  {
    static long LastTime = 0;
    static int LastAmount = 0;

    if (dFrom)
    {
     ::Comment("Waiting Ticks from " + ::TimeToString(dFrom, TIME_DATE) + "...");

      LastAmount = 0;
    }
    
    ::ArrayFree(Ticks);
  
    int Size = (dFrom || LastTime) ? ::CopyTicksRange(_Symbol, Ticks, COPY_TICKS_INFO, dFrom ? (long)dFrom * 1000 : LastTime) : 0;
    
    if (Size > LastAmount)
    {
      LastTime = Ticks[Size - 1].time_msc;
      int NewLastAmount = 1;
      
      for (int i = Size - 2; (i >= LastAmount) && (Ticks[i].time_msc == LastTime); i--)
        NewLastAmount++;
        
      if (::ArrayRemove(Ticks, 0, LastAmount))
        Size -= LastAmount;
        
      LastAmount = NewLastAmount;
    }
    else
      Size = ::ArrayResize(Ticks, 0);
    
    return(Size);
  }


Wenn der Wert ungleich Null ist - neuer Tick.

 
...:

Die Grundidee besteht darin, eine Funktion mit statischem Inhalt zu verwenden.

Um Ticks zu speichern und abzugleichen, können Sie in ID = GetMicroSecondsCount speichern

Ich danke Ihnen!

Das ganze Problem ist nur diese eindeutige ID (Zeckennummer), die es nicht gibt.

GetMicroSecondsCount wird nicht helfen, da es sich zwischen den Aufrufen ändert (dafür ist es ja da), während GetTickCount sich theoretisch nicht bei 2 benachbarten Ticks ändern kann.

 
fxsaber:

Das Problem ist hier nicht die Billigkeit, sondern die Zuverlässigkeit der Ticknummerierung. In einer Kampf-EA mache ich das so.

Nein, es wird auf jeden Fall langsamer sein als ein Bid/Ask/ms-Vergleich.

Was ist das Problem mit der Zuverlässigkeit? Nur die Tatsache, dass etwas verändert wird, ist wichtig.

 
fxsaber:

Fügen Sie hier Ihre Bedingungen (SL/TP usw.) ein.

Ich habe mich sofort an diesen Code erinnert.

Es geht aber nur darum, eine unnötige Aufzählung aller Aufträge zu vermeiden.

Es ist klar, dass wir diese Schleife zu einer einzigen Schleife für den gesamten EA machen können. Aber in diesem Fall sollten wir der Funktion ein Zeichen von Änderungen übergeben (wir können sie auch nicht aufrufen).

 
Andrey Khatimlianskii:

Nein, es wird auf jeden Fall langsamer sein als der Bid/Ask/ms-Vergleich.

Was ist das Problem mit der Zuverlässigkeit? Wichtig ist nur, dass sich etwas ändert.

Forum zum Thema Handel, automatisierte Handelssysteme und Strategietests

Alle Fragen von PROFi an SUPER PROFi - 1.

Andrey Khatimlianskii, 2020.03.05 23:46

Zeit (TimeCurrent) kann gleich bleiben, Zeit in ms von SymbolInfoTick, theoretisch auch.

Der Vergleich von Bid, Ask und Time in MSC ist teuer.

Besonders relevant für MT4, wo time_msc Schritt Änderung ist 1000ms.

 
Andrey Khatimlianskii:

Das Ziel ist aber gerade, unnötige Überschneidungen aller Aufträge zu vermeiden.

Es liegt auf der Hand, dass wir diesen Zyklus zu einem einzigen für den gesamten EA machen können. Aber dann müssen wir der Funktion ein Zeichen für Änderungen übergeben (wir können sie auch nicht aufrufen).

Das verstehe ich nicht. Wenn sich etwas in der Datenbank geändert hat, lässt sich das nur durch einen Vergleich mit dem vorherigen Zustand der Datenbank herausfinden.

Sie können jedes entsprechende Datenbankelement vergleichen. Oder Sie können den Hash aus ihnen berechnen und die Hashes vergleichen.