MetaTrader 4 Build 529 beta mit neuem Compiler veröffentlicht - Seite 18

 
mr_Johns:
Ist das MQL4-Handbuch (das sich im Editor befindet) auch entsprechend aktualisiert worden?


ja, mit der Bitte um Aktualisierung. Das MQL4-Handbuch basiert fast auf 5 und entspricht derzeit nicht den Realitäten des Compilers.
 
ALXIMIKS:

Korrigieren Sie mich, wenn ich das falsch verstanden habe.

Ich verwende eine Bibliotheksfunktion in einem Indikator. Diese Funktion deklariert einige statische Variablen, die an der Berechnung des Indikator-Arrays beteiligt sind.

Wenn ich die Indikatorparameter ändern möchte, um die Indikatorberechnung zu korrigieren (abhängig von statischen Variablen),

Übergeben Sie das Kennzeichen an die Bibliotheksfunktion, die für die Reinitialisierung zuständig ist (Sie sollten die Eingabeparameter jeder Funktion, die statische Variablen hat, erweitern)

statische Variablen im Hauptteil auf Null setzen und nicht vergessen, die Markierung zu entfernen, bevor die Berechnung abgeschlossen wird.

Es wäre viel einfacher, wenn statische Variablen einen Parameter hätten, der bei ihrer Deklaration festgelegt wird und dafür verantwortlich ist, ob diese Variablen bei der Reinitialisierung auf Null zurückgesetzt werden.

Machen Sie globale Variablen statt lokaler Statik (außerhalb von Funktionen), und initialisieren Sie sie beim ersten Aufruf.
 
ALXIMIKS:

Es wäre viel einfacher, wenn statische Variablen einen Parameter hätten, der bei ihrer Deklaration festgelegt wird und der dafür verantwortlich ist, ob der Wert dieser Variablen bei der Neuinitialisierung zurückgesetzt wird oder nicht.

Es wäre noch einfacher, wenn die Entwickler eine spezielle Funktion wie ResetStaticVars() erstellen würden.

// Übrigens ist das gar nicht so einfach. Ich würde das nicht tun. Es ist eine Sache, das gesamte Datensegment einfach auf Null zu setzen, und eine andere, alle Benutzeranfangswerte korrekt zuzuweisen. Das ist allerdings sehr lästig.

Eigentlich ist es (als Paradigma) recht praktisch, Werte während der Laufzeit des Programms zu speichern. Es ist nur eine Frage der Abwärtskompatibilität, also...

 

Ich weiß, dass dies ein russischsprachiger Teil des Forums ist, aber da ich schlecht Russisch spreche (obwohl ich es lesen kann), hoffe ich, dass es niemandem etwas ausmacht, dies hier zu posten (da der englische Teil völlig inaktiv zu sein scheint, was diese Themen angeht, und da ich nicht gesehen habe, dass jemand über dieses Thema gepostet hat)

Es gibt ein schwerwiegendes Problem mit dem neuen Metatrader, das externe String-Parameter betrifft. Anfänglich haben sie einen korrekten Wert, aber sobald der Zeitrahmen oder das Symbol geändert wird, geht der Inhalt eines Stringparameters verloren. Hier ist ein einfaches Beispiel, das genau zeigt, was passiert. Dieses Problem tritt auch auf, wenn solche Indikatoren durch iCustom()-Aufrufe verwendet werden, und das macht jeden solchen Indikator unbrauchbar von jedem EA oder anderen Code

#property indicator_chart_window

extern string TestString = "whatever value that we want initially set";

int OnInit() { return(0); }
int deinit() { return(0); }
int start()
{
   Comment(TestString);
   return(0);
}
 
ALXIMIKS:

Ja, mit dem Antrag auf Aktualisierung. Das Handbuch für MQL4
basiert fast auf 5 und entspricht nicht den aktuellen Gegebenheiten des Compilers.

Vielleicht haben sie dort etwas hinterlassen, das in der nahen Zukunft liegt? ich rechne damit.
 
mr_Johns:
Ist das MQL4-Handbuch (das sich im Editor befindet) auch entsprechend aktualisiert worden?

Ja, sie wurde schon vor längerer Zeit aktualisiert und wird täglich aktiv ergänzt.
 

Ich kann nicht verstehen, warum wir ein solches Design brauchen

#property icon "\\Files\\button.ico"
 
VOLDEMAR:

Ich kann nicht verstehen, warum wir ein solches Design brauchen

Wenn Sie den EA starten, wird auf der Registerkarte "Allgemein" ein Bild angezeigt.
 
kein Bild
 
mladen:

Ich weiß, dass dies ein russischsprachiger Teil des Forums ist, aber da ich schlecht Russisch spreche (obwohl ich es lesen kann), hoffe ich, dass es niemandem etwas ausmacht, dies hier zu posten (da der englische Teil völlig inaktiv zu sein scheint, was diese Themen angeht, und da ich nicht gesehen habe, dass jemand über dieses Thema gepostet hat)

Es gibt ein ernsthaftes Problem mit dem neuen Metatrader, das externe String-Parameter betrifft. Anfänglich haben sie einen korrekten Wert, aber sobald der Zeitrahmen oder das Symbol geändert wird, geht der Inhalt eines Stringparameters verloren. Hier ist ein einfaches Beispiel, das genau zeigt, was passiert. Dieses Problem tritt auch auf, wenn solche Indikatoren durch iCustom()-Aufrufe verwendet werden, und das macht jeden solchen Indikator von jedem EA oder anderen Code unbrauchbar

Mladen, es ist einfacher für mich, auf Russisch zu antworten, da Sie fließend lesen können.

Hier ist meine Lösung für dieses Problem. In meinen init()-Code schließe ich die Funktion ReInit() ein, die diese globalen Variablen neu initialisiert, deren Werte wiederhergestellt werden sollten, wenn sich der Zeitrahmen oder das Symbol ändert:

//-----------------------------------------------------------------------------
int init(){
   int Error;
   if( МинНаклонТренда<Zero ) МинНаклонТренда=0;
   if( МинНаклонТренда-МаксНаклонТренда>Zero ) МаксНаклонТренда=МинНаклонТренда;
   if( БарОкончания<1 ) БарОкончания=1;
   if( МинБазовыйПериод<1 ) МинБазовыйПериод=1;
   if( МаксБазовыйПериод<МинБазовыйПериод ) МаксБазовыйПериод=МинБазовыйПериод;
   if( БарНачала<МинБазовыйПериод+БарОкончания ) БарНачала=МинБазовыйПериод+БарОкончания;
   if( БарНачала>Bars-1 ){
      if( Bars>МинБазовыйПериод+БарОкончания ) БарНачала=Bars-1;
      else Alert("Неразрешимая ошибка: история("+Bars+")<=активация("+МинБазовыйПериод
                +")+окончание("+БарОкончания+")");
   }
   if( ТолщинаТрендовой<1 ) ТолщинаТрендовой=1;
   if( ТолщинаТрендовой>5 ) ТолщинаТрендовой=5;
   if( РазмерИндикатораТиков<1 ) РазмерИндикатораТиков=1;
   if( РазмерИндикатораТиков>5 ) РазмерИндикатораТиков=5;
   if( СдвигИндикатораТиков<3 ) СдвигИндикатораТиков=3;
   if( СдвигИндикатораТиков>100 ) СдвигИндикатораТиков=100;
   if( ПоказыватьВсе ) Visibility=0; else Visibility=EMPTY;
   LastBar     =БарОкончания;
   ЦветЛиний[0]=ЦветПоддержки;
   ЦветЛиний[1]=ЦветСопротивления;
   ЦветХорды[0]=ЦветВосходящейХорды;
   ЦветХорды[1]=ЦветНисходящейХорды;
   Цвет123[0]  =Цвет123 ВТ;
   Цвет123[1]  =Цвет123 НТ;
   NewTime     =0;
   ReInit();                                       // Повторная инициализация
   ClearScreen();                                  // Очистить экран
   Error=fVLine("StartLine","Старт",0,БарНачала,0,0,0,0,0,ЦветВертикалей);
   Error=fVLine("DeadLine","Пуск",0,БарОкончания,0,0,0,0,0,ЦветВертикалей);
   DeadLine=TimeCurrent();
   if( СтатическийРежим ){
      if( РежимОтладки ) РежимРаботы=" Отладка "; else РежимРаботы=" ";
      РежимРаботы=РежимРаботы+"Статический режим Пауза "+ПериодИмитацииТиков+" мс";
      МоделироватьДинамику=false;
      //РежимОтладки=false;
      while( true ){                               // Бесконечный цикл
         ReInit();                                 // Повторная инициализация
         start();                                  // Имитация тика
         Sleep(ПериодИмитацииТиков);               // Не работает в индикаторах
   }  }
   else {
      if( МоделироватьДинамику ){
         РежимРаботы=" Режим имитации динамики Размерность "+DoubleToStr(0.5*БарНачала*БарНачала,0);
         Print("      "+Version+РежимРаботы+" История: "+(БарНачала)+" баров с "+TimeToStr(Time[БарНачала]));
         LastBar=БарНачала;
         while( LastBar>БарОкончания ){            // Перебор всех баров истории
            LastBar--;
            start();                               // Имитация тика
         }
         МоделироватьДинамику=false;
         Print("      Режим имитации динамики отключен!");
   }  }
   if( РежимОтладки ) РежимРаботы=" Отладка "; else РежимРаботы=" ";
   РежимРаботы=РежимРаботы+"Динамический режим";
   Print("      "+Version+РежимРаботы+" История: "+(БарНачала)+" баров с "+TimeToStr(Time[БарНачала]));
   if( !ПечататьПредупреждения ) Print("Печать предупреждений запрещена!");
   if( РежимОтладки ) start();                     // Имитация тика
   return(0);
}
//-----------------------------------------------------------------------------
// Повторная инициализация глобальных переменных и массивов
void ReInit(){
   StartTime[0]   =Time[БарНачала];
   StartTime[1]   =Time[БарНачала];
   Groups[0]      =0;
   Groups[1]      =0;
   OldMG[0]       =0;
   OldMG[1]       =0;
   MainGroup[0]   =0;
   MainGroup[1]   =0;
   QualityMax[0]  =0;
   QualityMax[1]  =0;
   OldStopLine    =0;
   return;
}
//-----------------------------------------------------------------------------