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

 
Vitaly Muzichenko:

Que inicialmente sea así.

A continuación, tenemos que hacer una fijación adecuada que la barra se resuelve, pero aquí tenemos que calcular toda la aproximación a la TOR.

Por lo que veo en tu post, hay que hacer esto:

La esencia es que si el spread es más de lo normal, entonces salimos de nuevo aOnTick, y en un nuevo tick comprobamos el spread, si es normal - enviamos una orden y recordamos que hubo una operación en esta barra.

También hay una segunda vía:

En general, es necesario definir la lógica, cuando debe grabar, y no comprobar de nuevo hasta que la "Nueva barra" se forma.


Te entiendo, ¡gracias!

 

Señores, ¿pueden darme una pista? He estado tratando de escribir los datos del indicador en un archivo para leerlo más tarde y construir un indicador basado en los datos. El indicador es de entrenamiento, calculo el volumen en cada tick de una barra determinada. Si el tick es positivo su volumen se añade con "+", si es negativo - con "-". Sumo los volúmenes acumulados obtenidos y obtengo un delta y considero este delta acumulado. Esto produce una curva. Sin embargo, esta curva se construye sólo en tiempo real. No se puede trazar en la historia. Para ello, he decidido escribir los datos en un archivo. Me quedé atascado en esta etapa. He conseguido con amargura que el código no genere errores de compilación. Sin embargo, el producto resultante no funciona. El indicador funcionaba antes. Después de haber adjuntado el código para escribir el archivo el indicador ya no funciona. El programa crea un archivo con un registro incomprensible y muere en este punto. Llevo todo el día aquí sentado y no consigo entenderlo. ¿Puede alguien ayudarme?

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#property version   "1.00"
#property strict
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_label1  "Вверх"
#property indicator_type1   DRAW_LINE
#property indicator_color1  Salmon
#property indicator_style1  STYLE_SOLID
#property indicator_width1  2

#property indicator_label2  "Вниз"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrDarkTurquoise
#property indicator_style2  STYLE_SOLID
#property indicator_width2  2

input string             InpFileName="111.csv";      // Имя файла 
input string             InpDirectoryName="Data";     // Имя каталога 

datetime Время=0;   // Время прошлого бара
double Bid1;
double   Buf_1[];
// double ExtBuffer;
long V1; // объем для текущего тика вверх
long V2; // накопленный объем для всех тиков вверх текущего бара
long V3; // объем текущего тика вниз
long V4; // накопленный объем для всех тиков вниз для текущего бара
long V5;  // отрицательные и положительные iVolume нарастающим итогом
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnInit()
  {
   IndicatorDigits(0);
   SetIndexBuffer(0,Buf_1);
//SetIndexBuffer(1,Buf_2);
   Bid1=Bid;
   V5=0;

  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   datetime Вр=Time[0];   // Время текущего бара
   if(Вр>Время)           // Если новый бар
     {
      Время=Вр;           // Запомнить
                          //      Buf_1[0]=0;         // и обнулить последний элемент буфера
     }

   datetime date_Buf_1[]; // массив дат индикатора 
   datetime time_Buf_1[]; // массив времени 
                          // --- считаю объем для положительных и отрицательных тиков      
   if(Bid>=Bid1)
     {
      if(Bid>Bid1) // если тик положительный..
        {
         V1=iVolume(NULL,0,0); // если повышающий цену тик, то находим его объем
         V2= V1 + V2;
        }
      else
        {
         V1=0;                // если Bid1 = Bid2, т.е. изменение цены = 0, то iVolume этого тика присваиваем 0;
         V2= V1 + V2;
        }
     }
   else
     {
      V3 = iVolume(NULL, 0, 0); // если понижающий цену тик 
      V4 = V3 + V4;             // то находим его объем  
     }

   V5=V2-V4;               // определяем разницу (дельту) между объемами положительных и отрицательных тиков
   Bid1=Bid;
   Buf_1[0]=V5; // в буфер сгружаем  дельту

                //   ExtBuffer = Buf_1 [0];
//   double macurrent=iMAOnArray(ExtBuffer,0,5,0,MODE_LWMA,0); 

// запись в файл данных буфера

//--- установим для массивов признак таймсерии 
   ArraySetAsSeries(Buf_1,true);
   ArraySetAsSeries(date_Buf_1,true);

//--- скопируем таймсерию 
   int copied=CopyTime(NULL,0,0,0,date_Buf_1);

//--- подготовим массив Buf_1 
   ArrayResize(Buf_1,copied);
//--- скопируем значения линии индикатора  
   for(int i=0;i<copied;i++)
     {
      Buf_1[i]=V5;
     }
//--- откроем файл для записи значений индикатора 
   ResetLastError();
   int file_handle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_WRITE|FILE_CSV);
   if(file_handle!=INVALID_HANDLE)
     {
      PrintFormat("Файл %s открыт для записи",InpFileName);
      PrintFormat("Путь к файлу: %s\\Files\\",TerminalInfoString(TERMINAL_DATA_PATH));
      //--- сначала запишем значения индикатора 
      FileWrite(file_handle,Buf_1[0]);
      //--- запишем время и значения в файл 
      for(int i=0;i<Buf_1[0];i++)
         FileWrite(file_handle,time_Buf_1[i],Buf_1[i]);
      //--- закрываем файл 
      FileClose(file_handle);
      PrintFormat("Данные записаны, файл %s закрыт",InpFileName);
     }
   else
      PrintFormat("Не удалось открыть файл %s, Код ошибки = %d",InpFileName,GetLastError());

   return(rates_total);
  }
//+------------------------------------------------------------------+
 
YarTrade:

Señores, ¿pueden darme una pista? He estado tratando de escribir los datos del indicador en un archivo para leerlo más tarde y construir un indicador basado en los datos. El indicador es de entrenamiento, calculo el volumen en cada tick de una barra determinada. Si el tick es positivo su volumen se añade con "+", si es negativo - con "-". Sumo los volúmenes acumulados obtenidos y obtengo un delta y considero este delta acumulado. Esto produce una curva. Sin embargo, esta curva se construye sólo en tiempo real. No se puede trazar en la historia. Para ello, he decidido escribir los datos en un archivo. Me quedé atascado en esta etapa. He conseguido con pena que el código no genere errores de compilación. Sin embargo, el producto resultante no funciona. El indicador funcionaba antes. Después de haber adjuntado el código para escribir el archivo el indicador ya no funciona. El programa crea un archivo con un registro incomprensible y muere en este punto. Llevo todo el día aquí sentado y no consigo entenderlo. ¿Puede alguien ayudarme?


Sería una buena idea mover el puntero al final del archivo antes de grabar.

FileSeek - Файловые операции - Справочник MQL4
FileSeek - Файловые операции - Справочник MQL4
  • docs.mql4.com
Если выставить позицию за "правую границу" файла (больше, чем размер файла), то последующая запись в файл будет будет произведена не с конца файла, а с выставленной позиции. При этом между предыдущим концом файла и выставленной позицией будут записаны неопределенные значения...
 
Alexey Viktorov:

Sería bueno mover el puntero al final del archivo antes de escribir.


¿Para qué es esto? He leído el enlace, pero no lo entiendo.

 
YarTrade:

¿Para qué sirve esto? He leído el enlace, pero no lo entiendo.

¿Para qué? Cuando se abre un archivo, el puntero se sitúa al principio del archivo y la información se escribe al principio del mismo. Para escribir en el lugar correcto, tienes que mover el puntero al lugar correcto.

 
YarTrade:

Señores, ¿pueden darme una pista? Por segunda semana he estado tratando de escribir los datos del indicador en un archivo...

¿Lo has leído?
 
Alexey Kozitsyn:
¿Lo has leído?

Todavía estoy aprendiendo MQL4. No he leído.

¿Existe algún servicio de formación en línea donde se pueda aprender MQL4 de forma gratuita/pagada mediante ejemplos con un instructor? Casi he leído un tutorial de MQL4, pero no sé programar en absoluto. No estoy familiarizado con la programación antes. Estoy intentando aprender algo en este hilo, pero no he avanzado nada. ¿Puede darme algún consejo?

 
YarTrade:

Todavía estoy aprendiendo MQL4. No he leído.

¿Existe algún servicio de formación en línea donde se pueda aprender MQL4 de forma gratuita/pagada mediante ejemplos con un tutor? Casi he leído un tutorial de MQL4, pero no sé programar en absoluto. No estoy familiarizado con la programación antes. Estoy intentando aprender algo en este hilo, pero no he avanzado nada. ¿Puede darme algunas sugerencias?

1. Trabajar con archivos en mql4 es lo mismo que en mql5.

2. Con el debido respeto a Sergei Kovalev, él también respondió a mis preguntas en su momento, pero en mi opinión, las lecciones de Kirill son más fáciles de entender. En Yandex escribes e inmediatamente 2 enlaces a su lección


 

Hola! El tutorial de la página web fue suficiente para mí, después de unos años de golpear sobre los bafles aprendí a escribir mis propios indicadores. Pero las preguntas permanecen. Ahora no entiendo por qué se confunden los indicadores. En la M1, después de unas 12 horas, algunos de ellos empiezan a dibujar incorrectamente pero señalan correctamente. Algunos dibujan y señalan incorrectamente. En la M5 siguen dibujando cinco veces más. ¿Puede darme una pista, por favor?

 
Alexey Viktorov:

1. El manejo de los archivos en mql4 es el mismo que en mql5.

2. Con el debido respeto a Sergei Kovalev, él también respondió a mis preguntas en su momento, pero en mi opinión, la lección de Kirill es más fácil de entender. En Yandex, escriba en e inmediatamente 2 enlaces a su lección



¿Es posible aprender con la ayuda de las lecciones de "Kirill" si no te has dedicado a la programación antes? ¿Cuánto tiempo tarda?

Razón de la queja: