Errores, fallos, preguntas - página 742

 
TheXpert:
Así que haz una fábrica. Eso resolvería el problema.

Ya es bastante fácil trabajar ahí dentro. El objeto tiene una estructura bastante rígida. Llama a un método virtual Load de cada uno de sus miembros, ellos a su vez hacen lo mismo. Al principio de cada bloque de datos (objeto) se escribe el ID del tipo (para control al cargar). Eso es todo. Es una especie de fábrica de fabricación propia.

Entonces se necesitará la fábrica y la tabla de registro de tipos. Aunque el problema no estaba tan resuelto, me las he arreglado con clips y cinta adhesiva. :)

 

El fan de Gunn.

Si el segundo punto de anclaje está en el futuro, el ángulo cambia.

Además, este objeto tiene algunos problemas al copiar (con Ctrl pulsado). Muy a menudo no copia, sino que arrastra el original, y tarda el tercer o quinto intento en copiar.

Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Способы привязки объектов
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Способы привязки объектов
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы объектов / Способы привязки объектов - Документация по MQL5
 
MetaDriver:

Bien, genial.

Slava, ¿puedo preguntar (para el desarrollo general) por qué no se puede inicializar la tabla de métodos virtuales al principio del constructor (después de la inicialización del ancestro)?

Ya te lo he dicho. Los constructores funcionan en una jerarquía. Mientras se construye un ancestro, no hay información sobre los descendientes.
 
stringo:
Ya te lo he dicho antes. Los constructores elaboran la jerarquía. Mientras se construye un ancestro, no hay información sobre los descendientes.

Ya lo he leído. Y lo entendí perfectamente. Y he hecho una pregunta basada en lo que he leído. Intentaré hacerlo más claro, con imágenes.

class MySecond: MyFirst
{
  void  MySecond(MyArg arg): 
    MyFirst(arg)
   { // Можно код инициализации VMT добавлять здесь. Тогда не будет проблем с виртуальными вызовами.
     ...............
     MyVirtualFunc();
      ...........
     return;
   } // Сейчас код инициализации VMT добавляется здесь.

};

Lo entiendo todo, es más difícil hacerlo, hay todo tipo de sutilezas. Es mucho más sencillo y universal (para ti) escribir toda la inicialización implícita al final. E incluso creo de antemano que "nadie hace eso" y que "no es habitual en C++", etc.

Pero para nosotros ( usuarios ), es más simple, universal, razonable y lógico considerar el constructor MySecond() como un territorio de la clase MySecond y no de MyFirst. Piensa en qué es más fácil: hacer que las funciones virtuales funcionen en los constructores o expresar en la documentación restricciones importantes y serias sobre el código de los constructores en varios lugares y, a pesar de ello, recibir regularmente mensajes importantes y serios de los novatos al Service Desk y al Foro "sobre los errores virtuales en los constructores".

 
struct SDaylyRange {double min, max, open, close;};
void OnStart()
  {
//---
   SDaylyRange tmp, tmp2;
   tmp = 2+3 ? tmp : tmp2;
   if (2+3) tmp = tmp; else tmp = tmp2;
  }

El operador tensorial con estructuras da lugar a un error de generación de código (aunque si se sustituye por if, funciona)

 

Recibo regularmente el error 4401

ERR_HISTORY_NOT_FOUND

El siguiente código indicador

datetime prevTime[22];
MqlRates _Rates[];

bool IsNewBar(ENUM_TIMEFRAMES period) {
   datetime currentTime[1];
   CopyTime(Symbol(), period, 0, 1, currentTime);
   int _;
   switch (period) {
      case PERIOD_M1  : _= 1;
         break;
      case PERIOD_M2  : _= 2;
         break;
      case PERIOD_M3  : _= 3;
         break;
      case PERIOD_M4  : _= 4;
         break;
      case PERIOD_M5  : _= 5;
         break;
      case PERIOD_M6  : _= 6;
         break;
      case PERIOD_M10 : _= 7;
         break;
      case PERIOD_M12 : _= 8;
         break;
      case PERIOD_M15 : _= 9;
         break;
      case PERIOD_M20 : _= 10;
         break;
      case PERIOD_M30 : _= 11;
         break;
      case PERIOD_H1  : _= 12;
         break;
      case PERIOD_H2  : _= 13;
         break;
      case PERIOD_H3  : _= 14;
         break;
      case PERIOD_H4  : _= 15;
         break;
      case PERIOD_H6  : _= 16;
         break;
      case PERIOD_H8  : _= 17;
         break;
      case PERIOD_H12 : _= 18;
         break;
      case PERIOD_D1  : _= 19;
         break;
      case PERIOD_W1  : _= 20;
         break;
      case PERIOD_MN1 : _= 21;
         break;  
      default         : _= 0;    
   } 
   if(currentTime[0]== prevTime[_]) return(false);
   else {
      prevTime[_] = currentTime[0];
      return(true);
   }
}

int OnInit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[]) 
if (IsNewBar(_Period)) {
    int err = CopyRates(Symbol(), PERIOD_D1, 0, 2, _Rates);
   Print("Count:", err);
   if (err < 1) {
       Print("ERROR:", GetLastError());
       Print("__Symbol:", Symbol());
       return(rates_total);
   }

}
return(rates_total); 
}

producirá un error inmediatamente al iniciarse (si no en D1). O más bien, una vez después del inicio de la terminal y la apertura del gráfico - para poner el indicador, obtendremos un error. Si el terminal no está cerrado, no se producirá este error al inicio.

Pero después de algún tiempo (un par de horas - 2 horas fueron suficientes para mí) veremos que obtendremos el error en el gráfico ya abierto. (Lo ejecuté en m30)

 

¡Hola, señores desarrolladores!

¿Podemos hacer cambios en el compilador de MQL5 para que al menos nos dé un aviso?

para errores de este tipo en el código.

if(Flag_Exitl=true) {break;}


La condición de comparación aquí no es correcta (debería ser == ), por eso siempre será break.

¿Cómo se puede abordar esta situación en el compilador (si es que es posible), para que pueda tener menos baches al escribir el código?

(Pensé que no funcionaría, parece que se separa la asignación y la comparación en el if, luego se elimina la pregunta).

 
Fia:

¡Hola, señores desarrolladores!

¿Es posible cambiar el compilador de MQL5 para que al menos dé un aviso?

para errores de este tipo en el código.

if(Flag_Exitl=true) {break;}


La condición de comparación no es correcta (debería ser == ), por eso siempre será break.

¿Cómo se puede abordar esta situación en el compilador (si es posible), para que pueda tener menos baches al escribir el código?

(He pensado que no va a funcionar, puedo dividir la asignación y la comparación en si, así se elimina la pregunta).

La condición puede estar escrita incorrectamente pero está permitida en MQL5.

Traduciré lo que has codificado: La variable Flag_Exitl debe ser puesta a true y luego se comprueba si Flag_Exitl es true, entonces se rompe.

La secuencia de acciones es exactamente así.

 

No entiendo muy bien cómo trabajar con búferes que no necesitan ser mostrados en la pantalla.

De acuerdo con el código de abajo por alguna razón

1) no dibuja nada

2) ambos búferes se denominan Label1

aunque contengan los datos correctos

#property indicator_separate_window
#property indicator_buffers 6
#property indicator_plots   2

//--- plot Label1
#property indicator_label1  "Label1"
#property indicator_color1  clrRed, clrWhite
#property indicator_type1   DRAW_COLOR_LINE

//--- plot Label2
#property indicator_label2  "Label2"
#property indicator_color2  clrRed, clrGreen
#property indicator_type2   DRAW_COLOR_LINE

//--- indicator buffers
double         L1_1[];
double         L2_1[];
double         Colors_1[];

//--- indicator buffers
double         L1_2[];
double         L2_2[];
double         Colors_2[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{
   SetIndexBuffer(0,L1_1,INDICATOR_DATA);
   SetIndexBuffer(1,L1_2,INDICATOR_DATA);
   SetIndexBuffer(2, Colors_1,INDICATOR_COLOR_INDEX);
   SetIndexBuffer(3, Colors_2,INDICATOR_COLOR_INDEX);
   SetIndexBuffer(4, L2_1, INDICATOR_CALCULATIONS);
   SetIndexBuffer(5, L2_2, INDICATOR_CALCULATIONS);
   return(0);
}

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[])
{
   for (int i = 0; i < rates_total; i++)
   {
      L1_1[i] = i;
      L1_2[i] = i + 1;
   }
   return(rates_total);
}
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы индикаторов / Стили рисования
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы индикаторов / Стили рисования
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы индикаторов / Стили рисования - Документация по MQL5
 

Hola. Puede que esté escribiendo en la dirección equivocada, pero espero que pueda indicarme la dirección correcta. ¿Dónde ir con una pregunta sobre la API Web para mt5? )

Intentaré explicar la situación por si acaso. Tengo el gestor de МТ y la API WEB con php... La factura en ruso se crea, los datos se envían e incluso se muestran en el gestor de МТ, pero hay un problema - los datos en el gestor de МТ se muestran en unicode ("044404300c0438043b0438044f" - así es como se ve el nombre de usuario). Al enviar los datos no se codifica ni decodifica nada, desde el cliente MT se crea todo con normalidad... Al menos, ¿hacia dónde mirar? (