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

 
Artyom Trishkin #:

obj_name - имя объекта-стрелки, colour - цвет, заданный в параметрах.

Забыл уточнить, я стрелки отображал через функцию PlotIndexSetInteger. 
Возможно красить стрелки через эту функцию или надо менять на Object? 

 

Кто-нибудь может подсказать, как поступить. Мой индикатор mq4 обновляется один раз в сутки на первом тике дневной свечи. Идет отрисовка хай-лоу дня, недели, месяца не тронутых ценой линий. 

Если не переключаться между таймфреймами, а находиться на одном рабочем графике, скажем М15, то индикатор работает нормально, не обновляется, а ждет первого тика дневной свечи. 

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

С уважением, Вячеслав.

 
Vyacheslav.K #:

Кто-нибудь может подсказать, как поступить. Мой индикатор mq4 обновляется один раз в сутки на первом тике дневной свечи. Идет отрисовка хай-лоу дня, недели, месяца не тронутых ценой линий. 

Если не переключаться между таймфреймами, а находиться на одном рабочем графике, скажем М15, то индикатор работает нормально, не обновляется, а ждет первого тика дневной свечи. 

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

С уважением, Вячеслав.

вариантов всего три: 1) оставить как есть 2) выбросить 3) исправить момент рассчёта..

вот вы какой ответ ожидали услышать ? телепатические исправления ?? или моральную поддержку в стиле "действуй,у тебя всё получится, мы в тебя верим"

КОД ГДЕ

 
Maxim Kuznetsov #:

вариантов всего три: 1) оставить как есть 2) выбросить 3) исправить момент рассчёта..

вот вы какой ответ ожидали услышать ? телепатические исправления ?? или моральную поддержку в стиле "действуй,у тебя всё получится, мы в тебя верим"

КОД ГДЕ

//+------------------------------------------------------------------+
//|                                                     HL_LEVEL.mq4 |
//+------------------------------------------------------------------+
#property copyright "kochegarov.vm"
#property link      "kochegarov.vm@mail.ru"
#property indicator_chart_window

extern string General   = "//////////////////////////////////////////";
extern int    TimeFrame     = 0;
extern bool   Ray           = true; 

extern string D1_Settings   = "//////////////////////////////////////////";
extern int    ObjD1         = 22;
extern color  ColorHigh_D1  = clrRed;
extern color  ColorLow_D1   = clrBlue;
extern int    LineStyle_D1  = 0;
extern int    LineWidth_D1  = 2;

extern string W1_Settings   = "//////////////////////////////////////////";
extern int    ObjW1         = 52; 
extern color  ColorHigh_W1  = clrMagenta;
extern color  ColorLow_W1   = clrDeepSkyBlue;
extern int    LineStyle_W1  = 0;
extern int    LineWidth_W1  = 4;

extern string MN_Settings   = "//////////////////////////////////////////";
extern int    ObjM1         = 12; 
extern color  ColorHigh_MN  = clrRed;
extern color  ColorLow_MN   = clrBlue;
extern int    LineStyle_MN  = 0;
extern int    LineWidth_MN  = 5;
//+----------------------------------------------------------------------------+
int  MaxObj = 0;

double    D1h[], D1l[], W1h[], W1l[], M1h[], M1l[];
datetime  D1ts[], D1te[], W1ts[], W1te[], M1ts[], M1te[];

datetime LastTime=0;
bool     New_Bar=false;
//+----------------------------------------------------------------------------+
int init()  
{
   ArrayResize(D1h,ObjD1+1); ArrayResize(D1l,ObjD1+1); ArrayResize(D1ts,ObjD1+1); ArrayResize(D1te,ObjD1+1);
   ArrayResize(W1h,ObjW1+1); ArrayResize(W1l,ObjW1+1); ArrayResize(W1ts,ObjW1+1); ArrayResize(W1te,ObjW1+1);
   ArrayResize(M1h,ObjM1+1); ArrayResize(M1l,ObjM1+1); ArrayResize(M1ts,ObjM1+1); ArrayResize(M1te,ObjM1+1);
   
   if (ObjD1+1 > MaxObj) MaxObj=ObjD1+1;
   if (ObjW1+1 > MaxObj) MaxObj=ObjW1+1;
   if (ObjM1+1 > MaxObj) MaxObj=ObjM1+1;

return(0);
}
//+----------------------------------------------------------------------------+
int deinit()
{
   rLines(MaxObj+1);

return(0);
}
//+----------------------------------------------------------------------------+
int start()
{
//-----------------
   if(LastTime<iTime(Symbol(),PERIOD_D1,0)) 
   {
     LastTime=iTime(Symbol(),PERIOD_D1,0);
     New_Bar=true;  
   }
//-----------------
   if(DayOfWeek()==0 || DayOfWeek()==6) return(0);
   if(New_Bar==true)
   {
     for(int x=1; x<MaxObj; x++)       
     {
         D1h[x]=iHigh(Symbol(),1440,x);   D1l[x]=iLow(Symbol(),1440,x);
         W1h[x]=iHigh(Symbol(),10080,x);  W1l[x]=iLow(Symbol(),10080,x);
         M1h[x]=iHigh(Symbol(),43200,x);  M1l[x]=iLow(Symbol(),43200,x);
   
         D1ts[x]=iTime(Symbol(),1440,x);  D1te[x]=Time[0];
         W1ts[x]=iTime(Symbol(),10080,x); W1te[x]=Time[0];
         M1ts[x]=iTime(Symbol(),43200,x); M1te[x]=Time[0];      
     }
     
     dD1(ObjD1+1);
     dW1(ObjW1+1);
     dM1(ObjM1+1);
     
   New_Bar=false; 
   }
   
return(0);
}

//+----------------------------------------------------------------------------+
void dD1(int Obj) 
{
   for (int x=1; x<Obj; x++)
   {  
      int nb1=iBarShift(NULL,0, D1ts[x],false); 
      int nb2=iBarShift(NULL,0, D1te[x],false);
      double up=High[iHighest(NULL,0, MODE_HIGH, nb1-nb2, nb2)];
      double dn=Low [iLowest(NULL,0, MODE_LOW, nb1-nb2, nb2)];
      
      if(LineStyle_D1>0) LineWidth_D1=1;
      SetTLine(ColorHigh_D1,"D1_High_"+(string)x,D1ts[x],D1h[x], D1te[x],D1h[x],Ray,LineStyle_D1,LineWidth_D1);
      if(up>D1h[x]) {ObjectDelete("D1_High_"+x);}
      
      SetTLine(ColorLow_D1,"D1_Low_"+(string)x,D1ts[x],D1l[x], D1te[x],D1l[x],Ray,LineStyle_D1,LineWidth_D1);
      if(dn<D1l[x]) {ObjectDelete("D1_Low_"+x);}
   }
}
//+----------------------------------------------------------------------------+
void dW1(int Obj) 
{
   for (int x=1; x<Obj; x++)
   {  
      int nb1=iBarShift(NULL,0, W1ts[x],false);
      int nb2=iBarShift(NULL,0, W1te[x],false);
      double up=High[iHighest(NULL,0, MODE_HIGH, nb1-nb2, nb2)];
      double dn=Low [iLowest(NULL,0, MODE_LOW, nb1-nb2, nb2)];
      
      if(LineStyle_W1>0) LineWidth_W1=1;
      SetTLine(ColorHigh_W1,"W1_High_"+(string)x,W1ts[x],W1h[x],W1te[x],W1h[x],Ray,LineStyle_W1,LineWidth_W1);
      if(up>W1h[x]) {ObjectDelete("W1_High_"+x);}
      
      SetTLine(ColorLow_W1,"W1_Low_"+(string)x,W1ts[x],W1l[x],W1te[x],W1l[x],Ray,LineStyle_W1,LineWidth_W1);
      if (dn<W1l[x]) {ObjectDelete("W1_Low_"+x);}
   }
}
//+----------------------------------------------------------------------------+
void dM1(int Obj)
{
   for (int x=1; x<Obj; x++)
   { 
      int nb1=iBarShift(NULL,0, M1ts[x],false);
      int nb2=iBarShift(NULL,0, M1te[x],false);
      double up=High[iHighest(NULL,0, MODE_HIGH, nb1-nb2, nb2)];
      double dn=Low [iLowest(NULL,0, MODE_LOW, nb1-nb2, nb2)];
      
      if(LineStyle_MN>0) LineWidth_MN=1;
      SetTLine(ColorHigh_MN,"MN_High_"+(string)x, M1ts[x],M1h[x],M1te[x],M1h[x],Ray,LineStyle_MN,LineWidth_MN);
      if(up>M1h[x]) {ObjectDelete("MN_High_"+x);}
      
      SetTLine(ColorLow_MN,"MN_Low_"+(string)x, M1ts[x],M1l[x],M1te[x],M1l[x],Ray,LineStyle_MN,LineWidth_MN);
      if (dn<M1l[x]) {ObjectDelete("MN_Low_"+x);}
   }
}
//+----------------------------------------------------------------------------+
void SetTLine( color    cl, 
               string   nm="",
               datetime t1=0, 
               double   p1=0, 
               datetime t2=0, 
               double   p2=0,
               bool     ry=False, 
               int      st=0, 
               int      wd=1 ) {

  if (ObjectFind(nm)<0) ObjectCreate(nm, OBJ_TREND, 0, 0,0, 0,0);
  ObjectSet(nm, OBJPROP_TIME1 , t1);
  ObjectSet(nm, OBJPROP_PRICE1, p1);
  ObjectSet(nm, OBJPROP_TIME2 , t2);
  ObjectSet(nm, OBJPROP_PRICE2, p2);
  ObjectSet(nm, OBJPROP_COLOR , cl);
  ObjectSet(nm, OBJPROP_RAY   , ry);
  ObjectSet(nm, OBJPROP_STYLE , st);
  ObjectSet(nm, OBJPROP_WIDTH , wd);
}   
//+------------------------------------------------------------------+
void rLines(int Obj)     
{
   for (int x=1; x<Obj; x++)
   {
      ObjectDelete("D1_High_"+1);  
      ObjectDelete("D1_Low_"+1);   
      ObjectDelete("D1_High_"+x);  
      ObjectDelete("D1_Low_"+x);   
      ObjectDelete("W1_High_"+x);  
      ObjectDelete("W1_Low_"+x);  
      ObjectDelete("MN_High_"+x);  
      ObjectDelete("MN_Low_"+x);   
   }
}
//+------------------------------------------------------------------+

