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

 

Кто-нибудь из добрых людей подскажите как написать следующую штуку.

Сделал учебный индикатор, который считает iVolume для каждого тика: для тех что дернулись вверх  iVolume положительная, а для тех что вниз - отрицательная iVolume. Чтобы получилась кривая, все iVolume (положительный и отрицательные) складываю нарастающим итогом от бара к бару. Получается кривая. Однако, я столкнулся с 2-мя проблемами:

1) линия получается сильно ломаная;

2) невозможно протестировать советник, поскольку , полученный  график iVolume живет только жизнью реальной.

Вопрос:

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

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

#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

datetime Время=0;   // Время прошлого бара
double Bid1;
double   Buf_1[];
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;         // и обнулить последний элемент буфера
   }
   
      
   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; // в буфер сгружаем 
  
   
  return(rates_total);
}


 

 

Может в конце кода добавить:

double macurrent=iMAOnArray(Buf_1[0],0,5,0,MODE_LWMA,0);

Эх нет! Компилятор пишет ошибку, что мол, нет массива.


 
здравствуйте, подскажите что значат эти восклицательные знаки в тостере стратегий?
 

Кто-нибудь....., может помочь?  Моя тупиковая для меня задача изложена здесь: https://www.mql5.com/ru/forum/160683/page378#comment_6053255

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

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

 

Какой-то кошмар, не понимаю почему так выдает:
Участок кода :


 line[0]=MathFloor(Low[1]*MathPow(10,D-1));
 Print("Var ",DoubleToStr(line[0],D));
 Print("Code ",DoubleToStr(MathFloor(Low[1]*MathPow(10,D-1)),D));

Выводит :

 EURUSD,M15: Var 0.00000
 EURUSD,M15: Code 11754.00000


Что происходит со значением после присваивания?

 
LuckySith:   Участок кода :

 line[0]=MathFloor(Low[1]*MathPow(10,D-1));
 Print("Var ",DoubleToStr(line[0],D));
 Print("Code ",DoubleToStr(MathFloor(Low[1]*MathPow(10,D-1)),D));

Выводит :

 EURUSD,M15: Var 0.00000
 EURUSD,M15: Code 11754.00000

Что происходит со значением после присваивания?

Распечатайте значения переменных после присваивания и значение переменной D. Посчитаем на калькуляторе...

 

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

Файлы:
Awesome-33.ex4  16 kb
 
STARIJ:

Распечатайте значения переменных после присваивания и значение переменной D. Посчитаем на калькуляторе...


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


a=b;

Print (a);

Print (b);

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

 
LuckySith:

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


a=b;

Print (a);

Print (b);

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


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

   int D=5;
   double a=MathFloor(Low[1]*MathPow(10,D-1)); 
   Print("Var ",DoubleToStr(a,D)); 
   Print("Code ",DoubleToStr(MathFloor(Low[1]*MathPow(10,D-1)),D)); 
Причина обращения: