Symboles personnalisés. Erreurs, bogues, questions, suggestions.

 
Comme le sujet est assez vaste, j'ai pensé que ce serait une bonne idée d'avoir une discussion séparée à ce sujet.
 

Bug 01.

Le tableau des caractères personnalisés est ouvert. Si, par exemple, vous supprimez manuellement l'historique des barres et des tics, la fenêtre du graphique se bloque, sans être rafraîchie.

Comportement attendu comme avec un symbole personnalisé vide.

 

Bug 02.

Vous devez supprimer la dernière semaine des cotations des symboles personnalisés. Vous pouvez le supprimer, mais même ChartRedraw ne donne aucun effet visuel.

Ce n'est que si vous faites défiler le graphique avec la souris qu'il revient à la normale. Pourriez-vous corriger la visualisation par ChartRedraw ?


ZZY Fait un découvert similaire pour le moment

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

Bug 03.

TicksAdd a la protection suivante. Si un tick est antérieur à celui de la Market Watch, il est ignoré.


Malheureusement, ce mécanisme n'interagit pas avec TicksDelete et TicksReplace.

Vous devez supprimer le dernier jour de l'historique du symbole personnalisé et mettre le dernier tick après la suppression dans Market Watch.

Si la suppression est acceptable, alors l'exposition du dernier tick ne fonctionnera pas, en raison de la règle que j'ai décrite ci-dessus.


Je suggère soit de modifier la règle TicksAdd, soit que TicksDelete/TicksReplace remplace le tick dans Market Watch par le dernier tick de l'historique si son heure est inférieure à l'heure actuelle.


Problème de relecture

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));                                                                   // Удалили символ.
  }
}


Résultat

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


Je comprends que sans le code source, le message d'erreur restera en toutes lettres. C'est ennuyeux à décrire, mais c'est probablement le moyen le plus efficace de montrer, trouver et corriger le bug.

 

J'ai commencé à trier les synthétiques hier, il y a quelques absurdités dans le testeur. Les synthétiques avec formules fonctionnent-ils dans le testeur ?

Création d'une formule synthétique, à partir de l'aide. Est-ce exact ?

1

C'est ce que le test a montré.

2

Cela n'a aucun sens - toutes les transactions sont rentables, ce qui ne peut pas être le cas, même d'après l'image. Toutes sont fermées à la fin du test et le bénéfice est nul. Je dois faire quelque chose de mal. Que dois-je vérifier d'autre ? Je joins le journal.

Dossiers :
20190224.log  9322 kb
 
Alexey Volchanskiy:

Je dois faire quelque chose de mal. Que dois-je regarder d'autre ?

Dans la capture d'écran, vous pouvez voir que la devise de profit du symbole n'est pas la même que la devise du compte. La conversion donne donc zéro.

Pour qu'il fonctionne dès le départ, donnez-lui un nom comme "EURUSD_ALEX1".

 
Pouvez-vous me dire dans quels dossiers sont stockés les symboles personnalisés et leurs paramètres ? Je ne le trouve ni dans le terminal ni dans le logiciel.
 
pivomoe:
Pouvez-vous me dire dans quels dossiers sont stockés les symboles personnalisés et leurs paramètres ? La suppression dans le terminal et le logiciel n'aide pas.

\N- Méta-Trader5\N- Bases\N- Clients

 

Bug 04.

Un autre bug avec le replay spécifique

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));                                                                   // Удалили символ.    
  }
} 


Résultat

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


Bug contenu dans CopyTicksRange - modifie l'historique des ticks! Veuillez noter que pour le reproduire, vous devez changer le nom du symbole personnalisé dans le script en permanence. Et ce malgré le fait que le script l'ait supprimé avec succès. Il s'avère que la suppression d'un symbole n'est pas du tout une suppression.

 
fxsaber:

Dans la capture d'écran, vous pouvez voir que la devise de profit du symbole n'est pas la même que la devise du compte. Par conséquent, la conversion donne zéro.

Pour qu'il fonctionne dès le départ, donnez-lui un nom comme "EURUSD_ALEX1".

Merci, c'était le but. Je l'ai nommé comme il est dans mon compte et ça a marché. Une autre question. Que se passe-t-il pendant le trading réel ? Les ordres synthétiques sont-ils traduits en ordres et positions sur les paires réelles, en l'occurrence (voir une formule) EURUSD et USDCAD ?

Où puis-je le voir, le journal du testeur ne montre que du synthétique.

й

 
Lessymboles personnalisés sur le réel sont fournis à titre d'information uniquement, et non à des fins commerciales. Ils ne peuvent être échangés que dans le testeur.