Ваши вопросы по языку MQL4

Абдулхаким

Почетный гражданин
как сделать отрисовку на указанное количество дней назад
в цикле
C-подобный:
Expand Collapse Copy
for(int it=0; it<days; it++)
итератор подставь сюда
C-подобный:
Expand Collapse Copy
iTime(NULL,i,it)
названия линий должны отличаться
 

Viktor73

Новичок форума
сделал вот так но не прорисовывает на все указанные дни

int days = 5;//количество дней отрисовки
M=0; if ((ChartSymbol(0))=="XAUUSD")M=1;
for(int it=0; it<days; it++)
{
int i=1440;
LastBar = iBarShift(Symbol(),0,iTime(NULL,i,it))-M;
double Ind1 = iCustom(Symbol(),PERIOD_H1,Indicatr,0,LastBar);
if (LastBar != iBarShift(Symbol(), 0, iTime(NULL,i,it+1))-M)
{
Line("Ind_",Time[LastBar],Ind1,Time[LastBar]+(PERIOD_D1*60)-M,Ind1,clrBlue,STYLE_SOLID,2,false,false,false);//name = "Ind_1H1"; if(ObjectFind(name)==-1)
}
}

// ---------- ТРЕНД ЛИНИЯ ----------
void Line(string name,datetime time1,double price1,datetime time2,double price2,color clr,ENUM_LINE_STYLE style,int width,bool back=false,bool selectable=false,bool ray_right=false)
{
name = name + TimeDayOfYear(LastBar);
if(ObjectFind(name) != -1) {ObjectDelete(name);}
ObjectCreate(name,OBJ_TREND,0,0,0,0,0); //--- создание "линии"
ObjectSet(name,OBJPROP_TIME1,time1); // v координата X1
ObjectSet(name,OBJPROP_PRICE1,price1); // v координата Y1
ObjectSet(name,OBJPROP_TIME2,time2); // v координата X2
ObjectSet(name,OBJPROP_PRICE2,price2); // v координата Y2
ObjectSet(name,OBJPROP_COLOR,clr); // v установим цвет линии
ObjectSet(name,OBJPROP_STYLE,style); // v установим стиль отображения линии
ObjectSet(name,OBJPROP_WIDTH,width); // v установим толщину линии
ObjectSet(name,OBJPROP_BACK,back); // v отобразим на переднем (false) или заднем (true) плане
ObjectSet(name,OBJPROP_SELECTABLE,selectable);// v включим (true) или отключим (false) режим перемещения линии мышью
ObjectSet(name,OBJPROP_SELECTED,false); //--- (false) не выделен
ObjectSet(name,OBJPROP_RAY_RIGHT,ray_right); // v включим (true) или отключим (false) режим продолжения отображения линии вправо
ObjectSet(name,OBJPROP_HIDDEN,true); //--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
ObjectSet(name,OBJPROP_ZORDER,1); //--- установим приоритет на получение события нажатия мыши на графике
}

1674225837539.png
 

Абдулхаким

Почетный гражданин
но не прорисовывает на все указанные дни
название линии сделай таким
C-подобный:
Expand Collapse Copy
"Ind_"+TimeToString(iTime(NULL,0,LastBar),TIME_DATE)
а эту строчку
C-подобный:
Expand Collapse Copy
name = name + TimeDayOfYear(LastBar);
удали, ну или запиши её так
C-подобный:
Expand Collapse Copy
name += string(TimeDayOfYear(time1));
 

Viktor73

Новичок форума
код получился таким

int start()
{
M=0; if ((ChartSymbol(0))=="XAUUSD")M=1;
for(int it=0; it<days; it++)
{
int i=1440;
LastBar = iBarShift(Symbol(),0,iTime(NULL,i,it))-M;
double Ind1 = iCustom(Symbol(),0,Indicatr,0,LastBar);
if (LastBar != iBarShift(Symbol(), 0, iTime(NULL,i,it+1))-M)
{
Line("Ind_"+TimeToString(iTime(NULL,0,LastBar),TIME_DATE),Time[LastBar],Ind1,Time[LastBar]+(PERIOD_D1*60)-M,Ind1,clrBlue,STYLE_SOLID,2,false,false,false);
}
}
return(0);
}
 

Viktor73

Новичок форума
теперь еще вопрос. как лучше делать что бы данные постоянно не обновлялись.
записать в переменную или в файл и там хранить данные.
эту часть кода
double Ind1 = iCustom(Symbol(),0,Indicatr,0,LastBar);
, я понимаю что можно проводить расчет при запуске индикатора или при событии Тайм.раз в сутки. на новой свече.
просто получиться если так делать до будут пересчитываться все старые данные, а это нагружает работу терминала и скорость работы индикатора.
как лучше поступить ?
и главное надо избежать рисования. уровни должны оставаться ся не изменными именно на старте дня. в идеале
 
