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

 
Как узнать что на N барах нет OBJ_RECTANGLE?
 
neverness:

Неужели в МТ5 что то изменилось ???

Нет такого ни в мт4, ни в мт5.

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

 
Ghabo:
Как узнать что на N барах нет OBJ_RECTANGLE?
Попробовать так может быть?
  int n = Bars(Symbol(), PERIOD_CURRENT, ObjectGetInteger(0,"Rectangle",OBJPROP_TIME,1), TimeCurrent());
  Print(n);
 
Vitaly Muzichenko:

Нет такого ни в мт4, ни в мт5.

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

Наконец-то я увидел единственный "конструктивный ответ" на мой вопрос во всем этом "обсуждении".

Что касается ошибок, то они присутствуют и на всех разделителях-недельках в текущем (последнем) фрейме и на МТ4, и на МТ5. 

Везде в  последнем разделителе недель МТ4/МТ5 рисует  разделитель  7 дней вместо 5.

Но не в этом дело. Ошибки всегда были, и будут. Все это можно исправить, если есть программный код прорисовки разделителей.

Меня удивляют не ошибки, а совсем другое.

Неужели за все время существования МТ4/МТ5 никому не пришло в голову написать программу рисования разделителей в прогнозируемой области?

Ведь программа простейшая. 

Для решения этой задачи требуется знать лишь положение последнего разделителя, и "раствор" времени по оси X (то есть, какой временной промежуток приходится на 1 пиксел).

И до сих пор никто и ни разу ???

Вот это меня действительно удивляет.

Опять все придется делать самому.

 
Igor Makanu:

это не сложно, но Вы видимо не совсем понимаете как работают индикаторы в МТ и в чем их преимущество

Вероятно, Вы правы.

Есть такой математический анекдот:

У математика спрашивают: Как вскипятить воду в чайнике?

Математик отвечает:- Взять пустой чайник, налить в него воду, поставить чайник на плиту, включить плиту, и ждать когда закипит вода.

- Хорошо. А как быть, если вода в чайнике уже налита? - спрашивают у математика.

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

Так вот.

Этот анекдот про Вас.

 
neverness:

Этот анекдот про Вас.

хм, даже не знаю, улыбаться или .... сказали бы, что делать самостоятельно ничего не будете, если знаете, где есть торговый терминал, который выполнит все Ваши прихоти, в чем же дело? меня МТ4/5 устраивает на 100%, я в нем могу сделать все, держите индикатор который рисует периоды Д1 на графике, заинтересуетесь программированием, модифицируйте под свои задачи... хотя сомневаюсь, что Вы будете этим заниматься

#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com/ru/users/igorm"
#property version   "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   2
//--- plot line1
#property indicator_label1  "Period"
#property indicator_type1   DRAW_HISTOGRAM
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
#property indicator_label2  "Period"
#property indicator_type2   DRAW_HISTOGRAM
#property indicator_color2  clrRed
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1
//--- input parameters
input int      Days=3;
//--- indicator buffers
double         Pmax[],Pmin[];
bool run=true;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,Pmax);
   SetIndexBuffer(1,Pmin);
   run=true;
   switch(_Period)
     {
      case PERIOD_M1:   SetIndexShift(0,1440*Days);SetIndexShift(1,1440*Days);   break;
      case PERIOD_M5:   SetIndexShift(0,288*Days); SetIndexShift(1,288*Days);    break;
      case PERIOD_M15:  SetIndexShift(0,96*Days);  SetIndexShift(1,96*Days);     break;
      case PERIOD_M30:  SetIndexShift(0,48*Days);  SetIndexShift(1,48*Days);     break;
      case PERIOD_H1:   SetIndexShift(0,24*Days);  SetIndexShift(1,24*Days);     break;
      case PERIOD_H4:   SetIndexShift(0,6*Days);   SetIndexShift(1,6*Days);      break;
      default: run=false; SetIndexShift(0,0); SetIndexShift(1,0);ArrayInitialize(Pmax,EMPTY_VALUE);ArrayInitialize(Pmin,EMPTY_VALUE); break;
     }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| 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[])
  {
//---
   if(prev_calculated==0)
     {
      run=true;
      ArrayInitialize(Pmax,EMPTY_VALUE);
      ArrayInitialize(Pmin,EMPTY_VALUE);
     }
   if(run)
     {
      int i=0,lastperiod=TimeDay(time[0]);
      double maxvalue;
      if(!ChartGetDouble(ChartID(),CHART_PRICE_MAX,0,maxvalue)) maxvalue=1000.0;
      maxvalue*=10.0;
      while(i<rates_total)
        {
         if(TimeDay(time[i])!=lastperiod)
           {
            lastperiod=TimeDay(time[i]);
            Pmax[i-1]=maxvalue;
            Pmin[i-1]=0.0;
           }
         else
           {
            Pmax[i]=EMPTY_VALUE;
            Pmin[i]=EMPTY_VALUE;
           }
         i++;
        }
      run=false;
     }
//---
   return(rates_total);
  }
//+------------------------------------------------------------------+
График EURUSD.e, H1, 2018.11.09 13:11 UTC, RoboForex (CY) Ltd., MetaTrader 4, Demo


ЗЫ: индикатор довольно простой, но почему то баг появляется при переключении на ТФ> D1, вроде инициализирую буфера при переключении ТФ, почему так не пойму, впервые с таким столкнулся

 
neverness:

Наконец-то я увидел единственный "конструктивный ответ" на мой вопрос во всем этом "обсуждении".

Что касается ошибок, то они присутствуют и на всех разделителях-недельках в текущем (последнем) фрейме и на МТ4, и на МТ5. 

Везде в  последнем разделителе недель МТ4/МТ5 рисует  разделитель  7 дней вместо 5.

Но не в этом дело. Ошибки всегда были, и будут. Все это можно исправить, если есть программный код прорисовки разделителей.

Меня удивляют не ошибки, а совсем другое.

Неужели за все время существования МТ4/МТ5 никому не пришло в голову написать программу рисования разделителей в прогнозируемой области?

Ведь программа простейшая. 

Для решения этой задачи требуется знать лишь положение последнего разделителя, и "раствор" времени по оси X (то есть, какой временной промежуток приходится на 1 пиксел).

И до сих пор никто и ни разу ???

Вот это меня действительно удивляет.

Опять все придется делать самому.

я вам ответил - что делал и не раз. (и в маркете есть, и не в одном индикаторе)

и вы жеж сказали, что уже написали код, будете снова писать?)

 
Igor Makanu:

хм, даже не знаю, улыбаться или .... сказали бы, что делать самостоятельно ничего не будете, если знаете, где есть торговый терминал, который выполнит все Ваши прихоти, в чем же дело? меня МТ4/5 устраивает на 100%, я в нем могу сделать все, держите индикатор который рисует периоды Д1 на графике, заинтересуетесь программированием, модифицируйте под свои задачи... хотя сомневаюсь, что Вы будете этим заниматься


ЗЫ: индикатор довольно простой, но почему то баг появляется при переключении на ТФ> D1, вроде инициализирую буфера при переключении ТФ, почему так не пойму, впервые с таким столкнулся

Спасибо, конечно.

Как я и предполагал, на неполных днях Ваши разделители периодов не совпадают со стандартными.

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

Тогда положение разделителей неполных дней истории не будет влиять на разделители прогноза.

Еще одно важное отличие Вашего разделительного индикатора от стандартных  разделителей заключается в том, что стандартные разделители обновляются при событии на самом графике, а Ваш индикатор обновляется на каждом  событии OnCalculate(). Я думал это будет заметно - но на самом деле это почти не чувствуется.  

Конечно, этот индикатор следует переделать, но все равно спасибо. Интересно было посмотреть.

 
Ghabo:

Это получается индекс бара объекта с указанным именем. Объектов больше одного, имена "QUADRO"+Time[i+1] Как узнать что на десяти барах нет такого объекта?

С буфером понятно, если значение пустое то на графике ничего не отображено, а с объектом как? 

if (ObjectFind(0,"QUADRO"+Time[10])<0)
        {
        //объекта нет на 10 баре
        }
 
Vitaly Muzichenko:
Попробовать так может быть?
  int n = Bars(Symbol(), PERIOD_CURRENT, ObjectGetInteger(0,"Rectangle",OBJPROP_TIME,1), TimeCurrent());

Спасибо. Это получается индекс бара (120983) объекта с указанным именем. Объектов больше одного, имена "QUADRO"+Time[i+1] Как узнать что на десяти барах нет такого объекта?

С буфером понятно, если значение пустое то на графике ничего не отображено, а с объектом как? 

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