[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 309

 
Zhunko muchas gracias, todo vuelve con un boomerang y lo bueno también.
 
artmedia70:
Exactamente. La variable global Reason obtiene un valor, pero no lo obtiene en deinit(), sino en init() para que al ejecutar init(), pueda ver el motivo de la última desinicialización y realizar una determinada acción en función del valor. Pero no funciona como debería.

Te han dicho cómo hacerlo. En deinit() se averigua el motivo de la última desinicialización y se pasa por una variable declarada globalmente. En init() se comprueba el valor de la variable y se averigua el motivo de la última desinicialización. ¡¡¡Funciona!!!

PS Aparentemente, no todo el mundo se da cuenta de que init()/deinit() no cambian los valores de las variables declaradas globalmente a menos que se indique explícitamente en las declaraciones dentro de las funciones.

En realidad, es mejor no cerrar las órdenes en init(). Allí, MarketInfo() no suele funcionar como se espera.

int    DeinitReason = 0; // определяем переменную на глобальном уровне
...
int init ()
{
...
      if ( DeinitReason == 3) // если смена таймфрейма
...
}

int deinit()
  {
//----
   DeinitReason = UninitializeReason( );
   Print("DeinitReason ",DeinitReason);
//----
   return(0);
  }
 
Mislaid:
Te han dicho cómo hacerlo. En deinit() se averigua el motivo de la última desinicialización y se pasa por una variable declarada globalmente. En init() se comprueba el valor de la variable y se averigua el motivo de la última desinicialización. ¡¡¡Funciona!!!
Me he dado cuenta de que Artyom tiene un problema específicamente con el cambio de TF M5. Ahí hay un error. Deberíamos comprobar si este es el caso. Tal vez sea un error en MT4.
 
Zhunko:
Esto sugirió lo que harías con esta función. Una característica como ésta suele pasar por la historia.

Ni siquiera puedo imaginarme la ejecución de la función en un bucle...
 
hoz:

No puedo imaginar una función que se ejecute en un bucle...

De nada:
for(i=OrdersTotal()-1;i>=0;i--){
    Print(GetOrderInfo(i,OrderMagic,.....));// вызов пользовательской функции 
}

for(i=0;i<OrdersTotal();i++){/// вызов функции "ордерс тотал" на каждой итерации

}
 
Zhunko:
Me di cuenta de que Artem tiene un problema con el cambio de M5 TF. Ahí hay un error. Me gustaría comprobar si es así. Tal vez sea un error de MT4.

No, no es un error. Aquí está el EA. Se han cambiado los plazos de M1 a H1

//+------------------------------------------------------------------+
//|                                                          111.mq4 |
//|                      Copyright © 2006, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

int    DeinitReason = 0; // определяем переменную на глобальном уровне
int init ()
{
}

int deinit()
  {
//----
   DeinitReason = UninitializeReason( );
   Print("DeinitReason ",DeinitReason);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+ 
19:20:02 111 CADJPY,M15: inicializado
19:20:09 111 CADJPY,M15: DeinitReason 3
19:20:09 111 CADJPY,M15: desinicializado
19:20:09 111 CADJPY,M15: uninit razón 3
19:20:09 Supertendencia[1] CADJPY,M15: desinicializado
19:20:09 Supertrend[1] CADJPY,M15: uninit reason 3
19:20:09 HLC CADJPY,M15: desinicializado
19:20:09 HLC CADJPY,M15: uninit razón 3
19:20:09 AMA optimizado1 CADJPY,M15: desinicializado
19:20:09 AMA optimizado1 CADJPY,M15: uninit razón 3
19:20:09 AMA optimizado1 CADJPY,M15: desinicializado
19:20:09 AMA optimizado1 CADJPY,M15: uninit razón 3
19:20:09 Supertendencia[1] CADJPY,H1: inicializada
19:20:09 HLC CADJPY,H1: inicializado
19:20:09 AMA optimizado1 CADJPY,H1: inicializado
19:20:09 AMA optimizado1 CADJPY,H1: inicializado
19:20:09 111 CADJPY,H1: inicializado
 
Mislaid:

No, no es un error. Aquí está el EA. Se han cambiado los plazos de M1 a H1

¡Eso es bueno! También tengo muchas razones para la desinicialización.

Desaparecido:

En realidad, es mejor no cerrar las órdenes en init(). Allí MarketInfo() no suele funcionar como se espera.

Sí. No puedes. Está escrito en la ayuda.

hoz:

ni siquiera puedo imaginar que la función se ejecute en un bucle...
Es una rutina.
 
Zhunko:

¡Eso es bueno! Porque yo también tengo mucho que ver con las razones de la desinicialización.

Sí. No puedes. Está escrito en la ayuda. Es algo común.

Aquí está la última variante a comprobar. El anterior no tuvo mucho éxito, porque init()/deinit() a veces no se hace amigo de print()

//+------------------------------------------------------------------+
//|                                                          111.mq4 |
//|                      Copyright © 2006, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

int    DeinitReason = 0; // определяем переменную на глобальном уровне
bool firststart = true;
int init ()
{
}

int deinit()
  {
//----
   DeinitReason = UninitializeReason( );
   firststart = true;
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
  if ( firststart )
  {
      Print( "DeinitReason ", DeinitReason, " ", Period( ) );
      firststart = false;
  }
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
 

Me preguntaba cómo escribir una función. La idea es que cuando N velas retroceden en una determinada dirección, debe calcular el número de velas. PERO. Para ello hay varias condiciones, o más exactamente, habrá una lista de ellas a lo largo del tiempo.

Digamos que la tendencia, por ejemplo, se dirige a la baja,... ...un pullback sube. Quiero, si 5 velas subieron, y cada vela fue alcista, y, por ejemplo, el tamaño de cada vela fue mayor quei_sizeOfCurrBar, y algunas otras condiciones, entonces la salida del número de barras continuamente alcista, y devolver algún resultado de la función.

¿Cuál es la mejor manera de escribirlo? De momento me he puesto a escribir, y entiendo que debería pasarlo por un bucle por barras, y de alguna manera debería limitar la vista en la profundidad del histórico no por un número fijo de barras, sino por barras, con esos parámetros, que nos interesan por condiciones.

Esto es lo que tengo, conseguido:

int LastCandlesType()
{
   bool up,    // Свеча направлена вверх
        dn;    // Свеча направлена вниз
   int cnt;    // Счётчик идущих друг за другом бычьих свечей
   
   for (int i=Bars-1; i>=Bars-6; i--)
   {
      if ((Close[i] - Open[i]) <= i_sizeOfCurrBar * Point)    // Пропускаем все бары, размера меньше заданного внешним параметром.
          continue;
      
      if (Close[i] > Open[i])                               // 
          up = true;

      cnt++;
   }
   if (cnt == 5)
       return (BULL_CANDLES);
}

En este momento sólo vamos desde la penúltima barra hasta la barra con índice 6, es decir, 5 barras seguidas. Pero quiero que mi Asesor Experto busque sólo las barras que son alcistas y no todas seguidas. ¿Cómo aplicarlo adecuadamente?

He filtrado correctamente por tamaño.

Y cuando todo está ya escrito, el contador calculará el número de barras continuas con los parámetros nht,etvsvb y si hay suficientes de tales barras, se devolverá algún valor de la función.

 
Mislaid:

Te han dicho cómo hacerlo. En deinit() se averigua el motivo de la última desinicialización y se pasa por una variable declarada globalmente. En init() se comprueba el valor de la variable y se averigua el motivo de la última desinicialización. ¡¡¡Funciona!!!

PS Aparentemente, no todo el mundo se da cuenta de que init()/deinit() no cambian los valores de las variables declaradas globalmente a menos que se indique explícitamente en las declaraciones dentro de las funciones.

En realidad, es mejor no cerrar las órdenes en init(). Allí MarketInfo() no suele funcionar como se espera.

¿Y dónde ves que cierre posiciones en init()? Hice una pregunta sobre la solicitud de borrado, pero donde los borro - no dije eso, y mucho menos preguntar. ¿Por qué crees que es así?
Razón de la queja: