Preguntas de los principiantes MQL4 MT4 MetaTrader 4 - página 147

 

EA debe leer de un archivo un array de datos de la forma: date integer1 integer2 integer3 integer4, puede ser de cualquier tipo de archivo, excepto bin.

файл скопировал в папку C:\Users\Михаил\AppData\Roaming\MetaQuotes\Tester\1B9501BF48F2354A4685940A72752910\Agent-127.0.0.1-3000\MQL5\Files\qqq.scv

se borra de esta carpeta.

aquí está el código.


int File()
{
int P=0;

int filehandle=FileOpen("qqq.csv",FILE_READ|FILE_CSV,","); 
if(filehandle!=INVALID_HANDLE) 
     { 
     datetime d = FileReadDatetime(filehandle);
   int I=FileReadNumber(filehandle);
     FileClose(filehandle);
     Comment(d+" "+I);
     }
     else {Comment("qqq.csv");}
return P;

}

¿puede especificar la ruta de la carpeta de la que el archivo no será eliminado por el probador? Tengo entendido que todos los archivos se eliminan de esta carpeta durante las pruebas, pero cuando se crea el archivo mediante programación, se coloca en esta carpeta

 
Mikhail Simakov:

EA debe leer de un archivo un array de datos de la forma: date integer1 integer2 integer3 integer4, puede ser de cualquier tipo de archivo, excepto bin.

файл скопировал в папку C:\Users\Михаил\AppData\Roaming\MetaQuotes\Tester\1B9501BF48F2354A4685940A72752910\Agent-127.0.0.1-3000\MQL5\Files\qqq.scv

se borra de esta carpeta.

Aquí está el código.

¿Tal vez especificar la ruta de la carpeta de la que el archivo no será eliminado por el probador? He entendido que todos los archivos se eliminan de esta carpeta al hacer pruebas, pero al crear un archivo mediante programación, se coloca en esta carpeta

Tal vez deberíamos utilizar FileCopy con la bandera FILE_COMMON. La nueva prueba funciona desde cero, esto podría ser un fallo.

 
Konstantin Nikitin:

Tal vez debería utilizar FileCopy con la bandera FILE_COMMON. La nueva prueba funciona desde cero, esto puede ser un fallo.

funciona si copias el archivo a una carpeta mientras pruebas )) ahora a averiguar el separador

 

Empecé a escribir un panel de comercio en MQL4 y aquí está la paradoja. Todo se ve bien, pero cada vez que cambio de TF, las líneas y el texto de otros indicadores se dibujan encima de mi panel.

Esto es lo que he comprobado: al cambiar el TF, el parámetro OBJPROP_BACK = false. Significa que todo está bien en este lado.

¿Alguna idea sobre este tema?

P.D. De hecho, lo he comprobado ahora y el código fuente (que tomé como prototipo) se comporta de la misma manera. Después de haber cambiado el TF, dibuja líneas normales sobre el panel y las líneas creadas por los indicadores que no utilizan OOP.
https://www.mql5.com/ru/code/19220
Infopanel
Infopanel
  • www.mql5.com
Пример создания простого и быстрого меню с поддержкой нескольких языков. В примере выводится информация о цене, времени до следующего бара, балансе счета, количестве ордеров. Данный пример можно использовать в качестве шаблона для создания своих разработок. Минус данного метода при добавлении, удалении или редактировании объектов необходимо...
 
Goya7:

Empecé a escribir un panel de comercio en MQL4 y aquí está la paradoja. Todo se ve bien, pero cada vez que cambio de TF, las líneas y el texto de otros indicadores se dibujan encima de mi panel.

Esto es lo que he comprobado: al cambiar el TF, el parámetro OBJPROP_BACK = false. Así que todo está bien por este lado.

¿Alguna idea sobre este tema?

P.D. De hecho, lo he comprobado ahora, el código fuente (que tomé como prototipo) se comporta igual. Después de haber cambiado el TF, dibuja líneas normales encima del panel y las líneas creadas por los indicadores que no usan OOP.
https://www.mql5.com/ru/code/19220

Al cambiar de marco temporal, los objetos creados por otros programas se eliminan y los nuevos se crean de inmediato. En el panel, los objetos no se borran, por lo que son "antiguos". En el gráfico, se aplica el principio de "el que está último está arriba".

Es necesario eliminar los objetos del panel con DeInit(), y volver a crear otros nuevos

 
Goya7:

Empecé a escribir un panel de comercio en MQL4 y aquí está la paradoja. Todo se ve bien, pero cada vez que cambio de TF, las líneas y el texto de otros indicadores se dibujan encima de mi panel.

Esto es lo que he comprobado: cuando se cambia el TF, el parámetro OBJPROP_BACK = false. Así que todo está bien por este lado.

¿Alguna idea sobre este tema?

P.D. De hecho, lo he comprobado ahora, el código fuente (que tomé como prototipo) se comporta igual. Después de haber cambiado el TF, dibuja líneas normales sobre el panel y las líneas creadas por los indicadores que no utilizan OOP.
https://www.mql5.com/ru/code/19220
Vitaly Muzichenko:

Al cambiar de marco temporal, los objetos creados por otros programas se eliminan y los nuevos se crean de inmediato. En el panel, los objetos no se borran, por lo que son "antiguos". En el gráfico se aplica el principio de "el que está último está arriba".

Es necesario eliminar los objetos del panel mediante DeInit(), y volver a crear otros nuevos

es mejor capturar la creación de un nuevo objeto en Eventos y redibujar el panel

 
Vitaly Muzichenko:

Cuando se cambia de hora, se borran los objetos creados por otros programas y se crean inmediatamente los nuevos. En el panel, los objetos no se borran, por lo que son "antiguos". En el gráfico se aplica el principio de "el último de arriba es el último de abajo".

Es necesario eliminar los objetos del panel mediante DeInit(), y volver a crear otros nuevos

Gracias por las reflexiones. En DeInit() se borran, por supuesto. Al cambiar de TF el procedimiento Init() pasa, pero algo me dice que el panel no se redibuja. A saber, experimenté e instalé otro panel, que está territorialmente donde está el mío y luego lo borré. El mío también ha desaparecido (antes del cambio de TF) - así que no se está redibujando. ((
¿Puedes decirme un poco más sobre cómo redibujarla?


Taras Slobodyanik:

es mejor capturar la creación de un nuevo objeto en Eventos y redibujar el panel

Dime cómo hacerlo, sólo tengo media hora como programador. :)
 
int OnInit()
{
ChartSetInteger(0,CHART_EVENT_OBJECT_CREATE,true);
}


void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
{
//событие создания нового объекта на чарте
if(id==CHARTEVENT_OBJECT_CREATE && StringFind(sparam, prefix, 0)<0)
   {
   //удаляем панель и рисуем заново

   ChartRedraw();
   }
}

ps. Acabo de recordar - también necesitas comprobar el nombre del objeto creado para asegurarte de que no es tu objeto (prefija el nombre de tus objetos).
o en lugar del nombre, comparar el tipo de objeto.

 
¡¡¡Ciudadanos, decidme si lo estoy haciendo bien!!! Necesito que el Asesor Experto opere cuando no ha entrado en la zona de 30 o 70, y cuando lo ha hecho, ¡¡¡no opera!!! ¿Es esta la forma correcta de hacerlo?

RSI3 = iRSI(_Símbolo, _Periodo, RSIPeriod, PRICE_CLOSE, 1);
RSI4 = iRSI(_Símbolo, _Periodo, RSIPeriod, PRICE_CLOSE, 2);

bool RSItf = RSI3 > 30 && 30 > RSI4;
if(RSItf == true)
{
}
else
{
ordersend(_Symbol, OP_SELL, lot, Bid, Slippage, 0, 0, NULL, Magic, 0, clrRed);
}
bool RSItf = RSI3 > 70 && 70> RSI4;
if(RSItf == true)
{
}
else
{
ordersend(_Symbol, OP_BUY, lot, Ask, Slippage, 0, 0, NULL, Magic, 0, clrBlue);
}
 
ponochka:
¡¡¡Ciudadanos, decidme si lo estoy haciendo bien!!! Necesito que el Asesor Experto opere cuando no ha entrado en la zona de 30 o 70, y cuando lo ha hecho, ¡¡¡no opera!!! ¿Es esta la forma correcta de hacerlo?

Es algo así, por lo que tengo entendido se necesita

int RSIPeriod = 0, Slippage = 5, Magic = 1234;
double lot = 0.1;

void OnStart()
{
     double RSI3 = iRSI(_Symbol, _Period, RSIPeriod, PRICE_CLOSE, 1),
            RSI4 = iRSI(_Symbol, _Period, RSIPeriod, PRICE_CLOSE, 2);
     int ticket = 0;
     
     if(RSI3 <= 30 && RSI4 <= 30)
          ticket = OrderSend(_Symbol, OP_SELL, lot, Bid, Slippage, 0, 0, NULL, Magic, 0, clrRed);
     
     if(RSI3 >= 70 && RSI4 >= 70)
          ticket = OrderSend(_Symbol, OP_BUY, lot, Ask, Slippage, 0, 0, NULL, Magic, 0, clrBlue);
}