Fehler, Irrtümer, Fragen - Seite 1724

 
MK, warum fügst du nicht normale Funktionen für die Binärsuche in die Standardbibliothek ein? ArrayBsearch ist nur in einfachen Fällen anwendbar, in denen die Typen einfach sind und Sie keinen eigenen Komparator benötigen. Templates sind da, machen Sie einen Override über c++::std::lower/upper_bound. Bisher musste ich es selbst schreiben, was nicht normal ist (fast vollständig von cppreference kopiert).
template<typename A, typename T, typename Compare>
uint lower_bound(const A &ar[], const T &value, Compare &comp){
   long count = ArraySize(ar);
   uint first = 0;
  
   while(count > 0){
      uint it = first;
      uint step = count / 2;
      it += step;
      if(comp.comp(ar[it], value)){
         first = ++it;
         count -= step + 1;
      }
      else
         count = step;
   }
   return first;
}

void OnStart(){
   struct M_point{
      double price;
      datetime time;
   };
   M_point ar[5];
   ar[0].time = 2; ar[1].time = 4; ar[2].time = 6;
   ar[3].time = 8; ar[4].time = 10;
   struct Comp{
      bool comp(const M_point &p, datetime value) {return p.time < value;}
   }cmp;
   datetime value = 6;
   lower_bound(ar, value, cmp);
   return;
}

Dabei ergaben sich einige Fragen:
1. Warum ist es unmöglich, operator() in Comp zu schreiben (es ist aus irgendeinem Grund verboten)?
bool operator()(const M_point &p, datetime value) {return p.time < value;}
2. Warum können wir prvalue nicht an eine Funktion übergeben, die eine konstante Referenz akzeptiert?
lower_bound(ar, 6, cmp) ); // ошибка
ZS: und auch sehr ärgerlich diese Warnung: "struct has no members, size assigned to 1 byte "
 
coderex:

Dort ist alles in Ordnung, die Auftragserteilung sollte über OnTradeTransaction gesteuert werden. Übrigens, wenn Sie sich direkt über Plaza2 mit der Börse verbinden, ist die Situation die gleiche - Sie müssen die Ankunft von Nachrichten über die Auftragserteilung steuern. In MT4 ist diese Funktion synchron, aber die gleiche Option ist in MT5 verfügbar, nur dass in diesem Fall die Logik anhält, bis die Funktion keine Antwort erhält.

Wenn Sie möchten, kann ich Ihnen die Steuerklasse schicken, aber sie ist für den Marktplatz geschrieben, aber bald werde ich sie für Begrenzer fertigstellen.

Um die Anfrage zu kontrollieren, müssen Sie sich an die Tatsache erinnern, wo sie platziert wurde. Die Klasse wird Ihnen dann zugeschickt.
 
fxsaber:
Ich bitte Sie sehr, etwas in der kodobase zu posten! Für pädagogische Zwecke.

Aus dem Grund, auf den Sie selbst hingewiesen haben, geht das nicht https://www.mql5.com/ru/forum/1111/page1743#comment_2877482. Kürzlich konnte ich den Fehler nicht lokalisieren, verbrachte viel Zeit damit, den Quellcode in servicedesk zu formen - am Ende kam nichts heraus, weil viele Querverweise (einer zieht den anderen in geometrischer Progression) - ich schickte .ex5

Zu Lehrzwecken kann ich folgende Aufgabe vorschlagen: Ohne zusätzliche Variablen einzuführen, vereinfachen Sie h() so, dass f() in jedem Fall einmal aufgerufen wird

bool f() { return Random(); /*вычисляется ооочень долго, но результат не зависит от числа вызовов*/ } 
void g1() { /*делает что-то полезное*/ }
void g2() { /*делает что-то полезное*/ }
void h() {
#ifndef  MACRO
        if ( f() )
#endif
        {
                if ( f() )
                        g1();
                g2();
        }
}
Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • www.mql5.com
Форум трейдеров MQL5.community
 
A100:

Kompilierungsfehler

(*) Im Allgemeinen können in Muster (1) sowohl A->(2) als auch const A->(3) anstelle von T ersetzt werden.

Warum ist das so? Ein Muster mit const kann nicht non-const akzeptieren - es verstößt gegen den Vertrag.

 
A100:

Zu Lehrzwecken kann ich folgende Aufgabe vorschlagen: Vereinfachen Sie h(), ohne zusätzliche Variablen einzuführen, so dass f() in jedem Fall einmal aufgerufen wird

bool f() { return Random(); /*вычисляется ооочень долго, но результат не зависит от числа вызовов*/ } 
void g1() { /*делает что-то полезное*/ }
void g2() { /*делает что-то полезное*/ }
void h() {
#ifndef  MACRO
        if ( f() )
        {
                g1();
                g2();
        }
#else
        if ( f() )
                g1();
        g2();
#endif
}
 
Stanislav Korotky:

Warum ist das so? Eine Vorlage mit const kann nicht non-const akzeptieren - es verstößt gegen den Vertrag.

Eine Vorlage ist nicht selbständig (im Gegensatz zu einer Funktion) - ihre Aufgabe ist es, eine Substitution durchzuführen (in Analogie zu #define). Wenn es am Ende der Ersetzung keine Widersprüche gibt (und es gibt keine), hat die Vorlage ihre Aufgabe erfüllt. Zumindest habe ich versucht, es in C++ zu kompilieren und der Compiler gab keine Fehler oder Warnungen aus
 
fxsaber:
Dies ist nicht wirklich eine Vereinfachung. Im Original ist MACRO+2*f+g1+g2=5 - Sie haben: MACRO+2*f+2*g1+2*g2=7.
 
Sergey Diubakin:

Hat jemand ein ähnliches Problem erlebt? Ein "Fehler" im Terminal oder bei mir?

Was gibt die Funktion GetLastError() zurück?
 
fxsaber:

MT5-OrderSend ist NICHT vollständig synchronisiert - es findet keine Synchronisation mit der Handelsumgebung statt. Das bedeutet, dass die historischen Messwerte nicht mit der realen Situation übereinstimmen.

Eine Auszeit kommt nicht in Frage. Es gibt keine verlässliche Lösung für dieses Problem, da Sie sich mit Synchronisationsproblemen auf der Terminalebene und nicht auf der Serverebene befassen müssen.

In der Tat stehen die MT5-Benutzer vor dem gleichen Problem wie die Entwickler der MT4-Bridge.

Wenn ein OrderSend gesendet wird, müssen Sie sich daran ERINNERN (hier liegt die potenzielle Schwachstelle), dass dies geschehen ist. Dann ignorieren Sie die aktuelle Historie (Handelsumgebung), bis die entsprechende Meldung in OnTrade kommt. Sobald es eintrifft, VERGESSEN Sie es nicht mehr.

Wenn es kein REMEMBER gibt, können Sie sich auf die Historie wie in MT4 verlassen.

MT4-OrderSend ist VOLLSTÄNDIG synchronisiert.
Ich frage mich - aus welchem Grund wird das gemacht ...
Ich verstehe, wenn Sie mit OrderSendAsync asynchron herumspielen, können Sie sowohl OnTrade als auch OnTradeTransaction behandeln. Mit OrderSend möchte ich ein einfaches Verhalten haben, wie in MT4. Sobald sie aufgerufen wird, erhalten wir in der Ausgabe die bereits geänderten offenen Positionen und die Historie.
Es gibt einen feinen Punkt. Wenn der aktuelle Zustand in einer globalen Variable gespeichert ist und die Erwartung von Zustandsänderungen relativ lange dauert, und es dem Händler gelingt, die EA-Parameter zu ändern, werden die globalen Variablen zurückgesetzt und der Zustand wird verworfen.
 
bool f() { return Random(); /*вычисляется ооочень долго, но результат не зависит от числа вызовов*/ } 
void g1() { /*делает что-то полезное*/ }
void g2() { /*делает что-то полезное*/ }
void h() {
        if ( f() )

        {
                g1();
#ifdef  MACRO
        }
#endif
                 g2();
#ifndef  MACRO
        }
#endif
}