Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 379

 
Taras Slobodyanik:

не вижу нуля, где-то вы намудрили


У Вас оба принта выдают одинаковые значения?

Потому что у меня в коде нет никаких функций Print, а строчки эти идут одна за другой соотвественно никак значения не меняются.

Но Var выдает 0, а Code - нужное значение

 
LuckySith:

Так ведь присваемое значение я и вывожу сразу. То есть по сути код такой:

a=b;

Print (a);

Print (b);

Но a выдает равным нулю, а b выводит правильно

Такое возможно, если int a    и  double b>0  и b<1   при присваивании целой переменной действительного значения дробная часть отбрасывается

 
STARIJ:

Такое возможно, если int a    и  double b>0  и b<1   при присваивании целой переменной действительного значения дробная часть отбрасывается


b больше единицы намного

а - массив типа double

 

Проблему решил.

Массив у меня был создан следующим образом:


double line[];

При таком варианте при присванивании line[0]=x; нулевой элемент как видно все равно оставался пустым.


Когда я написал 


double line[20];


Все заработало как надо. Не понимаю почему так, ведь в первом случае я просто создал неограниченный массив, в чем разница?

 
LuckySith:

Проблему решил.

Массив у меня был создан следующим образом:


double line[];

При таком варианте при присванивании line[0]=x; нулевой элемент как видно все равно оставался пустым.


Когда я написал 


double line[20];


Все заработало как надо. Не понимаю почему так, ведь в первом случае я просто создал неограниченный массив, в чем разница?

Вы создали динамический массив, а размер-то ему нужно задавать и контролировать самостоятельно.

 
Artyom Trishkin:

Вы создали динамический массив, а размер-то ему нужно задавать и контролировать самостоятельно.

Директива  #property strict  ускоряет нахождение этой ошибки. Программа заканчивается с сообщением типа: array out of range in 'С.mq4' (31,32)
 

Никто таки не отзывается на помощь? Тупиковая для меня проблема изложена здесь: https://www.mql5.com/ru/forum/160683/page378#comment_6053255

Вопрос:

1) как описать код, позволяющий строить график по усредненным данным, которые у меня записываются в буфер?

2) возможно ли данные по этому индикатору (которые получаются в реальном режиме) записывать в некий файл, чтобы потом, сославшись на этот файл, можно было бы построить индикатор на исторических данных, применив к ним уже собранные тиковые объемы? Если можно, то как это описать программно? Или есть иное решение, не требующее записи в файл текущей информацией iVolume?

Код программы описан тут: https://www.mql5.com/ru/forum/160683/page378#comment_6053255

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

Индикатор по данным из файла - ввел эту строку в поиске и нашел


Чтобы данные из файла получить, нужно сначала туда данные залить. 

 

Ау... люди добрые! Помогите, плиз! Осваиваю программирование. Без Вашей помощи тупик полный. 

Данные индикатора пытаюсь записать в файл, чтобы потом пользоваться ими для построения индикатора. Индикатор строится как линия, на основе данных по разнице между объемом положительных тиков и объемом отрицательных тиков для текущего бара.

Воспользовался справочником MQL4 для получения информации, как массив данных выгрузить в файл. В итоге получил код полный ошибок. Не могу понять ни сути ошибок, и вообще правильно воспользовался подсказкой из справочника или нет. Кто-нибудь может помочь? 

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:  Данные индикатора пытаюсь записать в файл, чтобы потом пользоваться ими для построения индикатора. Индикатор строится как линия, на основе данных по разнице между объемом положительных тиков и объемом отрицательных тиков для текущего бара.

Если Вы думаете, что кто-то, глядя на Ваш код, может быстро найти ошибка - заблуждаетесь. Ошибки ищет компилятор. Текст программы должен быть отформатирован - для этого в 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

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