Ungültige Anfrage - habe gerade angefangen und kann es nicht herausfinden... - Seite 8

 
papaklass:

Ich habe es auf die gleiche Weise implementiert, nur durch Funktionen.


Verstehe, Ihr Code ähnelt dem von MK - zwischen OrderCheck und OrderSend gibt es eine Ebene der Fehlerbehandlung durch den Benutzer.

 
papaklass:

Ich habe es auf diese Weise implementiert, nur durch Funktionen.

OrderCheck wird implizit und notwendigerweise innerhalb von OrderSend geprüft.

Wenn die Bestellung also nicht korrekt ausgefüllt wird, wird die Antwort sofort zurückgegeben, ohne sie an den Server zurückzuschicken.

 
papaklass:

Lesen Sie, was im Handbuch dazu steht:

Erste Auswahl: Wir sehen, dass es sich um eine Funktion für Handelsgeschäfte handelt und dass keine Schecks erwähnt werden.

Nun, wenn ich sage, dass es Kontrollen gibt, dann stimmt das auch.

Kein Auftrag verlässt das Terminal ohne harte Kontrollen.

Zweite Hervorhebung: Wir sehen, dass Prüfungen auf dem Server durchgeführt werden, und die Entwickler empfehlen die Verwendung von OrderCheck(), um die Anfrage zu prüfen, bevor sie an den Server gesendet wird. Auch hier wird nicht erwähnt, dass OrderSend() eine Validierung durchführt.

Wir empfehlen ausdrücklich, dass die Händler die Möglichkeit haben, sich im Voraus zu informieren, ob der Auftrag korrekt ausgeführt wird, und die entsprechenden Maßnahmen zu ergreifen.

Wer will, kann es vorprüfen. Wer das nicht möchte, für den werden wir trotzdem ähnliche Antworten prüfen und zurückgeben.

Die einzige Stelle, an der erwähnt wird, dass die Prüfung vor dem Senden der Anfrage erfolgt, ist "Im Falle einer erfolgreichen grundlegenden Prüfung der Strukturen (Zeigerprüfung) ....". Die Prüfung von Zeigern und die Prüfung der Werte von Feldern der Anforderungsstruktur auf Fehler ist jedoch nicht dasselbe. Und die Empfehlung der Entwickler, die Funktion OrderCheck() zu verwenden, ist ein indirekter Beweis dafür, dass OrderSend() keine echte Fehlerprüfung durchführt, bevor eine Anforderung an den Server gesendet wird. Warum sollten wir sonst "gebuttert" werden: OrderSend() prüft zuerst, und dann muss dieselbe Prüfung von OrderCheck() erneut durchgeführt werden?

Aus dem Verweis geht also eindeutig hervor, dass die Prüfung ausschließlich auf dem Server durchgeführt wird!

Niemandem wird ein fehlerhafter oder übermäßiger Fluss von Anfragen an den Server entgehen.

Um dies zu verstehen, genügt einfache Logik. Und wir werden die Dokumentation erweitern.

 
sergeev:

Alle Fehler werden von der Geschäftslogik behandelt.

Ich habe eine. Business-Logik behandelt Ereignisse im Zusammenhang mit der Geschäftslogik (z. B., um Platzierung Fehler), aber alles andere (z. B. Server-Antwort Verzögerung) - eine universelle Vorlage, auf der absolut jeder Experte implementiert werden kann.

Aber MT5 ist um ein Vielfaches komplizierter in Bezug auf die Handhabung von Return Codes + Asynchronität.

Das ist es, worüber wir sprechen, wie ich ebenfalls schon geschrieben habe, und es gibt null Informationen zu diesem Thema. Und seit Jahren versuchen die MKs auf jede erdenkliche Weise, sich von dieser Bestimmung zu distanzieren. Das ist es, was ich geschrieben habe - Händler profitieren von einem Produkt, bei dem es Punkte gibt, die zu Leckagen führen, d.h. für MQ ist es ein Faktor zur Umsatzsteigerung. Leider befinden wir uns auf einem Markt, auf dem wir Konkurrenten (wir und MQ) sind, keine Genossen.

Sie verlangen Unmögliches von einem Wrapper. Die Standardbibliothek ist keine Geschäftslogik. Es ist ein Wrapper "über" die Terminalfunktionen. Eine Umhüllung über der Füllung der Süßigkeit.

Dann ist eine solche Strukturierung wenig sinnvoll.

