Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 379

 
Taras Slobodyanik:

Non vedo zero, hai sbagliato da qualche parte.


Avete gli stessi valori in entrambe le stampanti?

Perché non ci sono funzioni di stampa nel mio codice e queste linee si susseguono una dopo l'altra, quindi i valori non cambiano in alcun modo.

Ma Var dà 0 e Code dà il valore necessario

 
LuckySith:

Ma io emetto subito il valore che sto assegnando. Quindi il codice è essenzialmente il seguente:

a=b;

Stampa (a);

Stampa (b);

Ma a è uguale a zero mentre b è stampato correttamente

È possibile che se int a e double b>0 e b<1 quando si assegna un valore reale a una variabile intera, la parte frazionaria venga scartata

 
STARIJ:

Questo è possibile se int a e double b>0 e b<1 quando si assegna un valore reale a una variabile intera, la parte frazionaria viene scartata


b è maggiore di uno molto maggiore di uno

a è un array di tipo doppio

 

Il problema è stato risolto.

Ho creato l'array nel modo seguente:


doppia linea[];

Con questa opzione, quando si assegnava line[0]=x; l'elemento nullo appariva ancora vuoto.


Quando ho scritto


doppia linea[20];


Tutto funziona come dovrebbe. Non capisco perché, nel primo caso ho semplicemente creato un array non limitato; qual è la differenza?

 
LuckySith:

Il problema è stato risolto.

Ho creato l'array nel modo seguente:


doppia linea[];

Con questa opzione, quando si assegnava line[0]=x; l'elemento null appariva ancora vuoto.


Quando ho scritto


doppia linea[20];


Tutto funziona come dovrebbe. Non capisco perché, nel primo caso ho semplicemente creato un array senza limiti; qual è la differenza?

Avete creato un array dinamico, mentre la sua dimensione dovrebbe essere impostata e controllata da voi stessi.

 
Artyom Trishkin:

Avete creato un array dinamico, ma dovete impostare e controllare la dimensione da soli.

La direttiva #property strict accelera la ricerca di questo errore. Il programma finisce con un messaggio del tipo: array out of range in 'C.mq4' (31,32)
 

Non c'è nessuno ad aiutare? Ilvicolo cieco per me si trova qui:scrittura delle informazioni correnti di iVolumenel file?

Il codice del software è descritto qui:https://www.mql5.com/ru/forum/160683/page378#comment_6053255

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

Indicatore di dati da file - ha inserito questa linea nella ricerca e ha trovato


Per recuperare i dati da un file, dovete prima riempirlo.

 

Ahi... Brava gente! Aiuto, per favore! Sto imparando a programmare. Senza il tuo aiuto è una situazione di stallo.

Sto cercando di scrivere i dati dell'indicatore in un file, in modo da poterli usare in seguito per costruire un indicatore. L'indicatore è disegnato come una linea basata sulla differenza tra il volume dei tick positivi e il volume dei tick negativi per la barra corrente.

Ho usato MQL4 Reference per ricevere informazioni su come caricare un array di dati in un file. Come risultato ho ottenuto un codice pieno di errori. Non riesco a capire l'essenza degli errori, e in generale non ho usato correttamente il suggerimento del libro di riferimento o meno. Qualcuno può aiutare?

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: Sto cercando di scrivere i dati dell'indicatore in un file in modo da poterli utilizzare in seguito per costruire l'indicatore. L'indicatore è costruito come una linea, basata sui dati sulla differenza tra il volume dei tick positivi e il volume dei tick negativi per la barra corrente.

Se pensate che qualcuno guardando il vostro codice possa trovare rapidamente un errore, vi sbagliate. Il compilatore cerca gli errori. Il testo del programma dovrebbe essere formattato - MetaEditor ha uno strumento di styling per questo. Se ti piace uno stile diverso - usa, per esempio, il programma AStyle.exe. Dopo lo styling, vedrete rapidamente che il programma 1) ha una parentesi di chiusura in più. 2) Variabile dichiarata: datetime date_Buf_1; // indicatore array di date - perché questo sia un array, deve essere [size] o [] per un array dinamico e poi la dimensione deve essere impostata su ArrayResize, sembra. E devi farlo prima di usare un array - vedi i post precedenti a questo proposito. 3) FileOpen(InpDirectoryName+"//"+InpFileName - sembra che i bastoni dovrebbero essere inclinati dall'altra parte. Ed è meglio fare a meno di InpDirectoryName+"//" - troverete comunque il file nella cartella Files.

sulla linea: int copied=CopyTime(NULL,0,0,0,0,date_Buf_1); il compilatore si arrabbia, start=end=0 number=0

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