Diskussion zum Artikel "Erstellen eines Expert Advisors, der mit verschiedenen Instrumenten handelt" - Seite 5

 
Interesting:
By Tnew[1] Ungültiger Array-Bereich - es scheint sich um eine Bereichsüberschreitung zu handeln. Vergessen Sie nicht, dass die Nummerierung der Array-Elemente mit dem Beginn des Array-Bereichs beginnt.

no access to edit message from 2010.07.16 22:41 2010.07.16 22:41:25 2010.07.16 22:41:25 #

Ersetze:8.Warum Exp_TEMA.mq5 beim Testen Trades innerhalb eines Balkens öffnet? durch

8.warum Exp_TEMA.mq5, beim Testen, mehrere Trades in einem Bar öffnet?

 
ias:
kein Zugang zum Bearbeiten der Nachricht von 2010.07.16 22:41 2010.07.16 22:41:25 2010.07.16 22:41:25 #

Beiträge können nur innerhalb von 3 Tagen nach der Veröffentlichung bearbeitet werden.

 

ias:

Warum eröffnet Exp_TEMA.mq5 beim Testen mehrere Trades in einem Takt?

Es wäre logisch anzunehmen, dass es keine Überprüfung auf das Vorhandensein von zuvor geöffneten Positionen und eingestellten Aufträgen gibt....
 

Interesting:
Логично будт предположить то, что там нет проверки наличия ранее открытых позиций и установленных отложников...

Interessant:
Es wäre logisch, davon auszugehen, dass es keine Überprüfung der zuvor geöffneten Positionen gibt und schwebende Aufträge gesetzt werden....

Pending Orders werden in Exp_TEMA.mq5 nicht verwendet, vorher geöffnete Positionen werden eingecheckt:

//+X================================================================X+
bool BuyPositionOpen
                    ...
   if(PositionSelect(symbol))return(false);
//+X================================================================X+
bool SellPositionOpen
                    ...
   if(PositionSelect(symbol))return(false);
//+X================================================================X+
bool BuyPositionClose(const string symbol, ulong deviation)
...
   if(PositionSelect(symbol))
     {
      if(PositionGetInteger(POSITION_TYPE) != POSITION_TYPE_BUY) return(false);
     }
    else  return(false);
//+X================================================================X+
bool SellPositionClose(const string symbol, ulong deviation)
...
   if(PositionSelect(symbol))
    {
     if(PositionGetInteger(POSITION_TYPE) != POSITION_TYPE_SELL)return(false);
    }
   else return(false); 

Vielleicht ist etwas falsch, in:

//+X================================================================X+
bool IsNewBar(int Number, string symbol, ENUM_TIMEFRAMES timeframe)
  {
//----+
   static datetime Told[];
   datetime Tnew[1];
   
   //----+ Variablendeklaration für die Speicherung der Größen von Variablenarrays
   static int Size_ = 0;
   
   //----+ Größenänderung von Variablenarrays
   if (Number + 1 > Size_)
    {
     uint size = Number + 1;
     //----
     if (ArrayResize(Told, size) == -1)
      {
       string word = "";
       StringConcatenate(word, "IsNewBar( ", Number,
                    " ): Error!!! Failed to resize variable arrays!!!"); 
       Print(word); 
       //---- 
       int error = GetLastError();
       ResetLastError();
       if (error > 4000)
        {
         StringConcatenate(word, "IsNewBar( ", Number, " ): Fehlercode ", error);
         Print(word); 
        }  
       //---- 
       Size_ = -2;
       return(false);
      }
    }
   
   CopyTime(symbol, timeframe, 0, 1, Tnew); 
   if (Tnew[0] != Told[Number])
    {
     Told[Number] = Tnew[0];
     return(true);
    }
//----+
   return(false);
  }

oder in:

//+X================================================================X+
bool TradeSignalCounter
                      (
                       int Number,
                       string Symbol_,
                       bool Trade,
                       int period,
                       ENUM_APPLIED_PRICE ApPrice,
                       bool& UpSignal[],
                       bool& DnSignal[],
                       bool& UpStop[],
                       bool& DnStop[]
                      )
  
  {
//----+
   //----+ Prüfung des Handelsverbots
   if (!Trade)return(true);
   
   //----+ Deklarieren Sie eine Variable zum Speichern der Gesamtgröße von Variablenfeldern
   static int Size_ = 0;
   
   //----+ Deklarieren eines Arrays zum Speichern von Indikator-Handles als statische Variable
   static int Handle[];
   
   static int Recount[], MinBars[];
   double TEMA[4], dtema1, dtema2;
   
   //----+ Initialisierung 
   if (Number + 1 > Size_) // Eintritt in den Initialisierungsblock nur beim ersten Start
    {
     Size_ = Number + 1; // Der Zugang zum Block ist für diese Nummer geschlossen
     
     //---- Größenänderung von Variablenarrays
     ArrayResize(Handle,   Size_);
     ArrayResize(Recount,  Size_);
     ArrayResize(MinBars,  Size_);
     
     //---- Bestimmung der für die Berechnung ausreichenden Mindestanzahl von Balken 
     MinBars[Number] = 3 * period;
     
     //---- Vorläufiges Nullsetzen von Array-Zellen
     DnSignal[Number] = false;
     UpSignal[Number] = false;
     DnStop  [Number] = false;
     UpStop  [Number] = false;
     
     //---- Verwendung des Arrays als Zeitreihe
     ArraySetAsSeries(TEMA, true);
     
     //----+ Indikatorgriff abrufen
     Handle[Number] = iTEMA(Symbol_, PERIOD_CURRENT, period, 0, ApPrice);
    }
     
   //----+ Überprüfung der Anzahl der Balken, ob sie für die Berechnung ausreichen 
   if (Bars(Symbol_, 0) < MinBars[Number])return(true);

   //----+ Empfang von Handelssignalen 
   if (IsNewBar(Number, Symbol_, PERIOD_CURRENT) || Recount[Number]) // Eintritt in den Block bei Taktwechsel oder fehlgeschlagener Datenkopie
    {
     DnSignal[Number] = false;
     UpSignal[Number] = false;
     DnStop  [Number] = false;
     UpStop  [Number] = false;
     
     //----+ Kopieren Sie mit Hilfe der Indikator-Handles die Werte der Indikatoren
                   // Puffer in ein speziell vorbereitetes statisches Array
     if (CopyBuffer(Handle[Number], 0, 0, 4, TEMA) < 0)
      {
       Recount[Number] = true; // da die Daten nicht empfangen wurden, sollten Sie zurückgeben 
                                 // in diesen Block, um beim nächsten Tick Handelssignale zu erhalten!
       return(false); // Beenden Sie die Funktion TradeSignalCounter(), ohne Handelssignale zu empfangen
      }
      
     //---- Alle Kopiervorgänge aus dem Indikatorpuffer sind erfolgreich abgeschlossen
     Recount[Number] = false; // es ist möglich, bis zum nächsten Taktwechsel nicht zu diesem Block zurückzukehren
     
     int Digits_ = SymbolInfoInteger(Symbol_, SYMBOL_DIGITS) + 4;
     dtema2 = NormalizeDouble(TEMA[2] - TEMA[3], Digits_);
     dtema1 = NormalizeDouble(TEMA[1] - TEMA[2], Digits_);
     
     //---- Definition der Eingangssignale
     if (dtema2 > 0 && dtema1 < 0) DnSignal[Number] = true;
     if (dtema2 < 0 && dtema1 > 0) UpSignal[Number] = true;
     
     //---- Definition der Ausgangssignale
     if (dtema1 > 0) DnStop[Number] = true;
     if (dtema1 < 0) UpStop[Number] = true;
    }
//----+
   return(true);
  } 

Mehrere Trades in einem Bar beim Test von Exp_TEMA.mq5 auf EURUSD, Periode D1

 
ias, das sollte man besser an den Autor des Artikels richten....
 
ias:

Warum öffnet Exp_TEMA.mq5 beim Testen Trades innerhalb des Balkens?

Warum öffnet Exp_TEMA.mq5 beim Testen mehrere Trades innerhalb eines Balkens?

Der Punkt ist, dass im Rahmen dieses Artikels die Aufgabe darin bestand, einen einfachen Multicurrency Expert Advisor zu implementieren, ohne die Hauptidee mit unwichtigen Details zu überladen, die das Verständnis für das Wesentliche beeinträchtigen. Und jeder hat seine eigene Art, Details auszufüllen. In Ihrer Situation ist alles elementar gelöst. Die Variablen der Handelssignale dienen als Input für die Handelsfunktionen und sind durch den Link verbunden, und diese Variablen werden nach der Transaktion innerhalb der Handelsfunktionen zurückgesetzt.
Документация по MQL5: Торговые функции
Документация по MQL5: Торговые функции
  • www.mql5.com
Торговые функции - Документация по MQL5
 
