Entwickler! Testen Sie überhaupt, was Sie schaffen? - Seite 6

 
Mikalas:

Könnten Sie mir bitte sagen, wie Sie kontrollieren können, ob eine Bestellung geändert wird (ohne Serverantwort)?

Die Änderung eines Auftrags löst mehrere Ereignisse aus, und ich kontrolliere alle diese Ereignisse und auch die Zeit, die die ausstehende Aufgabe in der Liste der ausstehenden Aufgaben steht.

Ich habe einen Forts-Roboter, der 500-600 Trades pro Session macht und bisher keine Ereignisse verloren hat, d.h. alle Tasks in der Warteliste werden ausgeführt und erreichen nicht den Timer-Check.

 
Yurich:

Per Definition kann ein Ereignismodell nicht völlig zuverlässig sein; wenn ein Ereignis nicht eingetreten ist, bedeutet das nicht, dass es nicht stattgefunden hat.

Wenn einige der Ereignisse eintreffen und andere nicht, dann sind doppelte Codeblöcke erforderlich, um die Verarbeitung der Befehlsergebnisse zu gewährleisten, die den Status durch Vergleich mit dem vorherigen überprüfen würden usw. Dann stellt sich die Frage: Wenn der duplizierende Code absolut zuverlässig funktioniert, warum sollte man dann einen auf Ereignissen basierenden Code verwenden? Warum zwei Codes anstelle von einem, der nicht ereignisgesteuert ist, verwenden? Um Redundanz zu erzeugen?
 
Yurich:

Die Änderung eines Auftrags löst mehrere Ereignisse aus, und ich kontrolliere alle diese Ereignisse und auch die Zeit, die die Aufgabe auf der Warteliste steht.

Mein Forts-Roboter macht 500-600 Trades pro Session und es gab bisher keine Verlustereignisse, d.h. alle Aufgaben in der Warteliste werden ausgeführt und erreichen nicht die Zeitkontrolle.

Das ist viel interessanter... Es gab also noch keinen Fall, in dem das erwartete Ereignis nicht eingetreten ist?
 
C-4:
Das ist viel interessanter... Es hat also noch nie einen Fall gegeben, in dem ein erwartetes Ereignis nicht eingetreten ist?
Als ich sagte, es gäbe keinen Verlust von Ereignissen, meinte ich, dass die Aufgaben, die auf der Warteliste standen, auf ihr Ereignis warteten (mindestens ein Ereignis aus der Kette der wichtigen Ereignisse). Vielleicht gibt es Verluste von Ereignissen, von denen Michael sagt, ich führe kein Protokoll über die Ereignisse, aber sie haben keinen Einfluss auf das allgemeine Funktionieren meines Ereignismodells.
 

zu:Michael.

Im Allgemeinen ist es für Sie einfacher, eine zusätzliche Kontrolle durchzuführen, bis die Situation auf irgendeine Weise geklärt ist:

int dealsCount = 0;
///
/// С заданной периодичностью синхронизируем количество обработанных и поступивших трейдов.
///
void OnTimer(void)
{
   if(dealsCount != HistoryDealsTotal())
   {
      //Пришли новые трейды. их нужно обработать
      for(int i = dealsCount; i < HistoryDealsTotal(); i++)
      {
          ulong ticket = HistoryDealGetTicket(i);
          DealChecking(ticket);
      } 
   }
}

///
/// Поступило новое событие о поступлении трейда.
///
void  OnTradeTransaction(
      const MqlTradeTransaction&    trans,
      const MqlTradeRequest&        request,
      const MqlTradeResult&         result
   )
{
   if(trans.type == TRADE_TRANSACTION_DEAL_ADD)
     DealChecking(trans.deal);
   ...
}

///
/// Обработчик трейдов.
/// \param ticket - Уникальный идентификатор трейда, который надо обработать.
void DealChecking(int ticket)
{
   
   // Далее идет нужная обработка.
   ...
   //Трейд обработан - увеличиваем количество обработанных трейдов.
   dealsCount++;
}

Es gibt keine Redundanz in dieser Implementierung, da es nur einen tatsächlichen Handler für das Ereignis "new trade" gibt. Sie wird jedoch auf zwei verschiedene Arten aufgerufen: über den Timer und über das Ereignis OnTradeTransaction. Wenn das neue Geschäft aus irgendeinem Grund das OnTradeTransaction-Ereignis nicht aufgerufen hat, kommt es zu einer Unsynchronisierung des Gesamtbetrags und der Anzahl der verarbeiteten Geschäfte. Alle unbearbeiteten Geschäfte gelangen in diesem Fall weiterhin über die for-Schleife zum DealChecking-Handler.

Dieses Schema kann für jedes Ereignis eingeschränkt werden, nicht nur für TRADE_TRANSACTION_DEAL_ADD.
 
Mikalas:

...

P/S Und es ist nicht nötig, den Text "herauszureißen", und der ganze Satz beginnt so:

Wenn Sie die Art des Handels kennen, können Sie den aktuellen Status der Aufträge, Positionen und Geschäfte auf Ihrem Handelskonto analysieren.

Weitere Einzelheiten finden Sie immer in der Hilfe.

Bei allem anderen stimme ich mitYurich überein. Sie sollten wahrscheinlich auch Ihr Schema überdenken.

 

Liebe Kollegen!

Ich danke Ihnen allen sehr für Ihre Meinung!

Nur ein Wurm nagt an mir: Wozu ist dann die PLATFORM da?

 

Mikalas:

Warum brauchen Sie dann eine PLATFORM?

Das war wahrscheinlich eine rhetorische Frage :) Falls nicht, wurde die Antwort bereits in diesem Thema gegeben:

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Entwickler! Testen Sie überhaupt, was Sie schaffen?

C-4, 2013.12.10 12:08

Ich empfehle es nicht. Es ist viel einfacher, diesen Fehler zusammen mit MQ zu beheben, als ein neues Terminal für den Platz selbst zu bauen. Sie werden sich in endlosen Bugfixes und dem Schreiben von "Standardfunktionen" verzetteln. Ich spreche aus meiner eigenen Erfahrung. Ich habe teilweise einen solchen selbstgebauten Komplex auf der Grundlage von Stock# entwickelt - das Ergebnis ist ein weiteres "Fahrrad" für bestimmte Aufgaben. Kämpfen Sie lieber mit dem Support-Service, das ist einfacher und billiger.
Ich bin auch nicht mit allem im Terminal zufrieden, z. B. mit der Einstellung "letzter Preis". Aber ich hoffe, dass MQ, wenn eine kritische Masse von Börsenmaklern zusammenkommt, beginnt, auf ihre Bedürfnisse zu hören.
 
Ok. Was ist die echte Alternative zu MT5?
 
Armen:
Ok. Was ist die echte Alternative zu MT5?

Das ist genau die Frage, die Sie sich stellen müssen, bevor Sie solche Themen erstellen. Vor der Einführung von MT5 mussten Sie zumindest Ihr eigenes Handelsterminal schreiben, um mit FORTS zu handeln. Wenn Sie mit FORTS handeln wollen, gibt es in diesem Bereich keine fertigen Lösungen, abgesehen von Quick, das für Algotrading praktisch unbrauchbar ist (wer einmal Programme mit QPile geschrieben hat, die länger als 1000 Zeilen sind, wird verstehen, wovon ich spreche). Es gibt eine Reihe von Stock#-Bibliotheken, aber es hat sich nicht zu einem vollwertigen Handels-Terminal "out of the box" entwickelt (run and trade). Ein durchschnittlich oder gut ausgebildeter Programmierer wird bis zu 6 Monate brauchen, um eine Handelsplattform mit Stock# zu erstellen. Der Programmieranfänger wird von diesem Produkt überfordert sein. Es gibt auch Terminals wie Kofite, TSLab, WealthLab. Aber Sie müssen sich darüber im Klaren sein, dass sie nicht direkt von den Brokern unterstützt werden, so dass Sie mit Quick + Ihrer Super Trading Platform arbeiten müssen (mit all den damit verbundenen Problemen der Datenübertragung über DDE). Und wenn Sie durch das Protokoll PlazaII arbeiten wollen - für 3 000 Rubel pro Monat, wird der Makler Sie mit einer solchen Gelegenheit zu bieten.

Im bürgerlichen Segment ist die Lage nicht besser. Nicht jeder amerikanische Broker bietet eine Handelsplattform mit der Möglichkeit des Algotradings. Nicht jeder amerikanische Makler ist für eine Zusammenarbeit mit Russland geeignet. Es ist gut, wenn sie Ihnen eine API zur Verfügung stellen. Und wieder sind wir dabei, unser eigenes Fahrrad für diese API zu schreiben. Darüber hinaus sind die angebotenen Plattformen viel zu unterschiedlich und auf verschiedene Marktsegmente ausgerichtet. Vergleichen Sie einfach Wealth-Lab mit ThinkOrSwim. Keine Standards, keine einheitliche Schnittstelle.

Wenn Ihr Motto lautet: "Ich träume nur vom Frieden" oder "Ich handle, um neue Software zu testen und das nächste Fahrrad zu schreiben" - dann sollten Sie sich wirklich nach einer anderen Plattform als MetaTrader5 umsehen.