Símbolos personalizados. Erros, bugs, perguntas, sugestões.

 
Como o tema é bastante amplo, achei que seria uma boa idéia ter uma discussão separada sobre ele.
 

Bug 01.

A tabela de caracteres personalizada está aberta. Se, por exemplo, você apagar manualmente todas as barras e o histórico de tick, a janela do gráfico simplesmente fica pendurada - sem atualização.

Comportamento esperado como com um símbolo de costume vazio.

 

Bug 02.

Você precisa apagar a última semana das citações dos símbolos personalizados. Você pode apagá-lo, mas mesmo o ChartRedraw não dá nenhum efeito visual.

Somente se você rolar a tabela com o mouse, ela volta ao normal. Você poderia consertar a visualização por ChartRedraw?


ZZY Fazendo um overdraw semelhante por enquanto

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

Bug 03.

TicksAdd tem a seguinte proteção. Se um carrapato é anterior àquele da Market Watch, ele é ignorado.


Infelizmente, este mecanismo não interage com TicksDelete e TicksReplace.

Você precisa apagar o último dia do histórico do símbolo personalizado e colocar o último tique após a exclusão no Market Watch.

Se a exclusão estiver OK, então a exposição do último tique não funcionará, devido à regra que descrevi acima.


Sugiro ou mudar a regra TicksAdd, ou que TicksDelete/TicksReplace substitua o tick no Market Watch pelo último tick da história, se seu tempo for menor que o tempo atual.


Problema de repetição

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


Entendo que, sem o código fonte, a mensagem de erro permanecerá em palavras. Como foi chato descrever, mas provavelmente é a maneira mais eficaz de mostrar, encontrar e consertar o bug.

 

Só comecei ontem a classificar os sintéticos, há alguns disparates no testador. Os sintéticos com fórmulas funcionam no testador?

Criou uma fórmula sintética, a partir da ajuda. Isso é correto?

1

Isto é o que o teste mostrou.

2

Isto é um absurdo - todos os negócios são lucrativos, o que não pode ser nem mesmo de acordo com a imagem; todos eles são fechados no final do teste e o lucro é zero. Eu devo estar fazendo algo errado. O que mais devo verificar? Estou anexando o diário de bordo.

Arquivos anexados:
20190224.log  9322 kb
 
Alexey Volchanskiy:

Eu devo estar fazendo algo errado. O que mais eu deveria olhar?

Na captura de tela você pode ver que a moeda de lucro do símbolo não é a mesma que a moeda da conta. Portanto, a conversão dá zero.

Para que funcione "fora da caixa", nomeá-lo como "EURUSD_ALEX1".

 
Você pode me dizer em quais pastas os símbolos personalizados e suas configurações são armazenados? Não consigo encontrá-lo no terminal ou no software.
 
pivomoe:
Você pode me dizer em quais pastas os símbolos personalizados e suas configurações são armazenados? A eliminação no terminal e no software não ajuda.

\MetaTrader5Bases Personalizadas

 

Bug 04.

Outro bug com replay específico

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


Bug contido no CopyTicksRange - muda o histórico do tick! Observe que, para reproduzi-lo, é preciso mudar o nome do símbolo personalizado no roteiro o tempo todo. E isto apesar do fato de que o roteiro o apaga com sucesso. Acontece que a eliminação de um símbolo não é de forma alguma uma eliminação.

 
fxsaber:

Na captura de tela você pode ver que a moeda de lucro do símbolo não é a mesma que a moeda da conta. Portanto, a conversão dá zero.

Para que funcione "fora da caixa", nomeá-lo como "EURUSD_ALEX1".

Obrigado, esse era o objetivo. Eu o nomeei como está em minha conta e ele funciona. Outra pergunta. O que acontece durante a negociação real? As ordens sintéticas são traduzidas em ordens e posições em pares reais, neste caso (veja uma fórmula) EURUSD e USDCAD?

Onde posso vê-lo, o registro do testador mostra apenas o sintético.

й

 
Ossímbolos personalizados no real são apenas para informação, não para negociação. Eles só podem ser negociados no testador.