Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. En ninguna parte sin ti - 6. - página 561

 
Forexman77:

Querida, necesito tu ayuda.

Estoy optimizando mi Asesor Experto por el indicador, el código del indicador está abajo.

La optimización es lenta, he hecho un código en el EA para recalcular el indicador en una nueva barra, que no es del todo adecuado.

Por favor, mire el código del indicador, lo que se puede hacer en él para que el recálculo sea más rápido.


¿por qué crees que es culpa del indicador?
 
Vladon:

¿calcular el número de caracteres, + el tamaño de la letra, así?

El tamaño de la letra no le da el conocimiento que necesita. Tienes que dibujar varios objetos uno encima de otro. Sólo el primer objeto tiene un punto de anclaje. ¿Cómo se obtiene el punto de anclaje del segundo objeto y de los siguientes?
 
Vladon:


Finalización forzada del EA en caso de que el usuario descargue el EA.

es mejor registrar los datos directamente al principio.

No es posible hacerlo a través del inicio. La misma imagen.
----------------------------------------------------
stringo 25.03.2014 13:28

El tiempo de ejecución deinit está limitado a 10 segundos.

En el probador en la finalización normal de la bandera de parada no se establece, por lo que deinit se completa en silencio.

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

¿Tal vez se imponga un límite de 10 segundos en la operación de cualquier función?
 
Hola! Al estudiar MQL4 me ha surgido una pequeña duda. El problema está publicado en el tutorial de este sitio. Esta es la condición: Tarea 25. Crear un programa que realice las siguientes condiciones: si el tipo de cambio ha subido por encima del nivel especificado, entonces dar un mensaje, en el que las palabras indiquen que el tipo ha superado el nivel (hasta 100 puntos); en otros casos, dar un mensaje de que el tipo no supera el nivel especificado.
Y aquí está la solución propuesta:
//--------------------------------------------------------------------
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 qué crees que es culpa del indicador?

Por ejemplo, optimicé AMA, es mucho más rápido optimizando, aunque el indicador es complejo.

No voy a asegurar que sea culpa del indicador. Todavía no tengo mucha experiencia en ello.

Pero, ¿cómo acelerarlo? ¿He hecho todo bien aquí o puedo cambiar algo?

En principio, basta con que el indicador se calcule con las últimas 100 barras, pero si pongo el número 100 en lugar de 500, los valores desaparecen.

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;
     }
Si se lleva a cabo la optimización a esta velocidad, su barba de terminación crecerá hasta el suelo y los mullens ganados no serán útiles) Bueno, o el mercado será completamente diferente.
 
alxm:
Buenas tardes. ¿Pueden decirme si es posible definir o calcular mediante programación la anchura/altura en un gráfico de un objeto OBJ_TEXT?

Texto probablemente no, pero etiqueta por favor

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

Propiedades OBJPROP_XSIZE y OBJPROP_YSIZE

 
Vladon:


Gracias por la ayuda con el operador de bucle, todo ha funcionado bien.
 
Forexman77:



Pero, ¿cómo acelerarlo? ¿He hecho todo bien aquí o hay algo que pueda cambiar?



Pues bien, se puede ver inmediatamente que el cálculo es erróneo, por ejemplo, se ha añadido una barra.

limit1=Bars-counted_bars-1;

El límite1 será de dos... Y luego

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

De todos modos, el recálculo es completamente erróneo...

 
Vladon:



Muchas gracias, que tenga un buen día :) >)
 
splxgf:


Pues bien, aquí se puede ver inmediatamente que el recálculo ha metido la pata, por ejemplo se ha añadido una barra.

El límite1 será de dos... Y luego

De todos modos, el recálculo es completamente erróneo...

¿Cuál es la forma correcta de hacerlo? Por eso pregunto. No sé realmente cómo contar los indicadores.

Voy a adivinar:
limit1=Bars-counted_bars;

¿debería ser así?

No sé qué está pasando aquí.

if(limit1>0) 
     {
      limit1=500-Period_MA_1-1;
Si en general, me basta con que el indicador se calcule sobre las últimas 100 barras.