Nützliche Funktionen von KimIV - Seite 31

 
ShestkoFF писал (а) >>
Nun, ich würde es natürlich nicht blockieren. Ich hätte den Fehler übersehen und entschieden, was ich damit mache.

Wenn Sie den EA zu diesem Zeitpunkt blockieren, kann es sein, dass dieser EA eine offene Position hinterlässt, was eine Katastrophe wäre.

Damit haben Sie Ihre eigene Frage nach der langen Pause beantwortet. Man wartet auf das Signal, um eine Position zu eröffnen oder einen Auftrag zu erteilen.

Danke, Vasily, dass du mich wieder einmal erfolgreich in die Irre geführt hast. Ich habe mich fast beeilt, die Codes zu reparieren... Und nochmals vielen Dank, dass Sie mich auf den Weg zurückgebracht haben :-)

 
KimIV писал (а) >>

:-) Damit haben Sie Ihre eigene Frage nach der langen Pause beantwortet. Dies geschieht, um auf das Signal zur Eröffnung einer Position oder zum Setzen eines Auftrags zu warten.

Danke, Vasily, dass du mich wieder einmal erfolgreich in die Irre geführt hast. Ich habe mich fast beeilt, die Codes zu reparieren... Und nochmals vielen Dank, dass Sie mich auf den Weg zurückgebracht haben :-)

Um ehrlich zu sein, verstehe ich die Logik nicht.
Wir haben zum Beispiel einen Auftrag über 0,000001 Lot erteilt. Der Server gibt uns dafür natürlich eine Ohrfeige.
Anstatt das Los (außerhalb der Funktion) zu ändern, halten wir inne.
Infolge dieser Unterbrechung verlieren wir möglicherweise das Signal, einen Auftrag zu erteilen, aber wir sollten das Los ändern, anstatt zu warten.
Aus diesem Grund bin ich mit der Pause nicht einverstanden. Wir sollten diese Funktion einfach verlassen und den Fehlercode nach oben weitergeben und ihn dort behandeln.
Wenn es nach mir geht, werden wir keinen profitablen Handel verpassen! Und wir könnten sogar einen Verlust erleiden :)

PS: Ich werde dich vom falschen Weg abbringen :)

 
Ich dachte, die Funktion zur Berechnung des Loses sollte sofort aufgerufen werden (und nicht erst, wenn der Fehlerzähler überläuft) und erst dann, wenn der Fehlerzähler überläuft
 
Prival писал (а) >>
und ich dachte, Sie müssen die Funktion der Losberechnung auf einmal aufrufen (und nicht an den Anfang gehen) und erst nach dem Überlauf des Fehlerzählers an den Anfang gehen

Ja, natürlich müssen Sie diese Funktion sofort aufrufen, aber wenn ein Fehler auftritt!!!
Exit to the top nenne ich eine Situation, in der Sie die Funktion SetOrder verlassen müssen.
Ich sehe das in etwa wie folgt


int ticket = SetOrder(.....);

wenn (Ticket > 0) {

// alles in Ordnung

} sonst {

// Logikfehler korrigieren

}


int SetOrder(....) // gibt entweder ein Ticket oder eine Fehlernummer nur mit negativem Vorzeichen zurück.
{

int ticket = OrderSend(....)

wenn (Ticket < 0) {

// Fehler in der Satzreihenfolge korrigieren

}

}


Ich denke, wir müssen zwischen logischen Fehlern und Fehlern bei der Auftragsvergabe unterscheiden. Ich hoffe, dass ich heute ein Beispiel für eine Umsetzung geben kann.
 
ShestkoFF писал (а) >>
Um ehrlich zu sein, verstehe ich die Logik nicht.

Ich habe die Funktion zur Berechnung der Losgröße so aufgebaut, dass sie nur dann ein falsches Los (Null) liefert, wenn nicht genügend Geld vorhanden ist. In anderen Fällen wird die Partie normalisiert und innerhalb der Grenzen zwischen der Mindest- und der Höchstgröße gefahren. Wenn nicht genug Geld vorhanden ist, müssen wir warten, bis eine Position geschlossen wird.

ShestkoFF schrieb (a) >>
Wenn Sie 0,000001 Lot bestellt haben. Unser Server hat uns sicherlich einen Klaps auf die Finger gegeben.

Warum haben wir das getan? Warum haben wir absichtlich die falsche Losgröße gewählt? Wie können wir dieses Verhalten rechtfertigen?

ShestkoFF schrieb(a) >>.

Wir sollten diese Funktion einfach verlassen und den Fehlercode nach oben weitergeben und ihn dort behandeln.

Was werden wir davon haben? Bekommen wir eine andere Losgröße? Warum haben wir nicht gleich die richtige Losgröße bekommen? Nennen Sie Gründe. Analysieren wir...
 

Ich denke nur, dass Ihre Funktion eine Bibliotheksfunktion ist, d.h. universell, und daher sollten Sie alle Fehler in 2 Kategorien unterteilen:

  • Fehler, die in der SetOrder-Funktion verarbeitet werden sollen (Verbindungsfehler, Requotes...)
  • Fehler, die außerhalb der SetOrder-Funktion bearbeitet werden sollten (falsche Losgröße, falsche Stopps...)

Функцию расчёта размера лота я строю таким образом, что неверный лот (ноль) она выдаст только в случае не хватки денег. В остальных случаях лот нормализуется и загоняется в рамки между минимальным и максимальным размерами. Если денег не хватает, то надо ждать, когда закроется какая-нибудь позиция.

Dies ist die Logik Ihrer Experten, andere Leute haben vielleicht eine andere Logik. Deshalb würde ich den Fehler mit den falschen Losen in die externe
stellen.

Block zur Fehlerprüfung.

Das ist meine Vorstellung von diesem Fall :) Wie ich oben geschrieben habe, möchte ich heute ein Beispiel für die Umsetzung geben.

 

Meine Version von Mode:



int ModeInt(int array[])
{
   int size = ArraySize(array);
   
   if (size == 0) 
   {
      Print("Invalid parameter in function ModeInt(int array[]). It should be at least one element.");
      return(0);
   }
   
   int buffer[];
   ArrayCopy(buffer, array); 
   ArraySort(buffer);
   
   int max = 0;
   int maxValue = 0;
   
   int startIndex = 0;
   int startValue = buffer[0];
   
   for (int i = 1; i < size; i++)
   {
      if (buffer[i] > startValue)
      {
         if (max < i - startIndex)
         {
            max = i - startIndex;
            maxValue = buffer[startIndex];
         }
         
         startIndex = i;
         startValue = buffer[i];
      }
   }
   
   if (max < size - startIndex)
   {
      max = size - startIndex;
      maxValue = buffer[startIndex];
   }
   
   return (maxValue);
}
 
double ModeDouble(double array[], double interval)
{
   int size = ArraySize(array);
   
   if (size == 0) 
   {
      Print("Invalid first parameter in function ModeDouble(double array[], double interval). It should be at least one element.");
      return(0);
   }
   
   if (interval <= 0) 
   {
      Print("Invalid second parameter in function ModeDouble(double array[], double interval). It should be > 0 .");
      return(0);
   }
   
   double buffer[];
   ArrayCopy(buffer, array); 
   ArraySort(buffer);
   
   int max = 0;
   double maxValue = 0;
   
   int startIndex = 0;
   double startValue = buffer[0];
   
   double sum = startValue;
   
   for (int i = 1; i < size; i++)
   {
      if (buffer[i] >= startValue + interval)
      {
         if (max < i - startIndex)
         {
            max = i - startIndex;
            maxValue = (sum)/max;
         }
         
         startIndex = i;
         startValue = buffer[i];
         sum = 0;
      }
      sum += buffer[i];
   }
   
   if (max < size - startIndex)
   {
      max = size - startIndex;
      maxValue = (sum)/max;
   }
 
   return (maxValue);
}
 
TheXpert писал (а) >>

Meine Version des Mods:


Lieber TheXpert, Ihr Code sieht sehr kompakt aus. Das ist natürlich ein dickes Plus! >> Danke.

 
Wie versprochen, poste ich meine Version der Funktion.
Im Anhang finden Sie einen Expert Advisor, der diese Funktion verwendet. Ich habe AI Expert Advisor als Grundlage verwendet.
Ich hatte noch keine Zeit, die Funktion zu überprüfen. Mit anderen Worten: Ich glaube, dass das Signal nach 8 Minuten erneut überprüft werden sollte.
Hinzufügung der Erzeugung von Fehlern des Handelsservers, die es ermöglichen, den Betrieb der Funktion im Detail zu untersuchen und Fehler zu erkennen.
int errTest[] = {0, 128, 0, 142, 0, 143, 0, 4, 132};
errTest - Abfolge der erzeugten Fehler, kein Fehler 0. Es handelt sich um eine Zufallsfolge, die keinen Haken hat.


Ich warte auf etwas Kritik :)

Dateien:
 
ShestkoFF писал (а) >>
Wie versprochen, poste ich meine Version der Funktion.
Die beigefügte Datei enthält EA, wo diese Funktion verwendet wird. Ich habe AI Expert Advisor als Grundlage verwendet.
Ich hatte noch nicht genug Zeit, um zu prüfen, wie die Funktion im Laufe der Zeit funktioniert. D.h. ich glaube, dass das Signal nach 8 Minuten erneut überprüft werden sollte.
Zusätzliche Erzeugung von Fehlern des Handelsservers, die es ermöglicht, den Betrieb der Funktion gründlich zu untersuchen und Fehler zu erkennen.
errTest - Abfolge der erzeugten Fehler, kein Fehler 0. Es handelt sich um eine Zufallsfolge, die keinen Haken hat.


Ich warte auf Kritik :)

Ich kümmere mich nicht wirklich um die Funktion, ich kann nur eines sagen :), ich werde nicht originell sein und sagen, wie immer :) -- zu überlastet.

Das Ergebnis ist, dass der Expert Advisor zu einem 32 KB großen, sauberen und klaren Code geworden ist, an dem ich nicht herumpfuschen möchte.


Es gibt Fragen zum Kodex.

1. Wenn Sie den Expert Advisor deaktivieren, funktioniert er erst wieder, wenn er neu gestartet wird. Warum nicht eine relativ lange Zeitspanne warten lassen?

2. Neuronales Netz - zunächst einmal gibt es nie das Signal einer Wohnung aus. Zweitens: Wie kann man erwarten, dass es etwas optimiert, wenn es keinen Schwellenwert hat? Wenn der Schwellenwert nicht erreicht wird, werden 80 % der ohnehin schon geringen Effizienz zunichte gemacht (allerdings linear).



SZZH: Seien Sie nicht beleidigt, ich betätige mich in diesem Thread nur als Kritiker :) .