Perguntas de Iniciantes MQL5 MT5 MetaTrader 5 - página 186

 
por favor aconselhe o melhor indicador de sinal neste site...desde que seja gratuito, claro!
 
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:


E sobre dividi-lo ao meio - não parece fazer muita diferença qual a secção a tomar e quantos inputs tem.

Incluir um teste de avanço com uma relação 1 / 2. Dividirá automaticamente o histórico em períodos. Para além disso, também descobrirá se vale a pena.
 
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.

https://www.mql5.com/ru/forum/14041/page3#comment_605412

Линейное торможение - ошибка программиста или особенность работы MT4?
Линейное торможение - ошибка программиста или особенность работы MT4?
  • www.mql5.com
Такая работа просто убивает возможность оперативной настройки советника.
 
MetaDriver:

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

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; 
   else if(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);
   else return(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; // Раз уж нужная цена всегда в начале списка, на ней и остановимся
         }
      }
      // Чтобы не перепахивать всю торговую историю, если номер позиции уже меньше нашего (но больше ноля) - прерываем цикл
      else if(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...

 
Lone_Irbis:

О! 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...

ok.
 
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.

Boa sorte.