Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 1267

 
Dmitriywelcome:

 Как в Mql5 будет выглядеть код

   MqlDateTime tm;
   TimeCurrent(tm);
   if(tm.hour==12) {
    ...
   }

Точно также это выглядит в mql4


Немного справки

MqlDateTime

Структура даты содержит в себе восемь полей типа int.

struct MqlDateTime
  {
   int year;           // год
   int mon;            // месяц
   int day;            // день
   int hour;           // час
   int min;            // минуты
   int sec;            // секунды
   int day_of_week;    // день недели (0-воскресенье, 1-понедельник, ... ,6-суббота)
   int day_of_year;    // порядковый номер в году (1 января имеет номер 0)
  };

Документация по MQL5: Основы языка / Типы данных / Целые типы / Типы char, short, int и long
Документация по MQL5: Основы языка / Типы данных / Целые типы / Типы char, short, int и long
  • www.mql5.com
Целый тип char занимает в памяти 1 байт (8 бит) и позволяет выразить в двоичной системе счисления 2^8 значений=256. Тип char может содержать как положительные, так и отрицательные значения. Диапазон изменения значений составляет от -128 до 127. uchar # Целый тип uchar также занимает в памяти 1 байт, как и тип char, но в отличие от него, uchar...
 
Vladimir Karputov:

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

Классная авто чертилка получилась) с разными объектами, уровнями, таймфреймами, спасибо большое

 
int OnInit()
  {
//---
   ChartSetInteger(ChartID(), CHART_EVENT_OBJECT_CREATE, true);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
  }
//+------------------------------------------------------------------+

/***********************OnChartEvent function************************/
void OnChartEvent(const int id,         // идентификатор события
                  const long& lparam,   // параметр события типа long
                  const double& dparam, // параметр события типа double
                  const string& sparam  // параметр события типа string
                 )
  {
   if(id == CHARTEVENT_OBJECT_CREATE)
     {
      //----------------------------------------------------------------------------------------
      double   Level_0= ObjectGetDouble(
                           0,          // идентификатор графика
                           sparam,              // имя объекта
                           OBJPROP_PRICE,           // идентификатор свойства
                           0     // модификатор свойства
                        );


      double   Level_1= ObjectGetDouble(
                           0,          // идентификатор графика
                           sparam,              // имя объекта
                           OBJPROP_PRICE,           // идентификатор свойства
                           1     // модификатор свойства
                        );
      //------------------------------------------------------------------------------------------------------
      if(Level_0 > Level_1)
         ObjectSetInteger(0,sparam,OBJPROP_COLOR,clrDeepSkyBlue);
      else
         ObjectSetInteger(0,sparam,OBJPROP_COLOR,clrYellow);
      //+------------------------------------------------------------------+
      ulong timeCreate = ObjectGetInteger(0, sparam, OBJPROP_CREATETIME); //  получим время создания объекта
      string newName = "fibka"+string(timeCreate); //  сформируем новое имя объекта
      ObjectSetString(0, sparam, OBJPROP_NAME, newName);  //  переименуем объект
     }
  }/******************************************************************/

//+------------------------------------------------------------------+
Alexey Viktorov
:

Может быть научился-бы логически мыслить.)))

Всё что можно перепробовал, из того что вы подсказали, крутил вертел, но всё равно в один цвет красит линии в МТ5.   А в МТ4 норм перекрашивает, причём без задержек.

[Удален]  

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

- что бы отрисовать трендовые  линии. (как на картинке)

Снимок точки

-----------------------------------------

уже всё перепробовал методом тыка , рисуются но где то в непонятных точках .

//---
   ArraySetAsSeries(open,true);
   ArraySetAsSeries(high,true);
   ArraySetAsSeries(low,true);
   ArraySetAsSeries(close,true);
//---
   z=Z_;
   for(i=limit; i>=0; i--)
     {
      if(!CalculatePivot())
         return(0);
      if(rates_total!=prev_calculated && i==0)
         Z_=z;
      //---
      DnArrowiCustom[i]=0.0;
      UpArrowiCustom[i]=0.0;
      CoralDn=((Inpyna && BufferC[i]<BufferC[i+1]) || (Inpdoy && BufferCcop[i]<BufferCcop[i+1]) ||
               (Inptrei && BufferC[i]<BufferCcop[i]) || (Inppatry && BufferCcop[i]<BufferC[i]) ||
               (Inpcinc && close[i]<m_Coral_price) || (Inpshase && close[i]<BufferC[i]) || (Inpshapt && close[i]<m_p_price));
      CoralUp=((Inpyna && BufferC[i]>BufferC[i+1]) || (Inpdoy && BufferCcop[i]>BufferCcop[i+1]) ||
               (Inptrei && BufferC[i]>BufferCcop[i]) || (Inppatry && BufferCcop[i]>BufferC[i]) ||
               (Inpcinc && close[i]>m_Coral_price) || (Inpshase && close[i]>BufferC[i]) || (Inpshapt && close[i]>m_p_price));
      if(CoralDn)
         z = 1;
      if(CoralUp)
         z = 2;
      if(CoralDn && (z==1 || z==0))
        {
         if(((InpFiltryP && close[i]<m_p_price) || (!InpFiltryP && !InpFiltryM && !InpFiltryC)) ||
            ((InpFiltryC && close[i]<m_Coral_price) || (!InpFiltryP && !InpFiltryM && !InpFiltryC)) ||
            ((InpFiltryM && close[i]<m_Coral_price) || (!InpFiltryP && !InpFiltryM && !InpFiltryC)))
            if(OldTrend>0)
               UpArrowiCustom[i]=high[i];
         if(i!=0)
            OldTrend=-1;
         //if(FractalUpBuffer[i]==UpArrowiCustom[i])
           // return(rates_total);
        }
      if(CoralUp && (z==2 || z==0))
        {
         if(((InpFiltryP && close[i]>m_p_price) || (!InpFiltryP && !InpFiltryM && !InpFiltryC)) ||
            ((InpFiltryC && close[i]>m_Coral_price) || (!InpFiltryP && !InpFiltryM && !InpFiltryC)) ||
            ((InpFiltryM && close[i]>m_Coral_price) || (!InpFiltryP && !InpFiltryM && !InpFiltryC)))
            if(OldTrend<0)
               DnArrowiCustom[i]=low[i];
         if(i!=0)
            OldTrend=+1;
        // if(FractalDownBuffer[i]==DnArrowiCustom[i])
           // return(rates_total);
        }
     }
   m_left_Ctime=time[rates_total-2];
//---
   /*if(prev_calculated==0)
     {
      //---
      for(int u=rates_total-4; u>=10; u--)
        {
         if(FractalUpBuffer[u]!=0.0 && FractalUpBuffer[u]!=EMPTY_VALUE)
           {
            if(upper_left==0.0)
              {
               upper_left=FractalUpBuffer[u];
               upper_left_date=time[u];
              }
            else
               if(upper_right==0.0)
                 {
                  upper_right=FractalUpBuffer[u];
                  upper_right_date=time[u];
                 }
           }
         if(FractalDownBuffer[u]!=0.0 && FractalDownBuffer[u]!=EMPTY_VALUE)
           {
            if(lower_left==0.0)
              {
               lower_left=FractalDownBuffer[u];
               lower_left_date=time[u];
              }
            else
               if(lower_right==0.0)
                 {
                  lower_right=FractalDownBuffer[u];
                  lower_right_date=time[u];
                 }
           }
         if(upper_left!=0.0 && upper_right!=0.0 && lower_left!=0.0 && lower_right!=0.0)
            break;
        }
      if(upper_left==0.0 || upper_right==0.0 || lower_left==0.0 || lower_right==0.0)
         return(rates_total);
      //---
      TrendPointChange(0,m_Upper_line,0,upper_right_date,upper_right);
      TrendPointChange(0,m_Upper_line,1,upper_left_date,upper_left);
      TrendPointChange(0,m_Lower_line,0,lower_right_date,lower_right);
      TrendPointChange(0,m_Lower_line,1,lower_left_date,lower_left);
      //---
      return(rates_total);
     }*/
//---

-----------------------------------------------------------------------------------------------------

Индикатор прикрепляю - он рабочий - только эти линии, не как не приспособлю.

Файлы:
1.mq5  82 kb
 
Kira27:

Всё что можно перепробовал, из того что вы подсказали, крутил вертел, но всё равно в один цвет красит линии в МТ5.   А в МТ4 норм перекрашивает, причём без задержек.

Видимо не всё перепробовал.

Alexey Viktorov:

Очень большая вероятность того, что после переименования объекта он ещё недоступен для обращения к нему. Можно попробовать после переименования поставить ChartRedraw. Если не поможет, то надо как-то иначе строить последовательность.

ps; Ещё вариант: сначала перекрасить с именем sparam и потом переименовать.

Почему-то событие CHARTEVENT_OBJECT_CREATE считается сразу после касания крыской графика, а не после окончания создания объекта. И цены разных концов фибки оказываются одинаковыми. Следовательно надо перекрашивать уже после создания объекта.

И ещё замечание: Вы красите уровни или основную линию фибки?

Вот три варианта:

Первый.

bool endCreate;
string newName;
/*******************Expert initialization function*******************/
int OnInit()
 {
  ChartSetInteger(ChartID(), CHART_EVENT_OBJECT_CREATE, true);
  return(INIT_SUCCEEDED);
 }/******************************************************************/

/************************Expert tick function************************/
void OnTick()
 {
  if(endCreate)
   {
    double   Level_0= ObjectGetDouble(0, newName, OBJPROP_PRICE, 0);
    double   Level_1= ObjectGetDouble(0, newName, OBJPROP_PRICE, 1);
    if(Level_0 > Level_1)
      ObjectSetInteger(0, newName, OBJPROP_LEVELCOLOR, 1, clrDeepSkyBlue);
    else
      ObjectSetInteger(0, newName, OBJPROP_LEVELCOLOR, 1, clrYellow);
    endCreate = false;
   }
 }/******************************************************************/

/***********************OnChartEvent function************************/
void OnChartEvent(const int id,         // идентификатор события
                  const long& lparam,   // параметр события типа long
                  const double& dparam, // параметр события типа double
                  const string& sparam  // параметр события типа string
                 )
 {
  if(id == CHARTEVENT_OBJECT_CREATE)
   {
    ulong timeCreate = ObjectGetInteger(0, sparam, OBJPROP_CREATETIME); //  получим время создания объекта
    newName = "Fibo "+string(timeCreate); //  сформируем новое имя объекта
    ObjectSetString(0, sparam, OBJPROP_NAME, newName);  //  переименуем объект
    endCreate = true;
   }
 }/******************************************************************/

Второй.

/*******************Expert initialization function*******************/
int OnInit()
 {
  ChartSetInteger(ChartID(), CHART_EVENT_OBJECT_CREATE, true);
  return(INIT_SUCCEEDED);
 }/******************************************************************/

/************************Expert tick function************************/
void OnTick()
 {

 }/******************************************************************/

/***********************OnChartEvent function************************/
void OnChartEvent(const int id,         // идентификатор события
                  const long& lparam,   // параметр события типа long
                  const double& dparam, // параметр события типа double
                  const string& sparam  // параметр события типа string
                 )
 {
  string newName;  
  if(id == CHARTEVENT_OBJECT_CREATE)
   {
    ulong timeCreate = ObjectGetInteger(0, sparam, OBJPROP_CREATETIME); //  получим время создания объекта
    newName = "Fibo "+string(timeCreate); //  сформируем новое имя объекта
    ObjectSetString(0, sparam, OBJPROP_NAME, newName);  //  переименуем объект
   }
  if(id == CHARTEVENT_OBJECT_DRAG)
   {
    double   Level_0= ObjectGetDouble(0, newName, OBJPROP_PRICE, 0);
    double   Level_1= ObjectGetDouble(0, newName, OBJPROP_PRICE, 1);
    if(Level_0 > Level_1)
      ObjectSetInteger(0, newName, OBJPROP_LEVELCOLOR, 1, clrDeepSkyBlue);
    else
      ObjectSetInteger(0, newName, OBJPROP_LEVELCOLOR, 1, clrYellow);
   }
 }/******************************************************************/

Третий.

/*******************Expert initialization function*******************/
int OnInit()
 {
  ChartSetInteger(ChartID(), CHART_EVENT_OBJECT_CREATE, true);
  return(INIT_SUCCEEDED);
 }/******************************************************************/

/************************Expert tick function************************/
void OnTick()
 {
 }/******************************************************************/

/***********************OnChartEvent function************************/
void OnChartEvent(const int id,         // идентификатор события
                  const long& lparam,   // параметр события типа long
                  const double& dparam, // параметр события типа double
                  const string& sparam  // параметр события типа string
                 )
 {
  if(id == CHARTEVENT_OBJECT_DRAG)
   {
    ulong timeCreate = ObjectGetInteger(0, sparam, OBJPROP_CREATETIME); //  получим время создания объекта
    string newName = "Fibo "+string(timeCreate); //  сформируем новое имя объекта
    ObjectSetString(0, sparam, OBJPROP_NAME, newName);  //  переименуем объект
    double   Level_0= ObjectGetDouble(0, newName, OBJPROP_PRICE, 0);
    double   Level_1= ObjectGetDouble(0, newName, OBJPROP_PRICE, 1);
    if(Level_0 > Level_1)
      ObjectSetInteger(0, newName, OBJPROP_LEVELCOLOR, 1, clrDeepSkyBlue);
    else
      ObjectSetInteger(0, newName, OBJPROP_LEVELCOLOR, 1, clrYellow);
   ChartRedraw(); 
  }
 }/******************************************************************/


[Удален]  
SanAlex:

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

- что бы отрисовать трендовые  линии. (как на картинке)

-----------------------------------------

уже всё перепробовал методом тыка , рисуются но где то в непонятных точках .

-----------------------------------------------------------------------------------------------------

Индикатор прикрепляю - он рабочий - только эти линии, не как не приспособлю.

Может кто направит меня на статьи, про привязки точек трендовой линии.

-- всё что могу сейчас, отрисовать их, не понятно в каких точках.

EURUSDH4

---------------------------------------------------------

что то наверное такое надо прописать - наверное?

//--- найдем максимальное и минимальное значение графика
   double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
   double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//--- определим шаг изменения цены и заполним массив
   double step=(max_price-min_price)/accuracy;
   for(int i=0;i<accuracy;i++)
      price[i]=min_price+i*step;
//--- определим точки для рисования линии
   int d1=InpDate1*(bars-1)/100;
   int p1=InpPrice1*(accuracy-1)/100;
//--- количество видимых баров в окне графика
   int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//--- размер массива price
   int accuracy=1000;
//--- массивы для хранения значений дат и цен, которые будут использованы
//--- для установки и изменения координат точек привязки линии
   datetime date[];
   double   price[];
//--- выделение памяти
   ArrayResize(date,bars);
   ArrayResize(price,accuracy);
//--- заполним массив дат
   ResetLastError();
   if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
     {
      Print("Не удалось скопировать значения времени! Код ошибки = ",GetLastError());
      return;
     }
//--- заполним массив цен
//--- найдем максимальное и минимальное значение графика
   double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
   double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//--- определим шаг изменения цены и заполним массив
   double step=(max_price-min_price)/accuracy;
   for(int i=0;i<accuracy;i++)
      price[i]=min_price+i*step;
//--- определим точки для рисования линии
   int d1=InpDate1*(bars-1)/100;
   int d2=InpDate2*(bars-1)/100;
   int p1=InpPrice1*(accuracy-1)/100;
   int p2=InpPrice2*(accuracy-1)/100;
//--- создадим линию тренда
   if(!TrendCreate(0,InpName,0,date[d1],price[p1],date[d2],price[p2],InpColor,InpStyle,
      InpWidth,InpBack,InpSelection,InpRayLeft,InpRayRight,InpHidden,InpZOrder))
     {
      return;
     }



-------------------

скажите я на правильном пути ???

Файлы:
2.mq5  82 kb
 
SanAlex:

Может кто направит меня на статьи, про привязки точек трендовой линии.

-- всё что могу сейчас, отрисовать их, не понятно в каких точках.

---------------------------------------------------------

что то наверное такое надо прописать - наверное?

-------------------

скажите я на правильном пути ???

Трендовые линии строятся на 2 точках, это либо ценовые данные либо данные другого индикатора, пример построения по фракталам, кстати Вам уже знакомый)

https://www.mql5.com/ru/code/29210

Line through two fractals
Line through two fractals
  • www.mql5.com
cm BASKET Советник управляющий счетом. Показывает какие пары инструментов сейчас торгуются на данном счете. Показывает прибыль полученную по каждой паре за определенное время. Помогает переключаться между множества открытых окон... Virtual Trailing Stop 2
[Удален]  
VVT:

Трендовые линии строятся на 2 точках, это либо ценовые данные либо данные другого индикатора, пример построения по фракталам, кстати Вам уже знакомый)

https://www.mql5.com/ru/code/29210

Я хотел в одном Индикаторе - но не получилось. а вот через этот, который Вы предложили, я и раньше делал.

- и пришлось так и сделать, через два Индикатора 

Вот что получилось 

GBPUSDM30 GOTOV 

---------------------------

Забыл сказать Вам Спасибо! - Спасибо!!!

 
SanAlex:

Я хотел в одном Индикаторе - но не получилось. а вот через этот, который Вы предложили, я и раньше делал.

- и пришлось так и сделать, через два Индикатора 

Вот что получилось 

 

---------------------------

Забыл сказать Вам Спасибо! - Спасибо!!!

Ну так объедините их, в одном индикаторе можно создавать много разных объектов)

 
Alexey Viktorov:

Видимо не всё перепробовал.

Почему-то событие CHARTEVENT_OBJECT_CREATE считается сразу после касания крыской графика, а не после окончания создания объекта. И цены разных концов фибки оказываются одинаковыми. Следовательно надо перекрашивать уже после создания объекта.


Вы как это определили?  Логически?

И ещё замечание: Вы красите уровни или основную линию фибки?


Да в разных некоторых вариантах пробовал именно трендовые линии перекрашивать)))

Вот три варианта:

Первый.

Второй.

Третий.


За варианты преогромнейшее спасибо!!!   Глядишь на ваших примерах и научусь логически мыслить)))

Вы именно кодингом занимаетесь, или ещё и трейдингом?  В смысле как давно в теме трейдинга?  Я 12лет уже)))