GODZILLA:
Der Punkt ist, dass im Kontext dieses Artikels das Ziel darin bestand, einen einfachen Multiwährungs-Expert Advisor zu implementieren, ohne die Hauptidee mit kleinen Details zu überladen, die das Verständnis für das Wesentliche beeinträchtigen. Und jeder hat seine eigene Art, Details auszufüllen. In Ihrer Situation ist alles elementar gelöst. Die Variablen der Handelssignale dienen als Input für die Handelsfunktionen und sind miteinander verknüpft, und diese Variablen werden zurückgesetzt, nachdem ein Geschäft innerhalb der Handelsfunktionen ausgeführt wurde.
Bitte zeigen Sie mir am Beispiel Ihres Expert Advisors Exp_TEMA.mq5, wie man das macht.
 

ias:
Покажите, пожалустайста, на примере вышего эксперта Exp_TEMA.mq5, как это сделать.

Meiner Meinung nach besteht das Erlernen und Verstehen einer Programmiersprache darin, dass ein Individuum kleine Aufgaben löst, indem es den Code für seine eigenen Bedürfnisse umgestaltet. Wozu braucht man sonst diese Website und die Programmierartikel überhaupt? Um die Fähigkeiten der Autoren der Artikel zu demonstrieren? Diejenigen, die es nicht selbst verstehen wollen, können die Ressource https://www.mql5.com/ru/job
nutzen. In MQL4 habe ich diesen Ansatz in seiner einfachsten Form beispielsweise so umgesetzt https://www.mql5.com/de/articles/1516. Für MQL5 ändert sich nichts und alles wird auf die gleiche Weise gemacht.

.

 
GODZILLA:

Ich habe großen Respekt vor dem Autor des Artikels "Erstellen eines Expert Advisors, der auf verschiedenen Instrumenten handelt".
1. Der Code des Expert Advisors Exp_TEMA.mq5, der in dem Artikel vorgestellt wird, öffnet beim Testen mehrere Trades in einem Bar,
wie bereits in diesem Thema berichtet. Diese Tatsache bestätigt das Vorhandensein eines fehlerhaften Codes oder eines Bugs in dem Expert Advisor, an dessen Beseitigung viele Besucher der Website interessiert sind.
2.Die Antwort von Roche zum Thema "Expert Advisors:Multicast": "Außerdem kann die Funktion zur Bestimmung eines neuen Balkens auch ohne die Funktion des Zeitkopierens implementiert werden" - bestätigt ebenfalls die Möglichkeit einer rationelleren Schreibweise der Funktion IsNewBar() im Expert Advisor.
Ich würde gerne sehen, wie der Autor diese Fehler professionell beseitigt, denn jeder kann Fehler machen, und nur Profis können sie richtig korrigieren.
 
ias:

Wenn Sie sich die in diesem Artikel vorgestellten Handelssysteme genau ansehen, können Sie feststellen, dass es sich um Umkehrsysteme handelt. Der Stoploss spielt in solchen Systemen eine untergeordnete Rolle und wird in einem sehr anständigen Abstand vom Einstieg platziert, der mindestens in mehreren Kerzen gezählt wird. Professionalität in der Darstellung des Stoffes besteht darin, das Thema in möglichst einfacher Form zu entfalten, ohne es mit zusätzlichen Spielereien zu überfrachten, und nicht auf der Basis des Publikums, das nicht selbst denken will. Jedes Lehrbuch ist immer fehlerhaft in Bezug auf das Ideal. Und das wird als akzeptabel und normal angesehen. In Zukunft wird es eine solche Reihenfolge der ausführlichen Darstellung dieses Details des Aufbaus von Handelssystemen geben, es wird eine detaillierte Überprüfung der Umsetzung geben, die auch nicht so einfach ist.
Was das Kopieren von Zeit angeht, kann ich mit Sicherheit sagen, dass ich selbst keinen signifikanten Unterschied zu einer rationelleren Schreibweise der Funktion IsNewBar() im Expert Advisor feststellen konnte, obwohl ich es gemessen habe! Ich habe sogar einen Artikel zu diesem Thema geschrieben. Es wäre also verständlich, wenn es eine signifikante Verschlechterung der Arbeit des Codes gäbe.
Und wenn ich wollte, könnte ich z.B. jeden Artikel von dieser Seite ohne Probleme in Stücke reißen. Aber ich schätze Informationen in erster Linie, weil sie verfügbar sind, nicht weil sie meinen Vorstellungen vom Ideal entsprechen.
Ich werde also nicht aus nachvollziehbaren und durchaus professionellen Gründen weit hergeholte Mängel beseitigen und gleichzeitig den Code, der so einfach nicht ist, erheblich durcheinanderbringen.