Qualquer pergunta de novato, de modo a não desorganizar o fórum. Profissionais, não passem por aqui. Em nenhum lugar sem você - 6. - página 561

 
Forexman77:

Querida, preciso de sua ajuda.

Estou otimizando meu Expert Advisor pelo indicador, o código do indicador está abaixo.

A otimização é lenta, fiz um código no EA para recalcular o indicador em uma nova barra, o que não é muito adequado.

Consulte o código do indicador, o que pode ser feito nele para que o recálculo aconteça mais rapidamente.


por que você pensou que a culpa era do indicador?
 
Vladon:

calcular o número de caracteres, + tamanho da fonte, como este?

O tamanho da fonte não lhe dá o conhecimento de que você precisa. Você precisa desenhar vários objetos um em cima do outro. Somente o primeiro objeto tem um ponto de ancoragem. Como obter o ponto de ancoragem do 2º e subsequentes objetos?
 
Vladon:


Conclusão forçada da EA no caso de descarregar a EA do usuário.

é melhor registrar os dados diretamente no início.

Não é possível fazer isto através do início. A mesma imagem.
----------------------------------------------------
stringo 25.03.2014 13:28

O tempo de execução do deinit é limitado a 10 segundos.

No testador, a bandeira de parada de conclusão normal não é colocada, portanto, o deinit é concluído silenciosamente.

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

Talvez seja imposto um limite de 10 segundos para o funcionamento de qualquer função?
 
Olá! Ao estudar a MQL4 surgiu uma pequena pergunta. O problema está publicado no tutorial deste site. Aqui está a condição: Tarefa 25. Criar um programa, no qual se realizem as seguintes condições: se a taxa de câmbio tiver subido acima do nível especificado, então dê uma mensagem, na qual palavras indicam que a taxa excede o nível (até 100 pontos); em outros casos, para informar que a taxa não excede o nível especificado.
E aqui está a solução proposta:
//--------------------------------------------------------------------
extern double Level=1.3200;                     // Заданный уровень 
string Text[101];                               // Объявление массива
//--------------------------------------------------------------------
int init()                                      // Спец. ф-ия init()
  {                                             // Присвоение значений
   Text[1]="один ";            Text[15]="пятнадцать ";
   Text[2]="два ";             Text[16]="шестнадцать ";
   Text[3]="три ";             Text[17]="семнадцать ";
   Text[4]="четыре ";          Text[18]="восемнадцать ";
   Text[5]="пять ";            Text[19]="девятнадцать ";
   Text[6]="шесть ";           Text[20]="двадцать ";
   Text[7]="семь ";            Text[30]="тридцать ";
   Text[8]="восемь ";          Text[40]="сорок ";
   Text[9]="девять ";          Text[50]="пятьдесят ";
   Text[10]="десять ";         Text[60]="шестьдесят";
   Text[11]="одиннадцать ";    Text[70]="семьдесят ";
   Text[12]="двенадцать ";     Text[80]="восемьдесят ";
   Text[13]="тринадцать ";     Text[90]="девяносто";
   Text[14]="четырнадцать ";   Text[100]= "сто";
   // Вычисление значений
   for(int i=20; i<=90; i=i+10)                // Цикл по десяткам
     {
      for(int j=1; j<=9; j++)                  // Цикл по единицам
         Text[i+j]=Text[i] + Text[j];          // Вычисление значения   
     }
   return;                                     // Выход из init()
  }
//--------------------------------------------------------------------
int start()                                     // Спец. ф-ия start()
  {
   int Delta=NormalizeDouble((Bid-Level)/Point,0);// Превышение 
//--------------------------------------------------------------------
   if (Delta>=0)                                // Цена не выше уровня
     {
      Alert("Цена ниже уровня");                // Сообщение
      return;                                   // Выход из start()
     }
//--------------------------------------------------------------------
   if (Delta<100)                               // Цена более 100
     {
      Alert("Более ста пунктов");               // Сообщение
      return;                                   // Выход из start()
     }
//--------------------------------------------------------------------
   Alert("Плюс ",Text[Delta],"pt.");            // Вывод на экран
   return;                                      // Выход из start()
  }
//---------------------------------------------------------------------
По-моему в условных операторах неправильно проставлены знаки сравнения. Они должны быть с точностью до наоборот. Скажите прав ли я? И если нет, то почему так?  
 
Vladon:

Por que você achava que a culpa era do indicador?

Por exemplo, otimizei o AMA, é uma otimização muito mais rápida, embora o indicador seja complexo.

Não vou dizer com certeza que a culpa é do indicador. Eu ainda não tenho muita experiência nisso.

Mas como acelerá-lo? Eu fiz tudo aqui mesmo ou posso mudar alguma coisa?

Em princípio, basta que o indicador seja calculado utilizando as últimas 100 barras, mas se eu definir o número 100 em vez de 500, os valores desaparecem.

extern int Limit=70;

if(counted_bars<0) return(-1);
   if(counted_bars>0) counted_bars--;
 
   limit1=Bars-counted_bars-1;
   if (limit1>Limit && Limit>0) limit1=Limit;
   limit2=limit1;
   limit3=limit2;
   limit4=limit3;
   if(limit1>0) 
     {
      limit1=500-Period_MA_1-1;
      limit2=limit1-p2;
      limit3=limit2-p3;
      limit4=limit3-p4;
     }
Se você realizar a otimização a esta velocidade, sua barba de acabamento crescerá até o chão e o mullens ganho não será útil) Bem, ou o mercado será completamente diferente.
 
alxm:
Boa tarde. Você pode me dizer se é possível definir ou calcular programticamente a largura/altura em um gráfico de um objeto OBJ_TEXT?

Texto provavelmente não, mas etiqueta, por favor.

docs.mql4.com/pt/constants/objectconstants/enum_object_property

Propriedades OBJPROP_XSIZE e OBJPROP_YSIZE

 
Vladon:


Obrigado pela ajuda com o operador do laço, tudo funcionou bem.
 
Forexman77:



Mas, como acelerá-lo? Eu fiz tudo aqui mesmo ou há algo que eu possa mudar?



Bem, aqui você pode ver imediatamente a bagunça ao recalcular, por exemplo, uma barra foi adicionada.

limit1=Bars-counted_bars-1;

limite1 serão dois... E então

 if(limit1>0) 
     {
      limit1=500-Period_MA_1-1;

De qualquer forma, o recálculo está completamente errado.

 
Vladon:



Muito obrigado, tenha um bom dia :) >)
 
splxgf:


Bem, aqui você pode ver que o recálculo está estragado, por exemplo, uma barra foi adicionada.

limite1 serão dois... E então

De qualquer forma, o recálculo está completamente errado.

Qual é a maneira correta de fazer isso? É por isso que estou perguntando. Eu não sei realmente como contar indicadores.

Eu vou adivinhar:
limit1=Bars-counted_bars;

deveria ser assim?

Eu não sei o que está acontecendo aqui.

if(limit1>0) 
     {
      limit1=500-Period_MA_1-1;
Se em geral, é suficiente para mim ter o indicador calculado nas últimas 100 barras.
Razão: