Fragen von Anfängern MQL5 MT5 MetaTrader 5 - Seite 186

 
Bitte empfehlen Sie den besten Signalindikator auf dieser Website... solange er natürlich kostenlos ist!
 
barabashkakvn:
Und "eine ganze Reihe von Berechnungen auf der Grundlage der Geschichte" ergeben eine dynamische Anordnung?

So etwas gibt es, ja :) Genauer gesagt, werden mehrere dynamische Arrays verwendet, die aber nicht zu groß werden sollen.

Und was die Aufteilung in zwei Hälften angeht - es scheint keinen großen Unterschied zu machen, welches Segment man nimmt und wie viele Eingänge es hat. Im Durchschnitt wird ein Tag in 2500-3500 ms abgewickelt, aber eine Woche muss ein paar Minuten warten. Ich habe im Moment kein passendes Protokoll zur Hand und weiß nicht genau, wie viel. Aber eine Größenordnung mehr als 5x pro Tag, und die meiste Zeit entfällt auf die letzten ein oder zwei Tage. Einen Monat hingegen kann man über Nacht liegen lassen, und am Morgen wird er wahrscheinlich immer noch hängen >.>

 
Lone_Irbis:


Und was die Aufteilung in zwei Hälften angeht - es scheint keinen großen Unterschied zu machen, welchen Abschnitt man nimmt und wie viele Eingänge er hat.

Fügen Sie einen Vorwärtstest mit einem Verhältnis von 1:2 ein. Der Verlauf wird automatisch in Zeiträume unterteilt. Außerdem werden Sie herausfinden, ob es sich lohnt.
 
Lone_Irbis:
Ich frage mich, ob es irgendwo einen Artikel wie "Die häufigsten Gründe für EA-Trägheit" gibt? Ich versuche zu verstehen, warum der Expert Advisor im Strategy Tester anfangs fliegt, dann aber immer langsamer wird. Die Entwicklung ist noch nicht so weit fortgeschritten, dass dies von entscheidender Bedeutung wäre (die Geschwindigkeit reicht für die Entwicklung der grundlegenden Mechanismen und Werkzeuge aus). Aber es ist immer noch ungünstig, dass Abschnitte, die länger als eine Woche dauern, keinen Sinn machen, denn danach tendiert die Geschwindigkeit bereits gegen Null.

Versuchen Sie, ein Fass Farbe auf die Räder zu stellen und es bei Bedarf hinter sich herzuschieben.

https://www.mql5.com/ru/forum/14041/page3#comment_605412

Линейное торможение - ошибка программиста или особенность работы MT4?
Линейное торможение - ошибка программиста или особенность работы MT4?
  • www.mql5.com
Такая работа просто убивает возможность оперативной настройки советника.
 
MetaDriver:

Versuchen Sie, den Farbbehälter auf die Räder zu stellen und ihn bei Bedarf hinter sich herzuschieben.

https://www.mql5.com/ru/forum/14041/page3#comment_605412

Das ist ein interessantes Gleichnis :) Danke für den Hinweis. Alles, was bleibt, ist, dieses spezielle Fass zu finden... Oder eher Fässer. Allerdings habe ich bereits einen vagen Verdacht auf Nachrichten und Widerstandsniveaus Handler...
 
Lone_Irbis:
Es ist eine unterhaltsame Parabel :) Danke für den Hinweis. Jetzt müssen wir nur noch das Fass finden... Oder eher Fässer. Allerdings habe ich bereits einen vagen Verdacht auf Nachrichten und Widerstandsniveaus Handler...
Meistens ist ein solcher Lauf "der Anfang der Zeiten" - der Expert Advisor versucht, seine eigene Handelsgeschichte (oder andere angesammelte Informationen) bei jedem Takt (Tick) neu zu analysieren.
 
Ich habe mich vor kurzem wieder auf die Erstellung von Panels konzentriert, daher ist meine Frage. Ich erstelle zwei Beschriftungen OBJ_RECTANGLE_LABEL und OBJ_LABEL und weiß nicht, wie ich OBJ_RECTANGLE_LABEL auf die Grafik ziehen kann, so dass OBJ_LABEL genau wie eine Beschriftung gezogen wird. Vielleicht gibt es einen Mechanismus, der sie miteinander verknüpft, und eine Aktion an einer Stelle bewirkt das Gleiche an der anderen (an allen anderen)?
 
MetaDriver:
Meistens ist ein solches Fass "der Anfang der Zeit" - die eigene Handelsgeschichte (oder eine andere angesammelte Information), die ein Expert Advisor bei jedem Balken (Tick) zu reanalysieren versucht.

О! Überraschenderweise wurde das Problem innerhalb weniger Minuten gefunden und behoben. Das Problem lag in der Tat in der Handelshistorie, die sich über jeden Tick erstreckt. Die Funktion habe ich aus dem Code a la "the simplest Expert Advisor for mql5" übernommen, der am Anfang verwendet wurde. Seitdem ist es mir irgendwie entfallen. Es scheint zu funktionieren, also denke ich - warum sich damit abmühen... Anscheinend muss ich immer noch Stümpfe des Codes durchsehen :) Nur für den Fall, dass jemand hier mit ähnlichen Verzögerungen gegoogelt hat, werde ich das problematische Fragment und meine kreative Arbeit zu diesem Thema veröffentlichen, um zu versuchen, dieses Problem zu lösen. Ich weiß nicht, wie viel "richtiger" meine Version in Bezug auf die Quelle ist. Wahrscheinlich ist es genau derselbe beschissene Code wie alles andere, was ich schreibe. [Mir ist das natürlich egal. Ich meine, falls jemand auf die Idee kommt, das untere Teil zu verwenden: Berücksichtigen Sie, dass der Autor ein autodidaktischer Shitcoder ist. ^^] Aber zumindest scheint nichts kaputt zu sein und der Roboter fliegt wie ein Jet :) Nun, zumindest im Vergleich zu dem, was es war. Die zwei Monate der Probezeit vergingen in etwa einer Minute, was immer noch ein schöner Kontrast zu den ursprünglichen 6+ Stunden ist %)

War:

// Эта функция вызывалась дважды за каждый тик. С ее помощью записывались две глобальные переменные: 
// с ценой последнего ордера и числом открытых ордеров (да, взятый за исходник код был примером самого простейшего мартина). 
double History(bool LastPrice = false){
   long Ticket, OldTicket = 0, PosID, Magic, Dir;
   double PriceOpen = 0, Count = 0;
   ENUM_DEAL_TYPE CheckDir;
   if(Sell) CheckDir = DEAL_TYPE_SELL; 
   else if(Buy) CheckDir = DEAL_TYPE_BUY;
   
   HistorySelect(0, Now);
   int HistoryTotal = HistoryDealsTotal();
   // Проблемное место было тут: в цикле перебиралась вся история торговли, что в начале немного. 
   // Но даже за сутки счетчик доходил до сотни (не рискну предположить, сколько там набиралось за месяц). 
   // И этот бессмысленный и беспощадный процесс повторялся на каждом тике вообще без всякой на то причины.
   for (int i=0; i < HistoryTotal; i++){ 
      Ticket = (int)HistoryDealGetTicket(i);
      PosID  = HistoryDealGetInteger(Ticket, DEAL_POSITION_ID);
      Magic  = HistoryDealGetInteger(Ticket, DEAL_MAGIC);
      Dir    = HistoryDealGetInteger(Ticket, DEAL_TYPE);
      
      if(LastPrice) { // Этой частью добывалась цена
         if(PosID == PositionID && Magic == MagicNumber && Dir == CheckDir) {
            if(Ticket > OldTicket) {
               PriceOpen = HistoryDealGetDouble(Ticket, DEAL_PRICE);
               OldTicket = Ticket;
            }
         }
      }
      
      else { // А тут оно считало ордера
         if(PosID == PositionID && Magic == MagicNumber) Count++;
      }                              
   }
   
   if(LastPrice) return(PriceOpen);
   else return(Count);
}

Wurde:

// Вызывается она теперь только в конце функций создания/изменения/закрытия позиций. Если открытых нет - глобальные переменные просто обнуляются.
// Хотя в принципе, если вызывать ее не каждый тик, а только на изменениях, вероятно и старая версия не тормозила бы так уж сильно
void History(){
   long Ticket, PosID, Magic, Dir;
   bool GotPrice = false;
   Total = 0;
   HistorySelect(0, Now);
   int HistoryTotal = HistoryDealsTotal();
   
   // Похоже, что быстрее будет считать с обратного конца
   for(int i=HistoryTotal;i>=0;i--){
      Ticket = (int)HistoryDealGetTicket(i);
      PosID  = HistoryDealGetInteger(Ticket, DEAL_POSITION_ID);
      Magic  = HistoryDealGetInteger(Ticket, DEAL_MAGIC);
      Dir    = HistoryDealGetInteger(Ticket, DEAL_TYPE);
      
      if(PosID == PositionID && Magic == MagicNumber) {
         // Корявую конструкцию заменяем на... другую корявую конструкцию... но она хотя бы компактнее :)
         Total++; 
         if(!GotPrice){
            LastOrderPrice = HistoryDealGetDouble(Ticket, DEAL_PRICE);
            GotPrice = true; // Раз уж нужная цена всегда в начале списка, на ней и остановимся
         }
      }
      // Чтобы не перепахивать всю торговую историю, если номер позиции уже меньше нашего (но больше ноля) - прерываем цикл
      else if(PosID > 0 && PosID < PositionID) break; 
   }
}

Wie auch immer, danke für die Hilfe :) Ohne den Tipp wäre ich wahrscheinlich schon lange nicht mehr auf die Idee gekommen, in diese weit verstaubten Ecken des Codes zu schauen...

 
Lone_Irbis:

О! Überraschenderweise wurde das Problem innerhalb weniger Minuten gefunden und behoben. Das Problem lag in der Tat in der Handelshistorie, die sich über jeden Tick erstreckt. Die Funktion habe ich aus dem Code a la "the simplest Expert Advisor for mql5" übernommen, der am Anfang verwendet wurde. Seitdem ist es mir irgendwie entfallen. Es scheint zu funktionieren, also denke ich - warum sich damit abmühen... Offensichtlich sollte ich besser die Reste des Codes durchsehen :) Nur für den Fall, dass jemand hier mit ähnlichen Verzögerungen gegoogelt hat, werde ich das problematische Fragment und meine kreative Arbeit zu diesem Thema veröffentlichen, um zu versuchen, dieses Problem zu lösen. Ich weiß nicht, wie viel "richtiger" meine Version in Bezug auf die Quelle ist. Wahrscheinlich ist es genau derselbe beschissene Code wie alles andere, was ich schreibe. [Mir ist das natürlich egal. Ich meine, falls jemand auf die Idee kommt, das untere Teil zu verwenden: Berücksichtigen Sie, dass der Autor ein autodidaktischer Shitcoder ist. ^^] Aber zumindest scheint nichts kaputt zu sein und der Roboter fliegt wie ein Jet :) Nun, zumindest im Vergleich zu dem, was es war. Die zwei Monate der Probezeit vergingen in etwa einer Minute, was immer noch ein schöner Kontrast zu den ursprünglichen 6+ Stunden ist %)

War:

Wurde:

Wie auch immer, danke für die Hilfe :) Ohne den Tipp wäre ich wahrscheinlich schon lange nicht mehr auf die Idee gekommen, in diese weit verstaubten Ecken des Codes zu schauen...

OK.
 
paladin800:
Ich habe mich vor kurzem wieder auf die Erstellung von Panels konzentriert, daher ist meine Frage. Ich erstelle zwei Beschriftungen OBJ_RECTANGLE_LABEL und OBJ_LABEL und weiß nicht, wie ich OBJ_RECTANGLE_LABEL auf die Grafik ziehen kann, so dass OBJ_LABEL genau wie eine Beschriftung gezogen wird. Vielleicht gibt es einen Mechanismus, der sie aneinander bindet, so dass eine Aktion an einer Stelle die gleiche Aktion an einer anderen Stelle (allen anderen) auslöst?

Einen solchen Mechanismus gibt es nicht. Sie müssen ihn selbst schaffen. Zum Glück ist das nicht so schwer. Aber es wird einige Arbeit erfordern.

Viel Glück!

Grund der Beschwerde: