Símbolos personalizados. Errores, fallos, preguntas, sugerencias. - página 13

 
fxsaber:

Además, si son las 00:00:01, no puede utilizar CustomTicksAdd para remodelar una barra de hace dos segundos.

Por supuesto que no puedes. Porque el tick que llegó a las 00:00:01 ya debería formar la siguiente barra. En una situación normal.

 
Slava:

Para el probador, el tick de anteayer es el tick fresco de hoy.

Ya veo lo que quieres decir. Sus ejercicios con tics personalizados de hace seis meses son de una naturaleza claramente probadora. Su situación no es normal (en el sentido de la práctica común)

En cuanto al uso no estándar de las personalizadas. Para eso está la discusión, para identificar las peculiaridades de las distintas situaciones y tratar de resolverlas.

 
Slava:

Por supuesto, esto no funcionará. Porque un tick que llega a las 00:00:01 ya debería formar la siguiente barra. En una situación normal.

Imagina un Servicio que temporice los ticks en un segundo (quizás menos, como suele hacer en los de fórmula - 100ms). Luego, a medianoche, las barras suelen perder los últimos ticks del día.

 

Bug 16.

Las barras M1 están ahí, pero los otros marcos temporales no se muestran.


Cómo reproducirlo irónicamente, no lo sé.
 
fxsaber:

Bug 16.

Las barras M1 están ahí, pero los otros marcos temporales no se muestran.


No sé cómo reproducirlo.
¿No son esas barras las que tienen segundos no nulos?
 
Slava:
¿No son esas las barras que tienen tiempo con segundos no nulos?

Hay ticks reales con el EURUSD y las barras son normales (múltiplos de un minuto).

El problema era estable en cualquier periodo que no fuera M1. Por eso el vídeo se grabó sin problemas.


Pero después de algún tiempo el problema dejó de sonar. El símbolo fue creado por el Asesor Experto de esta rama.

 

Bug 17.

La historia de las garrapatas desaparece por completo.

#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)); // Убедились, что тиков стало меньше на удаленное количество
}


Resultado

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


Si se elimina el comentario de la línea subrayada, el script funciona correctamente. Al parecer, los antiguos tipos de adición no van donde van los tipos de sustitución.

 

Bug 18.

Cuando se eliminan los ticks, se pierde la última barra.

#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);
}


Resultado

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.

Cálculo incorrecto del diferencial.

#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); // Смотрим сам тик.
  }
}


Resultado

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. eliminado de los bichos. La solución se encuentra en la rama de abajo.

2085
Configuración incorrecta de las propiedades de los símbolos personalizados.
Se observa un cambio en el resultado.
Las propiedades se fijaron según una de las opciones

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