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)
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?
inputstring InpFileName="111.csv"; // Имя файла inputstring InpDirectoryName="Data"; // Имя каталога datetime Время=0; // Время прошлого бараdouble Bid1;
double Buf_1[];
// double ExtBuffer;long V1; // объем для текущего тика вверхlong V2; // накопленный объем для всех тиков вверх текущего бараlong V3; // объем текущего тика внизlong V4; // накопленный объем для всех тиков вниз для текущего бараlong V5; // отрицательные и положительные iVolume нарастающим итогомvoidOnInit()
{
IndicatorDigits(0);
SetIndexBuffer(0,Buf_1);
//SetIndexBuffer(1,Buf_2);
Bid1=Bid;
V5 = 0;
}
//+------------------------------------------------------------------+//| Custom indicator iteration function |//+------------------------------------------------------------------+intOnCalculate(constint rates_total,
constint prev_calculated,
constdatetime &time[],
constdouble &open[],
constdouble &high[],
constdouble &low[],
constdouble &close[],
constlong &tick_volume[],
constlong &volume[],
constint &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);
}
elsePrintFormat("Не удалось открыть файл %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
Данная функция предназначена для оформления исходного кода в соответствии с рекомендуемым стандартом. Это позволяет сделать код более читаемым, выглядящем профессионально. Грамотно оформленный код гораздо проще анализировать в последующем как его автору, так и другим пользователям. Для того чтобы запустить стилизатор, необходимо выполнить...
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
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
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?
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.
Avete creato un array dinamico, ma dovete impostare e controllare la dimensione da soli.
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
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?
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