Arquivo da versão MT.

 

Caros amigos, eu proponho criar aqui um arquivo de versões MT. Às vezes com atualizações podem ocorrer erros inesperados e você tem que voltar para uma versão anterior...

Preciso construir 2007 agora. Você o tem? Compartilhe, por favor.

 
Сергей Таболин:

Caros amigos, eu proponho criar aqui um arquivo de versões MT. Às vezes com atualizações podem ocorrer erros inesperados e você tem que voltar para uma versão anterior...

Preciso construir 2007 agora. Você o tem? Compartilhe, por favor.

Há um homem aqui que está construindo uma coleção. Mas, até onde me lembro, seus posts com links para os arquivos da versão MT são às vezes apagados para que o progresso não seja retardado. ))

 


minha ligação foi morta aqui,

os desenvolvedores sugerem o download somente de fontes verificadas

se você quiser arriscar minha construção, basta me deixar cair uma linha.

você deve continuar trabalhando de forma estável no portal ou arquivo e atualizar conscientemente para as construções de teste

você deve estar muito consciente da atualização para as últimas construções.

 
Fast235:

minha ligação foi morta aqui,

os desenvolvedores sugerem o download somente de fontes verificadas

se você quiser arriscar minha construção, basta me deixar cair uma linha.

você deve continuar trabalhando de forma estável no portal ou arquivo e atualizar conscientemente para as construções de teste

você deve manter o trabalho estável no portátil ou no arquivo e, em geral, estar atento às atualizações para os testes de construção

Eles estão certos ao remover versões antigas.

Você tem que escrever programas normais. Não ignore as advertências. Inicializar as variáveis e não usar as globais tanto quanto possível. Evite fragmentos potencialmente perigosos em código.

Tenho dezenas de milhares de linhas de código - nem um único aviso em modo estrito. Metade dos meus projetos de base de código têm avisos mesmo sem o uso de códigos rígidos, embora não contenham sequer milhares de linhas. E então você começa a reclamar que "tudo funcionou na velha construção e parou de funcionar na nova"...

 
Georgiy Merts:

Eles estão certos ao remover versões antigas.

Você precisa escrever os programas corretamente. Não ignore as advertências. Inicializar as variáveis e não utilizar tanto quanto possível as globais. Evite fragmentos potencialmente inseguros em código.

Não tenho um único avisoem dezenas de milhares de linhas de código em modo estrito. Metade dos meus projetos de base de código relatam avisos mesmo sem o uso de códigos rígidos, embora eles não contenham nem mesmo mil cordas. E então você começa a reclamar que "tudo funcionou na velha construção e deixou de funcionar na nova"...

Este é o programa Mars Rover? O que você pode descrever em tantas linhas???

 
Sergey Basov:

Há aqui uma pessoa que está construindo uma coleção. Mas até onde me lembro, seus posts com links para os arquivos da MT-versão são às vezes apagados para não deixar o progresso abrandar. ))

Obrigado. Descarreguei-o.

Fast235:

o link matou meu link aqui,

Os desenvolvedores sugerem o download somente de fontes verificadas.

Se você quiser arriscar minha construção, basta me deixar cair uma linha.

você deve continuar trabalhando de forma estável no portal ou arquivo e atualizar conscientemente para as construções de teste

Estou em DC agora com a construção de 2007, talvez.

Não estou atualizando sobre as construções de teste. Mas agora eu vou salvar)))).

Georgiy Merts:

Eles estão certos ao remover versões antigas.

Você tem que escrever os programas corretamente. Não ignore as advertências. Inicializar as variáveis e não usar as globais tanto quanto possível. Evite fragmentos potencialmente inseguros em código.

Tenho dezenas de milhares de linhas de código e nem um único aviso sobre o modo restrito. Metade dos meus manequins de base de código mostram avisos mesmo sem o uso de estritos, embora não contenham sequer mil cordas. E então você começa a reclamar que "tudo funcionou na velha construção e parou de funcionar na nova"...

George, leia meu último post no tópico. Eu encontrei a origem do problema. Não está em meu código.

 
Сергей Таболин:

Obrigado. Descarregado.

Eu não atualizo para testar. Mas agora eu vou salvar)))).

George, leia meu último post no tópico. Encontrei a origem do problema. Não está em meu código.

Eu o li.

A fonte do problema é que os desenvolvedores e você abordaram a situação de forma ligeiramente diferente. Grosseiramente falando, eles "não se entendiam". E é por isso que insisto que o código deve ser sempre muito simples e claro, excluindo quaisquer lugares onde possa haver ambigüidades.

Lembro-me, nos tempos em que o MT5 estava apenas quebrando seu caminho - fiquei surpreso, as pessoas usavam variáveis sem inicialização, pensando que elas conteriam zero.

Não se pode deixar de relembrar uma piada:

Pinóquio deu ao Pinóquio três maçãs. Ele comeu dois. Quantas maçãs restam?

Programador N1:
- Você não sabe quantos. Ninguém sabe quantas maçãs ele tinha antes!

Moral: limpar as variáveis iniciais.


Programador N2
- Não está claro quantos são. Talvez enquanto Malvina estava dando as maçãs, Pierrot também estava comendo-as ?

Moral: não utilizar variáveis globais.

Programador N3
- Desconhecido quantos são. Não diz que Pinóquio comeu exatamente maçãs, diz que ele comeu duas, mas não está claro o que ele comeu. Além disso, dado que o nome "Pinóquio" não é recusado - Pinóquio e Pinóquio são variáveis diferentes.


Moral: Cuidado com sua sintaxe

 
Сергей Таболин:

Obrigado. Descarregado.

Eu não atualizo para testar. Mas agora eu vou salvar)))).

George, leia meu último post no tópico. Encontrei a origem do problema. Não está em meu código.

E a fonte do problema foi "não leu a documentação", não a nova construção. Então você está sendo manhoso, dizendo que não é o seu código.

1:

Fórum sobre comércio, sistemas comerciais automatizados e estratégias comerciais de teste

Então, o que você quer fazer a seguir?

Sergey Tabolin, 2019.06.16 00:17

Encontrei a razão para este ultraje.

A questão é esta:

//--- пропустить бесполезные проходы оптимизации
//*
   if(!check_init && (MQLInfoInteger(MQL_OPTIMIZATION) || MQLInfoInteger(MQL_TESTER)))
   {
      if(period_HMA7C == 0 && move_profit)                                                            TesterStop();
      if(period_HMA7C == 0 && move_stop)                                                              TesterStop();
      if(period_HMA7C == 0 && shift_correction_HMA7C != 5)                                            TesterStop();
      if(indent_channel_line_a0 == 0.0 && indent_channel_line_a4 != 0.0)                              TesterStop();
      if(indent_channel_line_a4 == 0.0 && indent_channel_line_a0 != 0.0)                              TesterStop();
      if((stop_loss_buy > 0 && stop_loss_buy < 700) || (stop_loss_sell > 0 && stop_loss_sell < 700))  TesterStop();
      check_init = true;
   }
//*/

Acontece que depois de TesterStop(), OnTester() também é lançado no novo lançamento, embora não deva ser lançado.

Naturalmente, nenhum dado está sendo preparado e isso é o que obtemos.

É culpa do MT 2085.

2:

Fórum sobre comércio, sistemas automatizados de comércio e teste de estratégias comerciais

O que devo fazer a seguir?

Sergey Tabolin, 2019.06.16 09:02

Desculpas. A descrição diz apenas que OnTester() é chamado depois. (((

Também tenho que fazer verificações lá. Vou tentar substituí-lo por ExpertRemove().

E então eu vou "tentar" novamente. E então, se suas tentativas não forem bem sucedidas, então a culpa é da MQ novamente ?

Não consigo me lembrar, mas acho que existe uma função especial para pular os "maus" passes. E exatamente o que você quer tentar, os desenvolvedores não recomendaram usá-lo - novamente - se minha memória me serve corretamente.

Mas o que é importante na minha mensagem - antes de transferir a culpa para os desenvolvedores, você deve primeiro ler a documentação, pedir uma solução no fórum, e só então, e somente se o erro for realmente encontrado, escrever um relatório de erro com um código mínimo reproduzindo-o. Isso seria sério, mas caso contrário...

 
Artyom Trishkin:

E a fonte do problema foi "não leu a documentação", não a nova construção. Então você está mentindo sobre o código não ser seu.

1:

2:

E então você vai "tentar" novamente... E então se suas tentativas não forem bem sucedidas, então a culpa é da MQ novamente ?

Não consigo me lembrar, mas acho que há uma função especial para saltar passes "ruins". E exatamente o que você quer tentar, os desenvolvedores não recomendaram o uso - novamente - se minha memória me serve corretamente.

Mas o que é importante em minha mensagem - antes de empurrar a culpa para os desenvolvedores, você deve primeiro ler a documentação, pedir uma solução no fórum, e só então, e só no caso de um bug realmente encontrado - escrever um relatório de bug com a reprodução do mesmo com o mínimo de código. Isso seria sério, mas caso contrário...

Artyom, o problema está na nova construção!

Diga-me, aqui você tem um código escrito que funciona sem erros. Funciona por um longo tempo. E de repente, após o novo lançamento do MT, ele cai com um monte de erros. De quem é a culpa? Ainda mais considerando que a documentação, como muitas pessoas sabem, nem sempre acompanha as inovações.

Portanto, meu código funcionou sem erros.

Eu usei isto:

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

O que substituir INIT_PARAMETERS_INCORRECT por ? Solução encontrada ))))

Sergey Tabolin, 2019.04.24 08:48

Encontrei a resposta à minha própria pergunta na linha:

Acabou sendo bastante simples. Basta mover a verificação de parâmetros inválidos de OnInit() para OnTick()

bool                 check_init              = false;                // флаг проверки входных параметров
..........
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
//--- пропустить бесполезные проходы оптимизации
//*
   if(!check_init && (MQLInfoInteger(MQL_OPTIMIZATION) || MQLInfoInteger(MQL_TESTER)))
   {
      if(period_HMA7C == 0 && move_profit)                                 ExpertRemove();
      if(period_HMA7C == 0 && move_stop)                                   ExpertRemove();
      if(period_HMA7C == 0 && shift_correction_HMA7C != 5)                 ExpertRemove();
      check_init = true;
   }
//*/ 
//+------------------------------------------------------------------+ 

Verificado! Funciona. A genética não falha ))))

Agora, depois de aparecerem os problemas, acrescentei mais algumas linhas:

bool                 check_init              = false;                // флаг проверки входных параметров
bool                 tester_stop             = true;                 // флаг проверки выхода по TesterStop
.............
void OnTick()
{
//--- пропустить бесполезные проходы оптимизации
//*
   if(!check_init && (MQLInfoInteger(MQL_OPTIMIZATION) || MQLInfoInteger(MQL_TESTER)))
   {
      if(period_HMA7C == 0 && move_profit)                                                            TesterStop();
      if(period_HMA7C == 0 && move_stop)                                                              TesterStop();
      if(period_HMA7C == 0 && shift_correction_HMA7C != 5)                                            TesterStop();
      if(indent_channel_line_a0 == 0.0 && indent_channel_line_a4 != 0.0)                              TesterStop();
      if(indent_channel_line_a4 == 0.0 && indent_channel_line_a0 != 0.0)                              TesterStop();
      if((stop_loss_buy > 0 && stop_loss_buy < 700) || (stop_loss_sell > 0 && stop_loss_sell < 700))
      {
         Print("Результат в OnTester() должен быть -99999999999.99");
         TesterStop();
      }
      check_init  = true;
      tester_stop = false;
   }
//*/
.........
}
Вызов TesterStop() считается нормальным завершением тестирования, и поэтому будет вызвана функция OnTester() 
с отдачей тестеру стратегий всей накопленной торговой статистики и значения критерия оптимизации.

Supõe-se, pelo raciocínio, que a transferência deve ser executada imediatamente, sem executar o resto do código. Certo?

E de fato o TesterStop() não pára o teste de forma alguma!

double OnTester()
{
   if(tester_stop) return(-99999999999.99);
   
   double   equity_dd_percent             = TesterStatistics(STAT_EQUITY_DDREL_PERCENT);
   if(equity_dd_percent > 0.0)
   {
      equity_dd_percent = 100.0 / equity_dd_percent;
   }
   else     equity_dd_percent    = 1.0;
   
   double   param                         = 0.0;
   double   profit                        = TesterStatistics(STAT_PROFIT);
   double   stability                     = 0.0;
   int      balance_arr_size              = ArraySize(balance_arr) - 1;
   int      alpha_size                    = balance_arr_size - 1;
   int      beta_size                     = alpha_size - 1;
   double   trade2time                    = ratioTrades2Time(TesterStatistics(STAT_TRADES));
   double   max_balance                   = balance_arr[0];
//+-------------------   
   if(balance_arr[balance_arr_size-1] - balance_arr[0] == 0.0) return(-99999999999.88);
//+-------------------   

Introduzi um parâmetro "inválido" e obtive este resultado:

LL      0       11:30:20.816    Core 1  2016.10.01 00:00:00   Советник получил MAGIC = 153128312914612747.
QN      0       11:30:20.816    Core 1  2016.10.03 00:00:00   Результат в OnTester() должен быть -99999999999.99
NJ      3       11:30:20.816    Core 1  TesterStop() called on 0% of testing interval
CD      0       11:30:20.816    Core 1  final balance 10000.00 USD
QF      0       11:30:20.816    Core 1  OnTester result -99999999999.88

Então isto é um bug! E isto é exatamente o bug do MQ.

Acredito que TesterStop() eExpertRemove() devem retornar verdadeiros se não puderem passar imediatamente o controle para OnTester(). Ela permitirá reagir de alguma forma, por exemplo, como esta:

bool                 tester_stop = false;                 // флаг проверки выхода по TesterStop
.......
void OnTick()
{
//--- пропустить бесполезные проходы оптимизации
   if(!check_init && (MQLInfoInteger(MQL_OPTIMIZATION) || MQLInfoInteger(MQL_TESTER)))
   {
      if(недопустимый параметр)          tester_stop = TesterStop();
........
}
double OnTester()
{
   if(tester_stop) return(-99999999999.99);

Neste caso, podemos obter exatamente o resultado que é logicamente esperado, em vez de dançar ao redor e prever todos os erros que teoricamente poderiam ocorrer como resultado da interrupção do teste.

 
Сергей Таболин:

Artyom, o problema está na nova construção!

Diga-me, aqui você tem um código escrito que funciona sem erros. Funciona por um longo tempo. E de repente, após o novo lançamento do MT, ele cai com um monte de erros. De quem é a culpa? Ainda mais considerando que a documentação, como muitas pessoas sabem, nem sempre acompanha as inovações.

Portanto, meu código funcionou sem erros.

Eu usei este aqui:

Agora, depois de alguns problemas, acrescentei mais algumas linhas:

A transferência deve ser feita, de forma inteligente, imediatamente, sem executar o resto do código. Certo?

Mas na verdade TesterStop() não pára o teste de forma alguma!

Introduzi um parâmetro "inválido" e obtive este resultado:

Então isto é um bug! E isto é exatamente o bug do MQ.

Acredito que TesterStop() eExpertRemove() devem retornar verdadeiros se não puderem passar imediatamente o controle para OnTester(). Neste caso, será possível reagir de alguma forma, por exemplo, desta forma:

Neste caso, será possível obter exatamente o resultado esperado logicamente, em vez de dançar ao redor e prever todos os erros que teoricamente poderiam ocorrer como resultado da interrupção do teste.

Todos os seus cálculos e testes não devem ser mostrados a mim, e não com uma certa quantidade de sarcasmo e irritação, mas seca e concisamente no fio"Erros, erros, erros, perguntas". A menos, é claro, que você queira ser ouvido e obter uma resposta.

ZS. E de preferência esqueça palavras como "bug", "falha", "dançar com pandeiro" e outros "códigos de merda" nos relatórios de bug - todas as pessoas, e você não está sem erros. E as declarações "psicóticas" não parecem muito sérias ou construtivas.

 
Artyom Trishkin:

Todos os seus cálculos e testes não devem ser mostrados a mim, e não com uma certa quantidade de sarcasmo e irritação, mas de forma seca e concisa no fio"bugs, bugs, perguntas". A menos, é claro, que você queira ser ouvido e obter uma resposta.

Sinto muito se você se sente assim. Há irritação, é claro, mas como poderia não haver quando os problemas surgem do nada? E o sarcasmo... - Estou mais intrigado com o que considero serem bloopers óbvios. ))

Quanto ao tema em questão, algo me parece que a pergunta poderia facilmente se "perder" ali. Então eu acho que um novo tópico com um problema específico é mais eficaz? Ou não é?

Em qualquer caso, você, como moderador, pode chamar a atenção dos desenvolvedores para alguns problemas, se você mesmo estiver convencido da existência deles ))))

Vou tentar acrescentar uma pergunta lá...

Razão: