Beunruhigt durch den Fehler gibt es keine Handelsgeschäfte - Seite 5

 
Alexey Viktorov:

Das liegt nicht daran, dass ich es neu kompiliert habe, sondern daran, dass die Tests zu einem anderen Zeitpunkt begonnen haben. Und mir ist ein Fehler aufgefallen: Wenn man etwas einträgt, das schon da war, dann wird nicht getestet, sondern sofort das vorherige Testergebnis angezeigt. Lassen Sie sich also nicht von solchen Krücken täuschen. Versuchen Sie, es normal zu machen. Wenn etwas fehlt oder Parameter ungültig sind, melden Sie dies über Drucken und alles wird korrigiert.

Wenn es nur an einem anderen Datum läge, würden meine Kontrollen dies aufzeigen (fehlende Balken usw.), aber das Problem liegt nicht am Datum. Wenn ich den Fehler nicht rekonstruieren kann, was die automatische Validierung feststellt, dann ist es für mich einfacher, denselben zu übersehen und zu hoffen, dass die Rache der Käufer die Problemstelle findet (falls es eine solche gibt). Diese Implementierung von Validierungen gibt mir kein vollständiges Verständnis dafür, wo ich nach Fehlern suchen muss. Und der Druck ist für mich bereits überflüssig geworden.

Alexey Viktorov:

Und mir ist so ein Zottel aufgefallen, wenn ich den schon einfüge, dann findet der Test nicht statt und gibt sofort das vorherige Testergebnis.

Und um ein früheres Testergebnis nicht zu erhalten, muss ich etwas ändern, sogar einen leeren String hinzufügen (ich meinte "neu kompilieren").

 
Roman Gergert:

Ich habe schließlich herausgefunden, vielleicht kann jemand helfen, in der Regel hat die sowjetische nur die minimale Menge überprüft, wenn die MM aktiviert wurde, und so hardcore set lot = 0,01, gut, in der Validator Einzahlung stellt sich heraus, $ 1 (fand diese Informationen in einem der Themen), bzw., verwendet es die Menge 0,001 (oder so) zu handeln, und da ich immer in einem Ort hatte, war eine Menge von 0,01, er war daher nicht genug Geld und der Roboter nicht Handel)

Genau, Roman, der Validator testet mit einer Einzahlung von 1 $.

Es gibt eine Menge Normalisierungsfunktionen im EA. Ist der Wert 0, wird nicht einmal versucht, den Handel zu eröffnen:

      if((Auto() && (b==0 || (b>0 && BuyPriceMin-Ask>(b==1?iPointOrderStep_1:iPointOrderStep_2)*Point()))) || buy) {
         BuyLot=buy && LotFromPanel()>0 ? LotFromPanel() : BuyLot;
         double norm_lot=NormalizeLots(_Symbol,BuyLot);
         if(norm_lot>0.0) {  
            int ticket=OrderSend(Symbol(),OP_BUY,norm_lot,NormalizeDouble(Ask,_Digits),30,0,0,
                        "NZT-48",iMagicNumber,0,clrGreen);
            if(ticket>0) {
                ObjectSetInteger(0,"V_5_buy",OBJPROP_STATE,false);
                buy=false;
            }
            else  
               Print("Order Send error #",GetLastError());
         } else Print("Not enough money for the minimum lot");   
      }

Aber es ist dann nicht klar, wie die Lot-Normalisierungsfunktion dieses EA ein 0,2 Lot zum Öffnen sendet:

//+------------------------------------------------------------------+
//| Функция нормализации лота                                        |
//+------------------------------------------------------------------+
double NormalizeLots(string symbol, double lot, bool is_margin=true) {
   if(lot<=0) return(0.0);
   RefreshRates();
   double min=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MIN);
   double max=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MAX);
   double step=SymbolInfoDouble(symbol,SYMBOL_VOLUME_STEP); 
   double free = AccountFreeMargin()*0.95;
   double margin = MarketInfo(symbol,MODE_MARGINREQUIRED);
   double _lot=lot<min?min:(lot>max?max:lot);
          _lot=MathRound(_lot/step)*step;
   if(is_margin && _lot*margin>free)  _lot=0.0;
   return(_lot);
}

Wenn nämlich das Los 0,2 zur Prüfung eintrifft und die Spanne nach den Protokollen 645 beträgt, dann sollte dieser Teil des Ausdrucks wahr sein

if(is_margin && _lot*margin>free)  _lot=0.0;     //0.2*645>0.95

Und die Funktion sendet 0,0, aber nicht 0,2. Es kann nur 0,2 senden, wenn es

MarketInfo(symbol,MODE_MARGINREQUIRED);

0 oder einen vernachlässigbaren Wert zurück. Ich verstehe überhaupt nicht, wie dieser Validator funktioniert.

Liebe MQL-Entwickler, bitte senden Sie uns Testprotokolle anstelle von trockenen Validierungsfehlerberichten in drei Zeilen. Es wird für uns, die bescheidenen Programmierer, viel einfacher sein, die Code-Fehler zu verstehen und sie zu beheben. Sie können es als Archiv per E-Mail verschicken, Ihnen wird sicher etwas einfallen)))

P.S. Lustige Situation. Für den 5. Tag versuche ich, einen Expert Advisor auf den Markt zu bringen, der im Tester und auf dem realen Markt perfekt funktioniert.
 
Andrey Kaunov:

Genau, Roman, der Validator testet mit einer Einzahlung von 1 $.

Es gibt eine Menge Normalisierungsfunktionen im EA. Ist der Wert 0, wird nicht einmal versucht, den Handel zu eröffnen:

Aber es ist dann nicht klar, wie die Lot-Normalisierungsfunktion dieses EA ein 0,2 Lot zum Öffnen sendet:

Wenn nämlich das Los 0,2 zur Prüfung eintrifft und die Spanne nach den Protokollen 645 beträgt, dann sollte dieser Teil des Ausdrucks wahr sein

Und die Funktion sendet 0,0, aber nicht 0,2. Es kann nur 0,2 senden, wenn es

0 oder einen vernachlässigbaren Wert zurück. Ich verstehe überhaupt nicht, wie dieser Validator funktioniert.

Liebe MQL-Entwickler, bitte senden Sie uns Testprotokolle anstelle von trockenen Validierungsfehlerberichten in drei Zeilen. Es wird für uns, die bescheidenen Programmierer, viel einfacher sein, die Codefehler zu verstehen und sie zu beheben. Sie können sie als Archiv per E-Mail verschicken, vielleicht fällt Ihnen ein Weg ein :)))

P.S. Lustige Situation. Für den 5. Tag versuche ich, einen Expert Advisor auf den Markt zu bringen, der sowohl im Tester als auch im realen Leben perfekt funktioniert.

es sieht so aus, als hätten Sie einen anderen Hebel als den auf dem Markt üblichen, vielleicht 1:500

Versuchen Sie, die Losberechnung auf 1k100 zu bringen, indem Sie nur eine Zeile des Codes ändern:

Marge = AccountLeverage()*MarketInfo(symbol,MODE_MARGINREQUIRED)/100.0;

und die Mindestmenge für den Markt ist 0,1 ich glaube....
 

Sie leben in einer Art eigener, begrenzter Welt. In einer normalen Welt kann die Mindestmenge von 0,01 sehr unterschiedlich sein.

EMPFANG: Lesen und wiederholen Sie den Artikel "Welche Kontrollen müssen bestehen ...".

Bevor Sie einen Handelsauftrag abschicken, müssen Sie prüfen, ob er erfolgreich sein wird, ob eine ausreichende Marge vorhanden ist ...


Im Allgemeinen hat der Validator bisher seine Hauptaufgabe erfüllt: unvollständigen Code aus dem Marketplace herauszufiltern.

 
Renat Akhtyamov:

es sieht so aus, als hätten Sie einen anderen Hebel als den auf dem Markt üblichen, vielleicht 1:500

Versuchen Sie, die Losberechnung auf 1k100 Hebelwirkung zu bringen, indem Sie nur eine Zeile im Code ändern:

Marge = AccountLeverage()*MarketInfo(symbol,MODE_MARGINREQUIRED)/100.0;

Renat, danke für den Ratschlag, ich werde es ausprobieren.

Wladimir Karputow:

Sie leben in Ihrer eigenen, begrenzten Welt. In einer normalen Welt kann die Mindestmenge von 0,01 sehr unterschiedlich sein.

EMPFANG: Lesen und wiederholen Sie den Artikel "Welche Kontrollen müssen bestehen ...".

Bevor Sie einen Handelsauftrag abschicken, müssen Sie prüfen, ob er erfolgreich sein wird, ob eine ausreichende Marge vorhanden ist ...


Im Allgemeinen hat der Validator bisher seine Hauptaufgabe bewältigt: unvollständigen Code aus dem Markt herauszufiltern.

Vladimir, können Sie die Frage konstruktiv verstehen?! Muss ich das Grundstück nicht auf Margen und andere Dinge prüfen?Der Artikel "Welche Prüfungen müssen bestanden werden ..." ist für mich schon wie eine Bibel. Ich habe oben Codeschnipsel gepostet. Ich habe den Code entsprechend Ihren Empfehlungen aus dem Artikel geändert, damit er vollständig konform ist:

//+------------------------------------------------------------------+
//| Функция нормализации лота                                        |
//+------------------------------------------------------------------+
double NormalizeLots(string symbol, double lot, int direction, bool is_margin=true) {
   if(lot<=0) return(0.0);
   RefreshRates();
   double min=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MIN);
   double max=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MAX);
   double step=SymbolInfoDouble(symbol,SYMBOL_VOLUME_STEP); 
   //double free = AccountFreeMargin()*0.95;
   //double margin = MarketInfo(symbol,MODE_MARGINREQUIRED);
   double _lot=lot<min?min:(lot>max?max:lot);
          _lot=MathRound(_lot/step)*step;
   //if(is_margin && _lot*margin>free)  _lot=0.0;
   ResetLastError();
   if(is_margin && (AccountFreeMarginCheck(Symbol(),direction,_lot)<=0 || GetLastError()==134)) _lot=0.0;
   return(_lot);
}

Aber ich erhalte immer noch "no trades":

Nun, wenn die Funktion immer 0,0 Lot sendet und es nicht erlaubt, Trades zu eröffnen, ändere ich sie so, dass sie ein Minimum Lot sendet:

//+------------------------------------------------------------------+
//| Функция нормализации лота                                        |
//+------------------------------------------------------------------+
double NormalizeLots(string symbol, double lot, int direction, bool is_margin=true) {
   if(lot<=0) return(0.0);
   RefreshRates();
   double min=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MIN);
   double max=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MAX);
   double step=SymbolInfoDouble(symbol,SYMBOL_VOLUME_STEP); 
   //double free = AccountFreeMargin()*0.95;
   //double margin = MarketInfo(symbol,MODE_MARGINREQUIRED);
   double _lot=lot<min?min:(lot>max?max:lot);
          _lot=MathRound(_lot/step)*step;
   //if(is_margin && _lot*margin>free)  _lot=0.0;
   ResetLastError();
   if(is_margin && (AccountFreeMarginCheck(Symbol(),direction,_lot)<=0 || GetLastError()==134)) _lot=min;
   return(_lot);
}

Und ich erhalte die Information, dass der Handel tatsächlich stattfindet (siehe Screenshots unten). Aber das minimale Los kommt natürlich sehr seltsam, aber lass es kommen. Aber die Angebote sind da!

Das ist in dieser Situation, sehr seltsame Sache ist Validator, so dass eine minimale Menge 0,2 für eine Einzahlung von $ 1.


Natürlich wird es überhaupt keine Angebote geben! Und das bei einem völlig ausreichenden Code. Übrigens habe ich zum Testen alle Bedingungen für Indikatoren usw. entfernt. Die Trades werden eröffnet, sobald der EA gestartet wird.

Wladimir Karputow:

...

Bisher hat der Validator seine Hauptaufgabe bewältigt: unvollständigen Code aus dem Markt herauszufiltern.

Wofür ist der Validator also zuständig? Ich kann mir nicht vorstellen, dass es etwas anderes tut, als den Programmierern das Hirn wegzupusten!

Beachten Sie, dass ich Sie nicht auffordere, irgendetwas im Validator zu ändern. Wir können einfach die Prüfprotokolle einsehen. Wir werden dann verstehen, mit welchen Parametern die Tests laufen und auf welchen Einlagen. Am Ende des Tages können wir mit Hilfe von Ausdrucken zumindest prüfen, wo der Fehler im Code liegt, und ihn so schnell wie möglich beheben. Wir werden nicht eine ganze Woche lang mit dem Finger in den Himmel zeigen, nur um einen Fehler zu lokalisieren. Wir arbeiten doch nicht gegeneinander, oder? Ich verstehe, dass wir versuchen, gemeinsam etwas zu verdienen.

 
Andrey Kaunov:

...Es ist ja nicht so, dass wir gegeneinander arbeiten! Ich verstehe, wir versuchen, gemeinsam etwas zu verdienen.

Andrew, ich bin am Wochenende einmal in einen Serverstillstand geraten.

was bedeutet, dass es MarketInfo(...) einfach nicht fressen würde.

Ich konnte es kaum zum Laufen bringen.

Also, wenn Sie verstehen, dass Sie nicht schlucken können Markt, bleibt es zu denken, wie man Validator nicht schwören zu machen

Ich frage zum Beispiel: Welche Hebelwirkung?

Hier steht 0.

Ich füge den Code ein - wenn er 0 ist, dann steht da 100

Wenn die Logik klar ist, wird es funktionieren, und viel Glück!

 

Ich verstehe, Renat, danke.

