barabashkakvn: E "muitos cálculos baseados na história" somam-se a um conjunto dinâmico?
Existe tal coisa, sim :) Bem, mais precisamente, são utilizadas várias matrizes dinâmicas, mas não é suposto que cresçam até atingirem um tamanho demasiado grande.
E sobre dividir-se ao meio - não parece fazer muita diferença qual o segmento a tomar e quantos inputs tem. Em média, um dia é tratado em 2500-3500 ms, mas uma semana tem de esperar alguns minutos. Não tem um tronco adequado à mão neste momento, não pode ter a certeza de quanto. Mas uma ordem de magnitude superior a 5x por dia, e a maior parte do tempo é gasto no último dia ou dois. Um mês, por outro lado, pode ser deixado de um dia para o outro e pela manhã ainda estará provavelmente pendurado >.>
Lone_Irbis: Será que há um artigo algures como "as razões mais comuns para a lentidão da EA"? Estou a tentar compreender porque é que o Consultor Especialista no Teste de Estratégia está a voar no início, mas abranda ainda mais. Não está em fase de desenvolvimento para ser crítico (a velocidade é suficiente para o desenvolvimento de mecanismos e ferramentas básicas). Mas ainda é inconveniente que segmentos superiores a uma semana não façam sentido, porque depois disso a velocidade já tende a zero.
Tente colocar um barril de tinta nas suas rodas e deslizá-lo atrás de si conforme as necessidades.
Esta é uma parábola interessante :) Obrigado pela dica. Tudo o que resta é encontrar esse barril em particular. Ou melhor, barris. No entanto, já tenho uma vaga suspeita de manipuladores de notícias e de níveis de resistência.
Lone_Irbis: É uma parábola divertida :) Obrigado pela dica. Tudo o que resta é encontrar o barril. Ou melhor, barris. No entanto, já tenho uma vaga suspeita de manipuladores de notícias e de níveis de resistência.
Na maioria das vezes, tal barril é "o início dos tempos" - o Conselheiro Especialista tenta reanalisar a sua própria história comercial (ou alguma outra informação acumulada) em cada bar (tick).
Recentemente recentrada na criação de painéis, por isso a minha pergunta é. Estou a criar duas etiquetas OBJ_RECTANGLE_LABEL e OBJ_LABEL e não sei como arrastar OBJ_RECTANGLE_LABEL no gráfico para que OBJ_LABEL seja arrastado exactamente como um. Talvez haja algum mecanismo que os ligue uns aos outros e uma acção sobre um provoque o mesmo sobre o outro (todos os outros)?
MetaDriver: Na maioria das vezes, tal barril é "o início dos tempos" - o próprio historial comercial (ou alguma outra informação acumulada) que um consultor especializado tenta reanalisar em cada bar (tick).
О! Surpreendentemente, o problema foi encontrado e resolvido em literalmente minutos. De facto, o problema estava na história do comércio, que passou por cima de cada carrapato. A função que herdei do código a la "o mais simples Expert Advisor para mql5" que foi usado no início. De alguma forma, tem-me escapado a ideia desde então. Parece estar a funcionar, por isso penso - porquê preocupar-se com isso... Obviamente, é melhor eu ver os restos desse código :) No caso de alguém aqui pesquisar no Google com desfasamentos semelhantes, publicarei o fragmento problemático e o meu trabalho criativo sobre o assunto, numa tentativa de resolver este problema. Não sei quanto mais "correcta" é a minha versão em relação à fonte. O mais provável é que seja exactamente o mesmo código de merda que tudo o resto que eu escrevo. [Eu, claro, não me importo. Quer dizer, se alguém pensar em usar a peça de baixo: ter em conta que o autor é um autodidacta de merda. ^^] Mas pelo menos nada parece estar partido e o robô está a voar como um jacto :) Bem, em comparação com o que era, pelo menos. A experiência de dois meses decorreu em cerca de um minuto, o que ainda é um bom contraste com as 6+ horas originais (%)
Foi:
// Эта функция вызывалась дважды за каждый тик. С ее помощью записывались две глобальные переменные: // с ценой последнего ордера и числом открытых ордеров (да, взятый за исходник код был примером самого простейшего мартина). double History(bool LastPrice = false){
long Ticket, OldTicket = 0, PosID, Magic, Dir;
double PriceOpen = 0, Count = 0;
ENUM_DEAL_TYPE CheckDir;
if(Sell) CheckDir = DEAL_TYPE_SELL;
elseif(Buy) CheckDir = DEAL_TYPE_BUY;
HistorySelect(0, Now);
int HistoryTotal = HistoryDealsTotal();
// Проблемное место было тут: в цикле перебиралась вся история торговли, что в начале немного. // Но даже за сутки счетчик доходил до сотни (не рискну предположить, сколько там набиралось за месяц). // И этот бессмысленный и беспощадный процесс повторялся на каждом тике вообще без всякой на то причины.for (int i=0; i < HistoryTotal; i++){
Ticket = (int)HistoryDealGetTicket(i);
PosID = HistoryDealGetInteger(Ticket, DEAL_POSITION_ID);
Magic = HistoryDealGetInteger(Ticket, DEAL_MAGIC);
Dir = HistoryDealGetInteger(Ticket, DEAL_TYPE);
if(LastPrice) { // Этой частью добывалась ценаif(PosID == PositionID && Magic == MagicNumber && Dir == CheckDir) {
if(Ticket > OldTicket) {
PriceOpen = HistoryDealGetDouble(Ticket, DEAL_PRICE);
OldTicket = Ticket;
}
}
}
else { // А тут оно считало ордераif(PosID == PositionID && Magic == MagicNumber) Count++;
}
}
if(LastPrice) return(PriceOpen);
elsereturn(Count);
}
Tornou-se:
// Вызывается она теперь только в конце функций создания/изменения/закрытия позиций. Если открытых нет - глобальные переменные просто обнуляются.// Хотя в принципе, если вызывать ее не каждый тик, а только на изменениях, вероятно и старая версия не тормозила бы так уж сильноvoid History(){
long Ticket, PosID, Magic, Dir;
bool GotPrice = false;
Total = 0;
HistorySelect(0, Now);
int HistoryTotal = HistoryDealsTotal();
// Похоже, что быстрее будет считать с обратного концаfor(int i=HistoryTotal;i>=0;i--){
Ticket = (int)HistoryDealGetTicket(i);
PosID = HistoryDealGetInteger(Ticket, DEAL_POSITION_ID);
Magic = HistoryDealGetInteger(Ticket, DEAL_MAGIC);
Dir = HistoryDealGetInteger(Ticket, DEAL_TYPE);
if(PosID == PositionID && Magic == MagicNumber) {
// Корявую конструкцию заменяем на... другую корявую конструкцию... но она хотя бы компактнее :)
Total++;
if(!GotPrice){
LastOrderPrice = HistoryDealGetDouble(Ticket, DEAL_PRICE);
GotPrice = true; // Раз уж нужная цена всегда в начале списка, на ней и остановимся
}
}
// Чтобы не перепахивать всю торговую историю, если номер позиции уже меньше нашего (но больше ноля) - прерываем циклelseif(PosID > 0 && PosID < PositionID) break;
}
}
De qualquer forma, obrigado pela ajuda :) Sem a dica, provavelmente ainda não me teria ocorrido olhar para aqueles cantos poeirentos do código durante muito tempo...
О! Surpreendentemente, o problema foi encontrado e resolvido em literalmente minutos. De facto, o problema estava na história do comércio, que passou por cima de cada carrapato. A função que herdei do código a la "o mais simples Expert Advisor para mql5" que foi usado no início. De alguma forma, tem-me escapado a ideia desde então. Parece estar a funcionar, por isso penso - porquê preocupar-se com isso... Obviamente, é melhor eu ver os restos desse código :) No caso de alguém aqui pesquisar no Google com desfasamentos semelhantes, publicarei o fragmento problemático e o meu trabalho criativo sobre o assunto, numa tentativa de resolver este problema. Não sei quanto mais "correcta" é a minha versão em relação à fonte. O mais provável é que seja exactamente o mesmo código de merda que tudo o resto que escrevo. [Eu, claro, não me importo. Quer dizer, se alguém pensar em usar a peça de baixo: ter em conta que o autor é um autodidacta de merda. ^^] Mas pelo menos nada parece estar partido e o robô está a voar como um jacto :) Bem, em comparação com o que era, pelo menos. A experiência de dois meses decorreu em cerca de um minuto, o que ainda é um bom contraste com as 6+ horas originais (%)
Foi:
Tornou-se:
De qualquer forma, obrigado pela ajuda :) Sem a dica, provavelmente ainda não me teria ocorrido olhar para aqueles cantos poeirentos do código durante muito tempo...
paladin800: Recentemente recentrada na criação de painéis, por isso a minha pergunta é. Estou a criar duas etiquetas OBJ_RECTANGLE_LABEL e OBJ_LABEL e não sei como arrastar OBJ_RECTANGLE_LABEL no gráfico para que OBJ_LABEL seja arrastado exactamente como um. Talvez haja um mecanismo para os ligar uns aos outros e uma acção sobre um irá causar a mesma acção sobre o outro (todos os outros)?
Não existe tal mecanismo. Terá de criar um sozinho. Felizmente, não é assim tão difícil. Mas é preciso algum trabalho.
E "muitos cálculos baseados na história" somam-se a um conjunto dinâmico?
Existe tal coisa, sim :) Bem, mais precisamente, são utilizadas várias matrizes dinâmicas, mas não é suposto que cresçam até atingirem um tamanho demasiado grande.
E sobre dividir-se ao meio - não parece fazer muita diferença qual o segmento a tomar e quantos inputs tem. Em média, um dia é tratado em 2500-3500 ms, mas uma semana tem de esperar alguns minutos. Não tem um tronco adequado à mão neste momento, não pode ter a certeza de quanto. Mas uma ordem de magnitude superior a 5x por dia, e a maior parte do tempo é gasto no último dia ou dois. Um mês, por outro lado, pode ser deixado de um dia para o outro e pela manhã ainda estará provavelmente pendurado >.>
E sobre dividi-lo ao meio - não parece fazer muita diferença qual a secção a tomar e quantos inputs tem.
Será que há um artigo algures como "as razões mais comuns para a lentidão da EA"? Estou a tentar compreender porque é que o Consultor Especialista no Teste de Estratégia está a voar no início, mas abranda ainda mais. Não está em fase de desenvolvimento para ser crítico (a velocidade é suficiente para o desenvolvimento de mecanismos e ferramentas básicas). Mas ainda é inconveniente que segmentos superiores a uma semana não façam sentido, porque depois disso a velocidade já tende a zero.
Tente colocar um barril de tinta nas suas rodas e deslizá-lo atrás de si conforme as necessidades.
https://www.mql5.com/ru/forum/14041/page3#comment_605412
Tente colocar o barril de tinta nas suas rodas e deslizá-lo atrás de si, conforme necessário.
https://www.mql5.com/ru/forum/14041/page3#comment_605412
É uma parábola divertida :) Obrigado pela dica. Tudo o que resta é encontrar o barril. Ou melhor, barris. No entanto, já tenho uma vaga suspeita de manipuladores de notícias e de níveis de resistência.
Na maioria das vezes, tal barril é "o início dos tempos" - o próprio historial comercial (ou alguma outra informação acumulada) que um consultor especializado tenta reanalisar em cada bar (tick).
О! Surpreendentemente, o problema foi encontrado e resolvido em literalmente minutos. De facto, o problema estava na história do comércio, que passou por cima de cada carrapato. A função que herdei do código a la "o mais simples Expert Advisor para mql5" que foi usado no início. De alguma forma, tem-me escapado a ideia desde então. Parece estar a funcionar, por isso penso - porquê preocupar-se com isso... Obviamente, é melhor eu ver os restos desse código :) No caso de alguém aqui pesquisar no Google com desfasamentos semelhantes, publicarei o fragmento problemático e o meu trabalho criativo sobre o assunto, numa tentativa de resolver este problema. Não sei quanto mais "correcta" é a minha versão em relação à fonte. O mais provável é que seja exactamente o mesmo código de merda que tudo o resto que eu escrevo. [Eu, claro, não me importo. Quer dizer, se alguém pensar em usar a peça de baixo: ter em conta que o autor é um autodidacta de merda. ^^] Mas pelo menos nada parece estar partido e o robô está a voar como um jacto :) Bem, em comparação com o que era, pelo menos. A experiência de dois meses decorreu em cerca de um minuto, o que ainda é um bom contraste com as 6+ horas originais (%)
Foi:
Tornou-se:
De qualquer forma, obrigado pela ajuda :) Sem a dica, provavelmente ainda não me teria ocorrido olhar para aqueles cantos poeirentos do código durante muito tempo...
О! Surpreendentemente, o problema foi encontrado e resolvido em literalmente minutos. De facto, o problema estava na história do comércio, que passou por cima de cada carrapato. A função que herdei do código a la "o mais simples Expert Advisor para mql5" que foi usado no início. De alguma forma, tem-me escapado a ideia desde então. Parece estar a funcionar, por isso penso - porquê preocupar-se com isso... Obviamente, é melhor eu ver os restos desse código :) No caso de alguém aqui pesquisar no Google com desfasamentos semelhantes, publicarei o fragmento problemático e o meu trabalho criativo sobre o assunto, numa tentativa de resolver este problema. Não sei quanto mais "correcta" é a minha versão em relação à fonte. O mais provável é que seja exactamente o mesmo código de merda que tudo o resto que escrevo. [Eu, claro, não me importo. Quer dizer, se alguém pensar em usar a peça de baixo: ter em conta que o autor é um autodidacta de merda. ^^] Mas pelo menos nada parece estar partido e o robô está a voar como um jacto :) Bem, em comparação com o que era, pelo menos. A experiência de dois meses decorreu em cerca de um minuto, o que ainda é um bom contraste com as 6+ horas originais (%)
Foi:
Tornou-se:
De qualquer forma, obrigado pela ajuda :) Sem a dica, provavelmente ainda não me teria ocorrido olhar para aqueles cantos poeirentos do código durante muito tempo...
Recentemente recentrada na criação de painéis, por isso a minha pergunta é. Estou a criar duas etiquetas OBJ_RECTANGLE_LABEL e OBJ_LABEL e não sei como arrastar OBJ_RECTANGLE_LABEL no gráfico para que OBJ_LABEL seja arrastado exactamente como um. Talvez haja um mecanismo para os ligar uns aos outros e uma acção sobre um irá causar a mesma acção sobre o outro (todos os outros)?
Não existe tal mecanismo. Terá de criar um sozinho. Felizmente, não é assim tão difícil. Mas é preciso algum trabalho.
Boa sorte.