Fehler, Irrtümer, Fragen - Seite 742

 
TheXpert:
Also bauen Sie eine Fabrik. Damit wäre das Problem gelöst.

Es ist so schon leicht genug, dort zu arbeiten. Das Objekt ist recht starr strukturiert. Er ruft eine virtuelle Load-Methode jedes seiner Mitglieder auf, die ihrerseits dasselbe tun. Am Anfang eines jeden Datenblocks (Objekts) wird die ID des Typs geschrieben (zur Kontrolle beim Laden). Mehr gibt es nicht zu sagen. Es ist eine Art selbstgebaute Fabrik.

Es ist sinnvoll, eine Fabrik zu erstellen, wenn zuvor unbekannte Typen in der Datei enthalten sein können. Dann werden die Fabrik und die Typenregistertabelle benötigt. Während das Problem nicht so gelöst war, habe ich es mit Büroklammern und Klebeband geschafft. :)

 

Gunns Fan.

Liegt der zweite Ankerpunkt in der Zukunft, ändert sich der Winkel.

Außerdem hat dieses Objekt einige Probleme beim Kopieren (bei gedrückter Strg-Taste). Sehr oft wird nicht kopiert, sondern das Original mitgeschleppt, und es braucht den dritten oder fünften Versuch, um zu kopieren.

Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Способы привязки объектов
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Способы привязки объектов
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы объектов / Способы привязки объектов - Документация по MQL5
 
MetaDriver:

OK, gut.

Slava, kann ich fragen (für die allgemeine Entwicklung), warum Sie nicht initialisieren können virtuelle Methode Tabelle am Anfang des Konstruktors (nach Vorfahren Initialisierung)?

Ich habe es Ihnen bereits gesagt. Konstrukteure arbeiten in einer Hierarchie. Während ein Vorfahre konstruiert wird, gibt es keine Informationen über Nachfahren.
 
stringo:
Ich habe es Ihnen schon einmal gesagt. Die Konstrukteure arbeiten die Hierarchie aus. Während ein Vorfahre gebaut wird, gibt es keine Informationen über Nachkommen.

Ich habe es bereits gelesen. Und ich habe es sehr gut verstanden. Und ich habe eine Frage gestellt, die auf dem beruht, was ich gelesen habe. Ich werde versuchen, sie mit Bildern zu verdeutlichen.

class MySecond: MyFirst
{
  void  MySecond(MyArg arg): 
    MyFirst(arg)
   { // Можно код инициализации VMT добавлять здесь. Тогда не будет проблем с виртуальными вызовами.
     ...............
     MyVirtualFunc();
      ...........
     return;
   } // Сейчас код инициализации VMT добавляется здесь.

};

Ich verstehe alles, es ist schwieriger zu machen, es gibt viele Feinheiten. Es ist viel einfacher und vielseitiger (für Sie), die gesamte implizite Initialisierung am Ende zu schreiben. Und ich glaube sogar im Voraus, dass "das niemand macht" und dass "das in C++ nicht üblich ist" usw.

Aber für uns (Benutzer) ist es einfacher, universeller, vernünftiger und logischer, den Konstruktor MySecond() als ein Gebiet der Klasse MySecond und nicht MyFirst zu betrachten. Überlegen Sie, was einfacher ist: virtuelle Funktionen in Konstruktoren funktionieren zu lassen oder wichtige und schwerwiegende Einschränkungen für Konstruktorcode in der Dokumentation an mehreren Stellen zu formulieren und trotzdem regelmäßig wichtige und schwerwiegende Nachrichten von Neulingen an den Service Desk und das Forum "über die virtuellen Fehler in Konstruktoren" zu erhalten...

 
struct SDaylyRange {double min, max, open, close;};
void OnStart()
  {
//---
   SDaylyRange tmp, tmp2;
   tmp = 2+3 ? tmp : tmp2;
   if (2+3) tmp = tmp; else tmp = tmp2;
  }

Der Tensor-Operator mit Strukturen führt zu einem Code-Generierungsfehler (wenn Sie ihn durch if ersetzen, funktioniert es)

 

Ich erhalte regelmäßig den Fehler 4401

ERR_HISTORY_NOT_FOUND

Der folgende Indikatorcode

datetime prevTime[22];
MqlRates _Rates[];

bool IsNewBar(ENUM_TIMEFRAMES period) {
   datetime currentTime[1];
   CopyTime(Symbol(), period, 0, 1, currentTime);
   int _;
   switch (period) {
      case PERIOD_M1  : _= 1;
         break;
      case PERIOD_M2  : _= 2;
         break;
      case PERIOD_M3  : _= 3;
         break;
      case PERIOD_M4  : _= 4;
         break;
      case PERIOD_M5  : _= 5;
         break;
      case PERIOD_M6  : _= 6;
         break;
      case PERIOD_M10 : _= 7;
         break;
      case PERIOD_M12 : _= 8;
         break;
      case PERIOD_M15 : _= 9;
         break;
      case PERIOD_M20 : _= 10;
         break;
      case PERIOD_M30 : _= 11;
         break;
      case PERIOD_H1  : _= 12;
         break;
      case PERIOD_H2  : _= 13;
         break;
      case PERIOD_H3  : _= 14;
         break;
      case PERIOD_H4  : _= 15;
         break;
      case PERIOD_H6  : _= 16;
         break;
      case PERIOD_H8  : _= 17;
         break;
      case PERIOD_H12 : _= 18;
         break;
      case PERIOD_D1  : _= 19;
         break;
      case PERIOD_W1  : _= 20;
         break;
      case PERIOD_MN1 : _= 21;
         break;  
      default         : _= 0;    
   } 
   if(currentTime[0]== prevTime[_]) return(false);
   else {
      prevTime[_] = currentTime[0];
      return(true);
   }
}

int OnInit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[]) 
if (IsNewBar(_Period)) {
    int err = CopyRates(Symbol(), PERIOD_D1, 0, 2, _Rates);
   Print("Count:", err);
   if (err < 1) {
       Print("ERROR:", GetLastError());
       Print("__Symbol:", Symbol());
       return(rates_total);
   }

}
return(rates_total); 
}

führt sofort beim Start zu einem Fehler (wenn nicht bei D1). Oder besser gesagt, einmal nach dem Start des Terminals und dem Öffnen des Charts - um den Indikator zu setzen, werden wir einen Fehler erhalten. Wenn das Terminal nicht geschlossen ist, tritt ein solcher Fehler beim Start nicht auf.

Aber nach einiger Zeit (ein paar Stunden - 2 Stunden waren genug für mich) werden wir sehen, dass wir den Fehler auf dem bereits geöffneten Diagramm erhalten werden. (Ich habe es auf m30 laufen lassen)

 

Hallo, meine Herren Entwickler!

Können wir Änderungen im MQL5-Compiler vornehmen, um zumindest eine Warnung zu erhalten?

für Fehler dieser Art im Code.

if(Flag_Exitl=true) {break;}


Die Vergleichsbedingung ist hier nicht korrekt (sie sollte == sein), weshalb es immer zu einem Bruch kommen wird.

Wie lässt sich diese Situation im Compiler beheben (falls das überhaupt möglich ist), damit ich beim Schreiben von Code weniger holprig vorankomme?

(Ich dachte, es würde nicht funktionieren, da es scheint, dass Zuweisung und Vergleich in if getrennt werden, dann wird die Frage entfernt).

 
Fia:

Hallo, meine Herren Entwickler!

Ist es möglich, den MQL5-Compiler so zu ändern, dass er zumindest eine Warnung ausgibt?

für Fehler dieser Art im Code.

if(Flag_Exitl=true) {break;}


Die Vergleichsbedingung ist nicht korrekt (sie sollte == sein), deshalb wird es immer ein Bruch sein.

Wie lässt sich diese Situation im Compiler beheben (falls überhaupt möglich), so dass ich beim Schreiben von Code weniger holprig arbeiten kann?

(Ich habe gedacht, es wird nicht funktionieren, ich kann die Zuordnung und den Vergleich in "wenn" aufteilen, damit die Frage entfernt wird).

Die Bedingung kann falsch geschrieben sein, aber sie ist in MQL5 erlaubt.

Ich werde übersetzen, was Sie codiert haben: Flag_Exitl Variable muss auf true gesetzt werden und dann überprüft, wenn Flag_Exitl wahr ist, dann brechen.

Die Abfolge der Aktionen ist genau wie folgt.

 

Ich verstehe nicht ganz, wie man mit Puffern arbeitet, die nicht auf dem Bildschirm angezeigt werden müssen.

Aus irgendeinem Grund wird der folgende Code angezeigt

1) zeichnet nichts

2) beide Puffer werden als Label1 bezeichnet

obwohl sie die richtigen Daten enthalten

#property indicator_separate_window
#property indicator_buffers 6
#property indicator_plots   2

//--- plot Label1
#property indicator_label1  "Label1"
#property indicator_color1  clrRed, clrWhite
#property indicator_type1   DRAW_COLOR_LINE

//--- plot Label2
#property indicator_label2  "Label2"
#property indicator_color2  clrRed, clrGreen
#property indicator_type2   DRAW_COLOR_LINE

//--- indicator buffers
double         L1_1[];
double         L2_1[];
double         Colors_1[];

//--- indicator buffers
double         L1_2[];
double         L2_2[];
double         Colors_2[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{
   SetIndexBuffer(0,L1_1,INDICATOR_DATA);
   SetIndexBuffer(1,L1_2,INDICATOR_DATA);
   SetIndexBuffer(2, Colors_1,INDICATOR_COLOR_INDEX);
   SetIndexBuffer(3, Colors_2,INDICATOR_COLOR_INDEX);
   SetIndexBuffer(4, L2_1, INDICATOR_CALCULATIONS);
   SetIndexBuffer(5, L2_2, INDICATOR_CALCULATIONS);
   return(0);
}

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[])
{
   for (int i = 0; i < rates_total; i++)
   {
      L1_1[i] = i;
      L1_2[i] = i + 1;
   }
   return(rates_total);
}
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы индикаторов / Стили рисования
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы индикаторов / Стили рисования
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы индикаторов / Стили рисования - Документация по MQL5
 

Hallo. Vielleicht schreibe ich in die falsche Richtung, aber ich hoffe, Sie können mir den richtigen Weg weisen. Wohin mit einer Frage zur Web-API für mt5? )

Ich werde versuchen, die Situation zu erklären, nur für den Fall. Ich habe МТ Manager und WEB API mit php... Die Rechnung in russischer Sprache wird erstellt, die Daten werden gesendet und sogar im МТ-Manager angezeigt, aber es gibt ein Problem - die Daten im МТ-Manager werden in Unicode angezeigt ("044404300c0438043b0438044f" - so sieht der Benutzername aus). Beim Senden von Daten wird nichts kodiert oder dekodiert, vom MT-Client wird alles normal erstellt... Zumindest in welche Richtung soll man schauen? (

Grund der Beschwerde: