Benutzerdefinierte Symbole. Fehler, Bugs, Fragen, Vorschläge.

 
Da das Thema recht umfangreich ist, dachte ich, es wäre eine gute Idee, eine separate Diskussion darüber zu führen.
 

Fehler 01.

Die benutzerdefinierte Zeichentabelle ist geöffnet. Wenn Sie z. B. alle Balken- und Tick-Historien manuell löschen, bleibt das Diagrammfenster einfach hängen, ohne sich zu aktualisieren.

Erwartetes Verhalten wie bei einem leeren benutzerdefinierten Symbol.

 

Fehler 02.

Sie müssen die letzte Woche der benutzerdefinierten symbolischen Anführungszeichen löschen. Sie können es löschen, aber auch ChartRedraw hat keinen visuellen Effekt.

Nur wenn Sie das Diagramm mit der Maus verschieben, wird es wieder normal angezeigt. Können Sie die Visualisierung durch ChartRedraw korrigieren?


ZZY Ähnliche Überziehung im Moment

    ChartSetInteger(0, CHART_SHIFT, !ChartGetInteger(0, CHART_SHIFT));
    Sleep(1000);
    ChartRedraw();
    
    ChartSetInteger(0, CHART_SHIFT, !ChartGetInteger(0, CHART_SHIFT));
 

Fehler 03.

TicksAdd bietet den folgenden Schutz. Liegt ein Tick vor dem Tick in der Marktbeobachtung, wird er ignoriert.


Leider interagiert dieser Mechanismus nicht mit TicksDelete und TicksReplace.

Sie müssen den letzten Tag der Historie des benutzerdefinierten Symbols löschen und den letzten Tick nach der Löschung in Market Watch eingeben.

Wenn das Löschen in Ordnung ist, dann wird das Aufdecken des letzten Häkchens aufgrund der oben beschriebenen Regel nicht funktionieren.


Ich schlage vor, entweder die Regel TicksAdd zu ändern, oder dass TicksDelete/TicksReplace den Tick in Market Watch durch den letzten Tick in der Historie ersetzt, wenn dessen Zeit kleiner als die aktuelle Zeit ist.


Wiederholungsproblem

template <typename T>
T MyPrint( const T Value, const string Str, const bool DebugFlag = false ) { Print(Str + " = " + (string)Value); return(Value); }
#define _P(A) MyPrint(A, __FUNCSIG__ ", Line = " + (string)__LINE__ + ": " + #A)                    // Макрос для удобного и наглядного вывода значений

void OnStart()
{
  const string Name = "TEMP1235";                                                                   // Имя кастомного символа
  const string SymbOrig = "EURUSD";                                                                 // Имя оригинального символа

  MqlTick Ticks[];
  const int Size = _P(CopyTicksRange(SymbOrig, Ticks, COPY_TICKS_ALL, (long)D'2019.01.01' * 1000)); // Считали EURUSD-тики за 2019 год.
    
  if ((Size > 0) && _P(CustomSymbolCreate(Name, NULL, SymbOrig)) && _P(SymbolSelect(Name, true)))   // Создали символ на основе EURUSD.
  {            
    _P(CustomTicksReplace(Name, 0, LONG_MAX, Ticks));                                               // Поместили в него историю EURUSD.
    
    MqlTick AddTicks[1];                                                                            
    AddTicks[0] = Ticks[Size - 1];                                                                  // Последний тик в истории.
    
    _P(CustomTicksAdd(Name, AddTicks));                                                             // Последний тик добавили в Обзор рынка и еще раз в историю
    
    _P(CustomTicksDelete(Name, (long)D'2019.02.01' * 1000, LONG_MAX));                              // Удалили все тики, оставив только данные за январь 2019.
    _P(CopyTicks(Name, AddTicks, COPY_TICKS_ALL, 0, 1));                                            // Взяли последний тик из оставшейся истории.
    
    ArrayPrint(AddTicks);                                                                           // Посмотрели, что это, действительно, последний тик января.
    _P(CustomTicksAdd(Name, AddTicks));                                                             // Попробовали записать его в Обзор рынка - не получилось.
    
    _P(SymbolSelect(Name, false));                                                                  // Удалили символ из Обзора рынка.
    _P(CustomSymbolDelete(Name));                                                                   // Удалили символ.
  }
}


