[ARCHIVO]Cualquier pregunta de novato, para no saturar el foro. Profesionales, no lo dejéis pasar. No puedo ir a ningún sitio sin ti - 5. - página 317

 
gyfto:

¿Cómo puedo simplificar esta expresión?

es del algoritmo ADX de MetaQuotes. Las propias MetaQuotes utilizan esta expresión:

- ¿cómo simplificarlo?


¿Por qué no le conviene la opción más sencilla?

z=0;
if(y>x && y>0) z=y;
 
Roger:


¿Por qué la opción más sencilla no es suficiente para ti?


Supongo que a veces hay que mirar un problema desde un ángulo diferente. Sí, gracias.
 
gyfto:

hoz, en me preguntaba cómo acortar aún más el si.Véase: si ponemos una variable

tenemos cnt=cnt+paso, donde

Pero 1=cnt/cnt, a -cnt=cnt/(-1), la única diferencia es el denominador. Ahora recordemos que x^0=1, x^1=x, es decir, podemos poner nuestra variable booleana _if en el exponente, es decir,paso=cnt/a*(cnt^_if); donde

Pero ±a es supuestamente 2*_if-1, es decir

O simplificamos


Vaya, has simplificado las cosas. No entiendo su lógica.
 
Me imaginé que bajaríamos a si... :-)))
 
zoritch:
Me imaginé que bajaríamos a si... :-)))

También comprendí que no entendía nada. Ni siquiera esos iconos que no entiendo... :)
 
hoz:

Las barras de un signo suben, es decir, son alcistas.

int LastCandlesType(int trend)
{
   int cnt,                            // Счётчик идущих друг за другом свечей с требуемыми признаками

   for (int i=i_AnyBarsToHistory; i>=1; i--)
   {
      if ((Close[i] - Open[i]) >= i_sizeOfSequentialCorrectionBar * pt)     // Если бар соответствует требуемым признакам..
          cnt++;                                                                     // .. прибавим 1 к счётчику

      if (Close[i] < Open[i])                                                        // Если бар, не соответствует основному признаку..
          cnt = 0;                                                                   // .. счётчик обнуляем
      
/*      if (i == 1)
      Print("i = ", i,"; cnt = ", cnt);*/
   }

   if (cnt == 3)                                                                     // Если 5 баров вподряд бычьи..
    return (REQUIRED_SEQUENTIAL_CANDLE_GOT);                                         //..Выходим из функции
}

Cómo hacer para que cuando se pase un parámetro de tendencia a esta función, que será responsable de la transferencia de la tendencia principal asumida en el momento, el cálculo se base en este parámetro.

Es decir, si latendencia == a la baja, la función en el bucle era como ahora, y sila tendencia == al alza, se intercambiaban en el bucle el Open[i] y el Close[i], para que se cumplieran las condiciones. En ese caso, el precio de cierre de la barra será menor que el precio de apertura y la diferencia será menor.

int LastCandlesType(bool trend)//trend равен 1 (бычий) или 0 (медвежий)
   int cnt,                            // Счётчик идущих друг за другом свечей с требуемыми признаками

   for (int i=i_AnyBarsToHistory; i>=1; i--)
   {
      if ((2*trend-1)*(Close[i] - Open[i]) >= i_sizeOfSequentialCorrectionBar * pt)     // Если бар соответствует требуемым признакам..
          cnt++;                                                                     // .. прибавим 1 к счётчику

      if ((2*trend-1)*(Close[i] - Open[i]) < i_sizeOfSequentialCorrectionBar * pt)    // Если бар, не соответствует основному признаку..
          cnt = 0;                                                                   // .. счётчик обнуляем
      
/*      if (i == 1)
      Print("i = ", i,"; cnt = ", cnt);*/
   }

   if (cnt == 3)                                                                     // Если 5 баров вподряд бычьи..
    return (REQUIRED_SEQUENTIAL_CANDLE_GOT);                                         //..Выходим из функции
}

O para simplificarlo aún más

int LastCandlesType(bool trend)//trend равен 1 (бычий) или 0 (медвежий)
   int cnt,                            // Счётчик идущих друг за другом свечей с требуемыми признаками

   for (int i=i_AnyBarsToHistory; i>=1; i--)
   {
      bool _if=((2*trend-1)*(Close[i] - Open[i])>=i_sizeOfSequentialCorrectionBar * pt); cnt=cnt+cnt/((2*_if-1)*MathPow(cnt, _if));
      
/*      if (i == 1)
      Print("i = ", i,"; cnt = ", cnt);*/
   }

   if (cnt == 3)                                                                     // Если 5 баров вподряд бычьи..
    return (REQUIRED_SEQUENTIAL_CANDLE_GOT);                                         //..Выходим из функции
}

