Características del lenguaje mql4, sutilezas y técnicas - página 10

 
Alexey Viktorov:

No puedo entender cuál es la sorpresa. Hay un valor int del tipo de orden en la documentación.

OP_BUY

0

Comprar

OP_VENDER

1

Vender

OP_BUYLIMIT

2

Orden pendiente de Límite de Compra

OP_SELLLIMIT

3

Orden pendiente de VENTA LIMITADA

OP_BUYSTOP

4

Orden pendiente de COMPRA STOP

OP_SELLSTOP

5

Orden pendiente de venta de STOP


#define OP_BALANCE 6
#define OP_CREDIT 7

Por lo tanto, con una matriz de 6 celdas, a veces se puede ir por la borda.

 

Foro sobre comercio, sistemas de comercio automatizados y prueba de estrategias de comercio

¿Quiero mover el comentario de EA de la esquina izquierda a la derecha?

fxsaber, 2018.07.10 15:13

// Вывод комментария по примерным координатам
void CommentXY( string Str, const uint X = 0, const uint Y = 0 )
{
  string Shift = NULL;
  
  StringInit(Shift, X >> 2, ' ');
  
  if (StringLen(Shift))
  {
    StringReplace(Str, "\n", "\n" + Shift);
    
    Str = Shift + Str;
  }
  
  if (Y)
  {
    StringInit(Shift, Y / 14, '\n');
    
    Str = Shift + Str;
  }
  
  Comment(Str);  
}


Aplicación

void OnStart()
{
  const uint Height = 200;
  const uint Width = 200;
  
  while (!IsStopped())
  {
    CommentXY("Hello World!\nCommentXY", MathRand() * Width / SHORT_MAX, MathRand() * Height / SHORT_MAX); // Вывод комментария со сдвигом (ноль - левый-верхний угол).
    
    Sleep(200);
  }
}
 
fxsaber:

¿Tienes una respuesta oficial de los desarrolladores? Hasta ahora sólo veo que has buscado, pensado y decidido.

 
Artyom Trishkin:

¿Tienes una respuesta oficial de los desarrolladores? Hasta ahora sólo veo que has buscado, pensado y decidido por tu cuenta.

Mi conclusión sobre el nivel de "autosuficiencia" no es mejor que esta al principio de este hilo

Foro sobre trading, sistemas de trading automatizados y pruebas de estrategias de trading

Peculiaridades de mql4, consejos y trucos

el tipo de orden y el precio que le corresponde. Es suficiente con escribir OrderClosePrice()


No es necesario sufrir por tonterías/paranoias.

 
fxsaber:

Mi conclusión sobre el nivel de "autosuficiencia" no es mayor que esta al principio de este hilo


No hay necesidad de sufrir tonterías/paranoias.

Debes haberte perdido el momento en que la mayoría de los que no sufrían de "paranoia" reescribieron urgentemente sus códigos mientras los EAs colapsaban de la noche a la mañana. Debido a la dependencia del triaje. Fue hace mucho tiempo, pero la gente todavía tiene recuerdos. Los que tuvieron problemas empezaron a escribir códigos independientes de la clasificación. No me he metido en líos, simplemente lo he leído en el foro y me lo he tomado a pecho.

 
Artyom Trishkin:

Debes haberte perdido la época en la que la mayoría de los que no sufrían de "paranoia" estaban reescribiendo urgentemente sus códigos mientras los EAs se colapsaban de la noche a la mañana. Debido a la dependencia del triaje. Fue hace mucho tiempo, pero la gente todavía tiene recuerdos. Los que tuvieron problemas empezaron a escribir códigos independientes de la clasificación. No me he metido en líos, simplemente lo he leído en el foro y me lo he tomado a pecho.

Por desgracia, este mito no encuentra apoyo en la historia del foro. Además, los promotores han dejado clara su posición de que tales cambios no pueden realizarse por principio.


Por ejemplo, puede escribir con seguridad

if (OrderType() <= OP_SELL)
  ReverseType = 1 - OrderType();


en lugar de

if ((OrderType() == OP_BUY) || (OrderType() == OP_SELL))
  ReverseType = (OrderType() == OP_BUY) ? OP_SELL : OP_BUY;


Puede escribir libremente

Foro sobre trading, sistemas de trading automatizados y pruebas de estrategias de trading

Peculiaridades del lenguaje mql4, consejos y trucos

fxsaber, 2018.04.03 16:15

double Lots[] = {0, 0, 0, 0, 0, 0, 0, 0};

for (int i = OrdersTotal() - 1; i >= 0; i--)
  if (OrderSelect(i, SELECT_BY_POS))
    Lots[OrderType()] += OrderLots();

etc.

 
fxsaber:

Por desgracia, este mito no encuentra apoyo en la historia del foro. Además, los promotores han dejado clara su posición de que tales cambios no pueden realizarse por principio.

Por ejemplo, puede escribir lo siguiente


¿Por qué todas estas pseudooptimizaciones, cuyos matices tenemos que tener en cuenta constantemente? ¿Es realmente tan difícil escribir un código que no dependa de esas suposiciones (significado de una constante con nombre)? ¿Qué sentido tienen estas construcciones, aparte de mostrar cierto conocimiento de los matices del compilador, pero en absoluto que sean más fáciles de entender?

 
Ihor Herasko:

¿Por qué todas estas pseudooptimizaciones, cuyos matices hay que tener constantemente en cuenta? ¿Realmente es tan difícil escribir código que no dependa de tales suposiciones (cuál es el significado de tal o cual constante con nombre)? De todos modos, ¿qué sentido tienen estas construcciones, aparte de mostrar cierto conocimiento de los matices del compilador, pero en absoluto que sean más fáciles de entender?

Es extraño, no tengo ningún problema con la lectura de dicho código. Además, su lectura y comprensión es más rápida que la del código "canónico".

Pues bien, el ejemplo anterior con Lots[] es un tesoro que muestra cómo el código puede ser superlacónico y claro al mismo tiempo. Y ojo, no es para nada "canónico".

Probablemente, si miras el código fuente de muchos trabajos de Market/Freelance, no sólo te encontrarás con jirones de código "canónico", sino que también te encontrarás con una terrible ineficiencia de rendimiento y un factor no menos importante: la comprensión del código durante la lectura.


El mismo amor inextinguible por continuar es una total falta de respeto por las posibilidades de la lengua. El código de 100 líneas se percibe mucho mejor que el de 200 líneas haciendo lo mismo. Esta es la razón por la que la gente se quejó inicialmente de MQL5. Mira el rediseño del código de MT4 en QB para MT5 - es muy difícil entender la lógica de TC (el código es muchas veces mayor). Es más fácil ir al original de MT4 y mirar el código.

 
fxsaber:

Extrañamente, no tengo ningún problema en leer dicho código. Además, su lectura y comprensión es más rápida que la del código "canónico".

En muchas empresas de software, este tipo de código se llevaría los dedos. Lo primero que debes hacer siempre y en todo momento es evitar la "lectura innecesaria". Por ejemplo, si utiliza una condición al introducir una función:

if (<условие>)
{
}

se recomienda escribir:

if (!<условие>)
   return;

Este planteamiento realmente saca de apuros la fijación de condiciones.

Pues bien, el ejemplo anterior con Lots[] es un verdadero tesoro, que muestra cómo el código puede ser a la vez superlacónico y totalmente comprensible. Y ojo, no es para nada "canónico".

Una vez más, es un dolor de cabeza. Al fin y al cabo, nadie comprobó lo que devolvía la función OrderType(). ¿O tal vez devolvió -1 o 6? Este es un ejemplo de cómo se utilizan las propiedades del compilador, de las que siempre se debe prescindir. Usted mismo cita muchos ejemplos de código multiplataforma. Entonces, ¿por qué se aleja de ella en este caso? Saldrá un nuevo compilador de MQ y este código ya no funcionará correctamente.

El mismo amor inextinguible por continuar es un desprecio total por las posibilidades de la lengua. Un código de 100 líneas se comprende mucho mejor que un código de 200 líneas haciendo lo mismo. Esta es la razón por la que la gente se quejó inicialmente de MQL5. Mira el rediseño del código de MT4 en QB para MT5 - es casi imposible entender la lógica de TC (el código es mucho más grande). Es más fácil ir al original de MT4 y mirar el código.

Con continuar es la misma situación. Un código como:

if (OrderSelect(i, SELECT_BY_POS) && OrderSymbol() == Symbol() && OrderMagicNumber() == m_nMagicNumber)
{
}

es más difícil de leer que:

if (!OrderSelect(i, SELECT_BY_POS))
   continue;

if (OrderSymbol() != Symbol())
   continue;

if (OrderMagicNumber() != m_nMagicNumber)
   continue;
Y, sin embargo, la eficacia de la ejecución es la misma en ambos casos.