Você está perdendo oportunidades de negociação:
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Registro
Login
Você concorda com a política do site e com os termos de uso
Se você não tem uma conta, por favor registre-se
Leia sobre como trabalhar com quadros.
Este é o código:
inNum=0;
{ // Ler os parâmetros de entrada otimizados correspondentes
Imprimir ("GLOC = ",GLOC);
Fórum sobre negociação, sistemas de negociação automatizados e teste de estratégias de negociação.
Bibliotecas: TesterCache
fxsaber, 2019.11.11 04:45 pm.
Você recebeu um arquivo opt em uma matriz de bytes. Em seguida, você precisa alimentá-lo no Cache.
Eu o corrigi como você disse:
string Sohran,Contr;
MTTESTER::GetSettings(Sohran); // As configurações iniciais atuais do robô são lidas para serem salvas temporariamente em Sohran.
prWrite = MTTESTER::SetSettings2(Odinar); // Define Odinar para as configurações do robô
prRead = MTTESTER::GetSettings(Contr); // Ler as configurações do robô que acabaram de ser definidas.
Print("prWriteSettings = ",prWrite," prReadSettings = ",prRead);
Print("SettingBeg OdinarContr ",Kol," PoseY = ",PoseY," Iteration ",IterNumber,"\n",Contr);
Run(Contr[0]); // Executa a otimização nos valores do parâmetro Y selecionado
int GLOC = MTTESTER::GetLastOptCache(Bytess); // Obtém o arquivo opt na matriz de bytes do Bytess
TESTERCACHE<ExpTradeSummary> Cache;
bool CL = Cache.Load(Bytess); // Alimenta a matriz de bytes do Bytess no Cache
ProfitNow = Cache[GetMaxProfitPos(Cache)].profit; // Lucro máximo
int NomProchodaMaxProfit = Cache[GetMaxProfitPos(Cache)].Pass; // Número da passagem com lucro máximo
int IndexMaxProfit = GetMaxProfitPos(Cache); // Índice da matriz com o valor do parâmetro https://www.mql5.com/ru/forum/318998/page2#comment_13846951
Cache.GetInputs(IndexMaxProfit,Paramas);
ParamMax = Paramas[0,1].double_value; // O valor do parâmetro no qual o lucro máximo foi obtido
Alert("CL=",CL," GLOC = ",GLOC," GLOC," ProfitNow =",ProfitNow," ParamMax=",ParamMax," Odinar ",Kol," PoseY = ",PoseY," PosEq = ",PosEq," TypPar = ",TypPar," Iteration ",IterNumber);
Retorno;
O resultado ainda está errado.
Por algum motivo, os dados ProfitNow e ParamMax de alguma execução anterior são lidos do cache.
Atenciosamente, Alexander
Por alguma razão, os dados ProfitNow e ParamMax de alguma execução anterior são lidos do cache.
Esse script mostra os valores corretos após a otimização?
Se sim, é provável que o problema seja o fato de o arquivo opt não estar pronto logo após a otimização. Você pode tentar colocar Sleep depois de Run. Ou o Run não está funcionando corretamente.
Esse script mostra os valores corretos após a otimização?
Se sim, o problema provavelmente é que o arquivo opt não está pronto logo após a otimização. Você pode tentar colocar Sleep depois de Run. Ou o Run não está funcionando corretamente.
Obrigado! Vou verificar tudo isso amanhã.
Mas agora descobri que, se eu definir a otimização com um novo parâmetro, tudo funcionará corretamente.
Portanto, parece-me que a questão principal é que o testador, se você redefinir uma otimização que já funcionou anteriormente, não a processa novamente, mas apenas recupera o resultado anterior da memória.
Não seria possível inventar algo para destruir essa memória do testador com antecedência?
Portanto, parece-me que o ponto principal é que o testador, se você redefinir uma otimização executada anteriormente, não a processa novamente, mas simplesmente recupera o resultado anterior da memória.
Suas hipóteses estão erradas. O problema está no código que você escreveu.
Suas hipóteses estão erradas. O problema é o código que você escreveu.
Boa tarde!
Concordo com você que "O problema está no código que escrevi". O erro está nele, e ainda não sei como corrigi-lo.
No entanto, descobri experimentalmente que, se você remover manualmente todos os arquivos opt antes de executar o Run.
da pasta "C:\Users\ASUSAppData\Roaming\MetaQuotes\Terminal\D0E8209F77C8CF37AD8BF550E51FF075\Tester\cache",
então meu código funciona corretamente e executa a otimização no parâmetro selecionado.
Se essa pasta não for limpa, o testador não executará otimizações repetidas (com os mesmos dados inalterados), mas lerá
o opt-file já existente dessa pasta. Isso pode ser visto claramente quando se executa repetidamente a mesma otimização manualmente.
É possível observar que a otimização real é executada apenas na primeira vez e, em seguida, lê apenas o arquivo opt da pasta.
Essa leitura repetida não parece atualizar o conteúdo do cache, e é isso que está causando o erro no meu código.
Limpar essa pasta pode ajudar a resolver o erro. É claro que essa é uma solução ruim, e seria mais elegante poder restaurar os dados corretos no cache.
Mas não sei como fazer isso. Por enquanto, os dados da otimização real anterior estão pendurados no cache (não correspondem à releitura da pasta).
Infelizmente, essa pasta não pode ser limpa do script usando o FolderClean, porque isso é proibido na MQL5.
Ela está fora da "sandbox" e é preenchida apenas pelo Strategy Tester.
Talvez você deva criar algum complemento externo por meio do C++ e executá-lo a partir do script.
Atenciosamente, Alexander