Fragen von Anfängern MQL5 MT5 MetaTrader 5 - Seite 1220

 
HistorySelect(xxx,TimeCurrent()+1)

Eine Sekunde ist oft der Verlust des letzten Geschäfts/der letzten Bestellung auf der Real. Zum Beispiel wird bei vielen Brüchen ein Auftrag für die TTL-Zeit ausgeführt, die fünf Sekunden betragen kann. Wird er nicht innerhalb von fünf Sekunden ausgeführt, gilt der Auftrag als Weiterleitung. Oder er wird ausgeführt, aber in drei Sekunden.

Wenn zwischen der Annahme und der Ausführung keine Zeitspanne verstrichen ist, erhält der Aufruf HistorySelect keine Informationen darüber.


Vielleicht sollte die TimeCurrent gleich MathMax(LastOrder_time, MarketWatch_Time) sein. Dann wird der HistorySelect korrekt sein. Aber TimeCurrent ist wahrscheinlich zu teuer.


Übrigens, ein solches Schema der Arbeit HistorySelect wird einige der Geschichte der Trades zu überspringen.

void OnStart()
{
  static MqlTick PrevTick = {0};
  
  MqlTick Tick;
  
  if (SymbolInfoTick(_Symbol, Tick))
  {
    if (HistorySelect(PrevTick.time, INT_MAX))
      // Учитываем новые ордера/сделки в Истории торгов

    PrevTick = Tick;  
  }
}

Obwohl auf den ersten Blick alles klar ist.


Das Schreiben einer billigen DealsTotal() ist in MT5 nicht einfach. Es ist nicht elementar (und frei) OrdersHistoryTotal() in MT4.

 

lauten Gedanken, ohne Anspruch auf Relevanz oder Kompetenz:


fxsaber:

Wenn von der Annahme bis zur Ausführung keine Ticks vorhanden waren, wird ein solcher Aufruf von HistorySelect keine Informationen darüber erhalten.

Sie werden dieses Problem nicht lösen, das Modell der Server - Terminal - MQL Interaktion wurde ursprünglich entworfen

Ich bin noch nicht so weit, dass ich es im MT5 überprüfen kann, aber im MT4 weiß ich mit Sicherheit, dass es Situationen gibt, in denen sich der Preis unseres Symbols im Marktbeobachtungsfenster ändert, aber es gibt vielleicht keine Ticks oder weniger als in ЕА


ok, egal, so dass es funktioniert, müssen Sie nur in der TS-Entscheidung zu wählen, was mit dem Auftrag in Ermangelung von Informationen aus dem Server von dem Moment an Sie den Auftrag senden passiert - dh, wird der Auftrag eingestellt oder abgelehnt werden a priori, und erhielt die Antwort auf diese vorläufige Entscheidung zu bestätigen oder zu stornieren - dh, die Arbeit mit unbestätigten Informationen oder noch für die Antwort vom Server warten - dieses Angebot MQ und Sie werden wahrscheinlich nicht passen


fxsaber:

Es ist nicht einfach, billige DealsTotal() in MT5 zu verwenden. Es ist nicht die elementare (und kostenlose) OrdersHistoryTotal() in MT4.

nicht schreiben ;)

oder vielmehr, höchstwahrscheinlich werden Sie, und Sie werden EA-Ressourcen zu verbringen, um den Algorithmus zu erhalten, ich denke, Sie müssen herausfinden, wie SQLite funktioniert, MQ Performance-Tests haben festgestellt, die Arbeit mit großen Tabellen und Proben ist genau der Zweck der Datenbank - die EA-Code wird minimalistisch sein, die ganze Arbeit der Datenbank zu tun, die ganze Arbeit kommt auf das Füllen von Daten, wenn eine Bestellung und die Aktualisierung, wenn der Server reagiert (Synchronisation, natürlich, wenn Sie EA, die Datenbank im Speicher laufen)

 
Igor Makanu:

aber das wirst du nicht ;)

oder vielmehr, höchstwahrscheinlich werden Sie schreiben und verbringen EA-Ressourcen, um den Algorithmus zu erhalten, ich denke, Sie müssen herausfinden, wie SQLite funktioniert, MQ Performance-Tests angegeben, die Arbeit mit großen Tabellen und Proben ist genau der Zweck der Datenbank - EA-Code wird minimalistisch sein, die ganze Arbeit der Datenbank werden Sie tun, alle Arbeit wird auf das Füllen von Daten kommen, wenn eine Bestellung und Aktualisierung, wenn die Antwort vom Server (Synchronisation, natürlich bei der Ausführung EA, die Datenbank im Speicher)

Er wurde ursprünglich geschrieben und veröffentlicht. Es ist unwahrscheinlich, dass es noch schneller geht.

 
fxsaber:

Er wurde ursprünglich geschrieben und veröffentlicht. Es ist unwahrscheinlich, dass es noch schneller geht.

Ich muss die Aufgabe falsch gesehen haben.

Ich dachte, dass ich die Liste der Aufträge an zwei Punkten aktualisieren muss, nämlichOnTradeTransaction() und OnTick(), und schlug daher vor, dies in der Datenbank zu tun

 
void OnTradeTransaction(const MqlTradeTransaction &trans, const MqlTradeRequest &request, const MqlTradeResult &result)
  {
   if(trans.type==TRADE_TRANSACTION_DEAL_ADD)
     {
      if(!HistoryDealSelect(trans.deal))
         return;
      bool time_to_sum_up=false;
      if(HistoryDealGetInteger(trans.deal,DEAL_ENTRY)==DEAL_ENTRY_OUT)
        {
         time_to_sum_up=true;
        }
      if(!time_to_sum_up)
         return;
      HistorySelect(0,TimeCurrent());
      int deals=HistoryDealsTotal();
      for(int i=deals-1; i>=0; i--)
        {
         if(HistoryDealGetTicket(i)==trans.deal)
           {
            Print("Found!");
            return;
           }
        }
      Print("Not Found!");
     }
   return;
  
Dieser Code ist ein vereinfachter Ausschnitt aus meinem EA.
Nehmen wir an, dass in einigen Fällen das Ergebnis der Ausführung dieses Codes "Nicht gefunden" ist.
Ich verstehe nicht ganz, warum.
Warum kann sie sich nicht in den von ihr ausgelösten Ereignissen wiederfinden?
Das vom Server an das Terminal gesendete Transaktionsereignis ist eingetroffen, aber der Server kann nicht gleichzeitig die richtige Zeit mit dem Terminal synchronisieren?
Meines Erachtens ist eine Erhöhung des Werts von TimeCurrent() um eine Sekunde mehr als ausreichend.
Ich muss etwasWichtiges übersehen haben, oder?
Ich wäre Ihnen sehr dankbar, wenn Sie mich auf eventuelle Fehler in meinem Verständnis hinweisen könnten.
Объем импорта г/г - экономический индекс Японии
Объем импорта г/г - экономический индекс Японии
  • www.mql5.com
Объем импорта г/г (Imports y/y) отражает изменение объема импорта товаров и услуг в отчетном месяце по сравнению с тем же месяцем прошлого года. Показатели импорта используются для оценки внешней торговой активности Японии и спроса на импортируемые товары внутри страны. Из-за последствий "финансового кризиса" США Япония также столкнулась с...
 
Können Sie bitte eine Methode zum Öffnen von Market Deep eines Symbols in mql5 erstellen? Dies ist wichtig, wenn man mit mehreren Symbolen arbeitet.
 
Dmitri Custurov:

Hier ist mein Code. Bei der Initialisierung wird ein Datensatz in der Tabelle erstellt. Im OnTick-Body sollte sofort ein Fehler zurückgegeben werden, weil ich versuche, einen Datensatz mit demselben PRIMARY KEY hinzuzufügen, und danach wird die Basis sofort geschlossen. Aber gleichzeitig sollte ich zumindest den ersten Datensatz sehen, wenn ich ihn öffne, aber wenn ich ihn im Testprogramm ausführe, ist er nicht da. Und auch die Tabelle wird nicht erstellt. Wenn ich es einfach im Terminal öffne, ist alles normal. Der erste Datensatz ist da.

Mit dem Standort der Datenbank kommen Sie hoffentlich nicht durcheinander?

 
Aleksey Mavrin:

Sie sind nicht verwirrt über den Standort der Basis, oder?

Nein, das bin ich nicht. Alles ist in Dateien. Ich denke, dass im Testermodus die Datenbank im Speicher erstellt und nach dem Test zerstört wird.

 
Igor Makanu:

lauten Gedanken, ohne Anspruch auf Relevanz oder Kompetenz:

...

oder vielmehr, höchstwahrscheinlich werden Sie schreiben und verbringen EA-Ressourcen, um den Algorithmus zu erhalten, ich denke, Sie müssen herausfinden, wie SQLite funktioniert, MQ Performance-Tests angegeben, die Arbeit mit großen Tabellen und Proben ist genau der Zweck der Datenbank - EA-Code wird minimalistisch sein, die ganze Arbeit der Datenbank werden Sie tun, ist alle Arbeit auf das Füllen von Daten reduziert, wenn eine Bestellung und Update, wenn die Antwort vom Server (Synchronisation, natürlich, wenn EA läuft, die Datenbank im Speicher)

Und welche Datenbank soll die ganze Arbeit erledigen? Können Sie mir das sagen?

 

Die Kommunikation erfolgt entweder über die Datenbank oder über PUB/SUB ZMQ. Natürlich ist die Datenbank nicht SQLite, sondern Redis, das für diese Zwecke am besten geeignet ist, natürlich meine persönliche Meinung.

Viel Glück!