Die Verpackung kann jedoch nichts garantieren, da Sie selbst als Bürge auftreten. Ihre Geschäftslogik. :)

Genau wie die Druckfunktion kann auch die Protokollierung von Fehlern keinen freien Speicherplatz auf der Festplatte garantieren. Für die Fehlerbehandlung müssen Sie andere Funktionen verwenden, und diese sind fallspezifisch.

Nicht einmal der richtige Wrapper kann alles garantieren, aber er kann viele Dinge im Zusammenhang mit verwandten Funktionen.

-Alexey-, lassen Sie uns über konkrete Mängel sprechen, und Sie nennen konkrete Mängel, die Sie gerne beheben würden.

Es wurde bereits mehr als einmal darüber geschrieben. Wenn MQ nicht in der Lage ist, eine fertige Lösung anzubieten, sollten sie zumindest ein Handbuch über Fehlerbehandlung und Rückgabecodes erstellen. Auf jede erdenkliche Weise freigeschaltet. In der Dokumentation zu 4 war dies teilweise vorhanden (z.B. 30 Sekunden warten in einem solchen Fall), teilweise haben die Benutzer aus Erfahrung den Umgang mit undokumentierten Situationen erkannt. Für 5 gibt es überhaupt nichts. Und da es sie gibt, wird sie niemand nutzen.

Nun, wenn MQ so reagiert, weil die einfach geschaffene Handelsinfrastruktur es prinzipiell nicht zulässt, was soll ich sagen - es ist ein komplettes Scheitern des gesamten MT5-Projekts, zumal es auch noch eine unglaubliche Menge anderer Untiefen gibt.

Wenn Sie möchten, können Sie jeden Rückgabecode durchgehen und die wichtigsten möglichen Situationen betrachten.

Ich würde es gerne mit einem so erfahrenen MQL5 Expert Advisor wie Ihnen machen. Wir werden auf die Zeit und die Notwendigkeit warten. Gott sei Dank habe ich noch 4, die in vielerlei Hinsicht viel bequemer sind.

 

-Alexey-:

eine fertige Lösung, zumindest einen Leitfaden für Fehlerbehandlung und Rückgabecodes


Welcher Code verursacht Verarbeitungsprobleme?


Code

Kennung

Beschreibung

10004

TRADE_RETCODE_REQUOTE

Anfrage an

10006

TRADE_RETCODE_REJECT

Antrag abgelehnt

10007

TRADE_RETCODE_CANCEL

Antrag vom Gewerbetreibenden storniert

10008

TRADE_RETCODE_PLACED

Auftrag erteilt

10009

TRADE_RETCODE_DONE

Auftrag ausgeführt

10010

TRADE_RETCODE_DONE_PARTIAL

Suchauftrag teilweise ausgeführt

10011

TRADE_RETCODE_ERROR

Fehler bei der Bearbeitung einer Anfrage

10012

TRADE_RETCODE_TIMEOUT

Antrag wegen Zeitablaufs storniert

10013

TRADE_RETCODE_INVALID

Falscher Antrag

10014

TRADE_RETCODE_INVALID_VOLUME

Falsches Volumen in der Anfrage

10015

TRADE_RETCODE_INVALID_PRICE

Falscher Preis in der Anfrage

10016

TRADE_RETCODE_INVALID_STOPS

Falsche Haltestellen im Antrag

10017

TRADE_RETCODE_TRADE_DISABLED

Handel verboten

10018

TRADE_RETCODE_MARKET_CLOSED

Der Markt ist geschlossen

10019

HANDEL_RETCODE_KEIN_GELD

Unzureichende Mittel für die Erledigung des Ersuchens

10020

TRADE_RETCODE_PRICE_CHANGED

Preise geändert

10021

HANDELS_RETCODE_PREIS_AUS

Kein Angebot zur Bearbeitung der Anfrage

10022

TRADE_RETCODE_INVALID_EXPIRATION

Ungültiges Verfallsdatum in der Anfrage

10023

TRADE_RETCODE_ORDER_CHANGED

Auftragsstatus geändert

10024

TRADE_RETCODE_TOO_MANY_REQUESTS

Zu häufige Anfragen

10025

TRADE_RETCODE_NO_CHANGES

Keine Änderung des Antrags

10026

TRADE_RETCODE_SERVER_DISABLES_AT

Auto-Trading vom Server verweigert

10027

TRADE_RETCODE_CLIENT_DISABLES_AT

Autotrading durch Client-Terminal verboten

10028

TRADE_RETCODE_LOCKED

Antrag zur Bearbeitung gesperrt

10029

HANDELS_RETCODE_GEFROREN

Auftrag oder Position eingefroren

10030

TRADE_RETCODE_INVALID_FILL

Nicht unterstützter Saldoauftragstyp wird angezeigt

10031

TRADE_RETCODE_CONNECTION

Keine Verbindung zum Handelsserver

10032

TRADE_RETCODE_ONLY_REAL

Der Betrieb ist nur für echte Konten erlaubt

10033

TRADE_RETCODE_LIMIT_ORDERS

Limit für die Anzahl der ausstehenden Aufträge erreicht

10034

TRADE_RETCODE_LIMIT_VOLUME ERREICHT

Limit für Order- und Positionsvolumen für dieses Symbol erreicht


Aktualisiert: 14.11.2012
Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте
Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте
  • www.mql5.com
Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте - Документация по MQL5
 

Zum Beispiel 10004. Wo steht geschrieben, was zu tun ist? Und in der vierfachen Dokumentation war zumindest etwas zu finden:

Можно без задержки обновить данные при помощи функции RefreshRates и повторить попытку. Если ошибка не исчезает, необходимо прекратить все попытки торговых операций и изменить логику программы.

 
sergeev:

Welcher Code wirft Verarbeitungsprobleme auf?

10006 (welcher Grund wird abgelehnt, welche anderen Gründe könnte es geben, die nicht in den anderen Codes aufgeführt sind?)

10011, 10013, 10028

 
A100:

10006 (welcher Grund wird abgelehnt, welche anderen Gründe könnte es geben, die nicht in den anderen Codes angegeben sind?)

10011, 10013, 10028

Ich unterstütze die Frage. MQ, eine dringende Bitte an Sie. Bitte kommentieren Sie diese 4 Codes so detailliert wie möglich.
 

Kollegen, die die Suche nach der Wahrheit bereits satt haben. Das Thema ist ähnlich zu dem, was ich brauche, also schreibe ich hier, bitte helfen Sie!

Ich erteile den Auftrag mit sofortiger Ausführung, während er hängt, prüfe ich den Preis jeden Tick und wenn es möglich ist, verfolge ich ihn. Aber aus irgendeinem Grund bekomme ich immer den Fehler 10013. Ich habe alle möglichen Foren durchforstet und fast alle Zeilen des ursprünglichen Auftrags hinzugefügt (obwohl in der Beschreibung steht, dass nur das Symbol, die Aktion und sl und tp für diese Art von Aktion ausreichend sind). Nichts funktioniert! Hier ist der Code.

// проверяем условие на открытую сделку
if (f_IsDealOpened()>0)
{  
   // здесь надо написать условия для коррекции ордеров
 MqlTradeRequest chrequest={0};
    if (1)//(is_Str2)
   {
    PositionSelect(NULL);
    if(PositionGetInteger(POSITION_TYPE)==0)
    {
        chrequest.symbol=PositionGetSymbol(0);
        chrequest.order=PositionGetInteger(POSITION_IDENTIFIER);
        chrequest.volume=PositionGetDouble(POSITION_VOLUME);
        chrequest.action=TRADE_ACTION_SLTP;
        chrequest.sl = latest_price.bid - TrailingStop;
        chrequest.tp = PositionGetDouble(POSITION_TP);

     }
     else
     {
        chrequest.symbol=PositionGetSymbol(0);
        chrequest.order=PositionGetInteger(POSITION_IDENTIFIER);
        chrequest.volume=PositionGetDouble(POSITION_VOLUME);
        chrequest.action=TRADE_ACTION_SLTP;
        chrequest.sl = latest_price.ask + TrailingStop;
        chrequest.tp = PositionGetDouble(POSITION_TP);
        Alert(PositionSelect(NULL));
     
     }    
    }
     MqlTradeResult chresult;
     if (OrderSend(chrequest,chresult)==0) 
         {
             Alert("Ошибка расчета функции OrderSend!");
             return;
         }    
         // анализируем код возврата торгового сервера
         if(mresult.retcode==10009 || mresult.retcode==10008) //запрос выполнен или ордер успешно помещен
           {
            Alert("Ордер по изменению SL успешно помещен, тикет ордера #: ",mresult.order,"!!");
            open_order_ticket = mresult.order;
            open_order_price = mresult.price;
            return;
           }
         else
           {
            Alert("Запрос на измнение ордера не выполнен - код ошибки: ",GetLastError());
            return;
           }
   
   
   return;
}