1) как описать код, позволяющий строить график по усредненным данным, которые у меня записываются в буфер?
2) возможно ли данные по этому индикатору (которые получаются в реальном режиме) записывать в некий файл, чтобы потом, сославшись на этот файл, можно было бы построить индикатор на исторических данных, применив к ним уже собранные тиковые объемы? Если можно, то как это описать программно? Или есть иное решение, не требующее записи в файл текущей информацией iVolume?
Ау... люди добрые! Помогите, плиз! Осваиваю программирование. Без Вашей помощи тупик полный.
Данные индикатора пытаюсь записать в файл, чтобы потом пользоваться ими для построения индикатора. Индикатор строится как линия, на основе данных по разнице между объемом положительных тиков и объемом отрицательных тиков для текущего бара.
Воспользовался справочником MQL4 для получения информации, как массив данных выгрузить в файл. В итоге получил код полный ошибок. Не могу понять ни сути ошибок, и вообще правильно воспользовался подсказкой из справочника или нет. Кто-нибудь может помочь?
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: Данные индикатора пытаюсь записать в файл, чтобы потом пользоваться ими для построения индикатора. Индикатор строится как линия, на основе данных по разнице между объемом положительных тиков и объемом отрицательных тиков для текущего бара.
Если Вы думаете, что кто-то, глядя на Ваш код, может быстро найти ошибка - заблуждаетесь. Ошибки ищет компилятор. Текст программы должен быть отформатирован - для этого в MetaEditor есть стилизатор. Если Вам нравится другой стиль - используйте, например, программу AStyle.exe. После стилизации вы быстро увидите, что в программе 1) лишняя закрывающая скобка. 2) Объявлена переменная: datetime date_Buf_1; // массив дат индикатора - чтоб это был массив, надо [размер] или [] для динамического массива и потом размер задать ArrayResize кажется. И это нужно делать до использования массива - смотрите про это посты выше. 3) FileOpen(InpDirectoryName+"//"+InpFileName - кажется, палки надо наклонить в другую сторону. А лучше обойтись без InpDirectoryName+"//" - в папке Files и так файл найдете.
на строку: int copied=CopyTime(NULL,0,0,0,date_Buf_1); Компилятор злится, начало=конец=0 количество=0
Данная функция предназначена для оформления исходного кода в соответствии с рекомендуемым стандартом. Это позволяет сделать код более читаемым, выглядящем профессионально. Грамотно оформленный код гораздо проще анализировать в последующем как его автору, так и другим пользователям. Для того чтобы запустить стилизатор, необходимо выполнить...
не вижу нуля, где-то вы намудрили
У Вас оба принта выдают одинаковые значения?
Потому что у меня в коде нет никаких функций Print, а строчки эти идут одна за другой соотвественно никак значения не меняются.
Но Var выдает 0, а Code - нужное значение
Так ведь присваемое значение я и вывожу сразу. То есть по сути код такой:
a=b;
Print (a);
Print (b);
Но a выдает равным нулю, а b выводит правильно
Такое возможно, если int a и double b>0 и b<1 при присваивании целой переменной действительного значения дробная часть отбрасывается
Такое возможно, если int a и double b>0 и b<1 при присваивании целой переменной действительного значения дробная часть отбрасывается
b больше единицы намного
а - массив типа double
Проблему решил.
Массив у меня был создан следующим образом:
double line[];
При таком варианте при присванивании line[0]=x; нулевой элемент как видно все равно оставался пустым.
Когда я написал
double line[20];
Все заработало как надо. Не понимаю почему так, ведь в первом случае я просто создал неограниченный массив, в чем разница?
Проблему решил.
Массив у меня был создан следующим образом:
double line[];
При таком варианте при присванивании line[0]=x; нулевой элемент как видно все равно оставался пустым.
Когда я написал
double line[20];
Все заработало как надо. Не понимаю почему так, ведь в первом случае я просто создал неограниченный массив, в чем разница?
Вы создали динамический массив, а размер-то ему нужно задавать и контролировать самостоятельно.
Вы создали динамический массив, а размер-то ему нужно задавать и контролировать самостоятельно.
Никто таки не отзывается на помощь? Тупиковая для меня проблема изложена здесь: https://www.mql5.com/ru/forum/160683/page378#comment_6053255
Вопрос:
1) как описать код, позволяющий строить график по усредненным данным, которые у меня записываются в буфер?
2) возможно ли данные по этому индикатору (которые получаются в реальном режиме) записывать в некий файл, чтобы потом, сославшись на этот файл, можно было бы построить индикатор на исторических данных, применив к ним уже собранные тиковые объемы? Если можно, то как это описать программно? Или есть иное решение, не требующее записи в файл текущей информацией iVolume?
Код программы описан тут: https://www.mql5.com/ru/forum/160683/page378#comment_6053255
Индикатор по данным из файла - ввел эту строку в поиске и нашел
Чтобы данные из файла получить, нужно сначала туда данные залить.
Ау... люди добрые! Помогите, плиз! Осваиваю программирование. Без Вашей помощи тупик полный.
Данные индикатора пытаюсь записать в файл, чтобы потом пользоваться ими для построения индикатора. Индикатор строится как линия, на основе данных по разнице между объемом положительных тиков и объемом отрицательных тиков для текущего бара.
Воспользовался справочником MQL4 для получения информации, как массив данных выгрузить в файл. В итоге получил код полный ошибок. Не могу понять ни сути ошибок, и вообще правильно воспользовался подсказкой из справочника или нет. Кто-нибудь может помочь?
Если Вы думаете, что кто-то, глядя на Ваш код, может быстро найти ошибка - заблуждаетесь. Ошибки ищет компилятор. Текст программы должен быть отформатирован - для этого в MetaEditor есть стилизатор. Если Вам нравится другой стиль - используйте, например, программу AStyle.exe. После стилизации вы быстро увидите, что в программе 1) лишняя закрывающая скобка. 2) Объявлена переменная: datetime date_Buf_1; // массив дат индикатора - чтоб это был массив, надо [размер] или [] для динамического массива и потом размер задать ArrayResize кажется. И это нужно делать до использования массива - смотрите про это посты выше. 3) FileOpen(InpDirectoryName+"//"+InpFileName - кажется, палки надо наклонить в другую сторону. А лучше обойтись без InpDirectoryName+"//" - в папке Files и так файл найдете.
на строку: int copied=CopyTime(NULL,0,0,0,date_Buf_1); Компилятор злится, начало=конец=0 количество=0