Benutzerdefinierte Symbole. Fehler, Bugs, Fragen, Vorschläge. - Seite 18

 

Fehler 24.

Die Datenbanken der untersuchten und der importierten Zecken existieren nicht korrekt nebeneinander.

#define  PRINT(A) Print(#A + " = " + (string)(A))

void OnInit()
{
  MathSrand((int)TimeLocal());
  EventSetMillisecondTimer(20); // С такой частотой будем пробрасывать тики
}

void OnTimer()
{
  static bool FirstRun = true;
  static const string Name = _Symbol + (string)MathRand();
    
  static MqlTick Ticks[];
  static int Pos = 0;
    
  if (FirstRun)
  {    
    if (CustomSymbolCreate(Name, NULL, _Symbol) && SymbolSelect(Name, true)) // Создали символ
      PRINT(CopyTicks(_Symbol, Ticks, COPY_TICKS_ALL, (ulong)D'2019.06.20' * 1000, 5)); // Взяли 5 тиков для проброса
      
    FirstRun = false;
  }
  else if (Pos < ArraySize(Ticks))
  {
    MqlTick Tick[1];
    
    Tick[0] = Ticks[Pos++];
    
    PRINT(CustomTicksAdd(Name, Tick)); // Пробросили тик.
    PRINT(CustomTicksReplace(Name, Tick[0].time_msc, Tick[0].time_msc, Tick)); // Заменили его же через импорт.
  }
  else
  {
    PRINT(CopyTicksRange(Name, Ticks)); // Взяли всю тиковую историю
    ArrayPrint(Ticks);                  // Распечатали ее.
    
    ExpertRemove();
  }
}


Ergebnis

CopyTicks(_Symbol,Ticks,COPY_TICKS_ALL,(ulong)D'2019.06.20'*1000,5) = 5
CustomTicksAdd(Name,Tick) = 1
CustomTicksReplace(Name,Tick[0].time_msc,Tick[0].time_msc,Tick) = 1
CustomTicksAdd(Name,Tick) = 1
CustomTicksReplace(Name,Tick[0].time_msc,Tick[0].time_msc,Tick) = 1
CustomTicksAdd(Name,Tick) = 1
CustomTicksReplace(Name,Tick[0].time_msc,Tick[0].time_msc,Tick) = 1
CustomTicksAdd(Name,Tick) = 1
CustomTicksReplace(Name,Tick[0].time_msc,Tick[0].time_msc,Tick) = 1
CustomTicksAdd(Name,Tick) = 1
CustomTicksReplace(Name,Tick[0].time_msc,Tick[0].time_msc,Tick) = 1
CopyTicksRange(Name,Ticks) = 10
                 [time]   [bid]   [ask] [last] [volume]    [time_msc] [flags] [volume_real]
[0] 2019.06.20 00:00:05 1.12255 1.12268 0.0000        0 1560988805004       6       0.00000
[1] 2019.06.20 00:00:07 1.12259 1.12268 0.0000        0 1560988807693       2       0.00000
[2] 2019.06.20 00:00:08 1.12259 1.12267 0.0000        0 1560988808627       4       0.00000
[3] 2019.06.20 00:00:09 1.12256 1.12267 0.0000        0 1560988809561       2       0.00000
[4] 2019.06.20 00:00:10 1.12255 1.12268 0.0000        0 1560988810083       6       0.00000
[5] 2019.06.20 00:00:05 1.12255 1.12268 0.0000        0 1560988805004       6       0.00000
[6] 2019.06.20 00:00:07 1.12259 1.12268 0.0000        0 1560988807693       6       0.00000
[7] 2019.06.20 00:00:08 1.12259 1.12267 0.0000        0 1560988808627       6       0.00000
[8] 2019.06.20 00:00:09 1.12256 1.12267 0.0000        0 1560988809561       6       0.00000
[9] 2019.06.20 00:00:10 1.12255 1.12268 0.0000        0 1560988810083       6       0.00000


