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

 
trader781:

En teoría sé por qué ha ocurrido esto, así que mi pregunta es, ¿podemos hablar brevemente sobre el uso de arrays?

¿Dónde hay que inicializarlos, borrarlos y procesarlos para que funcionen?

P.D.

cuando google lo prohíbe se ve algo así:

¿Qué te hace pensar que se trata de una matriz?
 
Alexey Viktorov:
¿Por qué crees que es por la matriz?
Porque esto no ha ocurrido nunca, y si lo ha hecho, me he equivocado en algún sitio, y por eso vengo aquí. Podrías hacerlo tú mismo, pero te llevaría mucho más tiempo.
 
trader781:

necesito

1) crearla en algún lugar (en un área global, como función, en onit u ontic?)

2) escribir cada billete en él al enviar un pedido, dándole un número por orden

3) sacarlos de ahí según sea necesario a través del número

4) Al cerrar toda la parrilla, poner a cero los parámetros

No es necesario mantenerlo en la memoria todo el tiempo. Cuando necesites encontrarlo, tienes que llamar a la función con un array local donde pondrás todos los pedidos/posiciones en el bucle, ordenarás el array como necesites, seleccionarás los pedidos necesarios de él, harás lo que necesites con ellos, y cuando salgas de la función, te olvidarás de ese array local. Y la próxima vez que llames de nuevo a la función, ésta ordenará las órdenes/posiciones que habrá en el momento de dicha llamada, y hará lo mismo con ellas. Y no necesitas una matriz global que tengas que supervisar y controlar constantemente.
 
Artyom Trishkin:
No es necesario mantenerlo en la memoria todo el tiempo. Cuando necesites encontrarla, llamas a la función con un array local dentro de ella donde pondrás todos los pedidos/posiciones en el bucle, ordenas el array como necesites, seleccionas los pedidos necesarios de él, haces lo que necesites con ellos, y cuando salgas de la función, te olvidas de ese array local. Y la próxima vez que llames de nuevo a la función, ésta ordenará las órdenes/posiciones que habrá en el momento de dicha llamada, y hará lo mismo con ellas. Y no necesitas una matriz global que tengas que vigilar y controlar constantemente.

No sé cuánto más barato. Cada situación tiene su propia solución. No hay ningún evento OnTradeTransaction() en MQL4, pero tenemos que llevar la cuenta de "nuestras" órdenes de alguna manera... Aquí es donde la matriz de variables globales resulta útil.

Imagina que hay varios Asesores Expertos corriendo en una cuenta, uno de los cuales tiene cálculos pesados, y el otro tiene un gran número de órdenes... ¿Cómo funcionaría con cálculos pesados? ¿Tendrá este EA que buscar una gran cantidad de pedidos? No se puede prescindir de la búsqueda en general, pero hay que minimizar este procedimiento.

¿Y para determinar si el pedido está cerrado o no? ¿Revisar toda la historia? ¿No es demasiado caro?

 
trader781:
Nunca he cometido este tipo de error, pero si lo he hecho, me he equivocado, por eso pregunto aquí. Podría hacerlo yo mismo, pero lleva mucho más tiempo.

Como habrás entendido por mi anterior post, yo uso arrays con bastante frecuencia y nunca he tenido problemas con ellos. Una vez escribí un EA que abría más de 2000 órdenes cuyos tickets se almacenaban en un array y no había ningún problema. No puedo creer que los problemas aparezcan por la matriz. Tampoco puedo creer qué error puede haber causado tales problemas.

Me recuerda a la película "No puede ser"... "No es la cerveza la que mata a la gente, es el agua la que mata a la gente"...

 
Alexey Viktorov:

No sé cuánto más barato. Cada situación tiene su propia solución. No hay ningún evento OnTradeTransaction() en MQL4, pero tenemos que llevar la cuenta de "nuestras" órdenes de alguna manera... Aquí es donde la matriz de variables globales resulta útil.

Imagina que hay varios Asesores Expertos corriendo en una cuenta, uno de los cuales tiene cálculos pesados, y el otro tiene un gran número de órdenes... ¿Cómo funcionaría con cálculos pesados? ¿Tendrá este EA que buscar una gran cantidad de pedidos? No se puede prescindir de la búsqueda en general, pero debemos minimizar este procedimiento.

¿Cómo comprobar si el pedido se ha cerrado? ¿Revisar toda la historia? ¿No es demasiado caro?

Todo tiene solución.

Por ejemplo, hace tiempo que creé una clase que controla todo esto. Puedes crear/borrar objetos de clase dinámicamente para cada símbolo, magik, marco temporal, o todo para una cuenta o una combinación de ellas - puedes elegir. Cualquier ciclo de búsqueda necesario ya se realiza en una nueva garrapata una vez, y hay todos los datos necesarios. Por supuesto, hay casos en los que es imposible prescindir de un ciclo más, pero es el segundo ciclo adicional por tic. Y no tener un bucle separado en cada función es un terrible desperdicio de recursos.

 
Artyom Trishkin:

Todo tiene solución.

Yo, por ejemplo, hace tiempo que hice una clase que se encarga de todo esto. Puedes crear/borrar objetos de clase dinámicamente para cada símbolo, magik, marco temporal, o todo para una cuenta, o combinaciones de ellos - puedes elegir. Cualquier ciclo de búsqueda necesario ya se realiza en una nueva garrapata una vez, y hay todos los datos necesarios. Por supuesto, hay casos en los que es imposible prescindir de un ciclo más, pero es el segundo ciclo adicional por tic. Y no tener un bucle separado en cada función es un terrible desperdicio de recursos.

Nadie lo discute. Con la llegada de las estructuras se hizo aún más conveniente.
 
Artyom Trishkin:
No es necesario mantenerlo en la memoria todo el tiempo. Cuando necesites encontrarla, deberás llamar a la función con un array local dentro de ella donde pondrás todos los pedidos/posiciones en el bucle, ordenarás el array como necesites, seleccionarás los pedidos necesarios de él, harás lo que necesites con ellos, y cuando salgas de la función, te olvidarás de ese array local. Y la próxima vez que llames de nuevo a la función, ésta ordenará las órdenes/posiciones que habrá en el momento de dicha llamada, y hará lo mismo con ellas. Y no necesitas una matriz global que tengas que supervisar y controlar constantemente.

Bien, esta es una visión simplificada.

Si el array es local, ¿dónde quieres ponerlo? Obviamente no en el ontik.

void OnTick()
{  

       if(FindLastOType()==OP_BUY)  //+------ если последний покупка
           {
            if(Ask<=FindLastOrderOpenPrice()-Step*Point())//+------------если ордер в минус
              {
               TotalClose();
              }
            else
            if(Ask>=FindLastOrderOpenPrice()+Step*Point())//+------------если ордер в плюс и это 5 ордер в списке
              {
               ticket=OrderSend(Symbol(),OP_BUY,(лот2 ордера+лот4 ордера),Ask,50,0,0,"",Magic,0,clrAzure);
              }        
           }  
}

 
trader781:

Bien, esta es una visión simplificada.

Si el array es local, ¿dónde quieres ponerlo? Obviamente no en el ontik.

void OnTick()
{  

       if(FindLastOType()==OP_BUY)  //+------ если последний покупка
           {
            if(Ask<=FindLastOrderOpenPrice()-Step*Point())//+------------если ордер в минус
              {
               TotalClose();
              }
            else
            if(Ask>=FindLastOrderOpenPrice()+Step*Point())//+------------если ордер в плюс и это 5 ордер в списке
              {
               ticket=OrderSend(Symbol(),OP_BUY,(лот2 ордера+лот4 ордера),Ask,50,0,0,"",Magic,0,clrAzure);
              }        
           }  
}

Por favor, lea lo que es una función. Entonces entenderás que el array declarado en el cuerpo de la función será local - fuera de la vista del resto del programa.
 
bool WriteToFile(int FileHandle,string DataToWrite)
  {
// Receives the number of bytes written to the file. Note that MQL can only pass
// arrays as by-reference parameters to DLLs
   int BytesWritten[1]={0};

// Get the length of the string
   int szData=StringLen(DataToWrite);

// Do the write
   WriteFile(FileHandle,DataToWrite,szData,BytesWritten,0);

// Return true if the number of bytes written matches the expected number
   return (BytesWritten[0] == szData);
  }

Quiero escribir una línea en el archivo con las traducciones a una nueva línea, pero no funciona, este código es de aquíhttps://www.mql5.com/en/forum/118999

este código escribe una línea con espacios después de cada letra, necesito un reemplazo para FileWrite() pero funciona

Reading and writing files anywhere on disk using CreateFileA() etc.
Reading and writing files anywhere on disk using CreateFileA() etc.
  • www.mql5.com
There are frequent questions in this forum (e.g...