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

 
Taras Slobodyanik:

No veo el cero, has metido la pata en algún sitio.


¿Dan ambas impresoras los mismos valores?

Porque no hay funciones de impresión en mi código y estas líneas se suceden, por lo que los valores no cambian de ninguna manera.

Pero Var da 0 y Code da el valor necesario

 
LuckySith:

Pero el valor que asigno sale de inmediato. Así que el código es esencialmente el siguiente:

a=b;

Imprime (a);

Imprimir (b);

Pero a es igual a cero mientras que b se imprime correctamente

Es posible que si int a y double b>0 y b<1 al asignar un valor real a una variable entera, se descarte la parte fraccionaria

 
STARIJ:

Esto es posible si int a y double b>0 y b<1 cuando se asigna un valor real a una variable entera, se descarta la parte fraccionaria


b es mayor que uno mucho mayor que uno

a es un array de tipo double

 

El problema se ha resuelto.

He creado la matriz de la siguiente manera:


doble línea[];

Con esta opción, al asignar línea[0]=x; el elemento nulo seguía apareciendo vacío.


Cuando escribí


doble línea[20];


Todo funciona como debería. No entiendo por qué, en el primer caso simplemente creé un array no limitado; ¿cuál es la diferencia?

 
LuckySith:

El problema se ha resuelto.

He creado la matriz de la siguiente manera:


doble línea[];

Con esta opción, al asignar línea[0]=x; el elemento nulo seguía apareciendo vacío.


Cuando escribí


doble línea[20];


Todo funciona como debería. No entiendo por qué, en el primer caso simplemente creé un array no limitado; ¿cuál es la diferencia?

Has creado un array dinámico, mientras que su tamaño debe ser establecido y controlado por ti mismo.

 
Artyom Trishkin:

Has creado un array dinámico, pero tienes que establecer y controlar el tamaño tú mismo.

La directiva #property strict acelera la localización de este error. El programa termina con un mensaje como: array fuera de rango en 'C.mq4' (31,32)
 

¿No hay nadie para ayudar? El callejón sin salida para mí se establece aquí:escribir la información actual de iVolumeen el archivo?

El código del software se describe aquí:https://www.mql5.com/ru/forum/160683/page378#comment_6053255

Любые вопросы новичков по MQL4, помощь и обсуждение по алгоритмам и кодам
Любые вопросы новичков по MQL4, помощь и обсуждение по алгоритмам и кодам
  • 2017.11.14
  • www.mql5.com
В этой ветке я хочу начать свою помощь тем, кто действительно хочет разобраться и научиться программированию на новом MQL4 и желает легко перейти н...
 
LRA:

Indicador por datos del archivo - introdujo esta línea en la búsqueda y encontró


Para recuperar datos de un archivo, primero hay que rellenarlo.

 

Ow... ¡Buena gente! ¡Ayuda, por favor! Estoy aprendiendo a programar. Sin su ayuda es un punto muerto.

Estoy tratando de escribir los datos del indicador en un archivo, para poder utilizarlo más tarde para construir un indicador. El indicador se dibuja como una línea basada en la diferencia entre el volumen de ticks positivos y el volumen de ticks negativos para la barra actual.

Utilicé MQL4 Reference para recibir información sobre cómo cargar una matriz de datos en un archivo. Como resultado obtuve un código lleno de errores. No puedo entender la esencia de los errores, y en general no he utilizado correctamente la pista del libro de referencia o no. ¿Alguien puede ayudar?

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); 
      //--- запишем время и значения в файл 
      for(int i=0;i<Buf_1;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: Estoy tratando de escribir los datos del indicador en un archivo para poder usarlo después para construir el indicador. El indicador se construye como una línea, basada en los datos de la diferencia entre el volumen de ticks positivos y el volumen de ticks negativos para la barra actual.

Si cree que alguien que mira su código puede encontrar rápidamente un error, se equivoca. El compilador busca errores. El texto del programa debe ser formateado - MetaEditor tiene una herramienta de estilo para eso. Si le gusta un estilo diferente, utilice, por ejemplo, el programa AStyle.exe. Después de la estilización, verá rápidamente que el programa 1) tiene un paréntesis de cierre extra. 2) Variable declarada: datetime date_Buf_1; // Indicador de matriz de fechas - para que sea una matriz, debe ser [size] o [] para una matriz dinámica y luego el tamaño debe ser establecido a ArrayResize parece. Y esto debería hacerse antes de usar un array - ver los posts anteriores sobre ello. 3) FileOpen(InpDirectoryName+"//"+InpFileName - parece que los palos deberían estar inclinados en la otra dirección. Y mejor prescindir de InpDirectoryName+"//" - de todos modos encontrará el archivo en la carpeta Files.

en la línea: int copied=CopyTime(NULL,0,0,0,date_Buf_1); el compilador se enfada, start=end=0 number=0

Стилизатор - Работа с исходным кодом - Разработка программ - Справка по MetaEditor
Стилизатор - Работа с исходным кодом - Разработка программ - Справка по MetaEditor
  • www.metatrader5.com
Данная функция предназначена для оформления исходного кода в соответствии с рекомендуемым стандартом. Это позволяет сделать код более читаемым, выглядящем профессионально. Грамотно оформленный код гораздо проще анализировать в последующем как его автору, так и другим пользователям. Для того чтобы запустить стилизатор, необходимо выполнить...