Fünf Zecken wurden nacheinander neu beprobt/importiert, aber es wurden 10 Zecken in der Vergangenheit gefunden. Gleichzeitig werden zuerst fünf Zecken und dann dieselben fünf Zecken gesetzt. D.h. auch die Zeit der Einträge in der Tickdatenbank ist nicht fortlaufend.

Achten Sie auf die Flaggen in der zweiten Hälfte der Zecken, sie unterscheiden sich von der ersten.

 
Slava:

Nicht reproduzierbar. Das leere Diagramm wird sofort nach dem Import der Balken aktualisiert.

Was passiert, wenn das Diagramm nicht geöffnet wird? Öffnen Sie das Diagramm nach dem Importieren von Balken.

Oder schließen und öffnen Sie das Diagramm.

Oder aktualisieren Sie das Diagramm über das Kontextmenü des Diagramms.

Suggestivfrage )))

Ich habe Gitterstäbe eingeführt und alle Fenster geschlossen.

Dann öffnete ich die Symbole erneut, ging auf die Registerkarte Balken und wählte dort mein Symbol aus.

Sollten die Balken angezeigt werden? Es ist leer.

Wenn ich auf die Schaltfläche Laden (mit der Vorauswahl des Abdeckungszeitraums) geklickt habe, erscheinen sie ebenfalls nicht.

Ich habe die Version 1970 ausprobiert - gleiche Situation.

Das Öffnen/Schließen der Karte und des Programms hilft nicht.

Ich habe noch nicht mit der Programmierung begonnen.

Nun, es muss so sein...


Wenn Sie die Möglichkeit haben, stellen Sie bitte eine Fernverbindung her und sehen Sie, was sie braucht.

 

https://www.mql5.com/ru/forum/147666/page2#comment_3720399

Könnte jemandem helfen.
Aber ich hatte ein anderes Problem
1. zusätzlich zur Datei 2019.hcc wurde die Datei 1970.hcc erstellt
Nachdem ich sie gelöscht hatte, schien sie wieder zum Leben zu erwachen.
2. es gab rote Linien, wo o oder h außerhalb von l h lagen

es ist nicht klar, woher 1970 kam.
es gab keine solchen Daten, keine leeren Zeilen
vielleicht eine Menge Kerzen, unter 50k

es ist möglich, zu schauen, aber wie man den Graphen mehr sichtbare Amplitude zu erweitern?
Ich muss beim Zeichnen von Objekten genau auf die Kerzenständerenden zielen
es nicht bequem ist, die Eigenschaften einzugeben und Werte manuell einzustellen
wird die Grafik an das Ende verschoben und ich muss zurückspulen
Wie kann ich es so einstellen, dass es nicht zum letzten Takt springt?

Тестер не работает
Тестер не работает
  • 2013.11.04
  • www.mql5.com
2013.11.03 17:25:58 TestGenerator: no history data 'EURUSD1' Вот такое сообщение появляется в журнале после нажатия кнопки "Старт"...
 

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Wanzen, Wanzen, Fragen

Stanislav Korotky, 2019.08.22 17:34

Ist jemand auf das folgende Problem mit benutzerdefinierten Zeichen gestoßen? Die CustomRatesUpdate-Funktion übergibt normale Kurse, aber in der Tat das Diagramm und Datenfenster bekommt etwas seltsam (in diesem Fall, in der Nähe und niedrigen Werte sind 100 mal weniger als übergeben):

Außerdem werden parallel dazu einzelne Ticks mit CustomTicksAdd mit denselben Werten des Schlusskurses emuliert wie im Protokoll (unmittelbar vor CustomRatesUpdate), d. h. es ist nicht klar, woher die reduzierten Werte in Anführungszeichen kommen.

UPD:

Ich habe "umgekehrte" Situation auf USDCAD - Zitate erhöhen 10 mal nach dem Schreiben. Das ist das Protokoll, das ich erhalte:

2019.08.23 00:04:10.579 RenkoCharts (USDCAD,M1)                  [time]  [open]  [high]   [low] [close] [tick_volume] [spread] [real_volume]
2019.08.23 00:04:10.579 RenkoCharts (USDCAD,M1) [0] 2019.08.23 00:02:00 1.32987 1.32987 1.32980 1.32987           457       48             0
2019.08.23 00:04:10.579 RenkoCharts (USDCAD,M1) Retry: 1 0
2019.08.23 00:04:10.579 RenkoCharts (USDCAD,M1)                  [time]  [open]   [high]   [low]  [close] [tick_volume] [spread] [real_volume]
2019.08.23 00:04:10.579 RenkoCharts (USDCAD,M1) [0] 2019.08.23 00:02:00 1.32980 13.29730 1.32980 13.29730           457       52             0

Der erste ArrayPrint ist das, was in CustomRatesUpdate geschrieben wurde, und der zweite ArrayPrint ist das, was mit CopyRates aus dem letzten letzten Takt unmittelbar nach dem Schreiben gelesen wurde. Erstens ist der Unterschied die letzte Ziffer in Open, aber noch wichtiger ist, dass High und Close um den Faktor 10 erhöht werden.

PS. Bei den Zecken ist alles in Ordnung:

 

Stanislav Korotky:

PS. Bei den Zecken ist alles in Ordnung:

Fehler 22.

 
fxsaber:

Fehler 22.

Wurde das Problem in einer der letzten Builds behoben?

 

Was ist der 4022-Fehler? Es hat etwas mit dem Versuch zu tun, einen Balken für ein benutzerdefiniertes Zeichen zu schreiben. Dem Code nach zu urteilen, handelt es sich jedoch um einen allgemeinen Code.

Am Anfang war es das:

KI      0       16:24:20.957    RenkoCharts (XAUUSD,M1) Alert: Error on writing custom record: 3082, err: 4401
HS      0       16:24:20.957    RenkoCharts (XAUUSD,M1) Failed to add:
LE      0       16:24:20.957    RenkoCharts (XAUUSD,M1)                  [time]   [open]   [high]    [low]  [close] [tick_volume] [spread] [real_volume]
KG      0       16:24:20.957    RenkoCharts (XAUUSD,M1) [0] 2019.08.28 00:06:00 1542.500 1542.500 1542.400 1542.400            15      170             0
GF      0       16:24:20.957    RenkoCharts (XAUUSD,M1) Last known 10 M1:
JN      0       16:24:20.973    RenkoCharts (XAUUSD,M1)                  [time]   [open]   [high]    [low]  [close]       [tick_volume] [spread]       [real_volume]
JJ      0       16:24:20.973    RenkoCharts (XAUUSD,M1) [0] 2019.08.28 00:00:00 1543.100 1543.100 1543.000 1543.000                   4      180                   0
DE      0       16:24:20.973    RenkoCharts (XAUUSD,M1) [1] 2019.08.28 00:01:00 1543.000 1543.000 1542.900 1542.900                   2      180                   0
EP      0       16:24:20.973    RenkoCharts (XAUUSD,M1) [2] 2019.08.28 00:02:00 1542.900 1542.900 1542.800 1542.800                   1      180                   0
ES      0       16:24:20.973    RenkoCharts (XAUUSD,M1) [3] 2019.08.28 00:03:00 1542.800 1542.800 1542.700 1542.700                   1      180                   0
EN      0       16:24:20.973    RenkoCharts (XAUUSD,M1) [4] 2019.08.28 00:04:00 1542.700 1542.700 1542.600 1542.600                   1      180                   0
QH      0       16:24:20.973    RenkoCharts (XAUUSD,M1) [5] 2019.08.28 00:05:00 1542.600 1542.700 1542.500 1542.500                  30      170                   0
RE      0       16:24:20.973    RenkoCharts (XAUUSD,M1) [6] 1970.01.01 00:00:00   +0.000   +0.000   +0.000   +0.000          5365435195        1 1827299883397152768
FF      0       16:24:20.973    RenkoCharts (XAUUSD,M1) [7] 2106.02.07 06:28:16    0.078   +0.000   +0.000   +0.000 4597373804417646592        1                9481
KR      0       16:24:20.973    RenkoCharts (XAUUSD,M1) [8] 1970.01.01 00:00:00   +0.000   +0.000   +0.000   +0.000           136454688        1 1827300776750350336
KL      0       16:24:20.973    RenkoCharts (XAUUSD,M1) [9] 0000.00.00 00:00:00   +0.000    2.150   +0.000   +0.000 1287860306076237824        0          4294967300
CH      0       16:24:20.973    RenkoCharts (XAUUSD,M1) Timeout before retry...

4401 beim Aufruf vonCustomRatesUpdate. Dann eine Lesung der letzten 10 Bars für benutzerdefinierte Symbol mit CopyRates (wir können einige Unsinn in der Basis zu sehen). Dann durch Timeouts mehrere Versuche, wieder einen Takt zu schreiben, bis 4022 kommt. Dann wurde der EA abnormal beendet, woraufhin er sich selbst neu gestartet hat.

 

Die Frage ist folgende.

Ich muss die Stop- und Freeze-Levels in einem benutzerdefinierten Symbol dynamisch ändern.

Es gibt den folgenden Code für den Test EA:

//+------------------------------------------------------------------+
//| Globals                                                          |
//+------------------------------------------------------------------+
string symbol_name="EURUSD_1";
string symbol_path="";
string symbol_origin="EURUSD";
long stop_lvl=20;
long freeze_lvl=30;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- 1) create
   if(!::SymbolInfoInteger(symbol_name,SYMBOL_CUSTOM))
     {
      ResetLastError();
      if(!::CustomSymbolCreate(symbol_name,symbol_path,symbol_origin))
        {
         PrintFormat("Error code: %d",GetLastError());
         return INIT_FAILED;
        }
     }
//--- 2) set levels
   ResetLastError();
   if(!::CustomSymbolSetInteger(symbol_name,SYMBOL_TRADE_STOPS_LEVEL,stop_lvl))
     {
      PrintFormat("Error code: %d",GetLastError());
      return INIT_FAILED;
     }
   if(!::CustomSymbolSetInteger(symbol_name,SYMBOL_TRADE_FREEZE_LEVEL,freeze_lvl))
     {
      PrintFormat("Error code: %d",GetLastError());
      return INIT_FAILED;
     }
//---
   return INIT_SUCCEEDED;
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- 1) stop level
   stop_lvl=::SymbolInfoInteger(symbol_name,SYMBOL_TRADE_STOPS_LEVEL);
   if(stop_lvl==20)
      stop_lvl=30;
   else
      stop_lvl=20;
   ResetLastError();
   if(::CustomSymbolSetInteger(symbol_name,SYMBOL_TRADE_STOPS_LEVEL,stop_lvl))
     {
      PrintFormat("Error code while setting a new value for the stop level: %d",
                  GetLastError());
      return;
     }
//--- 2) freeze level
   freeze_lvl=::SymbolInfoInteger(symbol_name,SYMBOL_TRADE_FREEZE_LEVEL);
   if(freeze_lvl==30)
      freeze_lvl=40;
   else
      freeze_lvl=30;
   if(::CustomSymbolSetInteger(symbol_name,SYMBOL_TRADE_FREEZE_LEVEL,freeze_lvl))
     {
      PrintFormat("Error code while setting a new value for the freeze level: %d",
                  GetLastError());
      return;
     }
  }
//+------------------------------------------------------------------+

Im normalen Debugging-Modus erhalte ich nur im Körper des OnTick()-Handlers einen Fehler. Der Fehler hat den Code 0.

2019.09.09 23:25:05.010 TestingLevels (EURUSD,M1)       Error code while setting a new value for the stop level: 0


Im Debugging-Modus des Verlaufs erhalte ich während der Initialisierung einen Fehler. Der Fehler sieht folgendermaßen aus:

2019.09.09 23:29:43.005 2019.09.02 00:00:00   Error code: 4014

D.h. es gibt ein Verbot, die Systemfunktion aufzurufen.

ERR_FUNCTION_NOT_ALLOWED

4014

Systemfunktion darf nicht aufgerufen werden


Ist es generell möglich, die Stop-Leveling- und Free-Leveling-Werte zu ändern, während der EA auf einem benutzerdefinierten Symbol läuft?

 
Denis Kirichenko:

Die Frage ist folgende.

Ich muss die Stop- und Freeze-Levels in einem benutzerdefinierten Symbol dynamisch ändern.

Es gibt den folgenden Code für den Test EA:

Im normalen Debugging-Modus erhalte ich nur im Körper des OnTick()-Handlers einen Fehler. Der Fehler hat den Code 0.


Im Debugging-Modus des Verlaufs erhalte ich während der Initialisierung einen Fehler. Der Fehler sieht folgendermaßen aus:

D.h. es gibt ein Verbot, die Systemfunktion aufzurufen.

ERR_FUNCTION_NOT_ALLOWED

4014

Systemfunktion darf nicht aufgerufen werden


Im Allgemeinen ist es möglich, Stop-Level und Freeze-Level-Werte zu ändern, wie der EA auf einem benutzerdefinierten Symbol ausgeführt wird?

Und warum in den OnTick()-Zeilen

if(::CustomSymbolSetInteger(symbol_name,SYMBOL_TRADE_STOPS_LEVEL,stop_lvl))

и

if(::CustomSymbolSetInteger(symbol_name,SYMBOL_TRADE_FREEZE_LEVEL,freeze_lvl))

den Körper des Fehlerbehandlungsblocks bei erfolgreicher Änderung der Zeicheneigenschaften eingeben? (kein "!"-Zeichen)

 
Artyom Trishkin:

Warum müssen die Zeilen in OnTick()

и

Blockkörper zur Fehlerbehandlung bei erfolgreicher Änderung der Zeicheneigenschaft eingeben? (kein "!"-Zeichen).

Artyom, ich danke dir! Mein Versehen.

Aktualisierte Version:

//+------------------------------------------------------------------+
//| Globals                                                          |
//+------------------------------------------------------------------+
string symbol_name="EURUSD_1";
string symbol_path="";
string symbol_origin="EURUSD";
long stop_lvl=20;
long freeze_lvl=30;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- 1) create
   if(!::SymbolInfoInteger(symbol_name,SYMBOL_CUSTOM))
     {
      ResetLastError();
      if(!::CustomSymbolCreate(symbol_name,symbol_path,symbol_origin))
        {
         PrintFormat("Error code: %d",GetLastError());
         return INIT_FAILED;
        }
     }
//--- 2) set levels
   ResetLastError();
   if(!::CustomSymbolSetInteger(symbol_name,SYMBOL_TRADE_STOPS_LEVEL,stop_lvl))
     {
      PrintFormat("Error code: %d",GetLastError());
      return INIT_FAILED;
     }
   if(!::CustomSymbolSetInteger(symbol_name,SYMBOL_TRADE_FREEZE_LEVEL,freeze_lvl))
     {
      PrintFormat("Error code: %d",GetLastError());
      return INIT_FAILED;
     }
//---
   return INIT_SUCCEEDED;
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- 1) stop level
   stop_lvl=::SymbolInfoInteger(symbol_name,SYMBOL_TRADE_STOPS_LEVEL);
   if(stop_lvl==20)
      stop_lvl=30;
   else
      stop_lvl=20;
   ResetLastError();
   if(!::CustomSymbolSetInteger(symbol_name,SYMBOL_TRADE_STOPS_LEVEL,stop_lvl))
     {
      PrintFormat("Error code while setting a new value for the stop level: %d",
                  GetLastError());
      return;
     }
//--- 2) freeze level
   freeze_lvl=::SymbolInfoInteger(symbol_name,SYMBOL_TRADE_FREEZE_LEVEL);
   if(freeze_lvl==30)
      freeze_lvl=40;
   else
      freeze_lvl=30;
   if(!::CustomSymbolSetInteger(symbol_name,SYMBOL_TRADE_FREEZE_LEVEL,freeze_lvl))
     {
      PrintFormat("Error code while setting a new value for the freeze level: %d",
                  GetLastError());
      return;
     }
  }
//+------------------------------------------------------------------+

Jetzt funktioniert alles im normalen Debug-Modus. Aber nicht mit dem Tester. Er schreibt dort weiter:

2019.09.10 07:16:49.867 2019.09.03 00:00:00   Error code: 4014