Ich habe schon viele Krücken gemacht, aber an manchen Stellen bin ich in einer Sackgasse. Und ich möchte, dass der entsprechende Code angemessen getestet wird. Außerdem ist es nicht unmöglich, ein Problem zu finden, wenn es keine Testprotokolle gibt, aber es ist sehr mühsam.

Vielleicht wäre es auch schön, wenn der Validator ein Upgrade bekäme. Ich bin nicht der Einzige, der auf solche Probleme stößt.

 
Andrey Kaunov:

Ich verstehe, Renat, danke.

Ich habe schon viele Krücken gebaut, aber an einigen Stellen bin ich in einer Sackgasse gelandet. Und ich möchte, dass der entsprechende Code angemessen getestet wird. Außerdem ist es nicht unmöglich, ein Problem zu finden, wenn es keine Testprotokolle gibt, aber es ist sehr mühsam.

Vielleicht wäre es auch schön, wenn der Validator ein Upgrade bekäme. Ich bin nicht der Einzige, der auf solche Probleme stößt.

Ja, Sie sind nicht der einzige, der mit diesem Problem konfrontiert ist, im nächsten Thread gibt es einen weiteren, der mit diesem Problem konfrontiert ist - Sie sind schon zwei.

Schauen Sie sich auch an, wie viele EAs jeden Tag ohne Probleme auf den Markt gebracht werden, das nennt man "das Niveau der Professionalität".

 

Vitaly, wenn Sie und andere "Fachleute" es schaffen, die Validierung beim ersten Mal zu bestehen, kann ich nur applaudieren. Aber es gibt weit mehr als zwei Threads zu einem ähnlichen Problem. Außerdem schreibt nicht jeder, manche Leute lesen nur. Übrigens, der Expert Advisor ist nicht von mir. Ich bereite sie auf dem Markt für den Kunden vor. Das ändert aber nichts an den oben beschriebenen Problemen. Wenn Sie meinen Beitrag aufmerksam lesen, können Sie als "Profi" vielleicht eine Lösung für das Problem vorschlagen. Um einen Beitrag nach dem Motto "Du bist dumm und ich bin schlau" zu verfassen, braucht man nicht viel Wissen.

Hier ist ein weiteres Problem für Sie. Wenn ich am Anfang von OnTick() eine unbedingte serielle Eröffnung von 5 Transaktionen in 5 Minuten mit einem minimalen Lot hinzugefügt habe, gibt mir der Validator die Meldung"no trading operations".

void OnTick() { 
   static int test_ticket[2]={0,0};
   if(test_ticket[1]<5 && test_ticket[0]==0) {
      test_ticket[0]=OrderSend(_Symbol,OP_BUY,SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN),NormalizeDouble(Ask,_Digits),30,0.0,0.0,"NZT-48_test",33333,0,clrNONE);
      if(test_ticket[0]>0) test_ticket[1]++;
   }   
   if(OrderSelect(test_ticket[0],SELECT_BY_TICKET))
      if(OrderCloseTime()==0 && OrderOpenTime()+300<TimeCurrent())
         if(OrderClose(test_ticket[0],NormalizeDouble(OrderLots(),2),NormalizeDouble(Bid,_Digits),30,clrNONE)) {
            printf("Test order closed, ticket #%d",test_ticket[0]);
            test_ticket[0]=0;
         }   
...
}
 
Andrey Kaunov:

Vitaly, wenn Sie und andere "Fachleute" es schaffen, die Validierung beim ersten Mal zu bestehen, kann ich nur applaudieren. Aber es gibt weit mehr als zwei Threads zu einem ähnlichen Problem. Außerdem schreibt nicht jeder, manche Leute lesen nur. Übrigens, der Expert Advisor ist nicht von mir. Ich bereite sie auf dem Markt für den Kunden vor. Das ändert aber nichts an den oben beschriebenen Problemen. Wenn Sie meinen Beitrag aufmerksam lesen, können Sie als "Profi" vielleicht eine Lösung für das Problem vorschlagen. Um einen Beitrag nach dem Motto "Du bist dumm und ich bin schlau" zu verfassen, braucht man nicht viel Wissen.

Hier ist ein weiteres Problem für Sie. Warum gibt mir der Validator, nachdem ich zu Beginn von OnTick() die bedingungslose sequentielle Eröffnung von 5 Transaktionen in 5 Minuten mit minimalem Lot hinzugefügt habe, auf die gleiche Weise"keine Handelsoperationen"?

Und Sie sollten zuerst die vollständige Antwort des Validierers hier veröffentlichen

Und wie kommen Sie darauf, dass der Entwerter die Fahrkarten nach dem von Ihnen erfundenen Prinzip ausstellt?

für die Eröffnung von 5 Geschäften müssen Sie die Anzahl der eröffneten Geschäfte zählen, nicht das Ticketing