Δ es la diferencia, es decir,Close[i] - Open[i], ^ es el signo de la potencia. const - constante en esta expresión, es deciri_sizeOfSequentialCorrectionBar * pt, notación matemática estándar, no he inventado nada. 2*bVar-1 es similar a±1, bVar aquí es cualquier variable bool. Y la expresión 2*bVar-1 no toma valores 0 y 1, sino -1 y +1. ≥ es MQL4 >=, también una notación matemática estándar.step es un paso, es decir, en cnt++ el paso es 1, y en cnt=0 el paso es -cnt. ¿Qué más no quedó claro en las notaciones?

 
No sé cómo crear registros, ¿cómo puedo hacer que MT4 borre los registros libres automáticamente (o que no los cree)? Algunas empresas de corretaje con 5 dígitos, estos registros para el día crecen a un tamaño aterrador (1,6 gb), y el espacio en el vps es limitado. Gracias de antemano.
 
M2012K:
¿Cómo puedo sugerir - cómo hacer que MT4 borrar registros libres de forma automática (o no crearlos en absoluto)? Tengo que utilizar algunas empresas de corretaje con 5 dígitos, estos registros comienzan a crecer en un día (por 1,6 gb), y el lugar en vps es limitado. Gracias de antemano.

Puedes hacerlo tú mismo:

Biblioteca1, biblioteca2.

==============

Aunque, el último archivo (actual) es abierto por el terminal. No es fácil borrarlo. Pero puedes borrar el contenido, que está escrito al principio.

La creación de registros no está desactivada.

==============

1. Cree un enlace simbólico (library1) a la carpeta de registros en la carpeta de archivos.

2. Elimina todos los archivos innecesarios utilizando las herramientas del MQL4.

Abrir el archivo actual con MQL4. Edítalo como necesites.

4. Cierra el archivo.

5. Puedes eliminar el enlace. No es necesario. Le será útil más adelante.

==============

También puede crear un archivo de script (BAT) y ejecutarlo en el Asesor Experto. El guión es el mismo que el anterior. Sólo sin crear un enlace. Trabajar con archivos, por supuesto, utilizando las herramientas de Windows.

 
M2012K:

¿Cómo puedo aconsejar que se borren los registros libres automáticamente (o que no se creen)?

Porque en algunos DCs con 5 dígitos, estos logs para un día crecen a un tamaño espantoso (por 1,6 gb), y el espacio en el vps es limitado. Gracias de antemano.

¿Registros de qué?

¿Cuál es la diferencia entre esto y los errores de EA?

 

¡Hola! Necesito ayuda para perfeccionar mi robot primitivo. Para empezar, explicaré mi sencilla estrategia para que quede más claro dónde se necesita ayuda y para qué.

La esencia de la ST:

1. Si el precio de apertura es inferior a la MA y el precio de cierre es superior, compramos.

2. Si el precio de apertura es superior a la MA y el precio de cierre es inferior, debemos vender.

Si el precio se ha movido un X% desde el precio más favorable, entonces cerramos la orden. Esto es similar a un trailing stop pero en lugar de pips X% de la distancia de apertura de la orden y el mejor precio. Como se muestra en la imagen:

AB - distancia desde la apertura de la orden hasta el precio más favorable; BC=X% de AB; C - cierre de la orden.

Los puntos 1 y 2 los he escrito en el programa:

extern int period=50;
extern int ma_shift=0;
extern int Magic=666;
extern double lot=0.1;
extern int SL=150;


//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
  int kolpos=0;
  double ma=iMA (NULL,0,period,ma_shift,MODE_SMMA,PRICE_MEDIAN,0);
//----
   for (int pos=0; pos<OrdersTotal(); pos++)
   {
   OrderSelect (pos, SELECT_BY_POS, MODE_TRADES);
   if (OrderSymbol()==Symbol()&&OrderMagicNumber()==Magic)
   kolpos++;
   }
   if (kolpos==0)
   {
 
   if(Open[1]>ma && Close[1]<ma)  
   OrderSend(Symbol(),OP_SELL,lot,Bid,10,Bid+SL*Point,0,NULL,Magic,0,Red);
   if(Open[1]<ma && Close[1]>ma)  
   OrderSend(Symbol(),OP_BUY,lot,Ask,10,Ask-SL*Point,0,NULL,Magic,0,Green);
   
   }
   
   
  
//----
   return(0);
  }

En general, necesito ayuda para escribir una función de cierre de órdenes para mi TS (punto 3) y adaptar el código existente a la función.

P.D. Y sé que el TS no es bueno.