Errores, fallos, preguntas - página 2101

 
damirqa:

Hola, he empezado a estudiar MQL5 desdehttps://www.mql5.com/ru/articles/100. He lanzado el código y me ha dado el error 4756. He mirado en la documentación y no ha mejorado. He pensado en empezar con algo sencillo (Alerta/Impresión...). Una de las funciones más importantes es OrderSend. Empecé a buscar en el foro/documentación sobre cómo utilizar OrderSend. Encontré este artículohttps://www.mql5.com/ru/docs/constants/tradingconstants/enum_trade_request_actions y encontré el código para abrir una posición de compra. Tengo el error 4756 y el retcódigo 10030. He entendido que 10030 - es la propiedad OrderSend, pero no he entendido cómo se debe utilizar esta propiedad (he mirado el código de otra persona) y para qué se utiliza principalmente. Entonces abríhttps://www.mql5.com/ru/docs/trading/ordersend, copié el código, lo ejecuté y funcionó bien.
Pero sigo sin entender por qué aparece el error 4756 y cómo deshacerse de él, así como del 10030.

Miré el código entre

y esta otra.

Me parecen casi idénticos, no veo dónde aparecen esos errores (4756 y 10030). Señala el dedo y explica por favor

Un campo de la estructura no está rellenado. Y no es suficiente, pero no es un error tan grande.

Ejecución instantánea

Una orden de negociación para abrir una posición en el modo de ejecución instantánea (el modo de negociación a precios de streaming). 9 campos son obligatorios:

  • acción
  • símbolo
  • volumen
  • precio
  • sl
  • tp
  • desviación
  • tipo
  • tipo_relleno

También puede especificar campos mágicos y de comentarios.

Ejecución del mercado

Una orden de apertura de una posición en el modo de ejecución de mercado. Requiere que se especifiquen 5 campos:

  • acción
  • símbolo
  • volumen
  • tipo
  • tipo_relleno

También puede especificar campos mágicos y de comentarios.


 

¿qué actualización ha llegado, 1736, qué contiene, dónde puedo leerla?

 

Propongo dar una oportunidad para determinar programáticamente qué búfer de indicador está dibujando en el gráfico.

Supongamos que un operador pone en marcha sus propios indicadores, no sabemos cuántos buffers se utilizan para el cálculo y cuántos se utilizan para dibujar el indicador en el gráfico.

Abordar los indicadores personalizados a través de

intChartIndicatorGet(
longchart_id,// identificador del gráfico
intsub_window// número de la subventana
const string nombre_del_indicador // nombre corto del indicador
);


También podemos solicitar el array de buffers de dibujo

intChartIndicatorGet(
longchart_id,// identificador del gráfico
intsub_window//número de ventana
const string nombre_del_indicador // nombre corto del indicador

int & IndicatorVisualBuffer[] // números del buffer de dibujo... );


Esto ampliará la posibilidad de trabajar con indicadores desconocidos instalados en el gráfico...

 
Vladimir Pastushak:

Propongo dar una oportunidad para determinar programáticamente qué búfer de indicador está dibujando en el gráfico.

Supongamos que un operador pone en marcha sus indicadores, no sabemos cuántos buffers se utilizan para calcular y cuántos se utilizan para dibujar el indicador en el gráfico.

Dirigirse al indicador a través de

intChartIndicatorGet(
longchart_id,// ID del gráfico
intsub_window// número de la subventana
const string nombre_del_indicador // nombre corto del indicador
);


También podemos solicitar la matriz de buffers de dibujo

intChartIndicatorGet(
longchart_id,// identificador del gráfico
intsub_window//número de ventana
const string nombre_del_indicador // nombre corto del indicador

int & IndicatorVisualBuffer[] // números del buffer de dibujo... );


Esto aumentará la posibilidad de trabajar con indicadores desconocidos instalados en el gráfico...

¿Qué devuelve?

int  ChartIndicatorGet(
   long           chart_id,              // идентификатор графика
   int            sub_window             // номер подокна
   const string   indicator_shortname    // короткое имя индикатора
   );

¿y de qué servirá añadirlo? Quieres añadir un parámetro de entrada y recibir el mismo indicador en respuesta...

Y si no le importa, ¿para qué se necesita? No estoy siendo irónico. Al fin y al cabo, si se sugiere algo, debería, en mi opinión, dar un argumento convincente de la necesidad de lo sugerido.

 
Alexey Viktorov:

¿Qué es lo que devuelve?

¿y de qué serviría añadirlo? Usted propone añadir un parámetro de entrada y obtener el mismo indicador en respuesta...

Y si no es difícil, ¿con qué fines apareció tal necesidad? La pregunta carece de ironía. Al fin y al cabo, si se ofrece algo, es necesario, en mi opinión, dar argumentos convincentes en necesidad de lo ofrecido.


El usuario pone cualquier indicador.

El Asesor Experto lo encuentra automáticamente y utiliza los datos del buffer para recibir la señal.


Ahora tenemos que utilizar iCustom y si podemos escribir la lista de parámetros, aquí está el problema con buffers....

Es posible contar la cantidad de buffers a través de Copy, pero para entender cuál es imposible ...

 
Vladimir Pastushak:

El usuario coloca cualquier indicador.

El Asesor Experto lo encuentra automáticamente y utiliza los datos del buffer para obtener la señal.


Ahora tenemos que utilizar iCustom y si podemos escribir la lista de parámetros, aquí está el problema con buffers....

Es posible contar la cantidad de búferes usando Copy programáticamente, pero es imposible entender cuál de ellos está dibujando ...

¿Por qué es imposible? ¿Se puede sacar el buffer INDICATOR_CALCULATIONS a través de iCustom()?

La pregunta es interesante, pero no está en este hilo para discutirla. Personalmente, tengo dudas de que pueda mejorar o simplificar de algún modo el trabajo del programador. Los indicadores son demasiado diferentes y las condiciones de su aplicación también. Entonces tendremos que pedir poder determinar el tipo de trazado gráfico y algunas otras cosas, y nuestras peticiones internas se convertirán en una bola de nieve.

 
Alexey Viktorov:

¿Por qué no es posible? ¿Se puede acceder al buffer INDICATOR_CALCULATIONS a través de iCustom()?

La pregunta es interesante, pero no está en este hilo para discutirla. Personalmente tengo dudas de que pueda mejorar o facilitar de alguna manera el trabajo del programador. Hay demasiados indicadores diferentes y condiciones muy distintas para su aplicación. Entonces tendremos que pedir poder determinar el tipo de trazado gráfico y algunas otras cosas, y nuestras peticiones internas se convertirán en una bola de nieve.


Teóricamente, lo que está escrito en el indicador por defecto, no hablo del código del programador, debería estar disponible desde fuera ... Los búferes su número, el tipo de trazado, el color, y otros estándares ...

 

Este es el problema que he encontrado:

He decidido utilizar como magia el resto de la división de ChartID por 1000 o 10000, realmente no importa.

Pero por alguna razón con diferentes ChartID() el resto de la división es de repente la misma. Pregunta: ¿por qué?

Escritura de comprobación

/********************Script program start function*******************/
void OnStart()
{
  long chartID = ChartID(), d = 100000;
  Print("ChartID - ", ChartID());
  Print("fmod(ChartID(), ",  d, ") = ", fmod(ChartID(), d));
}/*******************************************************************/

Resultado

2018.01.15 13:01:45.881 Script 00 EURUSD,M15: removed
2018.01.15 13:01:45.881 00 EURUSD,M15: uninit reason 0
2018.01.15 13:01:45.881 00 EURUSD,M15: fmod(ChartID(), 100000) = 74912
2018.01.15 13:01:45.881 00 EURUSD,M15: ChartID - 131472503841474907
2018.01.15 13:01:45.881 00 EURUSD,M15: initialized
2018.01.15 13:01:45.871 Script Test\00 EURUSD,M15: loaded successfully
2018.01.15 13:01:40.361 Script 00 EURUSD,H1: removed
2018.01.15 13:01:40.361 00 EURUSD,H1: uninit reason 0
2018.01.15 13:01:40.361 00 EURUSD,H1: fmod(ChartID(), 100000) = 74912
2018.01.15 13:01:40.361 00 EURUSD,H1: ChartID - 131472503841474908
2018.01.15 13:01:40.361 00 EURUSD,H1: initialized
2018.01.15 13:01:40.351 Script Test\00 EURUSD,H1: loaded successfully

Esperaba ver 74907 y 74908 respectivamente, porque el resto de la división debería ser la misma.


También estoy esperando una respuesta a esta pregunta.

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

Bichos, errores, preguntas

Alexey Viktorov, 2018.01.09 14:21

En el probador de MT5 el objeto "Campo de entrada" OBJ_EDIT no permite editar el valor en él. ¿Es así como está diseñado o es un error?

En los terminales y en el probador de MT4 es editable, pero en el probador de MT5 no quiere, el valor introducido en él programáticamente al crear el objeto desaparece por completo.


 
Alexey Viktorov:

Pero por alguna razón diferentes ChartID() de repente produce el mismo residuo de la división. Pregunta: ¿por qué?

Porque el fmod de entrada es doble. Double no puede almacenar un gran número de enteros. Por ejemplo, este es su caso:

Print(DoubleToString((double)131472503841474907, 0)); // 131472503841474912

Haz esto.

long fmod( const long Value, const long Value2 )
{
  return(Value % Value2);
}


Utilizando el ejemplo de float, se puede entender rápidamente la peculiaridad de double

#define  PRINT(A) Print(#A + " = " + (string)(A))

void OnStart()
{
  for (int i = 0; i < INT_MAX; i++)
    if ((int)(float)i != i)
    {
      PRINT(i);
      PRINT((float)i);
      PRINT((double)i);
      
      break;
    }
}


Resultado

i = 16777217
(float)i = 16777216.0
(double)i = 16777217.0


El doble SZY no pierde la información de todo el rango interior, no así con el largo.

 
fxsaber:

Porque el fmod de entrada es doble. Double no puede almacenar un gran número de enteros. Por ejemplo, su caso:

Haz esto.

Por supuesto, voy a comprobar esta muestra ahora, pero también tenía un código de comprobación como este

/********************Script program start function*******************/
void OnStart()
{
  long chartID = ChartID(), d=100000;
  Print("ChartID - ", ChartID());
  Print("fmod(ChartID(), ",  d, ") = ", fmod(ChartID(), d));
  printf("LONG_MAX = %I64d",LONG_MAX);
  printf("DBL_MAX = %.16e",DBL_MAX);
  Print("DBL_MAX-LONG_MAX = ", DBL_MAX-LONG_MAX);
}/*******************************************************************/

el resultado es

2018.01.15 14:07:20.440 Script 00 EURUSD,M15: removed
2018.01.15 14:07:20.440 00 EURUSD,M15: uninit reason 0
2018.01.15 14:07:20.440 00 EURUSD,M15: DBL_MAX-LONG_MAX = 17976931348623157081452742373170435679807 0567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368
2018.01.15 14:07:20.440 00 EURUSD,M15: DBL_MAX = 1.7976931348623157 e+308
2018.01.15 14:07:20.440 00 EURUSD,M15: LONG_MAX = 9223372036854775807
2018.01.15 14:07:20.440 00 EURUSD,M15: fmod(ChartID(), 100000) = 74912
2018.01.15 14:07:20.440 00 EURUSD,M15: ChartID - 131472503841474907
2018.01.15 14:07:20.440 00 EURUSD,M15: initialized
2018.01.15 14:07:20.430 Script Test\00 EURUSD,M15: loaded successfully

Indica que no debe haber truncamiento de valores.


Pero aquí comprobé esta variante y cambié ligeramente la propuesta

/********************Script program start function*******************/
void OnStart()
{
  long chartID = ChartID(), d=100000;
  Print("ChartID - ", ChartID());
  Print("fmod(ChartID(), ",  d, ") = ", (long)fmod(ChartID(), d));
  Print("ChartID() % ", d, " = ", ChartID() % d);
}/*******************************************************************/

y obtuve la variante esperada.

2018.01.15 14:17:51.301 Script 00 EURUSD,M15: removed
2018.01.15 14:17:51.301 00 EURUSD,M15: uninit reason 0
2018.01.15 14:17:51.301 00 EURUSD,M15: ChartID() % 100000 = 74907
2018.01.15 14:17:51.301 00 EURUSD,M15: fmod(ChartID(), 100000) = 74912
2018.01.15 14:17:51.301 00 EURUSD,M15: ChartID - 131472503841474907
2018.01.15 14:17:51.301 00 EURUSD,M15: initialized
2018.01.15 14:17:51.291 Script Test\00 EURUSD,M15: loaded successfully

Aparece otra pregunta,

Si MathMod así como fmoddevuelve el resto real después de la división de dos números. Y % según la documentación

El resto de minutos = tiempo % 60;


¿por qué hay diferencia?