Simboli personalizzati. Errori, bug, domande, suggerimenti. - pagina 13

 
fxsaber:

Inoltre, se è 00:00:01, non potete usare CustomTicksAdd per rimodellare una barra che era solo due secondi fa.

Certo che non si può. Perché il tick arrivato alle 00:00:01 dovrebbe già formare la prossima barra. In una situazione normale.

 
Slava:

Per il tester, il tick dell'altro ieri è il tick fresco di oggi.

Capisco il tuo punto di vista. I suoi esercizi con tic personalizzati di sei mesi fa sono di natura decisamente tester. La tua situazione non è normale (nel senso di pratica comune)

Per quanto riguarda l'uso non standard di quelli personalizzati. È a questo che serve la discussione, per identificare le peculiarità nelle diverse situazioni e cercare di risolverle.

 
Slava:

Naturalmente, questo non funzionerà. Perché un tick che arriva alle 00:00:01 dovrebbe già formare la prossima barra. In una situazione normale.

Immaginate un servizio che cronometri i tick in un secondo (forse meno, come si fa di solito con le formule - 100ms). Poi a mezzanotte le barre perderanno spesso gli ultimi tick della giornata.

 

Bug 16.

Le barre M1 ci sono, ma gli altri timeframe non vengono visualizzati.


Come riprodurlo ironicamente - non lo so.
 
fxsaber:

Bug 16.

Le barre M1 ci sono, ma gli altri timeframe non vengono visualizzati.


Non so come riprodurlo.
Quelle barre non sono quelle con secondi non nulli?
 
Slava:
Quelle barre non sono quelle con un tempo di secondi non nullo?

Ci sono tick reali con EURUSD e le barre sono normali (multipli di un minuto).

Il problema era stabile su qualsiasi periodo diverso da M1. Ecco perché il video è stato registrato senza problemi.


Ma dopo qualche tempo il problema ha smesso di suonare. Il simbolo è stato creato dall'Expert Advisor di questo ramo.

 

Bug 17.

La storia della zecca scompare completamente.

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

#define  SIZE 100

void OnStart()
{
  MathSrand((uint)TimeLocal());
  const string Name = _Symbol + (string)MathRand();
  
  MqlTick Ticks[];
  PRINT(CustomSymbolCreate(Name, NULL, _Symbol)); // Создали символ.
  PRINT(SymbolSelect(Name, true)); // Поместили в Обзор рынка
  PRINT(CopyTicksRange(_Symbol, Ticks, COPY_TICKS_INFO, D'2019.06.01' * 1000)); // Взяли тики
  
  PRINT(ArrayResize(Ticks, SIZE));    // Оставили только SIZE-тиков
  PRINT(CustomTicksAdd(Name, Ticks)); // Пробросили их все

  MqlTick NewTicks[];
  PRINT(CopyTicksRange(Name, NewTicks)); // Взяли тики, что в истории
   
//  PRINT(CustomTicksReplace(Name, 0, LONG_MAX, NewTicks)); // И перезаписали их.

  PRINT(CopyTicksRange(Name, Ticks)); // Убедились, что тиков в истории ровно SIZE
  PRINT(CustomTicksDelete(Name, Ticks[SIZE - 1].time_msc - 60 * 1000, LONG_MAX)); // Удалили последнюю минуту
  PRINT(CopyTicksRange(Name, Ticks)); // Убедились, что тиков стало меньше на удаленное количество
}


Risultato

CustomSymbolCreate(Name,NULL,_Symbol) = true
SymbolSelect(Name,true) = true
CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,D'2019.06.01'*1000) = 533797
ArrayResize(Ticks,100) = 100
CustomTicksAdd(Name,Ticks) = 100
CopyTicksRange(Name,Ticks) = 100
CustomTicksDelete(Name,Ticks[100-1].time_msc-60*1000,LONG_MAX) = 1
CopyTicksRange(Name,Ticks) = 0


Se si rimuove il commento dalla linea sottolineata, lo script funziona correttamente. A quanto pare, i vecchi Add-types non vanno dove vanno i Replace-types.

 

Bug 18.

Quando i tick vengono rimossi, l'ultima barra viene persa.

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

void OnStart()
{
  MathSrand((uint)TimeLocal());
  const string Name = _Symbol + (string)MathRand();
  
  MqlTick Ticks[];
  PRINT(CustomSymbolCreate(Name, NULL, _Symbol)); // Создали символ.
  PRINT(SymbolSelect(Name, true)); // Поместили в Обзор рынка
  PRINT(CopyTicks(_Symbol, Ticks)); // Взяли тики
  
  PRINT(CustomTicksReplace(Name, 0, LONG_MAX, Ticks)); // Записали их.
  PRINT(CustomTicksDelete(Name, Ticks[ArraySize(Ticks) - 1].time_msc - 60 * 1000, LONG_MAX)); // Удалили последнюю минуту

  MqlTick LastTick[1];
  PRINT(CopyTicks(Name, LastTick, COPY_TICKS_ALL, 0, 1)); // Распечатали последний тик
  ArrayPrint(LastTick);

  MqlRates LastBar[1];
  PRINT(CopyRates(Name, PERIOD_M1, 0, 1, LastBar)); // Распечатали последний бар
  ArrayPrint(LastBar);
}


Risultato

CustomSymbolCreate(Name,NULL,_Symbol) = true
SymbolSelect(Name,true) = true
CopyTicks(_Symbol,Ticks) = 2000
CustomTicksReplace(Name,0,LONG_MAX,Ticks) = 2000
CustomTicksDelete(Name,Ticks[ArraySize(Ticks)-1].time_msc-60*1000,LONG_MAX) = 25
CopyTicks(Name,LastTick,COPY_TICKS_ALL,0,1) = 1
                 [time]   [bid]   [ask] [last] [volume]    [time_msc] [flags] [volume_real]
[0] 2019.06.11 22:37:42 1.13284 1.13288 0.0000        0 1560292662809       6       0.00000
CopyRates(Name,PERIOD_M1,0,1,LastBar) = 1
                 [time]  [open]  [high]   [low] [close] [tick_volume] [spread] [real_volume]
[0] 2019.06.11 22:36:00 1.13278 1.13284 1.13278 1.13279            13        3             0
 

Bug 19.

Calcolo errato dello spread.

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

void OnStart()
{
  MathSrand((uint)TimeLocal());
  const string Name = _Symbol + (string)MathRand();
  
  PRINT(CustomSymbolCreate(Name, NULL, _Symbol)); // Создали символ.
  PRINT(SymbolSelect(Name, true)); // Поместили в Обзор рынка
  
  MqlTick Tick[1];
  
  if (SymbolInfoTick(_Symbol, Tick[0])) 
  {
    // Специально задаем отрицательный спред.
    Tick[0].bid = 1.11643;
    Tick[0].ask = 1.11632;        
    
    PRINT(CustomTicksAdd(Name, Tick)); // Пробросили тик.
    PRINT(SymbolInfoInteger(Name, SYMBOL_SPREAD)); // Смотрим его спред.
    
    ArrayPrint(Tick); // Смотрим сам тик.
  }
}


Risultato

CustomSymbolCreate(Name,NULL,_Symbol) = true
SymbolSelect(Name,true) = true
CustomTicksAdd(Name,Tick) = 1
SymbolInfoInteger(Name,SYMBOL_SPREAD) = -10
                 [time]   [bid]   [ask] [last] [volume]    [time_msc] [flags] [volume_real]
[0] 2019.06.03 00:32:11 1.11643 1.11632 0.0000        0 1559521931040       6       0.00000
 

Bug 20. rimosso dai bug. Soluzione trovata nel ramo qui sotto.

2085
Impostazione errata delle proprietà dei simboli personalizzati.
Si osserva uno spostamento del risultato.
Le proprietà sono state impostate secondo una delle opzioni

CustomSymbolSetInteger(SName, SYMBOL_FILLING_MODE, ORDER_FILLING_FOK);     Результат: Filling == None
или
CustomSymbolSetInteger(SName, SYMBOL_FILLING_MODE, ORDER_FILLING_IOC);     Результат: Filling == Fill or Kill
или
CustomSymbolSetInteger(SName, SYMBOL_FILLING_MODE, ORDER_FILLING_RETURN);  Результат: Filling == Immediate or Cancel