Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 1179

 
Mikhail:

Cuando hago una consulta como esta:

Obtengo este resultado:

2020.06.17 13:49:53.270 2020.01.02 06:50:00 Símbolo EURUSD_i Dígitos 5 Punto 1e-05

Cuando hago una petición como esta:

Obtengo este resultado:

2020.06.17 13:51:58.787 2020.01.02 06:45:00 Símbolo EURUSD_i Dígitos 0 Punto 0.0

Al mismo tiempo quiero hacer notar que si no inserto la función Print, no me da ningún error, la orden ni siquiera intenta modificarse. Es como si CTrade no viera mi orden.

La comprobación del símbolo y del número mágico no funciona:

Resultado:

2020.06.17 14:37:38.147 2020.01.02 06:50:00 Symbol Magic 0 Ticket 2

El número mágico debe ser 12345, el símbolo es el euro-dólar.

¿Por qué no puedo obtener el símbolo y el medgic?

Si cambias la cadena:

se cambia a

y eliminar la validación por número mágico, entonces tenemos problemas con los precios

2020.06.17 01:38:24.136 2020.01.02 07:40:00 fallida modificar orden #2 comprar stop 0.1 EURUSD_i a 1.12086 sl: 1.12023 tp: 1.12275 -> 1.00000, sl: 1.00000 tp: 1.00000 [Precio inválido].

2020.06.17 01:38:24.136 2020.01.02 07:40:00 CTrade::OrderSend: modificar #2 a 1.00000 (sl: 1.00000 tp: 1.00000) [precio no válido]

2020.06.17 01:38:24.136 2020.01.02 07:40:00 ¡BUY STOP modificación fallida! Resultado Retcode: 10015, descripción del Retcode: precio no válido

Ya me he devanado los sesos, mientras este mismo código funciona bien en otro Asesor Experto.

¿Qué estoy haciendo mal?

Objeto incorrectamente inicializado (o no) de la clase CSymbolInfo.

Si no tienes esta cadena asymbol.Name(Symbol()) entonces añádela.

Si tienes uno, depura en la función Name(string symbol) lo que ocurre.

Rellenar los campos m_digits etc con Refresh().

s.s. A juzgar por lo que has añadido, definitivamente tienes asymbol sin inicializar.

 
Mikhail:

Hasta que no llega la nueva garrapata, no se mueven los botones. Eso es lo que puedo ver con mis ojos. En cuanto el precio cambia, los botones se mueven.

Aunque hoy, incluso en el nuevo tick, los botones han dejado de redibujarse, aunque no he cambiado nada. Sólo se mueve el fondo.

Para aclarar - como usted dice que cambiar las coordenadas en OnTick, y afirmar que, de hecho, los botones se mueven en el siguiente tick. ¿La siguiente garrapata de qué? ¿La que cambió las coordenadas o la de navidad?

 
Aleksey Mavrin:

Su objeto de clase CSymbolInfo se inicializa incorrectamente (o no se inicializa).

Si no tiene dicha cadena asymbol.Name(Symbol()) entonces añádala.

Si tienes uno, depura en la función Name(string symbol) lo que ocurre.

Rellenar los campos m_digits etc con Refresh().

s.s. A juzgar por lo que has añadido, tu asymbol está definitivamente sin inicializar.

En la parte superior de mi código tengo las siguientes líneas
#include <Trade\Trade.mqh>
#include <Trade\OrderInfo.mqh>
#include <Trade\PositionInfo.mqh>
#include <Trade\DealInfo.mqh>
#include <Trade\SymbolInfo.mqh>

CTrade atrade;
COrderInfo aorder;
CPositionInfo apos;
CDealInfo adeal;
CSymbolInfo asymbol;

¿Es una inicialización? Al compilar obtengo la siguiente información

'Trade.mq5 panel' Trade.mq5 panel 1 1

'Trade.mqh' Trade.mqh 1 1

'Object.mqh' Object.mqh 1 1

'StdLibErr.mqh' StdLibErr.mqh 1 1

'OrderInfo.mqh' OrderInfo.mqh 1 1

'HistoryOrderInfo.mqh' HistoryOrderInfo.mqh 1 1

'PositionInfo.mqh' PositionInfo.mqh 1 1

'DealInfo.mqh' DealInfo.mqh 1 1

'SymbolInfo.mqh' SymbolInfo.mqh 1 1

código generado 1 1

0 errores, 0 avisos, 3192 mseg transcurridos 1 1

Después de abrir una orden Buy Stop recalculo todas las órdenes, selecciono una orden abierta y compruebo si el símbolo y el número mqh coinciden:

for(int i=OrdersTotal()-1;i>=0;i--)
          if(aorder.SelectByIndex(i))  
              if(aorder.Symbol()==asymbol.Name() && aorder.Magic()==MagicNumber && Ask < aorder.PriceOpen())

No ocurre nada en esta etapa, como escribí anteriormente asymbol.Name() no devuelve el símbolo de la orden abierta por alguna razón, aorder.Magic() devuelve el valor 0 (aunque mi número mágico es 121345), asymbol.TickSize() devuelve el valor 0. En otras palabras, la comprobación falla y, por lo tanto, se detiene el trabajo sobre la orden. Por favor, aclare"depurar en la función Nombre(símbolo de cadena) lo que está pasando", no entiendo bien esta frase. ¿Qué debo añadir y dónde?

 
Aleksey Mavrin:

Para aclarar - como usted dice que cambiar las coordenadas en OnTick, y afirmar que, de hecho, los botones se mueven en el siguiente tick. ¿La siguiente garrapata de qué? ¿La que cambió las coordenadas o la de navidad?

Creo que la secuencia es la siguiente: llega un nuevo tick, cambio las coordenadas del panel, el fondo del panel empieza a moverse hacia la ubicación que deseo, los botones se quedan quietos en ese momento, llega un nuevo tick y los botones se mueven siguiendo al panel hasta la ubicación deseada. ¿Es posible generar garrapatas desde el Nacimiento?
 
Mikhail:

En esta etapa, no pasa nada, porque como ya he escrito arriba, la función asymbol.Name() por alguna razón no devuelve el símbolo de la orden abierta, la función aorder.Magic() devuelve el valor 0 (aunque mi Magic es 121345), la función asymbol.TickSize() devuelve el valor 0. En otras palabras, la comprobación falla y, por tanto, se detiene el trabajo sobre la orden. Por favor, aclare"depurar en la función Nombre(símbolo de cadena) lo que está pasando", no entiendo bien esta frase. ¿Qué debo añadir y dónde?

El error en el índice de orden / ticket puede ser un error a juzgar por la magia 0. En el momento de acceder a la estructura de orden, se escriben allí datos del orden equivocado. En el bucle de selección, puede ocurrir que el siguiente número se coloque en el último conjunto de órdenes, y no el que necesita. Los datos de la última selección de pedidos se devuelven de la estructura de pedidos.

 
Mikhail:
en la parte superior de mi código hay líneas

¿Se trata de una inicialización? Al compilar, obtengo la siguiente información

'Trade panel.mq5' Trade panel.mq5 1 1

'Trade.mqh' Trade.mqh 1 1

'Object.mqh' Object.mqh 1 1

'StdLibErr.mqh' StdLibErr.mqh 1 1

'OrderInfo.mqh' OrderInfo.mqh 1 1

'HistoryOrderInfo.mqh' HistoryOrderInfo.mqh 1 1

'PositionInfo.mqh' PositionInfo.mqh 1 1

'DealInfo.mqh' DealInfo.mqh 1 1

'SymbolInfo.mqh' SymbolInfo.mqh 1 1

código generado 1 1

0 errores, 0 avisos, 3192 mseg transcurridos 1 1

Después de abrir una orden Buy Stop recalculo todas las órdenes, selecciono una orden abierta y compruebo si el símbolo y el número Majdic coinciden:

No ocurre nada en esta etapa, como escribí anteriormente asymbol.Name() no devuelve el símbolo de la orden abierta por alguna razón, aorder.Magic() devuelve el valor 0 (aunque mi número mágico es 121345), asymbol.TickSize() devuelve el valor 0. En otras palabras, la comprobación falla y, por lo tanto, se detiene el trabajo sobre la orden. Por favor, aclare"depurar en la función Nombre(símbolo de cadena) lo que está pasando", no entiendo bien esta frase. ¿Qué debo añadir y dónde?

Caramba, por qué usas algo que no entiendes (que si es una maleta yadda yadda )) )

Y ni siquiera te molestas en leer lo que está escrito

Si no tienes asymbol.Name(Symbol()) entonces añádelo.

s.w. Quería explicar más sobre la inicialización, pero supongo que también sería inútil
 
Valeriy Yastremskiy:

Puede haber un error en el índice del pedido / ticket según la magia 0. En el momento de acceder a la estructura del pedido se almacenan allí los datos del pedido equivocado. En el ciclo de selección puede ocurrir que el siguiente número vaya al último conjunto de órdenes pero no al que usted necesita. Los datos de la última selección de pedidos se devuelven desde la estructura de pedidos.

Todavía no he podido averiguar por qué se produce este fallo. Finalmente, tomé el código que se encarga de crear el panel con botones y lo reescribí en el EA donde este mismo código funciona correctamente y todo funcionó. De todos modos, ¡gracias!
 

¡Buenas tardes!

Ayúdame a resolver un problema sencillo.

Contador de huecos. Quiero contar los huecos de más de 10 puntos.

int start()
{
int gap=0;
int r=MathAbs(Close[2]-Open[1])/Point;
if (r>=10)
{
gap=gap+1;
}
Comment("ГЭП!========: ",gap,"\n",
        "ВЕЛИЧИНА ГЭПА==: ",r,"\n");
return(0);

La variable "gap" se pone a cero. No entiendo por qué. Ya lo he intentado todo. He probado los bucles y la estática, pero no funciona. Sospecho que escribí mal los bucles.

 
Alexey Belyakov:

¡Buenas tardes!

Ayúdame a resolver un problema sencillo.

Contador de huecos. Quiero contar los huecos de más de 10 puntos.

La variable "gap" se pone a cero. No entiendo por qué. Ya lo he intentado todo. He probado los bucles y la estática, pero no funciona. Sospecho que escribí mal los bucles.

La variable gap está en el ámbito de la función start - y con cada nuevo tick se reinicializa con cero

 
Alexey Belyakov:

¡Buenas tardes!

Ayúdame a resolver un problema sencillo.

Contador de huecos. Quiero contar los huecos de más de 10 puntos.

La variable "gap" se pone a cero. No entiendo por qué. Ya lo he intentado todo. He probado los bucles y la estática, pero no funciona. Sospecho que escribí mal los bucles.

int gap=0;
int start()
{
int r=MathAbs(Close[2]-Open[1])/Point;
if (r>=10)
{
gap++;
}
Comment("ГЭП!========: ",gap,"\n",
        "ВЕЛИЧИНА ГЭПА==: ",r,"\n");
return(0);
int start()
{
static int gap=0;
int r=MathAbs(Close[2]-Open[1])/Point;
if (r>=10)
{
gap=gap+1;
}
Comment("ГЭП!========: ",gap,"\n",
        "ВЕЛИЧИНА ГЭПА==: ",r,"\n");
return(0);
Razón de la queja: