Símbolos personalizados. Errores, fallos, preguntas, sugerencias.

Artyom Trishkin  
Como el tema es bastante amplio, he pensado que sería una buena idea tener un debate separado sobre él.
fxsaber  

Bug 02.

Es necesario eliminar la última semana de las cotizaciones de los símbolos personalizados. Se puede eliminar, pero incluso ChartRedraw no da ningún efecto visual.

Sólo si se desplaza el gráfico con el ratón, vuelve a la normalidad. ¿Podría arreglar la visualización por ChartRedraw?


ZZY Haciendo un sobregiro similar por ahora

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

Bug 03.

TicksAdd tiene la siguiente protección. Si un tick es anterior al de la Vigilancia del Mercado, se ignora.


Lamentablemente, este mecanismo no interactúa con TicksDelete y TicksReplace.

Tiene que eliminar el último día del historial del símbolo personalizado y poner el último tick después de la eliminación en Market Watch.

Si el borrado está bien, entonces exponer el último tick no funcionará, debido a la regla que he descrito anteriormente.


Sugiero que se cambie la regla TicksAdd, o que TicksDelete/TicksReplace sustituya el tick en Market Watch por el último tick del historial si su tiempo es menor que el actual.


Problema de repetición

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


Resultado

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


Entiendo que sin el código fuente el mensaje de error se quedará en palabras. Qué aburrido fue describirlo, pero es probablemente la forma más efectiva de mostrar, encontrar y arreglar el error.

Alexey Volchanskiy  

Ayer empecé a clasificar los sintéticos, hay algunas tonterías en el probador. ¿Funcionan los sintéticos con fórmulas en el probador?

Creó una fórmula sintética, a partir de la ayuda. ¿Es eso correcto?

1

Esto es lo que mostró la prueba.

2

Esto no tiene sentido: todas las operaciones son rentables, lo que no puede ser ni siquiera según la imagen; todas se cierran al final de la prueba y el beneficio es cero. Debo estar haciendo algo mal. ¿Qué más debo comprobar? Adjunto el registro.

Archivos adjuntos:
20190224.log  9322 kb
pivomoe  
¿Puede decirme en qué carpetas se almacenan los símbolos personalizados y sus ajustes? No lo encuentro ni en el terminal ni en el software.
Aidas Geguzis  
pivomoe:
¿Puede decirme en qué carpetas se almacenan los símbolos personalizados y sus ajustes? Borrar en el terminal y el software no ayuda.

\MetaTrader5\Bases\Custom\Nde

fxsaber  

Bug 04.

Otro error con la repetición específica

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


Resultado

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


Error contenido en CopyTicksRange - ¡cambia el historial de ticks! Tenga en cuenta que para reproducirlo, tiene que cambiar el nombre del símbolo personalizado en el script todo el tiempo. Y esto a pesar de que el script lo elimina con éxito. Resulta que borrar un símbolo no es borrarlo del todo.

Alexey Volchanskiy  
fxsaber:

En la captura de pantalla se puede ver que la moneda de las ganancias del símbolo no es la misma que la moneda de la cuenta. Por lo tanto, la conversión da cero.

Para que funcione "out of the box", nómbralo como "EURUSD_ALEX1".

Gracias, ese era el objetivo. Le puse el nombre que tiene en mi cuenta y funciona. Otra pregunta. ¿Qué sucede durante la negociación real? ¿Las órdenes sintéticas se traducen en órdenes y posiciones en los pares reales, en este caso (véase una fórmula) EURUSD y USDCAD?

Dónde puedo verlo, el registro del probador sólo muestra el sintético.

й

Razón de la queja: