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

 
Aleksey Mavrin:

¿hablamos del probador o de internet?

Si está en línea - mira el código, el evento de movimiento no se enruta correctamente. Paneles por cierto en el sitio sólo cinco bibliotecas diferentes, ¿qué quieres decir?

Y en el probador - parece que no hay manera, y por qué.

Después de enviar los comandos de movimiento a TODOS los objetos del panel, haga ChartRedraw()
 
Aleksey Mavrin:

¿hablamos del probador o de internet?

Si está en línea - mire el código, en algún lugar el evento de movimiento no se enruta normalmente. Paneles por cierto en el sitio sólo cinco bibliotecas diferentes, ¿qué quieres decir?

Y en el probador - parece que no hay manera, y por qué.

Estamos hablando de Internet. Realmente no lo necesito en el probador. No estoy seguro de las bibliotecas, no soy un experto en programación. Acabo de tomar un código listo de botón de MQL5 Referencia.

Ya lo he hecho y será mucho más barato. Aparentemente, esta es la razón por la que la posición del botón se actualiza en el siguiente tick. No entiendo cómo hacer que los botones se muevan junto con el fondo.

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
В языке MQL5 предусмотрена обработка некоторых предопределенных событий. Функции для обработки этих событий должны быть определены в программе MQL5: имя функции, тип возвращаемого значения, состав параметров (если они есть) и их типы должны строго соответствовать описанию функции-обработчика события. Именно по типу возвращаемого значения и по...
 
Artyom Trishkin:
Después de enviar los comandos de movimiento a TODOS los objetos del panel, haga ChartRedraw()
Lo intenté así, pero no funcionó.
   ObjectSetInteger(0, "Buy",            OBJPROP_XDISTANCE, x + 2);
   ObjectSetInteger(0, "Buy",            OBJPROP_YDISTANCE, y + 2);
   ChartRedraw();
  
   ObjectSetInteger(0, "Sell",           OBJPROP_XDISTANCE, x + 74);
   ObjectSetInteger(0, "Sell",           OBJPROP_YDISTANCE, y + 2);
   ChartRedraw();
 
Por favor, ayúdenme a entender. Tengo un código para que un panel de operaciones abra una orden pendiente de Buy Stop con posterior trailing si la orden no se activa. La orden se abre pero no se modifica. No he visto ningún error en el diario y no hay intentos de modificar la orden. He intentado rastrear a través del registro en qué momento se produce un error utilizando la función:
Print("Ордер Выбран!");

Sólo hay que insertarlo después de cada condición if.

Como resultado, descubrí que la función:

 for(int i=OrdersTotal()-1;i>=0;i--)
          if(aorder.SelectByIndex(i))  

Selecciona con éxito la orden para proceder, pero siPrint("¡Orden Seleccionada!"); seinserta después de este código:

if(aorder.Symbol()==asymbol.Name() && aorder.Magic()==MagicNumber && Ask < aorder.PriceOp
en())

entonces se produce un error:

2020.06.17 01:38:24.136 2020.01.02 07:40:00 failed modify order #2 buy stop 0.1 EURUSD_i at 1.12086 sl: 1.12023 tp: 1.12275 -> 1.00000, sl: 1.00000 tp: 1.00000 [Invalid price].

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

Yo uso el mismo código en otro EA para autotrading (la única diferencia es la ausencia de dicho código):

ObjectGetInteger(0, "Buy Stop", OBJPROP_STATE) == true


) y no tengo problemas. Los pedidos se abren y modifican sin problemas.

Aquí está el código en sí:

     double Ask          = NormalizeDouble(PriceInformation_High_Buy[HighestCandle_High_Buy].high, _Digits) + indent; // максимум самой высокой свечи плюс отступ
     double sl_buy       = NormalizeDouble(PriceInformation_Low_Buy[LowestCandle_Low_Buy].low, _Digits) - indent;     // минимум самой низкой свечи минус отступ  
     double tp_buy       = Ask + ((Ask - sl_buy) * Профит_фактор);                                                    // количество стопов лоссов 
     
     if  (OrdersTotal()==0 && PositionsTotal()==0 &&                                         // проверка на наличие открытых позиций и ордеров
     ObjectGetInteger(0, "Buy Stop", OBJPROP_STATE) == true)                                 // проверка состояния кнопки
                                                                                             
     {
        atrade.BuyStop(Lots, Ask, _Symbol, sl_buy, tp_buy, ORDER_TIME_GTC, 0, "My comment"); // посылаем ордер Buy Stop
        ObjectSetInteger(0, "Buy Stop", OBJPROP_STATE, false);                               // отжимаем кнопку
     }

     else

     ObjectSetInteger(0, "Buy Stop", OBJPROP_STATE, false);                                  // отжимаем кнопку
       
