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

 
Vitaly Muzichenko:

Пусть будет изначально такая.

Далее, нужно сделать правильное фиксирование что бар отработан, но здесь нужно просчитать весь подход к ТЗ.

Пока то, что Я вижу с вашего поста, то нужно сделать так:

Суть такая, что если спред больше нормы, значит выходим снова в OnTick, и на новом тике проверяем спред, если он нормальный - отправляем ордер и запоминаем, что на этом баре была сделка.

Можно ещё второй способ:

В общем, вам нужно определиться с логикой, когда должно записаться, и больше не проверятся до образования "Нового бара"


Я Вас понял, спасибо!

 

Господа, можете подсказать, плиз. Вторую неделю делаю попытку записать данные индикатора в файл, чтобы потом его прочесть и построить на основе данных индикатор. Индикатор учебный, считаю объем на каждом тике конкретного бара. Если тик положительный его объем складываю с "+", если отрицательный - с "-". Полученные накопленные объемы складываю и получаю дельту, а эту дельту учитываю нарастающим итогом. Так получается кривая. Однако, это кривая строится только в реальном времени. На истории не строится. Для этого решил записывать данные в файл. Застрял на этом этапе. С горем добился, чтобы код не выдавал ошибки компилятора. Однако, полученный продукт не работает. Индикатор до этого - работал. После того как я прикрепил к нему код по записи в файл, индикатор перестал работать. Файл программа создает с одной непонятной записью, и на этом умирает. Сижу целый день, ничего понять не могу. Поможет, кто-нибудь?

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#property version   "1.00"
#property strict
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_label1  "Вверх"
#property indicator_type1   DRAW_LINE
#property indicator_color1  Salmon
#property indicator_style1  STYLE_SOLID
#property indicator_width1  2

#property indicator_label2  "Вниз"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrDarkTurquoise
#property indicator_style2  STYLE_SOLID
#property indicator_width2  2

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[0]);
      //--- запишем время и значения в файл 
      for(int i=0;i<Buf_1[0];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:

Господа, можете подсказать, плиз. Вторую неделю делаю попытку записать данные индикатора в файл, чтобы потом его прочесть и построить на основе данных индикатор. Индикатор учебный, считаю объем на каждом тике конкретного бара. Если тик положительный его объем складываю с "+", если отрицательный - с "-". Полученные накопленные объемы складываю и получаю дельту, а эту дельту учитываю нарастающим итогом. Так получается кривая. Однако, это кривая строится только в реальном времени. На истории не строится. Для этого решил записывать данные в файл. Застрял на этом этапе. С горем добился, чтобы код не выдавал ошибки компилятора. Однако, полученный продукт не работает. Индикатор до этого - работал. После того как я прикрепил к нему код по записи в файл, индикатор перестал работать. Файл программа создает с одной непонятной записью, и на этом умирает. Сижу целый день, ничего понять не могу. Поможет, кто-нибудь?


 

Хорошо-бы перед записью переместить указатель в конец файла.

FileSeek - Файловые операции - Справочник MQL4
FileSeek - Файловые операции - Справочник MQL4
  • docs.mql4.com
Если выставить позицию за "правую границу" файла (больше, чем размер файла), то последующая запись в файл будет будет произведена не с конца файла, а с выставленной позиции. При этом между предыдущим концом файла и выставленной позицией будут записаны неопределенные значения...
 
Alexey Viktorov:

Хорошо-бы перед записью переместить указатель в конец файла.


А зачем это нужно? Прочел ссылку, но ничего не понял. 

 
YarTrade:

А зачем это нужно? Прочел ссылку, но ничего не понял. 

Ну как зачем? Открываешь файл, указатель стоит в начале файла, в начало файла и пишется информация. Для записи в нужное место, указатель надо переместить куда нужно.

 
YarTrade:

Господа, можете подсказать, плиз. Вторую неделю делаю попытку записать данные индикатора в файл...

Читали?
 
Alexey Kozitsyn:
Читали?

Я пока изучаю MQL4. Не читал.

Есть такой обучающий интернет сервис, чтобы можно было платно/бесплатно обучаться MQL4 на примерах с преподавателем? Почти прочел учебник по MQL4, но програмить совсем не могу. Раньше программированием не занимался вовсе. Пытаюсь в этой ветке что-то узнать, но за неделю не продвинулся ни на шаг. Можете посоветовать? 

 
YarTrade:

Я пока изучаю MQL4. Не читал.

Есть такой обучающий интернет сервис, чтобы можно было платно/бесплатно обучаться MQL4 на примерах с преподавателем? Почти прочел учебник по MQL4, но програмить совсем не могу. Раньше программированием не занимался вовсе. Пытаюсь в этой ветке что-то узнать, но за неделю не продвинулся ни на шаг. Можете посоветовать? 

1. Работа с файлами в mql4 такая-же как в mql5.

2. При всём уважении к Сергею Ковалёву, он мне тоже отвечал на вопросы, в своё время, но на мой взгляд урок от Кирилла доходчивей. В яндексе набираешь и сразу 2 ссылки на его урок


 

Здравствуйте! Мне хватило учебника с сайта, за несколько лет биений о подводные камни научился сам себе писать индикаторы. Но вопросы остаются. Сейчас не пойму почему индикаторы сбиваются. На М1 примерно через 12 часов некоторые начинают рисовать неправильно, а сигналят правильно. Некоторые рисуют и сигналят по неправильной отрисовке. На М5 держатся раз в пять дольше. Подскажите пожалуйста.

 
Alexey Viktorov:

1. Работа с файлами в mql4 такая-же как в mql5.

2. При всём уважении к Сергею Ковалёву, он мне тоже отвечал на вопросы, в своё время, но на мой взгляд урок от Кирилла доходчивей. В яндексе набираешь и сразу 2 ссылки на его урок



Реально научиться по урокам "от Кирилла", если программированием не занимался ранее? И сколько, с Вашей точки зрения займет это времени?