Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. En ninguna parte sin ti - 6. - página 1022

 

O permítanme hacer una pregunta más sencilla:

En la función OnCalculate() se inserta un bucle, por lo que sólo pasa una iteración, la siguiente sólo cuando se actualiza el gráfico....

 
ara66676:

O permítanme hacer una pregunta más sencilla:

En la función OnCalculate() se inserta un bucle, por lo que sólo pasa una iteración, la siguiente sólo cuando se actualiza el gráfico....

Parece que necesitas un vidente o un CÓDIGO PARA ESTUDIAR.
 
bistreevseh:
¡Muchas gracias! Funciona extrañamente tengo derechos de administrador, específicamente para la carpeta terminal le di todas las destrucciones al dueño, eso ayudó, pero luego dejó de funcionar. Luego traté de leer el archivo de registro utilizando el FileReadStrArrayW (si no me equivoco con el nombre) leer las líneas vacías, el script se cuelga en modo ansi. Sólo FileReadCharArr fue capaz de leer los códigos ansi. ¿Tal vez tenga algún ejemplo de cómo analizar el archivo de registro con su biblioteca? Se lo agradecería mucho.

Sí, ahora hay un problema en la lectura del registro. Antes era más fácil.

La cuestión es que el archivo en sí está codificado en ANSI, pero las cadenas son ahora UNICODE.

Aquí está ese script funciona:

#property strict
#property script_show_inputs

#include <FileFunctions.mqh>

input int NumLines = 10;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
 {
  string sName = TimeToString(TimeLocal(), TIME_DATE);
  StringReplace(sName, ".", "");
  string sPath = TerminalPath() + "\\MQL4\\Logs\\" + sName + ".log";
  Print(sPath);
  
  if (!FileCheckW(sPath))
   {
    Print("Файл отсутствует!");
    return;
   }
    
  int hFile = FileOpenExistingW(sPath, GENERIC_READ, SHARE_READ);
  if (hFile == NULL)
   {
    Print("Файл не открыт!");
    return;
   }

  string asArray[];
  ArrayResize(asArray, NumLines);
  Print("hFile = ", hFile);
  for (int i = 0; i < NumLines; i++) asArray[i] = string(i) + "                                                                                                                                                                                                                                                          ";
  FileReadStrArrayMW(hFile, asArray, ArraySize(asArray), 0, NumLines);
  FileCloseHandle(hFile);
  for (int i = 0; i < NumLines; i++) Alert(asArray[i]);
 }

Pero sólo funcionará si el archivo de registro se guarda primero en UNICODE.

Es decir, la biblioteca funciona correctamente. Tenemos que pensar en una forma sencilla de convertir la codificación ANSI del archivo en una matriz de cadenas UNICODE, o debería añadir a la biblioteca una función que convierta la codificación de las cadenas al leer el archivo.

=====================

Opción 1: No tienes que lidiar con arrays. Leer todo el archivo como ANSI, convertirlo en UNICODE y luego analizarlo con MQL.

Variante 2. Léalo como ANSI, escríbalo en el directorio actual de la terminal y léalo utilizando las funciones MQL para archivos CSV.

Opción 3. Cree un enlace simbólico al archivo de registro en la caja de arena utilizando la función de la misma biblioteca y léalo utilizando las funciones MQL para trabajar con archivos CSV:

#property strict
#include <FileFunctions.mqh>
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
 {
  string sName = TimeToString(TimeLocal(), TIME_DATE);
  StringReplace(sName, ".", "");
  sName += ".log";
  
  string sPathLogs = TerminalPath() + "\\MQL4\\Logs\\" + sName;
  string sPathFiles = TerminalPath() + "\\MQL4\\Files\\" + sName;
  
  Print(sPathLogs);
  Print(sPathFiles);
  
  if (!FileCheckW(sPathLogs))
   {
    Print("Файл отсутствует!");
    return;
   }
  
  if (!FileCheckW(sPathFiles) && !FileSymbolicLinkW(sPathLogs, sPathFiles))
   {
    Print("Символьная ссылка не создана!");
    return;
   }
  
  int hFile = FileOpen(sName, FILE_READ|FILE_CSV|FILE_ANSI, '\t');
  if (hFile == INVALID_HANDLE)
   {
    Print("Файл не открыт!");
    return;
   }
  
  while (!FileIsEnding(hFile)) Alert(FileReadString(hFile));
  FileClose(hFile);
 }

En mi opinión, esta es la opción más bonita y fácil.

 

Estoy tratando de escribir un indicador de canal. He calculado valores para dibujar en el gráfico y los he puesto en matrices double tob[] y double tos[], pero cuando intento conectarlos al buffer para dibujar en el gráfico - en las líneas 25 y 26:

SetIndexBuffer(0, tob);
SetIndexBuffer(1, tos);

, estas matrices en lugar de los valores requeridos, como:

0/1.424/1.3679
1/1.42/1.3639

se rellenan con el número 2147483647, así:
0/2147483647/2147483647
1/2147483647/2147483647
2/2147483647/2147483647

¿Cómo se puede curar esto?

Archivos adjuntos:
channel1.mq4  7 kb
 
¿Existen teclas de acceso rápido para pasar de un periodo a otro?
Pulsando D , H1 pasa a M15 , y pulsando U , pasa a H1.
 

Ayúdame a encontrar una plantilla para MT4 para separar la noche y el día.

Digamos que el gráfico de las 00:00 a las 8:00 está en un color y de las 8:00 a las 00:00 está en otro color.

 

Saludos a todos.

Ante este problema:

Un fragmento de código de robot:

int per=Periodo();
if(per = 60)
{

Print("Si el punto no es H1, esta línea no debería estar en el registro");

Comentario (...);

... // aquí está el cuerpo del robot

...

...

}

implica que ni el cuerpo del robot, ni la línea Print(...), ni el Comment(...) de la pantalla se ejecutarán si se habilita un periodo distinto de H1 en el gráfico.

Sin embargo, todo se ejecuta en cualquier periodo. ¿Por qué?

Cómo escribir correctamente, que si el período en el gráfico no coincide con el especificado - devolver el control a la terminal. (Por cierto, he probado con RETURN (0) - no ayuda - sigue imprimiendo todo...)

 
Dikons:

Saludos a todos.

Ante este problema:

Fragmento de código del robot:

int per=Período();
if(per = 60)
{

Print("Si el periodo no es H1 - esta línea no debe estar en el diario");

Comentario (...);

... // entonces el cuerpo del robot

...

...

}

implica que ni el cuerpo del robot, ni la cadena Print(...), ni Comment(...) en la pantalla se ejecutarán si se habilita un periodo distinto de H1 en el gráfico.

Sin embargo, todo se ejecuta en cualquier periodo. ¿Por qué?

Cómo registrar correctamente que si el plazo no se corresponde con el establecido - devuelva el control al terminal. (Por cierto, he probado con RETURN (0) - no funciona - sigue imprimiendo todo...)

Estás haciendo la asignación, necesitas la comparación if(per == 60)
 
Trader76:
Usted está haciendo la asignación, mientras que usted necesita la comparación if(per == 60)

Gracias camarada... Tengo el cerebro hervido... He tenido un parón importante en la programación, he olvidado mucho de lo poco que sé...

---

Una pregunta más... Fragmento de búsqueda de max/mini de las primeras 8 horas del día por terminal:

int h=TimeHour(TimeCurrent()); // averigua la hora terminal actual (0...23)
if (h<8) return(0); // si no hay H1 de las primeras 8 velas del día = leave...

double Maxi=High[iHighest(NULL,PERIOD_H1,MODE_HIGH,8,h-7)]; // define las 8 primeras velas máximas del día.

double Mini=Low[iLowest(NULL,PERIOD_H1,MODE_LOW,8,h-7)];


Las dos últimas líneas no funcionan correctamente si el periodo del gráfico está configurado en algo distinto a H1. ¿Por qué? Dado que al robot se le ha asignado explícitamente un periodo para los cálculos...

Si pone H4 en el gráfico, por ejemplo, el robot lo reequilibrará utilizando velas H4 (lo mismo ocurre con otros marcos temporales).

 
Dikons:

Gracias camarada... Tengo el cerebro hervido... He tenido un parón importante en la programación, he olvidado mucho de lo poco que sé...

---

Una pregunta más... Fragmento de búsqueda de max/mini de las primeras 8 horas del día por terminal:

int h=TimeHour(TimeCurrent()); // averigua la hora terminal actual (0...23)
if (h<8) return(0); // si no hay H1 de las primeras 8 velas del día = leave...

double Maxi=High[iHighest(NULL,PERIOD_H1,MODE_HIGH,8,h-7)]; // define las 8 primeras velas máximas del día.

double Mini=Low[iLowest(NULL,PERIOD_H1,MODE_LOW,8,h-7)];


Las dos últimas líneas no funcionan correctamente si el periodo del gráfico está configurado en algo distinto a H1. ¿Por qué? Dado que al robot se le ha asignado explícitamente un período para los cálculos...

Si pone H4 en el gráfico, por ejemplo, el robot lo reequilibrará utilizando velas H4 (lo mismo ocurre con otros marcos temporales).

Aquí se obtiene el número de barra máxima/mínima: iHighest(NULL,PERIOD_H1,MODE_HIGH,8,h-7)

Y luego insertas por ejemplo la barra número 2 y obtienes:High[2] y en otro timeframe obtendrás un valor diferente al H1. Lee sobre el Alto.

iHigh(NULL,PERIOD_H1, iHighest(NULL,PERIOD_H1,MODE_HIGH,8,h-7))