Preguntas de los principiantes MQL5 MT5 MetaTrader 5 - página 1501

 
MrBrooklin #:

Basándome en mi práctica de comunicarme en el Foro, puedo decirte que si enseñas el código que ya has escrito de una vez, te contestarán más rápido y te dirán dónde está el error en el código.

Saludos, Vladimir.

Ok, muchas gracias por tu opinión. Vamos a intentarlo. Un breve antecedente para entender. Tengo la intención de utilizar la función en un indicador basado en Renko, superpuesto en el gráfico principal. Hay una necesidad de determinar el tamaño actual de ladrillos. ZigZag está construido sobre la base del gráfico Renko, tiene, entre otras cosas, dos matrices - una con tops y otra con bottoms. Ahora tengo que determinar el GreatestCommonDivider de las distancias entre ellos para ajustar el tamaño de los ladrillos de forma automática.

De momento he esbozado esta especie de krakozabra y ya está, estoy perplejo, no se me ocurre qué hacer a continuación.

//+------------------------------------------------------------------+
//| Вычисляем значение НОД(НаибольшийОбщийДелитель)=размера кирпичика|
//+------------------------------------------------------------------+
int CalculateBrickSize(int &size_brick, double &Arr_PeakBuff[], double &Arr_BottomBuff[])
  {
   int    size_zigbuf = 0;
   double peak        = 0.0;
   double bottom      = 0.0;

   int zigLag   = 0.0;
   int Arr_ZigLag[];

   if(!ArrayGetAsSeries(Arr_PeakBuff))
      ArraySetAsSeries(Arr_PeakBuff,   true);
   if(!ArrayGetAsSeries(Arr_BottomBuff))
      ArraySetAsSeries(Arr_BottomBuff, true);
   ArrayInitialize(Arr_ZigLag, 0.00);

   size_zigbuf = MathMin(ArraySize(Arr_PeakBuff), ArraySize(Arr_BottomBuff));
   size_zigbuf = MathMin(size_zigbuf, ChartVisibleBars()) - 1;

   if(size_zigbuf > 0)
      ArrayResize(Arr_ZigLag, size_zigbuf);
   for(int i = 0; i < size_zigbuf; i++)
     {
      if(Arr_PeakBuff[i] != EMPTY_VALUE)
         peak = NormalizeDouble(Arr_PeakBuff[i], _Digits);
      if(Arr_BottomBuff[i] != EMPTY_VALUE)
         bottom = NormalizeDouble(Arr_BottomBuff[i], _Digits);
      if(peak == 0 || bottom == 0)
        {
         zigLag = 1;
        }
      else
         zigLag = (int)DoubleToString(MathAbs(peak - bottom)*100000, 0);
      Arr_ZigLag[i] = zigLag;
     }
//---
   int delimoe = 0;
   int delitel = 1;
   int ostatok = 1;
   ArraySort(Arr_ZigLag);

   for(int i = ArraySize(Arr_ZigLag)-1; i > 0; i--)
     {
      if(Arr_ZigLag[i] != Arr_ZigLag[i-1])
        {
         if(delimoe == 0)
            delimoe = MathMax(Arr_ZigLag[i], Arr_ZigLag[i-1]);
         if(delitel == 1)
            delitel = MathMin(Arr_ZigLag[i], Arr_ZigLag[i-1]);
         ostatok = (int)MathMod(delimoe, delitel);
         if(ostatok == 0)
           {
            delimoe = delitel;
            delitel = 1;
            ostatok = 1;
            continue;
           }
         else
            while(ostatok != 0)
              {
               ostatok = (int)MathMod(delimoe, delitel);
               delimoe = delitel;
               delitel = ostatok;
              }
        }
     }
   //Print("delimoe = ", delimoe);
   //Print("delitel = ", delitel);
   //Print("ostatok = ", ostatok);
   return(size_brick);
  }
//+------------------------------------------------------------------+
 
Por supuesto, esto es sólo un borrador, no juzgues estrictamente. Creo que me equivoqué en alguna parte, es todo un poco desordenado, tengo que encontrar una solución más simple y más clara, pero no puedo conseguir en mi cabeza yet.....
 
Sergey Voytsekhovsky #:
Por supuesto, esto es sólo un borrador, no juzgues estrictamente. Creo que me he equivocado en alguna parte, está todo un poco desordenado, necesito encontrar una solución más simple y clara, pero no se me ocurre todavía....
Sergey, forma un array de números para los que quieras encontrar el NOD y pásalo a la función ArrayGcd() de mi post anterior.

Pero no estoy seguro de que puedas usar NOD en este caso. Parece que quieres calcularlo para números que no tienen ninguna relación rígida entre ellos, asegurando la presencia de un divisor común no trivial.
Entonces con alta probabilidad siempre obtendrás NOD = 1.
 
Yuriy Bykov #:
Sergey, forma un array de números para los que quieras encontrar el NOD y pásalo a la función ArrayGcd() de mi post anterior.

Gracias, vi tu mensaje después de haber enviado el anterior, ahora estoy intentando adaptarlo.

 
Sergey Voytsekhovsky #:

Gracias, vi tu mensaje después de haber enviado el anterior, ahora estoy intentando adaptarlo.

Puedes sustituir ulong por int en cualquier parte del código, pero entonces tienes que asegurarte de que todos los números del array son positivos.
 
Yuriy Bykov #:
Sergey, forma un array de números para los que quieras encontrar el NOD y pásalo a la función ArrayGcd() de mi post anterior.

Pero no estoy seguro de que puedas usar el NOD en este caso. Parece que quieres calcularlo para números que no tienen ninguna relación rígida entre ellos, siempre que haya un divisor común no trivial.
Entonces con alta probabilidad siempre obtendrás NOD = 1.

Tal vez usted necesita para comprobar, y eso es sólo después de codificar el algoritmo. Gracias por tus comentarios.

 

Hola a todos, ¿podéis decirme si es posible importar una función de un EA a otro?

Por ejemplo, hay un EA que abre órdenes, y hay un EA que monitoriza el estado de la cuenta, donde se especifican los parámetros drawdown, etc,

Necesito que cuando se alcance el drawdown del segundo EA, el primer EA no abra órdenes....

¿Como hacerlo por ejemplo?

 
psihodelit importar una función de un EA a otro?

Por ejemplo, hay un EA que abre órdenes, y hay un EA que monitoriza el estado de la cuenta, donde se especifican los parámetros drawdown, etc,

Necesito que cuando se alcance el drawdown del segundo asesor, el primero no abra órdenes....

¿Como hacerlo por ejemplo?

Si el primer EA abre posiciones con un cierto medzhik, entonces puede ordenar estas posiciones en él o en otro EA y calcular su pérdida total de beneficios. Y el segundo Asesor Experto que tiene cuenta esta pérdida de beneficios, por lo que no puede ser un drawdown, no abre posiciones, supervisa el estado de las posiciones con el medzhik deseado. Y, en general, las posiciones, después de que se abren, son por su cuenta, y entre ellos por lo general tienen que encontrar los adecuados)))))

 
psihodelit importar una función de un EA a otro?

Por ejemplo, hay un EA que abre órdenes, y hay un EA que monitoriza el estado de la cuenta, donde se especifican los parámetros drawdown, etc,

Necesito que cuando se alcance el drawdown del segundo asesor, el primero no abra órdenes....

¿Como hacerlo por ejemplo?

Hay varias opciones.

Puedes utilizar el consejo anterior. Es una variante que funciona bastante bien.

Puedes utilizar variables Globales del terminal.

Puedes establecer un intercambio entre Asesores Expertos escribiendo/leyendo un archivo.

Como se suele decir, todos los rotuladores son diferentes para gustos y colores).

 
psihodelit importar una función de un EA a otro?

Por ejemplo, hay un EA que abre órdenes, y hay un EA que monitoriza el estado de la cuenta, donde se especifican los parámetros drawdown, etc,

Necesito que cuando se alcance el drawdown del segundo asesor, el primero no abra órdenes....

¿Como hacerlo por ejemplo?

Para empezar (IMHO por supuesto) necesitas entender algunas sutilezas

  1. Si el código de ambos EAs está disponible para su edición.
  2. ¿Los EAs dejan rastros de su actividad en las Variables Globales?
  3. ¿Tiene al menos conocimientos básicos de codificación?
Si la respuesta a las tres sutilezas es positiva, será fácil implementar lo que ha planeado, si hay lagunas será más difícil, pero también es posible - pensaremos en algo juntos.