Símbolos personalizados. Erros, bugs, perguntas, sugestões. - página 18

 

Bug 24.

Os bancos de dados de carrapatos sondados e importados não coexistem corretamente.

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

void OnInit()
{
  MathSrand((int)TimeLocal());
  EventSetMillisecondTimer(20); // С такой частотой будем пробрасывать тики
}

void OnTimer()
{
  static bool FirstRun = true;
  static const string Name = _Symbol + (string)MathRand();
    
  static MqlTick Ticks[];
  static int Pos = 0;
    
  if (FirstRun)
  {    
    if (CustomSymbolCreate(Name, NULL, _Symbol) && SymbolSelect(Name, true)) // Создали символ
      PRINT(CopyTicks(_Symbol, Ticks, COPY_TICKS_ALL, (ulong)D'2019.06.20' * 1000, 5)); // Взяли 5 тиков для проброса
      
    FirstRun = false;
  }
  else if (Pos < ArraySize(Ticks))
  {
    MqlTick Tick[1];
    
    Tick[0] = Ticks[Pos++];
    
    PRINT(CustomTicksAdd(Name, Tick)); // Пробросили тик.
    PRINT(CustomTicksReplace(Name, Tick[0].time_msc, Tick[0].time_msc, Tick)); // Заменили его же через импорт.
  }
  else
  {
    PRINT(CopyTicksRange(Name, Ticks)); // Взяли всю тиковую историю
    ArrayPrint(Ticks);                  // Распечатали ее.
    
    ExpertRemove();
  }
}


Resultado

CopyTicks(_Symbol,Ticks,COPY_TICKS_ALL,(ulong)D'2019.06.20'*1000,5) = 5
CustomTicksAdd(Name,Tick) = 1
CustomTicksReplace(Name,Tick[0].time_msc,Tick[0].time_msc,Tick) = 1
CustomTicksAdd(Name,Tick) = 1
CustomTicksReplace(Name,Tick[0].time_msc,Tick[0].time_msc,Tick) = 1
CustomTicksAdd(Name,Tick) = 1
CustomTicksReplace(Name,Tick[0].time_msc,Tick[0].time_msc,Tick) = 1
CustomTicksAdd(Name,Tick) = 1
CustomTicksReplace(Name,Tick[0].time_msc,Tick[0].time_msc,Tick) = 1
CustomTicksAdd(Name,Tick) = 1
CustomTicksReplace(Name,Tick[0].time_msc,Tick[0].time_msc,Tick) = 1
CopyTicksRange(Name,Ticks) = 10
                 [time]   [bid]   [ask] [last] [volume]    [time_msc] [flags] [volume_real]
[0] 2019.06.20 00:00:05 1.12255 1.12268 0.0000        0 1560988805004       6       0.00000
[1] 2019.06.20 00:00:07 1.12259 1.12268 0.0000        0 1560988807693       2       0.00000
[2] 2019.06.20 00:00:08 1.12259 1.12267 0.0000        0 1560988808627       4       0.00000
[3] 2019.06.20 00:00:09 1.12256 1.12267 0.0000        0 1560988809561       2       0.00000
[4] 2019.06.20 00:00:10 1.12255 1.12268 0.0000        0 1560988810083       6       0.00000
[5] 2019.06.20 00:00:05 1.12255 1.12268 0.0000        0 1560988805004       6       0.00000
[6] 2019.06.20 00:00:07 1.12259 1.12268 0.0000        0 1560988807693       6       0.00000
[7] 2019.06.20 00:00:08 1.12259 1.12267 0.0000        0 1560988808627       6       0.00000
[8] 2019.06.20 00:00:09 1.12256 1.12267 0.0000        0 1560988809561       6       0.00000
[9] 2019.06.20 00:00:10 1.12255 1.12268 0.0000        0 1560988810083       6       0.00000


Cinco carrapatos foram resamplificados/importados sucessivamente, mas 10 carrapatos são encontrados na história. Ao mesmo tempo, cinco carrapatos vão primeiro, e depois os mesmos cinco carrapatos. Isto é, mesmo o tempo de entrada no banco de dados de carrapatos não é consecutivo.

Preste atenção às bandeiras da segunda metade das carrapatas, elas são diferentes da primeira.

 
Slava:

Não reproduzível. O gráfico vazio é atualizado imediatamente após a importação das barras.

O que acontece se a tabela não for aberta? Gráfico aberto após a importação de barras.

Ou fechar e abrir a tabela.

Ou atualizar o gráfico a partir do menu de contexto do gráfico.

Pergunta principal ))))

Eu importei barras e fechei todas as janelas.

Em seguida, reabriu os símbolos e foi para a aba Bars, selecionou lá meu símbolo.

As barras deveriam estar aparecendo? Está em branco.

Quando pressionei o botão Load (com pré-seleção do período de cobertura), eles também não aparecem.

Eu tentei a versão 1970 - a mesma situação.

Abrir/fechar a tabela e o programa não ajuda.

Ainda não cheguei à programação.

Bem, deve ser assim...


Se você tiver uma possibilidade, conecte-se remotamente e veja o que ela precisa, por favor.

 

https://www.mql5.com/ru/forum/147666/page2#comment_3720399

Pode ajudar alguém.
Mas eu tinha um problema diferente
1. além do arquivo 2019.hcc, foi gerado o arquivo 1970.hcc
Depois de apagado, parecia ter voltado à vida.
2. Havia linhas vermelhas onde o ou h estava fora de l h

não está claro de onde veio 1970.
não existiam tais datas, não havia linhas vazias
talvez um monte de velas, menos de 50k

é possível olhar, mas como ampliar a amplitude do gráfico mais visível?
Preciso apontar com precisão as extremidades do castiçal ao desenhar objetos
não é conveniente inserir as propriedades e definir os valores manualmente
ele desloca o gráfico para o final e eu tenho que rebobiná-lo
como consertá-lo para que não salte para a última barra?

Тестер не работает
Тестер не работает
  • 2013.11.04
  • www.mql5.com
2013.11.03 17:25:58 TestGenerator: no history data 'EURUSD1' Вот такое сообщение появляется в журнале после нажатия кнопки "Старт"...
 

Fórum sobre comércio, sistemas automatizados de comércio e testes de estratégia comercial

Bichos, insetos, perguntas

Stanislav Korotky, 2019.08.22 17:34

Alguém já encontrou o seguinte problema com caracteres personalizados? A função CustomRatesUpdate passa as citações normais, mas na verdade o gráfico e a janela de dados recebem algo estranho (neste caso, em valores próximos e baixos são 100 vezes menos do que passados):

Além disso, em paralelo, os tiques simples são emulados com CustomTicksAdd com os mesmos valores fechados de preço que no log (imediatamente antes de CustomRatesUpdate), ou seja, não está claro de onde vêm os valores reduzidos nas cotações.

UPD:

Tenho situação "inversa" no USDCAD - as citações aumentam 10 vezes depois de escritas. Este é o registro que estou recebendo:

2019.08.23 00:04:10.579 RenkoCharts (USDCAD,M1)                  [time]  [open]  [high]   [low] [close] [tick_volume] [spread] [real_volume]
2019.08.23 00:04:10.579 RenkoCharts (USDCAD,M1) [0] 2019.08.23 00:02:00 1.32987 1.32987 1.32980 1.32987           457       48             0
2019.08.23 00:04:10.579 RenkoCharts (USDCAD,M1) Retry: 1 0
2019.08.23 00:04:10.579 RenkoCharts (USDCAD,M1)                  [time]  [open]   [high]   [low]  [close] [tick_volume] [spread] [real_volume]
2019.08.23 00:04:10.579 RenkoCharts (USDCAD,M1) [0] 2019.08.23 00:02:00 1.32980 13.29730 1.32980 13.29730           457       52             0

A primeira ArrayPrint é o que foi escrito em CustomRatesUpdate, e a segunda ArrayPrint é o que foi lido usando CopyRates do último bar imediatamente após a escrita. Primeiro, a diferença é o último dígito em aberto, mas o mais importante, alto e fechado são aumentados por um fator de 10.

PS. Em carrapatos tudo está bem:

 

Stanislav Korotky:

PS. Tudo está bem nos carrapatos:

Bug 22.

 
fxsaber:

Bug 22.

Foi corrigido em alguma das últimas construções?

 

O que é o erro 4022? Algo a ver com a tentativa de escrever uma barra para um personagem personalizado. Mas, a julgar pelo código, é um código genérico.

No início, foi isto:

KI      0       16:24:20.957    RenkoCharts (XAUUSD,M1) Alert: Error on writing custom record: 3082, err: 4401
HS      0       16:24:20.957    RenkoCharts (XAUUSD,M1) Failed to add:
LE      0       16:24:20.957    RenkoCharts (XAUUSD,M1)                  [time]   [open]   [high]    [low]  [close] [tick_volume] [spread] [real_volume]
KG      0       16:24:20.957    RenkoCharts (XAUUSD,M1) [0] 2019.08.28 00:06:00 1542.500 1542.500 1542.400 1542.400            15      170             0
GF      0       16:24:20.957    RenkoCharts (XAUUSD,M1) Last known 10 M1:
JN      0       16:24:20.973    RenkoCharts (XAUUSD,M1)                  [time]   [open]   [high]    [low]  [close]       [tick_volume] [spread]       [real_volume]
JJ      0       16:24:20.973    RenkoCharts (XAUUSD,M1) [0] 2019.08.28 00:00:00 1543.100 1543.100 1543.000 1543.000                   4      180                   0
DE      0       16:24:20.973    RenkoCharts (XAUUSD,M1) [1] 2019.08.28 00:01:00 1543.000 1543.000 1542.900 1542.900                   2      180                   0
EP      0       16:24:20.973    RenkoCharts (XAUUSD,M1) [2] 2019.08.28 00:02:00 1542.900 1542.900 1542.800 1542.800                   1      180                   0
ES      0       16:24:20.973    RenkoCharts (XAUUSD,M1) [3] 2019.08.28 00:03:00 1542.800 1542.800 1542.700 1542.700                   1      180                   0
EN      0       16:24:20.973    RenkoCharts (XAUUSD,M1) [4] 2019.08.28 00:04:00 1542.700 1542.700 1542.600 1542.600                   1      180                   0
QH      0       16:24:20.973    RenkoCharts (XAUUSD,M1) [5] 2019.08.28 00:05:00 1542.600 1542.700 1542.500 1542.500                  30      170                   0
RE      0       16:24:20.973    RenkoCharts (XAUUSD,M1) [6] 1970.01.01 00:00:00   +0.000   +0.000   +0.000   +0.000          5365435195        1 1827299883397152768
FF      0       16:24:20.973    RenkoCharts (XAUUSD,M1) [7] 2106.02.07 06:28:16    0.078   +0.000   +0.000   +0.000 4597373804417646592        1                9481
KR      0       16:24:20.973    RenkoCharts (XAUUSD,M1) [8] 1970.01.01 00:00:00   +0.000   +0.000   +0.000   +0.000           136454688        1 1827300776750350336
KL      0       16:24:20.973    RenkoCharts (XAUUSD,M1) [9] 0000.00.00 00:00:00   +0.000    2.150   +0.000   +0.000 1287860306076237824        0          4294967300
CH      0       16:24:20.973    RenkoCharts (XAUUSD,M1) Timeout before retry...

4401 ao chamarCustomRatesUpdate. Em seguida, uma leitura das últimas 10 barras para símbolo personalizado com CopyRates (podemos ver alguns disparates na base). Em seguida, através de interrupções de tempo, várias tentativas de escrever uma barra novamente, até que 4022 surja. E, em seguida, o término anormal da EA, após o que ela se reiniciou.

 

A questão é esta.

Preciso alterar dinamicamente os níveis de parada e congelamento em um símbolo personalizado.

Há o seguinte código para o teste EA:

//+------------------------------------------------------------------+
//| Globals                                                          |
//+------------------------------------------------------------------+
string symbol_name="EURUSD_1";
string symbol_path="";
string symbol_origin="EURUSD";
long stop_lvl=20;
long freeze_lvl=30;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- 1) create
   if(!::SymbolInfoInteger(symbol_name,SYMBOL_CUSTOM))
     {
      ResetLastError();
      if(!::CustomSymbolCreate(symbol_name,symbol_path,symbol_origin))
        {
         PrintFormat("Error code: %d",GetLastError());
         return INIT_FAILED;
        }
     }
//--- 2) set levels
   ResetLastError();
   if(!::CustomSymbolSetInteger(symbol_name,SYMBOL_TRADE_STOPS_LEVEL,stop_lvl))
     {
      PrintFormat("Error code: %d",GetLastError());
      return INIT_FAILED;
     }
   if(!::CustomSymbolSetInteger(symbol_name,SYMBOL_TRADE_FREEZE_LEVEL,freeze_lvl))
     {
      PrintFormat("Error code: %d",GetLastError());
      return INIT_FAILED;
     }
//---
   return INIT_SUCCEEDED;
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- 1) stop level
   stop_lvl=::SymbolInfoInteger(symbol_name,SYMBOL_TRADE_STOPS_LEVEL);
   if(stop_lvl==20)
      stop_lvl=30;
   else
      stop_lvl=20;
   ResetLastError();
   if(::CustomSymbolSetInteger(symbol_name,SYMBOL_TRADE_STOPS_LEVEL,stop_lvl))
     {
      PrintFormat("Error code while setting a new value for the stop level: %d",
                  GetLastError());
      return;
     }
//--- 2) freeze level
   freeze_lvl=::SymbolInfoInteger(symbol_name,SYMBOL_TRADE_FREEZE_LEVEL);
   if(freeze_lvl==30)
      freeze_lvl=40;
   else
      freeze_lvl=30;
   if(::CustomSymbolSetInteger(symbol_name,SYMBOL_TRADE_FREEZE_LEVEL,freeze_lvl))
     {
      PrintFormat("Error code while setting a new value for the freeze level: %d",
                  GetLastError());
      return;
     }
  }
//+------------------------------------------------------------------+

No modo normal de depuração, recebo um erro somente no corpo do manipulador OnTick(). O erro tem o código 0.

2019.09.09 23:25:05.010 TestingLevels (EURUSD,M1)       Error code while setting a new value for the stop level: 0


No modo de depuração no histórico, recebo um erro durante a inicialização. O erro é assim:

2019.09.09 23:29:43.005 2019.09.02 00:00:00   Error code: 4014

Isto é, há uma proibição de chamar a função do sistema.

ERR_FUNCTION_NOT_ALLOWED

4014

A função do sistema não pode ser chamada


Em geral, é possível alterar os valores de nível de parada e de nível livre enquanto a EA está funcionando com um símbolo personalizado?

 
Denis Kirichenko:

A questão é esta.

Preciso alterar dinamicamente os níveis de parada e congelamento em um símbolo personalizado.

Há o seguinte código para o teste EA:

No modo normal de depuração, recebo um erro somente no corpo do manipulador OnTick(). O erro tem o código 0.


No modo de depuração no histórico, recebo um erro durante a inicialização. O erro é assim:

Isto é, há uma proibição de chamar a função do sistema.

ERR_FUNCTION_NOT_ALLOWED

4014

A função do sistema não pode ser chamada


Em geral, é possível alterar os valores de stop lev e congelar lev, já que a EA está funcionando com um símbolo personalizado?

E por que nas linhas OnTick()

if(::CustomSymbolSetInteger(symbol_name,SYMBOL_TRADE_STOPS_LEVEL,stop_lvl))

и

if(::CustomSymbolSetInteger(symbol_name,SYMBOL_TRADE_FREEZE_LEVEL,freeze_lvl))

entrar no corpo do bloco de tratamento de erros sobre a mudança bem sucedida de propriedade de caráter? (sem sinal "!")

 
Artyom Trishkin:

Por que fazer as linhas em OnTick()

и

entrar no corpo do bloco de tratamento de erros sobre a mudança bem sucedida de propriedade de caráter? (sem sinal "!").

Artyom, obrigado! Minha supervisão.

Versão atualizada:

//+------------------------------------------------------------------+
//| Globals                                                          |
//+------------------------------------------------------------------+
string symbol_name="EURUSD_1";
string symbol_path="";
string symbol_origin="EURUSD";
long stop_lvl=20;
long freeze_lvl=30;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- 1) create
   if(!::SymbolInfoInteger(symbol_name,SYMBOL_CUSTOM))
     {
      ResetLastError();
      if(!::CustomSymbolCreate(symbol_name,symbol_path,symbol_origin))
        {
         PrintFormat("Error code: %d",GetLastError());
         return INIT_FAILED;
        }
     }
//--- 2) set levels
   ResetLastError();
   if(!::CustomSymbolSetInteger(symbol_name,SYMBOL_TRADE_STOPS_LEVEL,stop_lvl))
     {
      PrintFormat("Error code: %d",GetLastError());
      return INIT_FAILED;
     }
   if(!::CustomSymbolSetInteger(symbol_name,SYMBOL_TRADE_FREEZE_LEVEL,freeze_lvl))
     {
      PrintFormat("Error code: %d",GetLastError());
      return INIT_FAILED;
     }
//---
   return INIT_SUCCEEDED;
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- 1) stop level
   stop_lvl=::SymbolInfoInteger(symbol_name,SYMBOL_TRADE_STOPS_LEVEL);
   if(stop_lvl==20)
      stop_lvl=30;
   else
      stop_lvl=20;
   ResetLastError();
   if(!::CustomSymbolSetInteger(symbol_name,SYMBOL_TRADE_STOPS_LEVEL,stop_lvl))
     {
      PrintFormat("Error code while setting a new value for the stop level: %d",
                  GetLastError());
      return;
     }
//--- 2) freeze level
   freeze_lvl=::SymbolInfoInteger(symbol_name,SYMBOL_TRADE_FREEZE_LEVEL);
   if(freeze_lvl==30)
      freeze_lvl=40;
   else
      freeze_lvl=30;
   if(!::CustomSymbolSetInteger(symbol_name,SYMBOL_TRADE_FREEZE_LEVEL,freeze_lvl))
     {
      PrintFormat("Error code while setting a new value for the freeze level: %d",
                  GetLastError());
      return;
     }
  }
//+------------------------------------------------------------------+

Tudo agora funciona no modo normal de depuração. Mas não no Testador. Continua escrevendo lá:

2019.09.10 07:16:49.867 2019.09.03 00:00:00   Error code: 4014