Aqui, aproximadamente assim - https://www.mql5.com/pt/code/183. A questão é que a cópia de dados de outros símbolos não é realizada de uma só vez, mas uma barra de cada vez. Durante essa cópia, a partir de outros símbolos, a barra será copiada exatamente de acordo com o tempo da barra do gráfico, na qual o indicador é exibido. Se não houver uma barra correspondente, ela será copiada de uma barra anterior (como a função iBarShift() em MQL4). Nesse indicador, é copiada uma barra de cada vez, mas, para a correlação, pode ser necessário copiar o número correspondente ao período de correlação. Você pode fazer isso de outra forma: copie uma barra de cada vez e coloque-a no buffer do indicador. Usando o buffer, você pode fazer tudo o mais rápido possível (obviamente, às custas de um maior consumo de memória). Você pode fazer isso sem um buffer extra, com algumas variáveis estáticas.... A explicação é longa, provavelmente será necessário escrever um artigo:)
Ok, ontem ficamos um pouco empolgados demais, acho que você também comemorou o "Dia do Guarda de Fronteira" como eu.
Você pode me fornecer um link para a sincronização correta dos compassos, porque eu também uso esse método de sincronização pelo último compasso e pronto?
Não lhe darei um link (porque ainda não o encontrei), mas descreverei o método.
O método se refere à sincronização de diferentes instrumentos, embora possa ser usado para a sincronização de diferentes TFs.
Venho lidando com esse problema há bastante tempo, e até mesmo o SD fez uma correção dos bugs desse método que identifiquei.
O problema de sincronização está relacionado ao fato de que diferentes instrumentos têm um número diferente de barras. Aproximadamente o mesmo é um critério falso, tudo deve ser exato. Barra a barra. Caso contrário, o significado da sincronização se perde.
O segundo aspecto desse problema é como exibir uma barra se não houver nenhuma barra no instrumento atual?
Portanto, a essência do método é simples: os dados do instrumento são solicitados estritamente por horários...
count=CopyRates(symbol,tf,time0,time1,rates); если нужно несколько баров
или
count=CopyRates(symbol,tf,time0,1,rates); если нужен один
e a amostra de tempo é retirada do buffer padrão do indicador time[]. Assim, você sempre terá certeza de que está diante de uma barra que veio em sincronia com uma barra em outro instrumento.
Novamente, se não houver tal barra no instrumento atual, você não a solicitará. E se o instrumento solicitado não tiver essa barra como amostra, você receberá um zero na contagem e poderá lidar normalmente com essa exceção, dependendo da lógica do seu programa.
double GetPrice( string Symb, int time )
{
double Price;
Price = iClose(Symb, Period(), iBarShift(Symb, Period(), time));
return(Price);
}
int GetNextTime( int CurrTime )
{
staticint Pos[TWO_SYMBOLS];
int i, MinTime, Tmp = -1;
for (i = 0; i < TWO_SYMBOLS; i++)
{
Pos[i] = iBarShift(Symbols[i], Period(), CurrTime) - 1;
if (Pos[i] >= 0)
Tmp = i;
}
if (Tmp < 0)
return(Time[0]);
MinTime = iTime(Symbols[Tmp], Period(), Pos[Tmp]);
i = Tmp - 1;
while (i >= 0)
{
if (Pos[i] >= 0)
{
Tmp = iTime(Symbols[i], Period(), Pos[i]);
if (Tmp < MinTime)
MinTime = Tmp;
}
i--;
}
return(MinTime);
}
void GetBaseMatrix()
{
int i, NextTime;
NextTime = GetNextTime(CurrTime);
while (NextTime < Time[0])
{
CurrTime = NextTime;
for (i = 0; i < TWO_SYMBOLS; i++)
BaseMatrix[i][MatrixRows + Shifts[i]] = MathLog(GetPrice(Symbols[i], CurrTime));
Times[MatrixRows] = CurrTime;
MatrixRows++;
NextTime = GetNextTime(CurrTime);
}
return;
}
Ou seja, tudo é bastante simples. Outra coisa é que a representação barométrica clássica (discretização de tempo constante) dos preços dos BPs não é a única, muito menos sempre correta. Às vezes, é extremamente útil sincronizar os preços dos BPs de outra dimensão de tempo. Ou seja, introduzindo distorções que não são lineares do ponto de vista do tempo clássico. De forma correspondente, a correlação mostrará inter-relações não lineares de dois VRs clássicos.
Vou falar mais uma vez sobre a necessidade de otimização algorítmica para todos os indicadores. E também pelo mecanismo embutido de cálculo dos valores do indicador na memória (arquivo), de modo que, durante a otimização do testador, o indicador não calcule a mesma coisa, mas pegue valores prontos de lá.
hrenfx: Vou falar mais uma vez sobre a necessidade de otimização algorítmica para todos os indicadores. E também por um mecanismo embutido de cálculo dos valores do indicador na memória (arquivo), de modo que, durante a otimização do testador, o indicador não calcule a mesma coisa, mas pegue valores prontos de lá.
Você poderia mostrar um exemplo em que isso já tenha sido feito?
A otimização algorítmica para cada indicador é diferente. Para diferentes formas de usar a correlação, fiz, por exemplo, isto e isto.
A leitura de memória dos valores dos indicadores calculados antecipadamente para todo o histórico foi feita apenas em minha calculadora. Ou seja, não tenho um mecanismo universal, porque uso apenas minhas próprias soluções, que não são nada bonitas. Mas, como sou a favor do aprimoramento de tudo, seria ótimo ter esse mecanismo universal no caso do otimizador do testador do MT5, porque ele oferece aceleração de várias ordens de magnitude (experiência de uso em minha calculadora), ou seja, ele supera o Cloud em termos de eficiência.
Às vezes, passo o tempo distorcendo os códigos de outras pessoas, geralmente os resultados de um programa incompleto ou incompleto, tanto por falta de tempo quanto por falta de habilidade.
Dessa vez, eu tentaria distorcer esse maravilhoso indicador, e tentei fazer algo assim:
- Desenhar apenas uma linha, não uma linha de plotagem pontilhada
- Variante visual: uma linha colorida para cada correlação de pares de moedas 1 linha grossa que é apenas a média de 7 linhas ((A+B+C+D+E+F+G)/7)
- Sem variante visual: Apenas 1 linha, que é o resultado da fórmula acima ((A+B+C+D+D+E+F+G)/7)
É quase como adicionar 7 (ou 8) indicadores de correlação originais, mas todos somados, de modo que apenas a média, como na versão com 7 linhas + 1 (média) e a outra versão com 1 linha (apenas média).
Algo parecido com isso:
buf[i]= (
(v1/sqrt(v2*v3))+
(v4/sqrt(v2*v6))+
(v7/sqrt(v2*v9))+
(v10/sqrt(v2*v12))+
(v13/sqrt(v2*v15))+
(v16/sqrt(v2*v18))+
(v19/sqrt(v2*v21))
)/7; // média simples de valores.
buf2[i]=buf[i];
c=getPlotColor(buf[i]);
colors1[i]=c;
colors2[i]=c;
Por vários motivos, o código distorcido não faz o que eu quero por causa de erros completamente lógicos.
O principal problema é com os buffers, a sincronização e a parte de indentação recursiva do código:
Algumas funções Print() foram adicionadas para ajudar no caso de rastreamento de valores de variáveis e as instruções de retorno 0 foram comentadas para localizar onde o código falha logicamente.
Ok, ontem ficamos um pouco empolgados demais, acho que você também comemorou o "Dia do Guarda de Fronteira" como eu.
Você pode me fornecer um link para a sincronização correta dos compassos, porque eu também uso esse método de sincronização pelo último compasso e pronto?
Não lhe darei um link (porque ainda não o encontrei), mas descreverei o método.
O método se refere à sincronização de diferentes instrumentos, embora possa ser usado para a sincronização de diferentes TFs.
Venho lidando com esse problema há bastante tempo, e até mesmo o SD fez uma correção dos bugs desse método que identifiquei.
O problema de sincronização está relacionado ao fato de que diferentes instrumentos têm um número diferente de barras. Aproximadamente o mesmo é um critério falso, tudo deve ser exato. Barra a barra. Caso contrário, o significado da sincronização se perde.
O segundo aspecto desse problema é como exibir uma barra se não houver nenhuma barra no instrumento atual?
Portanto, a essência do método é simples: os dados do instrumento são solicitados estritamente por horários...
e a amostra de tempo é retirada do buffer padrão do indicador time[]. Assim, você sempre terá certeza de que está diante de uma barra que veio em sincronia com uma barra em outro instrumento.
Novamente, se não houver tal barra no instrumento atual, você não a solicitará. E se o instrumento solicitado não tiver essa barra como amostra, você receberá um zero na contagem e poderá lidar normalmente com essa exceção, dependendo da lógica do seu programa.
Implementação da sincronização (em MQL4) para qualquer número de FIs(daqui):
Por analogia para dois símbolos(a partir daqui):
Ou seja, tudo é bastante simples. Outra coisa é que a representação barométrica clássica (discretização de tempo constante) dos preços dos BPs não é a única, muito menos sempre correta. Às vezes, é extremamente útil sincronizar os preços dos BPs de outra dimensão de tempo. Ou seja, introduzindo distorções que não são lineares do ponto de vista do tempo clássico. De forma correspondente, a correlação mostrará inter-relações não lineares de dois VRs clássicos.Obrigado por sua ajuda!
Eu estava errado, admito, não achei que a sincronização fosse tão complicada.
Vou tentar descobrir e sincronizar as barras diretamente nesse indicador, pois preciso muito disso.
Obrigado a todos pelas informações!
Reescrevi um pouco o indicador. Agora, supostamente, ele deve pular partes ruins do histórico.
Já que começamos, por favor, verifique se há erros :)
Vou falar mais uma vez sobre a necessidade de otimização algorítmica para todos os indicadores. E também por um mecanismo embutido de cálculo dos valores do indicador na memória (arquivo), de modo que, durante a otimização do testador, o indicador não calcule a mesma coisa, mas pegue valores prontos de lá.
A otimização algorítmica para cada indicador é diferente. Para diferentes formas de usar a correlação, fiz, por exemplo, isto e isto.
A leitura de memória dos valores dos indicadores calculados antecipadamente para todo o histórico foi feita apenas em minha calculadora. Ou seja, não tenho um mecanismo universal, porque uso apenas minhas próprias soluções, que não são nada bonitas. Mas, como sou a favor do aprimoramento de tudo, seria ótimo ter esse mecanismo universal no caso do otimizador do testador do MT5, porque ele oferece aceleração de várias ordens de magnitude (experiência de uso em minha calculadora), ou seja, ele supera o Cloud em termos de eficiência.
Olá,
Às vezes, passo o tempo distorcendo os códigos de outras pessoas, geralmente os resultados de um programa incompleto ou incompleto, tanto por falta de tempo quanto por falta de habilidade.
Dessa vez, eu tentaria distorcer esse maravilhoso indicador, e tentei fazer algo assim:
- Desenhar apenas uma linha, não uma linha de plotagem pontilhada
- Para adicionar vários símbolos, como
Em seguida, criar duas variantes do código-fonte:
- Variante visual: uma linha colorida para cada correlação de pares de moedas 1 linha grossa que é apenas a média de 7 linhas ((A+B+C+D+E+F+G)/7)
- Sem variante visual: Apenas 1 linha, que é o resultado da fórmula acima ((A+B+C+D+D+E+F+G)/7)
É quase como adicionar 7 (ou 8) indicadores de correlação originais, mas todos somados, de modo que apenas a média, como na versão com 7 linhas + 1 (média) e a outra versão com 1 linha (apenas média).
Algo parecido com isso:
Por vários motivos, o código distorcido não faz o que eu quero por causa de erros completamente lógicos.
O principal problema é com os buffers, a sincronização e a parte de indentação recursiva do código:
if(bars1>bars2) { minBars=bars2; bars2=bars1-bars2; etc...+ além de outros erros lógicos.
Algumas funções Print() foram adicionadas para ajudar no caso de rastreamento de valores de variáveis e as instruções de retorno 0 foram comentadas para localizar onde o código falha logicamente.
código e arquivo