Fehler, Irrtümer, Fragen - Seite 2930

 

Übersetzen eines Indikators von mt4 nach mt5

Das Problem liegt in der Größe vonDRAW_HISTOGRAM

Wenn ich "1" oder "2" einstelle, ändert sich die Größe, aber "3" oder "4" = Größe ist immer noch "2".


Warum funktioniert alles in MT4, aber es gibt ein solches Problem mit MT5?

#property indicator_separate_window
#property indicator_plots   4
#property indicator_buffers 4
#property indicator_color1 clrDodgerBlue
#property indicator_color2 clrDodgerBlue
#property indicator_color3 clrLimeGreen
#property indicator_color4 clrFireBrick
#property indicator_width1 3
#property indicator_width2 3
#property indicator_width3 3
#property indicator_width4 3

Ergebnis in mt4


Ergebnis in mt5, zeigt nur "2" Dicke, obwohl ich "3" in den Einstellungen habe



Auch das Setzen der Eigenschaft in OnInit() hilft nicht

PlotIndexSetInteger(0,PLOT_LINE_WIDTH, 3);

 

Kritischer Fehler während der Fehlersuche:

struct sA
  {
   int               i;
   string            s;
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class cA
  {
public:
   sA                my_array[];
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart()
  {
   cA *ca;
   ca=new cA();
   ArrayResize(ca.my_array,1);
   ZeroMemory(ca.my_array);
   ArrayPrint(ca.my_array);
  }

Ergebnis:

2020.12.27 17:04:26.966 1 (EURUSD,M1)   Access violation at 0x000001FE5AF10199 read to 0xFFFFFFFFFFFFFFFF in 'D:\Alpari MT5\MQL5\Scripts\Test\1.ex5'
2020.12.27 17:04:26.967 1 (EURUSD,M1)      crash -->  000001FE5AF10199 8B4318            mov        eax, [rbx+0x18]
2020.12.27 17:04:26.967 1 (EURUSD,M1)                 000001FE5AF1019C 4089442420        mov        [rsp+0x20], eax
2020.12.27 17:04:26.967 1 (EURUSD,M1)                 000001FE5AF101A1 41B910000000      mov        r9d, 0x10
2020.12.27 17:04:26.967 1 (EURUSD,M1)                 000001FE5AF101A7 49B8B807F15AFE01  mov        r8, 0x1fe5af107b8
2020.12.27 17:04:26.967 1 (EURUSD,M1)                                  0000
2020.12.27 17:04:26.967 1 (EURUSD,M1)                 000001FE5AF101B1 488D17            lea        rdx, [rdi]
2020.12.27 17:04:26.967 1 (EURUSD,M1)                 000001FE5AF101B4 48B998D45F5FFE01  mov        rcx, 0x1fe5f5fd498
2020.12.27 17:04:26.967 1 (EURUSD,M1)                                  0000
2020.12.27 17:04:26.967 1 (EURUSD,M1)                 000001FE5AF101BE 49FF96A8120000    call       qword near [r14+0x12a8]  ; #11378 (terminal64.exe)
2020.12.27 17:04:26.967 1 (EURUSD,M1)   
2020.12.27 17:04:26.967 1 (EURUSD,M1)   00: 0x000001FE5AF10199
2020.12.27 17:04:26.967 1 (EURUSD,M1)   01: 0x000001FE633F0010
2020.12.27 17:04:26.967 1 (EURUSD,M1)   
Derzeitige Betaversion
Документация по MQL5: Программы MQL5 / Ошибки выполнения
Документация по MQL5: Программы MQL5 / Ошибки выполнения
  • www.mql5.com
Ошибки выполнения - Программы MQL5 - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Hat jemand einen Weg gefunden, um ein Indikator-Handle zu erhalten, um eine Eigenschaft im Hauptfenster oder Unterfenster anzuzeigen? Ich spreche von beliebigen Indikatoren von Drittanbietern, die mit IndicatorCreate erstellt werden und dann mitChartIndicatorAdd auf Anfrage des Benutzers zum Diagramm hinzugefügt werden können.
 
Stanislav Korotky:
Hat jemand einen Weg gefunden, um den Indikator-Handle im Hauptfenster oder in einem Unterfenster anzeigen zu lassen? Ich spreche von benutzerdefinierten Indikatoren, die mit IndicatorCreate erstellt werden und dann mit ChartIndicatorAdd zum Diagramm hinzugefügt werden können.

Sie können den Indikator wahrscheinlich in OBJ_CHART verschieben und sehen, wo er sich befindet.

 
Stanislav Korotky:
Hat jemand einen Weg gefunden, um eine Display-Eigenschaft von einem Indikator-Handle im Hauptfenster oder Unterfenster zu erhalten? Ich spreche von benutzerdefinierten Indikatoren, die mit IndicatorCreate erstellt werden und dann auf Wunsch des Benutzers mit ChartIndicatorAdd zum Diagramm hinzugefügt werden können.

hat etwas Ähnliches gemacht.
Hier ist eine, die ich gefunden habe. Ich weiß nicht mehr, ob es funktioniert oder nicht. Bitte schauen Sie sich das an.

bool FindIndicatorByHandle(long handle, string &symbol, ENUM_TIMEFRAMES &timeframe, long &ChartId, int &sub_win, string &Name) {
   long chart_id =ChartFirst();
   while (chart_id!=-1) {
      int total_sub = (int)ChartGetInteger(chart_id,CHART_WINDOWS_TOTAL);
      int total_ind; 
      for(int i=0; i<total_sub; i++) {
         total_ind = ChartIndicatorsTotal(chart_id,i);
         for (int j=0; j<total_ind; j++) {
            string name = ChartIndicatorName(chart_id,i,j);
            if (ChartIndicatorGet(chart_id,i,name)== handle) {
               ChartId=chart_id;
               symbol= ChartSymbol(chart_id);
               timeframe=ChartPeriod(chart_id);
               sub_win=i;
               Name=name;
               return true;
            }
         }
      }
      chart_id=ChartNext(chart_id);
   }
   return false;
}
Der Code durchsucht alle offenen Charts nach einem Indikator anhand seines Handles. Gibt Symbol, Zeitrahmen, Chart-ID, Unterfenster und Indikatorname zurück.
 
fxsaber:

Ich denke, Sie könnten den Indikator in OBJ_CHART einfügen und sehen, wo er sich befindet.

Ich werde es versuchen, denn jetzt hatte ich die Möglichkeit, es durch den Benutzer zu spezifizieren.

 
Nikolai Semko:

hat etwas Ähnliches gemacht.
Hier ist eine, die ich gefunden habe. Ich weiß nicht mehr, ob es funktioniert oder nicht. Bitte sehen Sie sich das an.

Dem Code nach zu urteilen, werden alle offenen Charts nach einem Indikator anhand seines Handles durchsucht. Gibt Symbol, Zeitrahmen, Chart-ID, Unterfenster und Indikatorname zurück.

Das passt nicht zu Ihrer Frage: Indikatoren, die von IndicatorCreate erstellt werden, werden nicht in einem Fenster platziert - sie "sitzen" darin, und die Aufgabe besteht darin, einen solchen Indikator an seinem Handle im Fenster zu platzieren. MQL5 erlaubt es nun, mit der Funktion ChartIndicatorAdd ein beliebiges Handle zum Haupt- oder Unterfenster hinzuzufügen, unabhängig von den "Eigenschaften" des Indikators (keine Fehler!), und das Ergebnis sieht sehr seltsam aus, wenn das Hinzufügen nicht wie beabsichtigt durchgeführt wird.

 

Es gibt ein größeres Problem mit Indikatoren.

Einige von ihnen implementieren den OnCalculate-Handler entsprechend der vereinfachten Version mit einem Eingabefeld, und Sie können den Preistyp für ihre Berechnung auswählen. Woher wissen Sie aus dem fremden MQL5-Programm, dass der Indikator diesen Preistyp erwartet, der bei der Erstellung des Indikators nach allen Parametern übergeben werden muss? Es scheint, dass es keinen Weg gibt. Und wenn Sie das nicht tun, wird der Indikator durch die #Eigenschaft indicator_applied_price gezeichnet, auf die von außen nicht zugegriffen werden kann. Hier ist ein einfacher Expert Advisor, der den Indikator/AMA programmatisch in das Diagramm einfügt:

int OnInit()
{
  const int h = iCustom(NULL, 0, "Examples/AMA");
  if(h == INVALID_HANDLE)
  {
    Print("iCustom failed: ", _LastError);
    return INIT_FAILED;
  }

  if(!ChartIndicatorAdd(0, 0, h))
  {
    Print("ChartIndicatorAdd failed: ", _LastError);
    return INIT_FAILED;
  }
  ChartRedraw();
  
  return INIT_SUCCEEDED;
}

Wenn wir danach den Zeitrahmen des Charts wechseln, erhalten wir 2 AMA-Indikatoren: einen zum Schlusskurs (programmatisch erstellt) und den zweiten zum Eröffnungskurs (generiert aufgrund des Zeitrahmenwechsels und der #Eigenschaft indicator_applied_price PRICE_OPEN; es ist auch nicht klar, warum diese Eigenschaft nicht in iCustom übernommen wird).

 

Um das Thema der Indikatoren fortzusetzen, hänge ich den Expert Advisor an, den ich verwendet habe, um das Problem mit den MqlParam-Parametern herauszufinden und zu vermeiden.

Die Aufgabe des Expert Advisors besteht darin, den Indikator "Examples/Price_Channel" mit denselben Parametern in den Chart einzufügen, falls er noch nicht vorhanden ist.

Um dies zu tun, erstellen wir eine Instanz mit iCustom/IndicatorCreate, erhalten ein Array seiner Parameter durch IndicatorParameters und rufen dann in der Schleife IndicatorParameters für Indikatoren auf, die bereits im Diagramm existieren: Wenn es keine Übereinstimmung der Array-Parameter gibt, wird der Indikator dem Diagramm hinzugefügt, wenn es eine Übereinstimmung gibt, wird der neue Handle einfach zerstört.

Das Problem ist, dass die Gleichheit der Parameter nicht immer wie erwartet funktioniert. Insbesondere gibt es einen solchen ausfallsicheren Testfall. Wir platzieren den Expert Advisor auf ein beliebiges leeres Diagramm und klicken - es wird die erste Instanz des Indikators erstellt. Dann wechseln wir zu einem anderen Diagramm-Zeitrahmen (der alte Indikator bleibt erhalten) und klicken erneut. Seltsamerweise wird die zweite Instanz des Indikators erstellt.

Aus der Analyse der Ausführung und des Protokolls geht hervor, dass dies auf die falsche Gleichsetzung von Zeichenfolgen des Indikatornamens in Parametern zurückzuführen ist. Die Zeichenketten sind dort 260 Zeichen lang, aber die Klemme 0 befindet sich viel früher. Danach gibt es entweder einige Serviceinformationen oder Müll. Der String-Vergleich "==" oder StringCompare berücksichtigt diesen "Müll" und wir erhalten eine Ungleichheit der Strings.

Wenn wir Zeichenketten in ein char-Array umwandeln, erhalten die Arrays eine vollständige Übereinstimmung. Wenn Sie in ein kurzes Array konvertieren, erhalten Sie nur Unsinn. Alles in allem ein inkonsistentes Verhalten, das in der Dokumentation nicht beschrieben wird.

Window N: 1
   0, Price Channel(22), 12
    [type] [integer_value] [double_value]                                                                                                                                                                                                                                                         [string_value]
[0]     14               0          0.000 "Indicators\Examples/Price_Channel"                                                                                                                                                                                                                                   
[1]      7              22          0.000 null                                                                                                                                                                                                                                                                  
ind1: 'Indicators\Examples/Price_Channel
ind2: 'Indicators\Examples/Price_Channel
260 0 / 260 0
Char arrays 34 34
 73 110 100 105  99  97 116 111 114 115  92  69 120  97 109 112 108 101 115  47  80 114 105  99 101  95  67 104  97 110 110 101 108   0
 73 110 100 105  99  97 116 111 114 115  92  69 120  97 109 112 108 101 115  47  80 114 105  99 101  95  67 104  97 110 110 101 108   0
Short arrays 260 260
[  0]    73   110   100   105    99    97   116   111   114   115    92    69   120    97   109   112   108   101   115    47    80   114   105    99
[ 24]   101    95    67   104    97   110   110   101   108     0   103   110    97   108     0     0     0     0     0     0     0     0     0     0
[ 48]     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
[ 72]     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
[ 96]     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
[120]     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
[144]     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
[168]     0     0     0     0     0     0     0     0     0     0     0     0    13  3328 58074    86 13696    54     0     0 35120  3210     0     0
[192]     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
[216]     0     0     0     0 61841 38184 17648 16370     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
[240]     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
[  0]    73   110   100   105    99    97   116   111   114   115    92    69   120    97   109   112   108   101   115    47    80   114   105    99
[ 24]   101    95    67   104    97   110   110   101   108     0   103   110    97   108     0    32    32    77    32    65    32    82    32    75
[ 48]    32    83     0    32    99   111   109   109    97    32   115   101   112    97   114    97   116   101   100    32   108   105   115   116
[ 72]    41     0    32   112   114   111   116   111   116   121   112   101   115    41     0     0   115     0     0     0     0     0     0     0
[ 96]   528     0     0     0     0    45     0     0     3     0     0     0   512     0     0     0  1160    45     0     0  7256 30655     0     0
[120]     0     0     0     0   512     0     0     0     0 65535  2272     0 29648    45     0     0     0     0     0     0     0     0     0     0
[144]     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
[168]     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
[192]     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
[216]     3     0     0     0 26341 16284     1     0  1308    16     0     0 49814 30635     0     0     0     0     0     0 32016    37     0     0
[240]     2     0     0     0 50336 16481     1     0     2     0     0     0     3     0     0     0 45520    37     0     0
1 0

Ich bin mir nicht sicher, was genau der Fehler ist, ob er im Prinzip der String-Verarbeitung in MQL liegt oder etwas anderes.

Wenn jemand die Feinheiten kennt, bitte ich um einen Hinweis.

Dateien:
 
Stanislav Korotky:

Wenn jemand die Feinheiten kennt, bitte ich um einen Hinweis.

Das ist die Art von Merkmal, bei der man, selbst wenn man sie kennt, die ganze Ebene noch einmal im Kopf durchgehen muss.

Hier ist die Definition von Selbstverfügbarkeit. Es schien zu funktionieren, wenn man die TFs wechselte.

Init_Sync
Init_Sync
  • www.mql5.com
Библиотека делает синхронизированными Init/Deinit индикаторов