Пробовал переписать код с использованием OnCalculate(), к сожалению не получилось. 


 
Igor168 #:

Забыл уточнить, я стрелки отображал через функцию PlotIndexSetInteger. 
Возможно красить стрелки через эту функцию или надо менять на Object? 

PlotIndexSetInteger(0,PLOT_LINE_COLOR,0,clrRed);
 
Igor168 #:

Забыл уточнить, я стрелки отображал через функцию PlotIndexSetInteger. 
Возможно красить стрелки через эту функцию или надо менять на Object? 

Индикатор что ли...

Например:

PlotIndexSetInteger(0,PLOT_LINE_COLOR,clrAqua);

UPD, ну выше уже показали...

Только ссылку на справку не дали.

Изучайте справку - там много ответов на почти все вопросы. С примерами кодов.

Документация по MQL5: Пользовательские индикаторы / PlotIndexSetInteger
Документация по MQL5: Пользовательские индикаторы / PlotIndexSetInteger
  • www.mql5.com
PlotIndexSetInteger - Пользовательские индикаторы - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Vyacheslav.K #:
Пробовал переписать код

Замените эту часть кода

int deinit()
{
   rLines(MaxObj+1);

return(0);
}

на эту

void OnDeinit(const int reason)
  {
   if(UninitializeReason()!=3)
     {
      rLines(MaxObj+1);
     }
  }
 
Tretyakov Rostyslav #:

Замените эту часть кода


Заменил, сутки понаблюдаю. Спасибо, что откликнулись.

 
Vyacheslav.K #:

Заменил, сутки понаблюдаю. Спасибо, что откликнулись.

инициализацию LastTime и NewBar перенесите в OnInit. ( init() по вашему )

внутри OnInit должны явно инициализироватьcя все переменные, кроме static (только static есть толк присваивать в глоб. секциях, для прочих бестолку)

 
Maxim Kuznetsov #:

инициализацию LastTime и NewBar перенесите в OnInit. ( init() по вашему )

внутри OnInit должны явно инициализироватьcя все переменные, кроме static (только static есть толк присваивать в глоб. секциях, для прочих бестолку)

//+----------------------------------------------------------------------------+
void OnInit()  
{
   datetime LastTime=0;
   bool     New_Bar=false;
//-----------------
   if(LastTime<iTime(Symbol(),PERIOD_D1,0)) 
   {
     LastTime=iTime(Symbol(),PERIOD_D1,0);
     New_Bar=true;  
   }
//-----------------
   if(New_Bar==true)
   {
   ArrayResize(D1h,ObjD1+1); ArrayResize(D1l,ObjD1+1); ArrayResize(D1ts,ObjD1+1); ArrayResize(D1te,ObjD1+1);
   ArrayResize(W1h,ObjW1+1); ArrayResize(W1l,ObjW1+1); ArrayResize(W1ts,ObjW1+1); ArrayResize(W1te,ObjW1+1);
   ArrayResize(M1h,ObjM1+1); ArrayResize(M1l,ObjM1+1); ArrayResize(M1ts,ObjM1+1); ArrayResize(M1te,ObjM1+1);
   
   if (ObjD1+1 > MaxObj) MaxObj=ObjD1+1;
   if (ObjW1+1 > MaxObj) MaxObj=ObjW1+1;
   if (ObjM1+1 > MaxObj) MaxObj=ObjM1+1;
   
   New_Bar=false; 
   }
   
}
//+----------------------------------------------------------------------------+

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

//+----------------------------------------------------------------------------+
int  MaxObj = 0;

double    D1h[], D1l[], W1h[], W1l[], M1h[], M1l[];
datetime  D1ts[], D1te[], W1ts[], W1te[], M1ts[], M1te[];

//+----------------------------------------------------------------------------+
Причина обращения: