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

 
lil_lil:

HayFileSeek(File,0,SEEK_END); y todo se escribe en el archivo desde una nueva línea.

El problema es que hay 4 archivos y necesitamos escribir datos en cuatro posiciones, cada uno en un archivo separado, cada archivo tiene una entrada de posición en el nombre, pero los datos se escriben sólo en uno, el último archivo, los datos en la última posición.

¿Los nombres de los archivos están formados correctamente? En lugar de Ticket=OrderTicket(); File name=_Ticket+Symbol()+".txt"; escribiría File name=(string)OrderTicket()+Symbol()+".txt"; y añadiría la directiva #property strict al principio - ayuda a eliminar errores
 
STARIJ:
¿Los nombres de los archivos están formados correctamente? En lugar de Ticket=OrderTicket(); File name=_Ticket+Symbol()+".txt"; escribiría File name=(string)OrderTicket()+Symbol()+".txt"; y añadiría la directiva #property strict al principio - ayuda a eliminar errores

Gracias, la formación del nombre fue rehecha según su recomendación, pero sigue escribiendo sólo los datos de la última posición.

Y, los nombres de los nuevos archivos no han cambiado) sospecho que no es el nombre, el archivo de la última posición se encontró de todos modos.

¿Por qué ignora las posiciones anteriores?

 

1501896125EURUSD.txt
Tiempo Medio Precio BID
2018.02.22 22:53 P 1,23259 0,88322
2018.02.22 22:54 P 1,23259 0,88322
2018.02.22 22:55 P 1,23259 0,88322
2018.02.22 22:56 P 1,23249 0,88322

1501896094EURUSD.txt
Tiempo Medio Precio BID
2018.02.22 22:43 L 1,23212 1,23203
2018.02.22 22:44 L 1,23220 1,23203
2018.02.22 22:44 L 1,23224 1,23203
2018.02.22 22:45 L 1,23244 1,23203
2018.02.22 22:45 L 1,23242 1,23203
2018.02.22 22:46 L 1,23251 1,23203
¿has cambiado algo? ver ... esto: string sy=""; int op=-1, mn=-1; apenas se necesita ... ¿podemos dejarlo? En el bucle en lugar de anidar if() es mejor continuar;

Archivos adjuntos:
Fileee.mq4  7 kb
 
STARIJ:

1501896125EURUSD.txt
Tiempo Medio Precio BID
2018.02.22.02.22 22:53 P 1,23259 0,88322
2018.02.22 22:54 P 1,23259 0,88322
2018.02.22 22:55 P 1,23259 0,88322
2018.02.22 22:56 P 1,23249 0,88322

1501896094EURUSD.txt
Tiempo Medio Precio BID
2018.02.22:43 L 1,23212 1,23203
2018.02.22 22:44 L 1,23220 1,23203
2018.02.22 22:44 L 1,23224 1,23203
2018.02.22 22:45 L 1,23244 1,23203
2018.02.02.22 22:45 L 1,23242 1,23203
2018.02.22 22:46 L 1,23251 1,23203
¿cambiar algo? ver...this: string sy=""; int op=-1, mn=-1; apenas se necesita ... ¿podemos dejarlo? En el bucle en lugar de anidar if() es mejor continuar;

No quiere escribir sobre todas las posiciones.

Hay 7 puestos vacantes. He escrito un archivo.

Lo he compilado cuando estaba en un gráfico y ha empezado a escribir los datos de la primera y la última posición. Ahora sólo tengo un dato, el de la primera posición.

No puedo ver seis, pero tengo todos los ticks enAlert(NameFile).

Qué necesita...

 
hay muchas condiciones en el programa, incluida una condición que debe cumplirse para que se escriba el archivo:
si(t_pre+60< TimeCurrent() && _o_t+1800>TimeCurrent()) // una vez cada media hora desde la apertura de la orden. ¿Es esto necesario?
{
t_pre=TimeCurrent();
El programa contiene ramificaciones:
  for(i=0; i<k; i++) 
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) 
        {
         if(OrderSymbol()==sy || sy=="") 
           {
            if(OrderType()==OP_BUY || 
               OrderType()==OP_SELL) 
              {
               if(op<0 || OrderType()==op) 
                 {
                  if(mn<0 || OrderMagicNumber()==mn) 
                    {
                     _o_t=OrderOpenTime();
И еще 5 закрывающих скобок. а можно короче на 10 строк и понятнее записать так
  for(i=0; i<k; i++) 
  {
     if( ! OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue; // если ошибка выбора ордера - переходим к следующему
     if(OrderSymbol()!=sy && sy!="") continue;   // а это вообще надо?
     if(OrderType()!=OP_BUY && OrderType()!=OP_SELL) continue; // а другие разве у Вас есть?
     if(op>=0 && OrderType()!=op) continue;
     if(mn>=0 && OrderMagicNumber()!=mn) continue;
     _o_t=OrderOpenTime();
¿Cuál era el objetivo de escribirlo antes en una escalera? En la antigua versión de MQL4 aceleraba la ejecución. No tiene importancia ahora
La variable _o_t se utiliza sólo en 2 lugares. Si lo sustituimos por OrderOpenTime(), el programa queda más claro y corto en 2 líneas (declaración y asignación)
datetime _o_t; y
_o_t=OrderOpenTime();
 

Lo tengo - la cuenta atrás de 60 segundos tiene que ser sacada del bucle

//+------------------------------------------------------------------+ 
//| Ежеминутная информация об ордерах, открытых за последнее полчаса | 
//+------------------------------------------------------------------+ 
#property strict
bool RUS=true;
datetime t_pre=0;  // Время предыдущего выполнения

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
{
   if(t_pre+60>=TimeCurrent()) return;      // Дождаться 60 секунд после прошлой обработки
   t_pre=TimeCurrent();                     // Это нужно вынести за цикл - в этом было дело !!!!!!!!!!!!

   string text;
   for(int i=0; i<OrdersTotal(); i++) 
   {
      if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
      if(OrderType()!=OP_BUY && OrderType()!=OP_SELL) continue;
      string ИмяФайла=(string)OrderTicket()+Symbol()+".txt";
      Alert(ИмяФайла);
      if(OrderOpenTime()+60>=TimeCurrent()) continue;   // Пропуск молодых которым меньше 1 минуты
      if(OrderOpenTime()+1800<=TimeCurrent()) continue; // Пропустк старых которым больше 30 минут
      if(OrderType()==OP_BUY){if(Bid>OrderOpenPrice())text="P"; else text="L";}
      if(OrderType()==OP_SELL){if(Bid<OrderOpenPrice())text="P"; else text="L";}

      // Открытие или создание файла и перемещение указателя в конец
      int Файл= FileOpen(ИмяФайла,FILE_CSV|FILE_READ|FILE_WRITE," ");
      if(Файл == -1) {  Alert("Ошибка при открытии файла ",ИмяФайла);  return; }
      FileSeek(Файл,0,SEEK_END);

      // Если новый файл записать имя файла и строку заголовков колонок
      if(FileSize(Файл)==0)
      {
         FileWrite(Файл,ИмяФайла);
         FileWrite(Файл,"           Время Полу   BID     Цена ");
      }
      // Сбор информации и запись в файл
      FileWrite(Файл, TimeToStr(TimeCurrent()), text,
                dstr(Bid), "  ", dstr(OrderOpenPrice()));
      FileClose(Файл);
   }
}

// Преобразование числа double в строку с запятой или точкой в соответствии с локализацией
string dstr(double Цена)
{
   if(!RUS) return DoubleToStr(Цена, Digits);
   return StringSetChar(DoubleToStr(Цена, Digits), StringFind(DoubleToStr(Цена, Digits), "."), ',');
}
Archivos adjuntos:
-Fi----.mq4  5 kb
 

Buenas tardes, queridos usuarios del foro.

¿Puede decirme por qué la optimización y las pruebas de los mismos ajustes producen a veces resultados diferentes?

He descargado las cotizaciones de SQ Tick Downloader y las he pasado por el script

 
Aidar Kaliaskar:

Buenas tardes, queridos amigos.

¿Puede decirme por qué la optimización y las pruebas de los mismos ajustes producen a veces resultados diferentes?

Te diré más: al operar en una cuenta real con un broker en 2 cuentas diferentes se pueden obtener resultados diferentes.
 
Vladislav Andruschenko:
Te diré más: cuando se opera en una cuenta real con el mismo broker en 2 cuentas diferentes, puede haber resultados diferentes.

Probablemente depende más del corredor. Pero, ¿podría darme una pista sobre la pregunta inicial?

 
Aidar Kaliaskar:

Probablemente depende más del corredor. Pero, ¿podría dar algún consejo sobre la pregunta inicial?

El diferencial, si se factura al corriente. La fecha de finalización de la prueba si se factura en la actual. Puede haber muchas más razones.