Simboli personalizzati. Errori, bug, domande, suggerimenti.

 
Dato che l'argomento è abbastanza ampio, ho pensato che sarebbe una buona idea avere una discussione separata su di esso.
 

Bug 01.

La tabella dei caratteri personalizzati è aperta. Se, per esempio, cancellate manualmente tutta la cronologia delle barre e dei tick, la finestra del grafico si blocca - senza rinfrescarsi.

Comportamento atteso come con un simbolo personalizzato vuoto.

 

Bug 02.

È necessario cancellare l'ultima settimana delle citazioni dei simboli personalizzati. Puoi cancellarlo, ma anche ChartRedraw non dà alcun effetto visivo.

Solo se si fa scorrere il grafico con il mouse, torna normale. Potresti sistemare la visualizzazione di ChartRedraw?


ZZY Facendo un overdraw simile per ora

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

Bug 03.

TicksAdd ha la seguente protezione. Se un tick è precedente a quello del Market Watch, viene ignorato.


Purtroppo, questo meccanismo non interagisce con TicksDelete e TicksReplace.

Devi cancellare l'ultimo giorno della storia del simbolo personalizzato e mettere l'ultimo tick dopo la cancellazione in Market Watch.

Se la cancellazione è ok, allora esporre l'ultimo tick non funzionerà, a causa della regola che ho descritto sopra.


Suggerisco di cambiare la regola TicksAdd, o che TicksDelete/TicksReplace sostituisca il tick in Market Watch con l'ultimo tick nella storia se il suo tempo è inferiore al tempo corrente.


Problema di riproduzione

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


Risultato

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


Capisco che senza il codice sorgente il messaggio di errore rimarrà a parole. Come era noioso da descrivere, ma è probabilmente il modo più efficace per mostrare, trovare e risolvere il bug.

 

Ho iniziato ieri a sistemare i sintetici, c'è qualche sciocchezza nel tester. I sintetici con formule funzionano nel tester?

Creato un sintetico, formula dall'aiuto. È corretto?

1

Questo è ciò che il test ha mostrato.

2

Questa è un'assurdità - tutti i trade sono redditizi, il che non può essere così anche secondo l'immagine. Tutti sono chiusi alla fine del test e il profitto è zero. Devo fare qualcosa di sbagliato. Cos'altro dovrei controllare? Sto allegando il registro.

File:
20190224.log  9322 kb
 
Alexey Volchanskiy:

Devo fare qualcosa di sbagliato. Cos'altro dovrei guardare?

Nella schermata si può vedere che la valuta di profitto del simbolo non è la stessa della valuta del conto. Quindi la conversione dà zero.

Per farlo funzionare "out of the box", dategli un nome come "EURUSD_ALEX1".

 
Puoi dirmi in quali cartelle sono memorizzati i simboli personalizzati e le loro impostazioni? Non riesco a trovarlo nel terminale o nel software.
 
pivomoe:
Puoi dirmi in quali cartelle sono memorizzati i simboli personalizzati e le loro impostazioni? La cancellazione nel terminale e nel software non aiuta.

\MetaTrader5\basi\clientela

 

Bug 04.

Un altro bug con il replay specifico

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


Risultato

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 contenuto in CopyTicksRange - cambia la storia dei tick! Notate che per riprodurlo, dovete cambiare continuamente il nome del simbolo personalizzato nello script. E questo nonostante il fatto che lo script lo cancelli con successo. Si scopre che la cancellazione di un simbolo non è affatto una cancellazione.

 
fxsaber:

Nella schermata si può vedere che la valuta di profitto del simbolo non è la stessa della valuta del conto. Pertanto, la conversione dà zero.

Per farlo funzionare "out of the box", dategli un nome come "EURUSD_ALEX1".

Grazie, era questo il punto. L'ho chiamato come è nel mio account e funziona. Un'altra domanda. Cosa succede durante il trading reale? Gli ordini sintetici vengono tradotti in ordini e posizioni su coppie reali, in questo caso (vedi formula) EURUSD e USDCAD?

Dove posso vederlo, il log del tester mostra solo il sintetico.

й

 
Isimboli personalizzati sul reale sono solo a scopo informativo, non per il trading. Possono essere scambiati solo nel tester.