//---Трейлинг Buy Stop---------------------------------------------------------------------------------------------------------------------------//     
      
        for(int i=OrdersTotal()-1;i>=0;i--)
          if(aorder.SelectByIndex(i))                                                                      // выбираем ордер 
       
            if(aorder.Symbol()==asymbol.Name() && aorder.Magic()==MagicNumber && Ask < aorder.PriceOpen()) // проверяем символ, мэджик номер, цену
               
              {
                 if(aorder.OrderType()==ORDER_TYPE_BUY_STOP)
                 Print("Ордер Выбран!"); 
                 if(aorder.PriceCurrent()<aorder.PriceOpen())
                 
                    {
                     if(atrade.OrderModify(aorder.Ticket(),
                        asymbol.NormalizePrice(Ask),
                        asymbol.NormalizePrice(sl_buy),
                        asymbol.NormalizePrice(tp_buy),
                        aorder.TypeTime(),
                        aorder.TimeExpiration()))
                        Print("Модификация BUY STOP прошла успешно! Тикет ордера = ",atrade.ResultOrder());
                     else
                        Print("Модификация BUY STOP прошла с ошибкой! Result Retcode: ",atrade.ResultRetcode(),
                              ", description of Retcode: ",atrade.ResultRetcodeDescription());
                    }
              }

Por favor, dígame cuál es mi error.

 
Mikhail:

Se trata de la red. Realmente no lo necesito en el probador. No puedo responder a la pregunta sobre las librerías, soy un completo tonto en programación. Acabo de tomar un código listo de botón de MQL5 Referencia.

Ya lohe hecho y será mucho más barato. Aparentemente, esta es la razón por la que la posición del botón se actualiza en el siguiente tick. No entiendo cómo hacer que los botones se muevan junto con el fondo.

¿Y cómo determinó que está en la siguiente garrapata y no en aquella)?

 
Mikhail:
Por favor, ayuda a entender. Tener un código para el panel de operaciones para abrir una orden pendiente de Buy Stop con posterior trailing si la orden falla. La orden está abierta pero no hay ninguna modificación de la orden. No se muestran errores en el diario y tampoco tenemos intentos de modificar la orden. Intenté rastrear a través del registro en qué etapa se produce un error utilizando la función:

Sólo hay que insertarlo después de cada condición if.

Como resultado, descubrí que la función:

Selecciona con éxito la orden para proceder, pero siPrint("¡Orden Seleccionada!"); seinserta después de este código:

entonces se produce un error:

2020.06.17 01:38:24.136 2020.01.02 07:40:00 failed modify order #2 buy stop 0.1 EURUSD_i at 1.12086 sl: 1.12023 tp: 1.12275 -> 1.00000, sl: 1.00000 tp: 1.00000 [Invalid price].

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

Yo uso el mismo código en otro EA para autotrading (la única diferencia es la ausencia de dicho código):


) y no tengo problemas. Los pedidos se abren y modifican sin problemas.

Aquí está el código en sí:

¿Puede decirme cuál es mi error?

Obviamente, Normalizar no funciona correctamente. Desimprimir asymbol.Digits() asymbol.TickSize(),. Punto() comprobar .

 

Buenos días a todos. Me he encontrado con este problema al acceder a EA a DLL:

No se puede cargar 'C:\....\shablon.dll' [487]

El error 487 parece significarERROR_INVALID_ADDRESS pero la ruta a la biblioteca es correcta. En realidad, ya puse esta dll en todas las carpetas, no ayuda.

¿Qué puede ser? Le agradeceré su ayuda.


P.D. Al principio esta dll era para 32 bits y funcionaba en mt4*86. Lo recompilé para 64 bits, ahora lo pongo en mt5*64 y tengo esos problemas.



 
Aleksey Mavrin:

¿Cómo se sabe lo que hay en la siguiente garrapata y no en aquella?)

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.

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

Al parecer, Normalizar no funciona correctamente. redondea a uno. Desimprimir asymbol.Digits() asymbol.TickSize(),. Punto() comprobar .

Cuando hago una consulta como esta:

Print("Symbol ", _Symbol, " Digits ", _Digits, " Point ", Point());

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:

Print("Symbol ",aorder.Symbol(), " Digits ", asymbol.Digits(), " Point ", asymbol.TickSize());

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:

Print("Symbol ", asymbol.Name(), " Magic ", aorder.Magic(), " Ticket ", aorder.Ticket()); 

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:

aorder.Symbol()==asymbol.Name()

se cambia a

aorder.Symbol()==_Symbol

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?

Документация по MQL5: Общие функции / Print
Документация по MQL5: Общие функции / Print
  • www.mql5.com
Данные типа double выводятся с точностью до 16 десятичных цифр после точки, при этом данные могут выводиться либо в традиционном либо в научном формате – в зависимости от того, как запись будет наиболее компактна. Данные типа float выводятся с 5 десятичными цифрами после точки. Для вывода вещественных чисел с другой точностью либо в явно...
 
dozolov:

Buenos días a todos. Me he encontrado con este problema al acceder a EA a DLL:

No se puede cargar 'C:\....\shablon.dll' [487]

El error 487 parece significarERROR_INVALID_ADDRESS pero la ruta a la biblioteca es correcta. En realidad, ya puse esta dll en todas las carpetas, no ayuda.

¿Qué puede ser? Le agradeceré su ayuda.


P.D. Al principio esta dll era para 32 bits y funcionaba en mt4*86. Lo recompilé para 64 bits y ahora lo pongo en mt5*64 y tengo esos problemas.



ERROR_INVALID_ADDRESS no se trata de la ruta. Estás pasando los argumentos equivocados.

Razón de la queja: