O exemplo é muito simples neste caso. O cálculo davida útil total de todas as posições fechadas é uma tarefa muito mais difícil para um desempenho rápido.
Um exemplo é muito simples neste caso. O cálculo davida útil total de todas as posições fechadas é uma tarefa muito mais difícil para um desempenho rápido.
Expliquei-lhe o motivo antes, mas você não o levou em conta.
Aparentemente, preciso pesquisar no fórum para obter sua explicação.
Da última vez você teve um problema semelhante, onde o parâmetro passado não estava em cache, mas passou diretamente para o código. E, depois de armazená-la em cache, a velocidade aumentou. Sempre alocar memória para uma variável e só usá-la mais tarde. É o mesmo aqui, você declara uma variável, a memória já está alocada e o trabalho adicional com a variável será mais rápido, uma vez que não há custos de alocação de memória.
Isto também se aplica a valores de busca de funções mql. Mesmo os desenvolvedores recomendados aqui no fórum, primeiro obtêm um valor de uma função em uma variável e depois usam essa variável em uma condição if()
#include <Generic\HashMap.mqh>
// Возвращает общую длительность всех закрытых позиций.int SumPositionsLengthMQL5( void )
{
int Res = 0;
if (HistorySelect(0, INT_MAX))
{
CHashMap<ulong, ulong> DealsIn; // По PositionID возвращает DealIn.constint TotalDeals = HistoryDealsTotal();
for (int i = 0; i < TotalDeals; i++)
{
constulong TicketDeal = HistoryDealGetTicket(i);
if (HistoryDealGetInteger(TicketDeal, DEAL_ENTRY) == DEAL_ENTRY_IN)
DealsIn.Add(HistoryDealGetInteger(TicketDeal, DEAL_POSITION_ID), TicketDeal);
elseif (HistoryDealGetInteger(TicketDeal, DEAL_TYPE) <= DEAL_TYPE_SELL)
{
ulong TicketDealIn;
if (DealsIn.TryGetValue(HistoryDealGetInteger(TicketDeal, DEAL_POSITION_ID), TicketDealIn))
Res += (int)(HistoryDealGetInteger(TicketDeal, DEAL_TIME) - HistoryDealGetInteger(TicketDealIn, DEAL_TIME));
}
}
}
return(Res);
}
Pode haver uma opção mais rápida. Mas um passo para a esquerda na condição do que precisa ser calculado, e a lógica pode ter que mudar consideravelmente. Não é fácil, em geral.
Pode haver uma opção mais rápida. Mas um passo para a esquerda na condição do que precisa ser contado, e a lógica pode ter que mudar consideravelmente. Não é fácil, em geral.
Não é a condição, é a escrita do código. Embora você possa substituir a condição por um interruptor, ele funcionará mais rápido do que se fosse outro. Tente este código, ele vai ficar mais rápido ou não? Caso contrário, tente substituir por um interruptor. Espero que vocês entendam agora que todas as declarações variáveis devem ser colocadas fora do loop, e não reexecutá-las 100500 vezes. Além disso, para cada valor retornado, alocar memória na forma de uma variável.
Esta é outra variante do código, para que não tenhamos que puxar a História para a segunda condição. Você também pode pensar qual condição será satisfeita com mais freqüência, colocá-la em primeiro lugar no loop e continuar a iteração.
No MT4 funciona da mesma maneira, apenas a criação do cache está escondida. Em cada OnTick/OnStart do MT4 o terminal cria automaticamente e com moderação um instantâneo do ambiente de mercado para cada EA.
Portanto, não se pode avaliar a verdadeira latência da preparação dos dados a partir do código MQL4. Felizmente, no MT4, os dados são pequenos e simples.
Se você mesmo o faz, você mesmo o faz. Mas é estranho por que o resultado é tão estranho, essa é uma pergunta para Renate. Minha suspeita é a verificação do hashmap DealsIn.TryGetValue Veja sob o perfilador.
C programadores.
O exemplo é muito simples neste caso. O cálculo davida útil total de todas as posições fechadas é uma tarefa muito mais difícil para um desempenho rápido.
Um exemplo é muito simples neste caso. O cálculo davida útil total de todas as posições fechadas é uma tarefa muito mais difícil para um desempenho rápido.
Expliquei-lhe o motivo antes, mas você não o levou em conta.
Expliquei-lhe o motivo antes, mas você não o levou em conta.
Aparentemente, preciso pesquisar no fórum para obter sua explicação.
Aparentemente, preciso pesquisar no fórum para obter sua explicação.
Da última vez você teve um problema semelhante, onde o parâmetro passado não estava em cache, mas passou diretamente para o código.
E, depois de armazená-la em cache, a velocidade aumentou. Sempre alocar memória para uma variável e só usá-la mais tarde.
É o mesmo aqui, você declara uma variável, a memória já está alocada e o trabalho adicional com a variável será mais rápido, uma vez que não há custos de alocação de memória.
Isto também se aplica a valores de busca de funções mql.
Mesmo os desenvolvedores recomendados aqui no fórum, primeiro obtêm um valor de uma função em uma variável e depois usam essa variável em uma condição if()
O cálculo davida útil acumulada de todas as posições fechadas é uma tarefa muito mais difícil para um desempenho rápido.
Fórum sobre comércio, sistemas automatizados de comércio e testes estratégicos
Bibliotecas: MT4Orders
fxsaber, 2020.08.29 04:17
Pode haver uma opção mais rápida. Mas um passo para a esquerda na condição do que precisa ser calculado, e a lógica pode ter que mudar consideravelmente. Não é fácil, em geral.
Pode haver uma opção mais rápida. Mas um passo para a esquerda na condição do que precisa ser contado, e a lógica pode ter que mudar consideravelmente. Não é fácil, em geral.
Não é a condição, é a escrita do código.
Embora você possa substituir a condição por um interruptor, ele funcionará mais rápido do que se fosse outro.
Tente este código, ele vai ficar mais rápido ou não? Caso contrário, tente substituir por um interruptor.
Espero que vocês entendam agora que todas as declarações variáveis devem ser colocadas fora do loop, e não reexecutá-las 100500 vezes.
Além disso, para cada valor retornado, alocar memória na forma de uma variável.
Esta é outra variante do código, para que não tenhamos que puxar a História para a segunda condição.
Você também pode pensar qual condição será satisfeita com mais freqüência, colocá-la em primeiro lugar no loop e continuar a iteração.
Esta é outra variante do código, a fim de não puxar o Histórico para a segunda condição.
A partir daqui, é com você.
No MT4 funciona da mesma maneira, apenas a criação do cache está escondida. Em cada OnTick/OnStart do MT4 o terminal cria automaticamente e com moderação um instantâneo do ambiente de mercado para cada EA.
Portanto, não se pode avaliar a verdadeira latência da preparação dos dados a partir do código MQL4. Felizmente, no MT4, os dados são pequenos e simples.
posições fechadas.
Você pode assumir a partir daqui.
Se você mesmo o faz, você mesmo o faz.
Mas é estranho por que o resultado é tão estranho, essa é uma pergunta para Renate.
Minha suspeita é a verificação do hashmap DealsIn.TryGetValue
Veja sob o perfilador.