Ergebnis

void OnStart(), Line = 11: CopyTicksRange(SymbOrig,Ticks,COPY_TICKS_ALL,(long)D'2019.01.01'*1000) = 3316638
void OnStart(), Line = 13: CustomSymbolCreate(Name,NULL,SymbOrig) = true
void OnStart(), Line = 13: SymbolSelect(Name,true) = true
void OnStart(), Line = 15: CustomTicksReplace(Name,0,LONG_MAX,Ticks) = 3316638
void OnStart(), Line = 20: CustomTicksAdd(Name,AddTicks) = 1
void OnStart(), Line = 22: CustomTicksDelete(Name,(long)D'2019.02.01'*1000,LONG_MAX) = 1159087
void OnStart(), Line = 23: CopyTicks(Name,AddTicks,COPY_TICKS_ALL,0,1) = 1
                 [time]   [bid]   [ask] [last] [volume]    [time_msc] [flags] [volume_real]
[0] 2019.01.31 23:59:58 1.14461 1.14486 0.0000        0 1548979198644       2       0.00000
void OnStart(), Line = 26: CustomTicksAdd(Name,AddTicks) = -1
void OnStart(), Line = 28: SymbolSelect(Name,false) = true
void OnStart(), Line = 29: CustomSymbolDelete(Name) = true


Ich verstehe, dass ohne den Quellcode die Fehlermeldung in Worten bleibt. Wie langweilig es war, das zu beschreiben, aber es ist wahrscheinlich der effektivste Weg, um den Fehler zu zeigen, zu finden und zu beheben.

 

Ich habe gestern erst angefangen, die Kunststoffe auszusortieren, da ist einiges an Unsinn im Testgerät. Funktionieren Kunststoffe mit Formeln im Prüfgerät?

Erstellt eine synthetische, Formel aus der Hilfe. Ist das richtig?

1

Das hat der Test ergeben.

2

Das ist Unsinn - alle Geschäfte sind gewinnbringend, was dem Bild nach gar nicht sein kann; alle werden am Ende des Tests geschlossen und der Gewinn ist gleich Null. Ich muss etwas falsch machen. Was sollte ich noch überprüfen? Ich füge das Protokoll bei.

Dateien:
20190224.log  9322 kb
 
Alexey Volchanskiy:

Ich muss etwas falsch machen. Worauf sollte ich noch achten?

Im Screenshot können Sie sehen, dass die Gewinnwährung des Symbols nicht mit der Kontowährung übereinstimmt. Daher ergibt die Umrechnung Null.

Damit es "out of the box" funktioniert, benennen Sie es wie "EURUSD_ALEX1".

 
Können Sie mir sagen, in welchen Ordnern die benutzerdefinierten Symbole und ihre Einstellungen gespeichert sind? Ich kann sie weder im Terminal noch in der Software finden.
 
pivomoe:
Können Sie mir sagen, in welchen Ordnern die benutzerdefinierten Symbole und ihre Einstellungen gespeichert sind? Das Löschen im Terminal und in der Software hilft nicht.

\MetaTrader5\Bases\Custom\

 

Fehler 04.

Ein weiterer Fehler mit spezifischer Wiedergabe

template <typename T>
T MyPrint( const T Value, const string Str, const bool DebugFlag = false ) { Print(Str + " = " + (string)Value); return(Value); }
#define _P(A) MyPrint(A, __FUNCSIG__ ", Line = " + (string)__LINE__ + ": " + #A)                    // Макрос для удобного и наглядного вывода значений

void OnStart()
{
  const string Name = "TEMP8";                                                                      // Для каждого запуска нужно менять имя символа, чтобы увидеть проблему
  const string SymbOrig = "EURUSD";                                                                 // Имя оригинального символа

  MqlTick Ticks[];
  const int Size = _P(CopyTicksRange(SymbOrig, Ticks, COPY_TICKS_ALL, (long)D'2019.01.01' * 1000)); // Считали EURUSD-тики за 2019 год.
    
  if ((Size > 0) && _P(CustomSymbolCreate(Name, NULL, SymbOrig)) && _P(SymbolSelect(Name, true)))   // Создали символ на основе EURUSD.
  {            
    _P(CustomTicksReplace(Name, 0, LONG_MAX, Ticks));                                               // Поместили в него историю EURUSD.
    
    MqlTick AddTicks[1];                                                                            
    AddTicks[0] = Ticks[Size - 1];                                                                  // Последний тик в истории.
    
    _P(CustomTicksAdd(Name, AddTicks));                                                             // Последний тик добавили в Обзор рынка и еще раз в историю
    
    _P(CustomTicksDelete(Name, (long)D'2019.02.01' * 1000, LONG_MAX));                              // Удалили все тики, оставив только данные за январь 2019.
    _P(CopyTicks(Name, AddTicks, COPY_TICKS_ALL, 0, 1));                                            // Взяли последний тик из оставшейся истории.    
    ArrayPrint(AddTicks);                                                                           // Посмотрели, что это, действительно, последний тик января.

    const int NewSize = _P(CopyTicksRange(Name, Ticks));                                            // Запросили всю историю тиков кастомного символа
    
    _P(CopyTicks(Name, AddTicks, COPY_TICKS_ALL, 0, 1));                                            // Снова Взяли последний тик из истории.    
    ArrayPrint(AddTicks);                                                                           // Увидели, что последний тик изменился!
    
    _P(SymbolSelect(Name, false));                                                                  // Удалили символ из Обзора рынка.
    _P(CustomSymbolDelete(Name));                                                                   // Удалили символ.    
  }
} 


Ergebnis

void OnStart(), Line = 11: CopyTicksRange(SymbOrig,Ticks,COPY_TICKS_ALL,(long)D'2019.01.01'*1000) = 3316638
void OnStart(), Line = 13: CustomSymbolCreate(Name,NULL,SymbOrig) = true
void OnStart(), Line = 13: SymbolSelect(Name,true) = true
void OnStart(), Line = 15: CustomTicksReplace(Name,0,LONG_MAX,Ticks) = 3316638
void OnStart(), Line = 20: CustomTicksAdd(Name,AddTicks) = 1
void OnStart(), Line = 22: CustomTicksDelete(Name,(long)D'2019.02.01'*1000,LONG_MAX) = 1159087
void OnStart(), Line = 23: CopyTicks(Name,AddTicks,COPY_TICKS_ALL,0,1) = 1
                 [time]   [bid]   [ask] [last] [volume]    [time_msc] [flags] [volume_real]
[0] 2019.01.31 23:59:58 1.14461 1.14486 0.0000        0 1548979198644       2       0.00000
void OnStart(), Line = 26: CopyTicksRange(Name,Ticks) = 2157552
void OnStart(), Line = 28: CopyTicks(Name,AddTicks,COPY_TICKS_ALL,0,1) = 1
                 [time]   [bid]   [ask] [last] [volume]    [time_msc] [flags] [volume_real]
[0] 2019.02.22 23:57:59 1.13303 1.13316 0.0000        0 1550879879799       6       0.00000
void OnStart(), Line = 31: SymbolSelect(Name,false) = true
void OnStart(), Line = 32: CustomSymbolDelete(Name) = true


Fehler in CopyTicksRange enthalten - ändert die Tick-Historie! Bitte beachten Sie, dass Sie den Namen des benutzerdefinierten Symbols im Skript immer wieder ändern müssen, um es zu reproduzieren. Und das, obwohl das Skript sie erfolgreich löscht. Es stellt sich heraus, dass das Löschen eines Symbols überhaupt kein Löschen ist.

 
fxsaber:

Im Screenshot können Sie sehen, dass die Gewinnwährung des Symbols nicht mit der Kontowährung übereinstimmt. Daher ergibt die Umrechnung Null.

Damit es "out of the box" funktioniert, benennen Sie es wie "EURUSD_ALEX1".

Danke, das war der Punkt. Ich habe es so benannt, wie es in meinem Konto steht, und es hat funktioniert. Eine andere Frage. Was passiert beim realen Handel? Werden synthetische Aufträge in Aufträge und Positionen auf reale Paare, in diesem Fall (siehe Formel) EURUSD und USDCAD, umgesetzt?

Wo kann ich es sehen, das Testerprotokoll zeigt nur synthetische Daten an.

й

 
Benutzerdefinierte Symbole auf dem Real dienen nur der Information, nicht dem Handel. Sie können nur im Testgerät gehandelt werden.