Resultados de testes de peritos multimoedas - página 6

 
tol64:

Porque está a escolher essa segunda fonte?)

Se começar a responder sobre os méritos, a resposta será algo sobre"frases arrancadas separadamente" ou"Não sou o tipo de pessoa que pensa estar sempre certa sobre tudo". Isso já está claro.

Sobre o ping-pong, é uma posição um pouco estranha a tomar. Interessa-se por um tópico, obtêm-se respostas e perguntas principais, e começa-se a desafiá-las ou a escová-las. Você ou quem precisa do tópico em primeiro lugar? Pessoalmente não preciso destes resultados e o resultado da vossa escolha é de pouco interesse para mim. O tema em si parece digno de atenção, mas o fervor polémico do autor cria dúvidas quanto à oportunidade da sua manutenção.

 
marketeer:

Porque seria? Tem aí o OnTimer como terceiro número. Já foi citado sobre este assunto: basta-lhe implementar um método que execute correctamente o teste. Existe um. Esta é a função OnTimer () com um intervalo mínimo. Por isso, deve ter algo mais em mente.

Antes disso, escreveu isso:

Mas não é a mesma coisa:
Na verdade, está a tentar "apanhar" o momento do tiquetaque de novas barras em todos os símbolos e é óbvio que a melhor maneira de o fazer é utilizar o evento OnTick.


A questão é que não estou a tentar "apanhar" carraças no OnTimer(). No OnTimer() a verificação de uma nova barra é realizada para cada símbolo separadamente. Esta verificação é efectuada a intervalos definidos no temporizador (em segundos).

Um evento como um tick é recebido na função OnTick() e no esquema proposto por Konstantin Gruzdev, ou seja, na função OnChartEvent(). No OnChartEvent() podemos rastrear qualquer evento, incluindo a formação de uma nova barra em qualquer período de tempo.

Não há qualquer problema com o temporizador. Agora testei a EA multi-divisas da seguinte forma

1. Optimizo os parâmetros para cada símbolo separadamente, anexando a EA ao símbolo cujos parâmetros estão a ser optimizados. O processo de optimização é feito utilizando a função OnTick(). No momento da optimização dos parâmetros para um símbolo, todos os outros símbolos são desactivados, ou seja, não participam em testes e as trocas são realizadas apenas para o símbolo, cujos parâmetros são optimizados.

2. Após a optimização dos parâmetros para todos os símbolos, precisamos de testar todos os símbolos de uma só vez. Mudo o código para a função OnTimer() (por agora), habilito o temporizador para testes preliminares (60 segundos) e analiso o resultado obtido. Se estou satisfeito, afino o sistema de gestão de dinheiro e outros subsistemas. Depois troco o teste final (temporizador 10 segundos) e recebo, na minha opinião, o resultado mais exacto. A minha opinião e conclusões baseiam-se nos resultados dos testes de todos os métodos e na comparação destes resultados uns com os outros.

marketeer:
Se é importante para si, recomendo ainda assim que verifique com os criadores qual é o análogo do ficheiro fxt em Cinco. Já escrevi que é provável que sejam geradas diferentes bases de carrapatos para diferentes testes.

Esta é uma suposição interessante. Pode até ser esse o caso. Uma resposta dos criadores seria, portanto, bem-vinda.

 
Não há ficheiros fxt no mt5. Agora as carraças não são escritas num ficheiro, mas sim modeladas a partir da história minuciosa na mosca.

Acontece que gerar carraças na mosca é mais rápido do que lê-las a partir do disco.
Документация по MQL5: Файловые операции / FileWrite
Документация по MQL5: Файловые операции / FileWrite
  • www.mql5.com
Файловые операции / FileWrite - Документация по MQL5
 
Renat:
Não há ficheiros fxt no mt5. Agora as carraças não são escritas num ficheiro, mas sim modeladas a partir da história minuciosa na mosca.

Acontece que gerar carraças na mosca é mais rápido do que lê-las a partir do disco.
Olá Renat. Obrigado pela sua resposta. Esta é uma óptima notícia.
 
tol64:
Olá Renat. Obrigado pela sua resposta. Esta é uma óptima notícia.
Não vejo nada de fantástico, acontece que em mt5 não se pode testar em carraças reais
 
Loky:
Não vejo nada de fantástico, acontece que em mt5 não se pode testar em carraças reais
Gostaria de poder recolher a sua própria base de carraças verdadeira ou levá-la de algum lugar e testá-la ou algo assim?
 
Yedelkin:

Se começar a responder sobre os méritos, a resposta será algo do tipo"frases extraídas separadamente" ou"Não sou o tipo de pessoa que pensa que tem sempre razão sobre tudo". Isso já está claro.

Não. Parece que ainda não entendeu nada. E agora vou explicar-vos pela quarta vez. Vamos retomar o nosso diálogo.

Tudo começou a partir deste momento:

Yedelkin:
Preste atenção à parte do código:

int OnInit()
{
if(iCustom("EURUSD",PERIOD_D1,"Spy Control panel MCM",ChartID(),0,CHARTEVENT_TICK) == INVALID_HANDLE)
   { Print("Ошибка установки шпиона на EURUSD"); return(true);}
   
if(iCustom("GBPUSD",PERIOD_D1,"Spy Control panel MCM",ChartID(),1,CHARTEVENT_TICK) == INVALID_HANDLE)
   { Print("Ошибка установки шпиона на GBPUSD"); return(true);}
}

Aqui pode ver que "dobra" um certo "Spy Control Panel MCM" em dois caracteres diferentes. Por isso, tem símbolos diferentes como fontes de sinal. Mas afirma que "negociamos no EURUSD", ou seja, a fonte do sinal é um e o mesmo símbolo. Vamos decidir.

A isso vos respondi:

tol64:

Oh, isto está a aproximar-se. Parece ter aparecido uma variante, em que estou enganado))). Pensarei um pouco e escreverei sobre isso em detalhes...

Pensamento. Resposta:

tol64:

Só é comercializado em EURUSD.

Nos meus testes considero o esquema de Konstantin Gruzdev - Implementação do Modo Multidivisas no MetaTrader 5. ))) Tudo está definido. Os ficheiros anexos contêm o indicador do painel de controlo de espionagem MCM e o exConsultor Especialista MCM do painel de controlo de espionagem MCM. Ao instalar o Expert Advisor num gráfico, pode ver como funciona. O registo mostra claramente os eventos especificados recebidos pelo Conselheiro Especialista a partir de diferentes símbolos. Tudo é claro, nada é misturado.

Tentei agora especificar no OnChartEvent() o símbolo a partir do qual o ID é recebido, mas isto não alterou os resultados. Retirei o segundo carácter do OnInit() para eliminar qualquer possibilidade de receber os eventos errados. O teste foi agora realizado utilizando esta variante:

...

código

...

imagens

...

Os resultados não coincidem. Já não existe um segundo símbolo, os sinais vêm apenas do EURUSD. Mas isto, infelizmente, não resolveu o problema.

O ponto-chave foi:"Não há mais nenhum segundo símbolo, os sinais vêm apenas de EURUSD".Mas isso, infelizmente, não resolveu o problema."


Está a ver? A remoção da segunda fonte não resolveu o problema. A situação foi simplificada e poderia ter deixado a segunda fonte, mas continuou a citar o exemplo original em vez de tentar resolver a seguinte questão. Porque é que tendo apenas um símbolo (fonte única) mas comercializando (em modo de teste) a partir de outro símbolo, obtemos variantes não idênticas?

Aqui está o correio onde o expressou:

Yedelkin:
Vamos começar com a redacção correcta. No exemplo inicial, teria gostado de "negociar no EURUSD". De facto, os eventos do utilizador provinham de dois símbolos, e no manipulador de eventos TradeSignalCounter()+TradePerformer() foram chamados quando os eventos de qualquer um destes dois símbolos foram recebidos. Podemos assumir que a fila do evento esteve sempre cheia.

Agora retirou uma das fontes de sinal mas introduziu a verificação "if(sparam == Symbol_01)" no manipulador do evento por alguma razão. Mas a questão seguinte é diferente. A julgar pelo código, o esquema de Lizar é utilizado no modo "Todos os tiques" e as funções TradeSignalCounter()+TradePerformer() são chamadas a cada tick da fonte do sinal (EURUSD). O interesse já deu a entender um possível transbordo da fila de eventos. Mas quero saber que instrumento é utilizado como parâmetro Symbol_01 destas duas funções, e se tentou alterar a periodicidade dos eventos no esquema de Lizar.

Expliquei-vos uma segunda vez (chamam-lhe "whisking" por alguma razão):

tol64:

Sim, era isso que eu queria fazer. Afinal de contas, cada acção que tomamos é desencadeada pelo nosso desejo. Neste caso, consegui exactamente o que queria. Ou seja, negociámos apenas no EURUSD, porque a função TradePerformer() verifica se é permitido negociar para cada símbolo da gama de símbolos. Esta opção está localizada em variáveis externas e, nessa altura, a negociação usando o símbolo GBPUSD era proibida. Os eventos do utilizador vieram de dois símbolos, mas no manipulador de eventos, mais uma vez, a função TradePerformer() só permitia o comércio com o símbolo EURUSD. A função TradePerformer() também contém uma função que determina se uma nova barra ocorreu num determinado símbolo, neste caso o EURUSD. A sua suposição de que a fila de eventos esteve sempre cheia está correcta, mas neste caso tudo foi processado separadamente e um tick atrasado não é significativo quando se testa em barras diárias.

A remoção de uma fonte de sinal, aquela que não deveria estar envolvida nos testes, apenas confirmou que tudo tinha sido feito correctamente antes. A verificação "if(sparam == Symbol_01)" permaneceu desde quando verifiquei os resultados sem eliminar uma fonte de sinal que não deveria ser testada, mas a partir da qual deveria ser testada. Este cheque acabou por se revelar até supérfluo. Os resultados não se alteraram. O símbolo EURUSD é utilizado como parâmetro Symbol_01. Tentei alterar a frequência dos eventos, mas não mudou nada. Mais precisamente, posso dizer que o modo "all ticks" é o mais preciso.

Ponto-chave:"Este teste acabou por se revelar até supérfluo. Os resultados não se alteraram."
Esta é a segunda vez que "não notou" que o problema não é o que aponta, e esta é a segunda vez que lhe respondo a mesma coisa, mas ainda mais explicitamente.

Continuou:

Yedelkin:
"...tudo era feito bem antes" - isto é da categoria de complacência. Foi um erro começar por aí. Aparentemente, não se dá importância a um fenómeno como o "transbordo de filas de eventos". Particularmente quando se trata de transmissão pós-ítica de eventos. Veja os materiais de referência e o fórum sobre o assunto. A palavra-chave é "fila".

Devido ao facto de as funções TradeSignalCounter()+TradePerformer() processar eventos a partir de uma única fonte de sinal, o estado da fila e o seu possível transbordo não se alterou de forma alguma. Por outras palavras, a "proibição de processar eventos pelo símbolo GBRUSD" não removeu de todo os eventos apropriados da fila. Pela terceira vez, estou a apontar o problema: "Um possível transbordamento na fila de eventos já foi sugerido" :) Se pensa que se trata apenas de "um carrapato atrasado", qual é a base para tais conclusões?

"...Neste caso, tudo foi tratado separadamente". O problema é que na versão original, o manipulador de eventos chamava funções quando os eventos eram recebidos de ambas as fontes de sinal, e depois essas funções já filtravam o sinal da fonte "desnecessária". Mas as funções foram chamadas a cada (!) tempo.

Não importa realmente em que período o manipulador do evento é testado. Se o esquema de Lizar gera sinais numa base de tique por tique, então eles estão também a marcar a fila do evento numa base de tique por tique, e não uma vez por dia.

"Tentei mudar a frequência dos eventos, mas não fez qualquer diferença. Mais precisamente, posso dizer que o modo "all ticks" é o mais preciso". Poderia dar-me alguns ecrãs comparativos sobre os modos sem tecto do Lizar?

E respondi-lhe pela terceira vez da forma mais educada possível. E os sorrisos que aparentemente percebeu como troça, na verdade expressam a minha simpatia em relação a si. Vou tentar não os colocar em mais lado nenhum, uma vez que são tão ambíguos.

tol64:

Bom dia! ))

Para além desta frase extraída separadamente, também escrevi: "...Nunca excluo a possibilidade de estar errado em algum lado e verifico sempre tudo. Mas mesmo depois das verificações mais difíceis, quando à primeira vista tudo parece certo, ainda não posso excluir a possibilidade de que possa haver um erro em algum lugar". Devo acrescentar que não sou o tipo de pessoa que pensa que tem sempre razão em tudo. )))

Deu uma vista de olhos ao tema do Temporizador. Os pontos-chave que salientei são:

1. Enquanto um evento está a ser processado, os outros podem não ser processados.

2. Se a pilha de eventos transbordar, os eventos antigos são removidos da fila sem serem processados.

Vamos tomar em ordem. Há uma enumeração de eventos:

...
código
...
Durante a inicialização, especificamos de que personagem receberemos o evento, e que evento receberemos:
...
código
...

Assim, aceitaremos o evento CHARTEVENT_TICK apenas da EURUSD. Não existem outros símbolos.

O teste já começou. Quando qualquer evento ocorre, o programa entra na função OnChartEvent(), declara conjuntos de variáveis para os sinais de negociação e verifica o evento. Se este for um evento personalizado, o programa determina o sinal em TradeSignalCounter(), então verifica se ocorreu uma nova barra na função TradePerformer() e depois decide sobre outras condições, dependendo disto. A função deixou de funcionar e só começará a funcionar quando um evento tiver ocorrido no gráfico EURUSD. Por outras palavras, neste caso, é um tique.

...

código
...

A execução destas funções é muito rápida. Nenhuma fila de eventos tem tempo para transbordar e não vamos perder nenhum evento significativo. E se a fila mesmo transbordar e os eventos forem perdidos, o que é que vamos perder? Um carrapato, dois carrapatos, três? E então? É insignificante nos bares diurnos.

O que estás a escolher nesta segunda fonte)))) Já não existe uma segunda fonte. Existe um - EURUSD, mas o Expert Advisor negoceia no EURUSD a partir do gráfico GBPUSD. E os resultados são identicamente errados. Uma cópia. Ou seja, são os mesmos como se a segunda fonte estivesse presente. )))

-----------

É melhor ser você a fazer o teste, mostrar os resultados e escrever (brevemente) o que fez para obter os resultados correctos do teste, se conseguir fazê-lo, claro. O perito mais simples fará para este teste. Entrada por qualquer condição, Stop Loss, Take Profit. Que sejam as barras diárias dos últimos 10 anos. E verá com os seus próprios olhos. Alguns períodos serão coincidentes, e outros não. Abra o gráfico de resultados e veja onde se encontra a discrepância.

E depois disso, escreve:

Yedelkin:
Sobre o pingue-pongue - uma posição um pouco estranha. Está interessado num determinado tópico, recebe uma resposta e faz perguntas importantes, e começa a contestá-las ou a rejeitá-las. Você ou quem precisa do tema em primeiro lugar? Não creio que alguém faça o seu trabalho por si. Pessoalmente estou-me nas tintas para os resultados e o resultado das vossas escolhas são de pouco interesse para mim. O tema em si parecia digno de atenção, mas o fervor polémico do autor cria dúvidas quanto à oportunidade da sua manutenção.

Depois há questões.

1. Que tipo de reacção esperava, se continua a repetir a mesma coisa, nomeadamente que já é irrelevante e que já foi respondido três vezes?

2. O que o faz pensar que estou a discutir? Se tomou as minhas respostas como argumento, está enganado, porque eu respondi e expliquei o que estava a fazer. Mas tomou-o como um argumento porque estava a discutir-se a si próprio. )))

3. nunca confio em outra pessoa para fazer o meu trabalho.

4. não sou o único a precisar do tema, e todos aqueles que se depararão com este problema. Se não precisa dele, então porque entrou no diálogo? O meu fervor polémico foi apenas uma consequência, a causa veio de si.

---
Não analisarei o seu comportamento do ponto de vista psicológico, caso contrário, você e eu teremos de voar para fora da atmosfera. Por conseguinte, vamos tentar manter o diálogo curto e directo. Mas se não precisar dele, é melhor não continuar. Porque: Por favor, observe as regras. )))

 

Claro que, pessoalmente, não estou interessado em analisar as peculiaridades das visões de mundo de outras pessoas. Já declarei as minhas conclusões sobre o vosso fervor polémico acima. Não há nada a acrescentar.

 
Yedelkin:

... Nada a acrescentar.

Sim, é melhor não. Caso contrário, acabará por ser apenas conversa fiada. Voltemos ao assunto.

---

Fez outra série de testes. Os resultados de testes anteriormente apresentados foram obtidos em modo - Preços de abertura apenas. Na minha opinião, consegui obter resultados correctos neste modo apenas usando a função OnTimer(). Todos os outros métodos não mostraram os resultados correctos.

Desta vez, realizei testes no modo All ticks a partir do início de 2011. Ao mesmo tempo, era interessante ver quanto tempo este ou aquele método levaria. Por exemplo, em testes automáticos de Conselheiros Especialistas para o Campeonato, um Conselheiro Especialista deve ser testado em modo "Todas as carraças" durante não mais do que 15 minutos. Para este teste, construí um simples Expert Advisor que negoceia em 12 pares de moedas. As únicas condições que contém são Stop Loss, Take Profit e Trailing Stop. Não há alargamento e estreitamento de posição, não há sistema de gestão de dinheiro, o lote negociado é fixo (0,1). O Expert Advisor é escrito sem um único ciclo, é maximamente simplificado. O período de trabalho em todos os símbolos é H8.

Eu optimizei os parâmetros para cada símbolo separadamente, por sua vez, utilizando OnTick(). Não esperei que a optimização terminasse. Após 100 corridas, parei a optimização e escolhi a que apresentava menos riscos, em vez da melhor opção.

A frequência do processador em que os testes foram realizados é de 2 GHz. É aqui que se diz em que se deve concentrar.

Além disso, vou substituir a palavra idêntica por quase idêntica, uma vez que o objectivo não é uma correspondência exacta, mas ao analisar visualmente o gráfico, as diferenças não devem ser notáveis.

---

Resultados dos testes:

A função OnTimer() foi utilizada para o primeiro teste porque deu resultados quase idênticos da última vez. E agora o seu resultado servirá como uma referência para comparação.

OnTimer()

O intervalo do temporizador é de 60 segundos.

O teste durou 27 minutos.

---

Intervalo de tempo 300 segundos:

Os resultados são quase idênticos. A duração do teste é de 26 minutos.

---

Intervalo de tempo 28800 segundos - 8 horas (período de tempo utilizado).

Os resultados são quase idênticos. A duração do teste é de 25 minutos.

Também fiz testes com intervalos de 1800 e 3600 segundos, os resultados também são consistentes.

-----------

OnChartEvent()

O período de 1 minuto é CHARTEVENT_NEWBAR_M1.

Os resultados são quase idênticos. A duração do teste é de 37 minutos.

---

Período de 1 minuto - CHARTEVENT_NEWBAR_H1.

Os resultados são quase idênticos. Duração do teste: 27 minutos.

---

Período de 1 minuto - CHARTEVENT_NEWBAR_H8.

Os resultados são quase idênticos. A duração do teste é de 27 minutos.

----------

OnTick()

Os resultados são quase idênticos. A duração do teste é de 72 minutos.

-----------------

No modo "Todas as carraças", todos os métodos mostraram resultados quase idênticos. OnTick() revelou-se ser a variante mais longa. A duração dos testesOnTimer() e OnChartEvent() são quase idênticos.

Relatório:

Resumindo:

No meu caso, nem mesmo o mais simples Expert Advisor Multimoedas que negoceia em 12 pares de moedas num período de tempo muito grande (H8) pode ser colocado no Campeonato, porque não passará no teste (15 minutos para o teste). Teremos de "cortar o apetite" ou procurar métodos para optimizar ao máximo o código do Expert Advisor.

---

Será que alguém conseguiu um teste rápido em 12 pares? Quanto tempo demora o seu teste?

 
tol64:

Será que alguém conseguiu um teste rápido em 12 pares? Quanto tempo demora o seu teste?


3.
capr2011 em EURUSD:H1 cada carrapato 2011.01.01-2011.08.01


4. início
terminado em 3 min 21 seg


5. Estatísticas
1233 kb de ficheiros de registo
100 negócios, 200 negócios, lucro 83043,82 USD