Последнее редактирование:

Абдулхаким

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

Viktor73

Новичок форума
я так понимаю записывать данные нужно через эту функцию "FileWrite"
 

Абдулхаким

Почетный гражданин
Удаляя вручную уровни , возвращает сразу на место , тестил на 20 днях.
ограничь переменной, чтобы расчёт был раз в сутки и при инициализации,
для оптимизации много вариантов, но и "контекст" нужно весь учитывать ...
сделай проверку на наличие линии, если она есть, то пропускай расчёт для этого дня.
проверь, что будет быстрее.
 

star603

Новичок форума
Код:
Expand Collapse Copy
double indikator[75][31];//Значения разных индикаторов
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void OnTick()
  {
    uo(indikator);
  Comment(indikator[0][1]);
  }
//+------------------------------------------------------------------+
void uo(double &gh[75][31])
  {
   for(int i = 0; i < ArrayRange(gh, 1); i++)
     {
      gh[0][i] = iFractals(_Symbol,PERIOD_CURRENT,MODE_UPPER,i);//Фрактал вверх
      gh[1][i] = iFractals(_Symbol,PERIOD_CURRENT,MODE_LOWER,i);//Фрактал вниз
      gh[2][i] = iAC(_Symbol,PERIOD_CURRENT,i);//Accelerator/Decelerator.
      gh[3][i] = iAO(_Symbol,PERIOD_CURRENT,i);//Awesome Oscillator.
      gh[4][i] = iMomentum(_Symbol,PERIOD_CURRENT,31,PRICE_CLOSE,i);//Индикатор Моментум
      gh[5][i] = iRVI(_Symbol,PERIOD_CURRENT,31,MODE_CLOSE,i);//Relative Vigor Index.
      gh[6][i] = iStochastic(_Symbol,PERIOD_CURRENT,5,3,3,MODE_LWMA,0,0,i);//Stochastic Oscillator.Low/High.MODE_MAIN
      gh[7][i] = iStochastic(_Symbol,PERIOD_CURRENT,5,3,3,MODE_LWMA,0,1,i);//Stochastic Oscillator.Low/High.MODE_SIGNAL
      gh[8][i] = iStochastic(_Symbol,PERIOD_CURRENT,5,3,3,MODE_LWMA,1,0,i);//Stochastic Oscillator.Close/Close.MODE_MAIN
      gh[9][i] = iStochastic(_Symbol,PERIOD_CURRENT,5,3,3,MODE_LWMA,1,1,i);//Stochastic Oscillator.Close/Close.MODE_SIGNAL
      gh[10][i] = iBullsPower(_Symbol,PERIOD_CURRENT,31,PRICE_CLOSE,i);//Сила быков
      gh[11][i] = iBearsPower(_Symbol,PERIOD_CURRENT,31,PRICE_CLOSE,i);//Сила медведей
      gh[12][i] = iADX(_Symbol,PERIOD_CURRENT,31,PRICE_CLOSE,0,i);//Average Directional Movement Index.MODE_MAIN
      gh[13][i] = iADX(_Symbol,PERIOD_CURRENT,31,PRICE_CLOSE,1,i);//Average Directional Movement Index.MODE_PLUSDI
      gh[14][i] = iADX(_Symbol,PERIOD_CURRENT,31,PRICE_CLOSE,2,i);//Average Directional Movement Index.MODE_MINUSDI
      gh[15][i] = iATR(_Symbol,PERIOD_CURRENT,31,i);//Average True Range
      gh[16][i] = iAlligator(_Symbol,PERIOD_CURRENT,13,8,5,5,5,3,MODE_LWMA,PRICE_CLOSE,MODE_GATORJAW,i);//Челюсти алигатора
      gh[17][i] = iAlligator(_Symbol,PERIOD_CURRENT,13,8,5,5,5,3,MODE_LWMA,PRICE_CLOSE,MODE_GATORLIPS,i);//Губы алигатора
      gh[18][i] = iAlligator(_Symbol,PERIOD_CURRENT,13,8,5,5,5,3,MODE_LWMA,PRICE_CLOSE,MODE_GATORTEETH,i);//Зубы алигатора
      gh[19][i] = iCCI(_Symbol,PERIOD_CURRENT,31,PRICE_CLOSE,i);//Commodity Channel Index
      gh[20][i] = iDeMarker(_Symbol,PERIOD_CURRENT,31,i);//Демаркер
      gh[21][i] = iForce(_Symbol,PERIOD_CURRENT,31,MODE_LWMA,PRICE_CLOSE,i);//Force Index
      gh[22][i] = iMACD(_Symbol,PERIOD_CURRENT,12,26,6,PRICE_CLOSE,MODE_MAIN,i);//MACD.MODE_MAIN
      gh[23][i] = iMACD(_Symbol,PERIOD_CURRENT,12,26,6,PRICE_CLOSE,MODE_SIGNAL,i);//MACD.MODE_SIGNAL
      gh[24][i] = iMFI(_Symbol,PERIOD_CURRENT,31,i);//Money Flow Index
      gh[25][i] = iOBV(_Symbol,PERIOD_CURRENT,PRICE_CLOSE,i);//On Balance Volume
      gh[26][i] = iSAR(_Symbol,PERIOD_CURRENT,0.02,0.2,i);//ParabolicSar
      gh[27][i] = iRSI(_Symbol,PERIOD_CURRENT,31,PRICE_CLOSE,i);//Relative Strength Index
      gh[28][i] = iIchimoku(_Symbol,PERIOD_CURRENT,9,26,52,1,i);//Ichimoku Kinko Hyo.MODE_TENKANSEN
      gh[29][i] = iIchimoku(_Symbol,PERIOD_CURRENT,9,1,52,2,i);//Ichimoku Kinko Hyo.MODE_KIJUNSEN
      gh[30][i] = iIchimoku(_Symbol,PERIOD_CURRENT,9,26,52,3,i);//Ichimoku Kinko Hyo.MODE_SENKOUSPANA
      gh[31][i] = iIchimoku(_Symbol,PERIOD_CURRENT,9,26,52,4,i);//Ichimoku Kinko Hyo.MODE_SENKOUSPANB
      gh[32][i] = iIchimoku(_Symbol,PERIOD_CURRENT,9,26,52,5,i);//Ichimoku Kinko Hyo.MODE_CHIKOUSPAN
      gh[33][i] = iAD(_Symbol,PERIOD_CURRENT,i);//Accumulation/Distribution.
      gh[34][i] = iStdDev(_Symbol,PERIOD_CURRENT,31,0,MODE_LWMA,PRICE_CLOSE,i);//Стандартное отклонение
      gh[35][i] = iStdDev(_Symbol,PERIOD_CURRENT,61,0,MODE_LWMA,PRICE_CLOSE,i);//Стандартное отклонение 2
      gh[36][i] = iMA(NULL,PERIOD_CURRENT,18,0,MODE_LWMA,PRICE_CLOSE,i);//Скользящие средння с периодом 18
      gh[37][i] = iMA(NULL,PERIOD_CURRENT,36,0,MODE_LWMA,PRICE_CLOSE,i);//Скользящие средння с периодом 36
      gh[38][i] = iMA(NULL,PERIOD_CURRENT,200,0,MODE_LWMA,PRICE_CLOSE,i);//Скользящие средння с периодом 200
      gh[39][i] = iEnvelopes(_Symbol,PERIOD_CURRENT,14,MODE_LWMA,0,PRICE_CLOSE,0.10,0,i);
      gh[40][i] = iEnvelopes(_Symbol,PERIOD_CURRENT,14,MODE_LWMA,0,PRICE_CLOSE,0.10,1,i);
      gh[41][i] = iEnvelopes(_Symbol,PERIOD_CURRENT,14,MODE_LWMA,0,PRICE_CLOSE,0.10,2,i);
      gh[42][i] = iBWMFI(_Symbol,PERIOD_CURRENT,i);//
      gh[43][i] = iBands(_Symbol,PERIOD_CURRENT,31,2,0,PRICE_CLOSE,0,i);//Bands MODE_MAIN
      gh[44][i] = iBands(_Symbol,PERIOD_CURRENT,31,2,0,PRICE_CLOSE,1,i);//Bands MODE_UPPER
      gh[45][i] = iBands(_Symbol,PERIOD_CURRENT,31,2,0,PRICE_CLOSE,2,i);//BandsMODE_LOWEER
      gh[46][i] = iCustom(_Symbol,0,"ZigZag",MODE_HIGH,0);//ZiqZagUp
      gh[47][i] = iCustom(_Symbol,0,"ZigZag",MODE_LOW,0);//ZiqZagDw
      gh[48][i] = High[i];//Высокая цена
      gh[49][i] = Low [i];//Низкая цена
      gh[50][i] = Open[i];//Цена открытия
      gh[51][i] = Close[i];//Цена закрытия
      gh[52][i] = gh[36][i]-gh[37][i];//Разница МА с периодом 18 и 36
      gh[53][i] = gh[22][i]-gh[23][i];//Разница MACD
      gh[54][i] = gh[13][i]-gh[14][i];//+DI - (-DI) ADX
      gh[55][i] = gh[50][i]-gh[51][i];//Тело свечи
      gh[56][i] = gh[48][i]-gh[49][i];//Высота свечи
      gh[57][i] = gh[48][i]-gh[50][i];//Верхняя тень черной свечи
      gh[58][i] = gh[48][i]-gh[51][i];//Верхняя тень белой  свечи
      gh[59][i] = gh[51][i]-gh[49][i];//Нижняя тень черной свечи
      gh[60][i] = gh[50][i]-gh[49][i];//Нижняя тень белой свечи
      gh[61][i] = gh[26][2]-gh[26][1];//Разность САР 2х дней рядом с текущим
      gh[62][i] = gh[26][i]-gh[16][i];//САР-челюсти аолигатора
      gh[63][i] = gh[26][i]-gh[17][i];//САР-губы алигатора
      gh[64][i] = gh[26][i]-gh[18][i];//САР-зубы алигатора
      gh[65][i] = gh[38][i]-gh[26][i];//MA(200)-САР
      gh[66][i] = gh[30][i]-gh[31][i];//ИшиА-ИшиБ
      gh[67][i] = gh[29][i]-gh[26][i];//Кейжин-САР
      gh[68][i] = gh[22][i]-gh[23][i];//MACD(m)-MACD(s)
      gh[69][i] = gh[43][i]-gh[26][i];//BandsU-САР
      gh[70][i] = gh[44][i]-gh[26][i];//BandsN-САР
      gh[71][i] = gh[12][i]-gh[13][i];//ADX-(+DL);
      gh[72][i] = gh[0][i]-gh[26][i];//fractkUp-Sar
      gh[73][i] = gh[1][i]-gh[26][i];//fractkDw-Sar
      gh[74][i] = gh[34][i]-gh[35][i];//SD из разность т31-т61
     }
  }
//+------------------------------------------------------------------+

Почему то не выодит значение. Что я упускаю?
 

Viktor73

Новичок форума
смотрел и анализировал. вариант только один записывать в файл данные на открытие дня или при запуске. так будет намного точнее и быстрее чем постоянно пересчитывать данные. Тем более это не нужно. Даже можно брать данные с последнего бара дня и отрисовывать на новый день.
Если есть возможность реализовать запись данных и их использования для отрисовки уровней на графике , буду благодарен.
На скрине данные с Н1 и Н4 таймфрейма. это скрин с не пересчитанными данными. делал вручную. если пересчитывать и перерисовывать многие уровни теряют смысл.
1674321175135.png
 

Абдулхаким

Почетный гражданин
так будет намного точнее и быстрее чем постоянно пересчитывать данные
постоянно пересчитывать не предлагаю :)
такой вариант значит не подошёл ?
C-подобный:
Expand Collapse Copy
datetime lastday = iTime(NULL,PERIOD_D1,0);
if(Last < lastday){
  // тут код
  Last = lastday;
}
делал вручную. если пересчитывать и перерисовывать многие уровни теряют смысл.
данные берутся из рисующего индикатора (пересчитывает свои старые данные) ?
такое условие в коде тоже не дало желаемого результата ?
C-подобный:
Expand Collapse Copy
string name = "Ind_"+TimeToString(iTime(NULL,0,LastBar),TIME_DATE);
if(ObjectFind(0,name) < 0){
  double Ind1 = iCustom(Symbol(),0,Indicatr,0,LastBar);
  if (LastBar != iBarShift(Symbol(), 0, iTime(NULL,i,it+1))-M){
    Line(name,Time[LastBar],Ind1,Time[LastBar]+(PERIOD_D1*60)-M,Ind1,clrBlue,STYLE_SOLID,2,false,false,false);
  }
}
 

Viktor73

Новичок форума
Индикатор рисует. этого не отрицаю. вот пример сравнения.
Попробую по Вашему коду прописать. смещение не критичное . но есть моменты когда это плохо сказывается. так как анализ истории будет всегда.
За помощь Спасибо!
1674326950972.png
 

Viktor73

Новичок форума
Спасибо за помощь на этом этапе. теперь надо тестить на реальных данных. для теста хватить недели. также для сравнения буду в ручном режиме отрисовывать уровни
1674367860204.png
 

Viktor73

Новичок форума
Ну что...
Спасибо за помощь https://forexsystemsru.com/members/abdulxakim.131240/ , была отличная помощь в реализации идеи.
достигнута максимальная точность отображения уровней на истории.
на данном этапе индикатора в течении недели будут идти сравнительные тесты. дабы понять нужно или нет создавать файл для хранения уровней по факту открытия дня.
Последний скрин . на черном авто уровни , на белом уровни в ручную.
На белом есть еще уровни со старшего таймфрейма.
1674402589450.png
 
Верх