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

 
Alexey Viktorov #:

Научитесь вставлять код.

Я вам сказал, что надо создать 7 хендлов, а у вас всего один

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

 
Tretyakov Rostyslav #:

В данном случае человеку нужны текущие показания

Спасибо.
Пользуясь вашей подсказкой сделал черновой вариант.

//---- indicator settings
#property indicator_chart_window
#property indicator_buffers 7
#property indicator_plots   0
//---- plot Label1
//--- input parameters
input int      SizeLabel         =  9;
input color    ModifyColorLabel  =  Khaki;

//--- indicator buffers
double   VolHT[];
double   VolIT[];
double   VolDT[];
double   VolWT[];
double   VolST[];
double   VolMT[];
double   VolLT[];
//--- хэндл пользовательского индикатора
int handle_swt_m1;
int handle_swt_m5;
int handle_swt_m15;
int handle_swt_h1;
int handle_swt_h4;
int handle_swt_d1;
int handle_swt_w1;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping

   SetIndexBuffer(1, VolHT, INDICATOR_CALCULATIONS);
   SetIndexBuffer(2, VolIT, INDICATOR_CALCULATIONS);
   SetIndexBuffer(3, VolDT, INDICATOR_CALCULATIONS);
   SetIndexBuffer(4, VolWT, INDICATOR_CALCULATIONS);
   SetIndexBuffer(5, VolST, INDICATOR_CALCULATIONS);
   SetIndexBuffer(6, VolMT, INDICATOR_CALCULATIONS);
   SetIndexBuffer(7, VolLT, INDICATOR_CALCULATIONS);

   handle_swt_m1 = iCustom(NULL, PERIOD_M1, "SWT", true, true);
   handle_swt_m5 = iCustom(NULL, PERIOD_M5, "SWT", true, true);
   handle_swt_m15 = iCustom(NULL, PERIOD_M15, "SWT", true, true);
   handle_swt_h1 = iCustom(NULL, PERIOD_H1, "SWT", true, true);
   handle_swt_h4 = iCustom(NULL, PERIOD_H4, "SWT", true, true);
   handle_swt_d1 = iCustom(NULL, PERIOD_D1, "SWT", true, true);
   handle_swt_w1 = iCustom(NULL, PERIOD_W1, "SWT", true, true);

//---
   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[])
  {
//--- скопируем значения индикатора в наш индикаторный буфер

   CopyBuffer(handle_swt_m1, 11, 0, rates_total, VolHT);
   CopyBuffer(handle_swt_m5, 11, 0, rates_total, VolIT);
   CopyBuffer(handle_swt_m15, 11, 0, rates_total, VolDT);
   CopyBuffer(handle_swt_h1, 11, 0, rates_total, VolWT);
   CopyBuffer(handle_swt_h4, 11, 0, rates_total, VolST);
   CopyBuffer(handle_swt_d1, 11, 0, rates_total, VolMT);
   CopyBuffer(handle_swt_w1, 11, 0, rates_total, VolLT);
   
   
   

//--- return value of prev_calculated for next call

   ObjectCreate(0, "Long1", OBJ_LABEL, 0, 0, 0);
   ObjectSetInteger(0, "Long1", OBJPROP_CORNER, CORNER_LEFT_UPPER);
   ObjectSetInteger(0, "Long1", OBJPROP_XDISTANCE, 55);
   ObjectSetInteger(0, "Long1", OBJPROP_YDISTANCE, 43);
   ObjectSetInteger(0, "Long1", OBJPROP_FONTSIZE, 9);
   ObjectSetString(0, "Long1", OBJPROP_FONT, "Franklin Gothic Medium");
   ObjectSetString(0, "Long1", OBJPROP_TEXT, DoubleToString(VolLT[rates_total - 1], _Digits)); // _Digits вместо Digits
   ObjectSetInteger(0, "Long1", OBJPROP_COLOR, ModifyColorLabel);

   ObjectCreate(0, "Medium1", OBJ_LABEL, 0, 0, 0);
   ObjectSetInteger(0, "Medium1", OBJPROP_CORNER, CORNER_LEFT_UPPER);
   ObjectSetInteger(0, "Medium1", OBJPROP_XDISTANCE, 55);
   ObjectSetInteger(0, "Medium1", OBJPROP_YDISTANCE, 56);
   ObjectSetInteger(0, "Medium1", OBJPROP_FONTSIZE, 9);
   ObjectSetString(0, "Medium1", OBJPROP_FONT, "Franklin Gothic Medium");
   ObjectSetString(0, "Medium1", OBJPROP_TEXT, DoubleToString(VolMT[rates_total - 1], _Digits)); // _Digits вместо Digits
   ObjectSetInteger(0, "Medium1", OBJPROP_COLOR, ModifyColorLabel);
   
   ObjectCreate(0, "Short1", OBJ_LABEL, 0, 0, 0);
   ObjectSetInteger(0, "Short1", OBJPROP_CORNER, CORNER_LEFT_UPPER);
   ObjectSetInteger(0, "Short1", OBJPROP_XDISTANCE, 55);
   ObjectSetInteger(0, "Short1", OBJPROP_YDISTANCE, 69);
   ObjectSetInteger(0, "Short1", OBJPROP_FONTSIZE, 9);
   ObjectSetString(0, "Short1", OBJPROP_FONT, "Franklin Gothic Medium");
   ObjectSetString(0, "Short1", OBJPROP_TEXT, DoubleToString(VolST[rates_total - 1], _Digits)); // _Digits вместо Digits
   ObjectSetInteger(0, "Short1", OBJPROP_COLOR, ModifyColorLabel);

   ObjectCreate(0, "Weekly1", OBJ_LABEL, 0, 0, 0);
   ObjectSetInteger(0, "Weekly1", OBJPROP_CORNER, CORNER_LEFT_UPPER);
   ObjectSetInteger(0, "Weekly1", OBJPROP_XDISTANCE, 55);
   ObjectSetInteger(0, "Weekly1", OBJPROP_YDISTANCE, 82);
   ObjectSetInteger(0, "Weekly1", OBJPROP_FONTSIZE, 9);
   ObjectSetString(0, "Weekly1", OBJPROP_FONT, "Franklin Gothic Medium");
   ObjectSetString(0, "Weekly1", OBJPROP_TEXT, DoubleToString(VolWT[rates_total - 1], _Digits)); // _Digits вместо Digits
   ObjectSetInteger(0, "Weekly1", OBJPROP_COLOR, ModifyColorLabel);

   ObjectCreate(0, "Daily1", OBJ_LABEL, 0, 0, 0);
   ObjectSetInteger(0, "Daily1", OBJPROP_CORNER, CORNER_LEFT_UPPER);
   ObjectSetInteger(0, "Daily1", OBJPROP_XDISTANCE, 55);
   ObjectSetInteger(0, "Daily1", OBJPROP_YDISTANCE, 95);
   ObjectSetInteger(0, "Daily1", OBJPROP_FONTSIZE, 9);
   ObjectSetString(0, "Daily1", OBJPROP_FONT, "Franklin Gothic Medium");
   ObjectSetString(0, "Daily1", OBJPROP_TEXT, DoubleToString(VolDT[rates_total - 1], _Digits)); // _Digits вместо Digits
   ObjectSetInteger(0, "Daily1", OBJPROP_COLOR, ModifyColorLabel);

   ObjectCreate(0, "IDay1", OBJ_LABEL, 0, 0, 0);
   ObjectSetInteger(0, "IDay1", OBJPROP_CORNER, CORNER_LEFT_UPPER);
   ObjectSetInteger(0, "IDay1", OBJPROP_XDISTANCE, 55);
   ObjectSetInteger(0, "IDay1", OBJPROP_YDISTANCE, 108);
   ObjectSetInteger(0, "IDay1", OBJPROP_FONTSIZE, 9);
   ObjectSetString(0, "IDay1", OBJPROP_FONT, "Franklin Gothic Medium");
   ObjectSetString(0, "IDay1", OBJPROP_TEXT, DoubleToString(VolIT[rates_total - 1], _Digits)); // _Digits вместо Digits
   ObjectSetInteger(0, "IDay1", OBJPROP_COLOR, ModifyColorLabel);

   ObjectCreate(0, "Hourly1", OBJ_LABEL, 0, 0, 0);
   ObjectSetInteger(0, "Hourly1", OBJPROP_CORNER, CORNER_LEFT_UPPER);
   ObjectSetInteger(0, "Hourly1", OBJPROP_XDISTANCE, 55);
   ObjectSetInteger(0, "Hourly1", OBJPROP_YDISTANCE, 121);
   ObjectSetInteger(0, "Hourly1", OBJPROP_FONTSIZE, 9);
   ObjectSetString(0, "Hourly1", OBJPROP_FONT, "Franklin Gothic Medium");
   ObjectSetString(0, "Hourly1", OBJPROP_TEXT, DoubleToString(VolHT[rates_total - 1], _Digits)); // _Digits вместо Digits
   ObjectSetInteger(0, "Hourly1", OBJPROP_COLOR, ModifyColorLabel);

   return(rates_total);
  }

Все работает как часы. Буду оптимизировать структуру меток применительно к MQL5.
Может еще какие рекомендации будут по написанному? Не по меткам, я там знаю что и как делать... А по содержательной части кода. Код намного больше, просто этот узел у меня никак не хотел работать и благодаря вам все получилось. Хотя может я что-то сделал не совсем правильно... Возраст знаете ли... :)))

 
Nikolay Skrigan #:

Спасибо.
Пользуясь вашей подсказкой сделал черновой вариант.

Все работает как часы. Буду оптимизировать структуру меток применительно к MQL5.
Может еще какие рекомендации будут по написанному? Не по меткам, я там знаю что и как делать... А по содержательной части кода. Код намного больше, просто этот узел у меня никак не хотел работать и благодаря вам все получилось. Хотя может я что-то сделал не совсем правильно... Возраст знаете ли... :)))

Знаете ли, мне 71 и я не жалуюсь. По 3 раза в день не могу, но иногда бывает и делаю всегда правильно.

Скажите, а зачем вы читаете 11 значений индикатора

   CopyBuffer(handle_swt_m1, 11, 0, rates_total, VolHT);

если нужно только одно? Да и вообще нужны-ли буферы индикатора если не нужны построения?

 
Nikolay Skrigan #:
Спасибо.
Пользуясь вашей подсказкой сделал черновой вариант.

там могут быть проблемы в момент открытия баров.

Данные таймфреймов внутри терминала обновляются от меньшему к большему, то есть если индикатор запущен на M5 то в 12.00 есть шанс получить старые данные по H4 (c временем открытия 8 часов) потому что бар H4 еще не оформлен терминалом. 

На следующий заход в OnCalculate всё будет уже нормально.

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

 
Nikolay Skrigan #:

Спасибо.
Пользуясь вашей подсказкой сделал черновой вариант.

input int      SizeLabel         =  9;
input color    ModifyColorLabel  =  Khaki;

string prefix="IndLabel";
int handle_swt_m1 = INVALID_HANDLE;
int handle_swt_m5 = INVALID_HANDLE;
int handle_swt_m15 = INVALID_HANDLE;
int handle_swt_h1 = INVALID_HANDLE;
int handle_swt_h4 = INVALID_HANDLE;
int handle_swt_d1 = INVALID_HANDLE;
int handle_swt_w1 = INVALID_HANDLE;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   handle_swt_m1 = iMA(_Symbol,PERIOD_M1, 12,0,MODE_SMA,PRICE_CLOSE);
   handle_swt_m5 = iMA(_Symbol,PERIOD_M5, 12,0,MODE_SMA,PRICE_CLOSE);
   handle_swt_m15= iMA(_Symbol,PERIOD_M15,12,0,MODE_SMA,PRICE_CLOSE);
   handle_swt_h1 = iMA(_Symbol,PERIOD_H1, 12,0,MODE_SMA,PRICE_CLOSE);
   handle_swt_h4 = iMA(_Symbol,PERIOD_H4, 12,0,MODE_SMA,PRICE_CLOSE);
   handle_swt_d1 = iMA(_Symbol,PERIOD_D1, 12,0,MODE_SMA,PRICE_CLOSE);
   handle_swt_w1 = iMA(_Symbol,PERIOD_W1, 12,0,MODE_SMA,PRICE_CLOSE);
   if(handle_swt_m1 == INVALID_HANDLE||handle_swt_m5 == INVALID_HANDLE||handle_swt_m15 == INVALID_HANDLE||handle_swt_h1 == INVALID_HANDLE
   ||handle_swt_h4 == INVALID_HANDLE||handle_swt_d1 == INVALID_HANDLE||handle_swt_w1 == INVALID_HANDLE)
     {
      Print("Can't load indicator.");
      return INIT_FAILED;
     }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   if(_UninitReason!=3) ObjectsDeleteAll(0,prefix);
  }
//+------------------------------------------------------------------+
//| 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(ObjectFind(0,prefix+"Min_1")!=0)
   Create_Label(0,prefix+"Min_1",0, 55, 43, CORNER_LEFT_UPPER, DoubleToString(GetIndicator(handle_swt_m1,0), _Digits),"Franklin Gothic Medium", 9, ModifyColorLabel);
   else 
   ObjectSetString(0,prefix+"Min_1", OBJPROP_TEXT, DoubleToString(GetIndicator(handle_swt_m1,0), _Digits)); // _Digits вместо Digits

   if(ObjectFind(0,prefix+"Min_5")!=0)
   Create_Label(0,prefix+"Min_5",0, 55, 56, CORNER_LEFT_UPPER, DoubleToString(GetIndicator(handle_swt_m5,0), _Digits),"Franklin Gothic Medium", 9, ModifyColorLabel);
   else 
   ObjectSetString(0,prefix+"Min_5", OBJPROP_TEXT, DoubleToString(GetIndicator(handle_swt_m5,0), _Digits)); // _Digits вместо Digits
   
   if(ObjectFind(0,prefix+"Min_15")!=0)
   Create_Label(0,prefix+"Min_15",0, 55, 69, CORNER_LEFT_UPPER, DoubleToString(GetIndicator(handle_swt_m15,0), _Digits),"Franklin Gothic Medium", 9, ModifyColorLabel);
   else 
   ObjectSetString(0,prefix+"Min_15", OBJPROP_TEXT, DoubleToString(GetIndicator(handle_swt_m15,0), _Digits)); // _Digits вместо Digits

   if(ObjectFind(0,prefix+"Hour1")!=0)
   Create_Label(0,prefix+"Hour1",0, 55, 82, CORNER_LEFT_UPPER, DoubleToString(GetIndicator(handle_swt_h1,0), _Digits),"Franklin Gothic Medium", 9, ModifyColorLabel);
   else 
   ObjectSetString(0,prefix+"Hour1", OBJPROP_TEXT, DoubleToString(GetIndicator(handle_swt_h1,0), _Digits)); // _Digits вместо Digits

   if(ObjectFind(0,prefix+"Hour4")!=0)
   Create_Label(0,prefix+"Hour4",0, 55, 95, CORNER_LEFT_UPPER, DoubleToString(GetIndicator(handle_swt_h4,0), _Digits),"Franklin Gothic Medium", 9, ModifyColorLabel);
   else 
   ObjectSetString(0,prefix+"Hour4", OBJPROP_TEXT, DoubleToString(GetIndicator(handle_swt_h4,0), _Digits)); // _Digits вместо Digits

   if(ObjectFind(0,prefix+"Daily1")!=0)
   Create_Label(0,prefix+"Daily1",0, 55, 108, CORNER_LEFT_UPPER, DoubleToString(GetIndicator(handle_swt_d1,0), _Digits),"Franklin Gothic Medium", 9, ModifyColorLabel);
   else 
   ObjectSetString(0,prefix+"Daily1", OBJPROP_TEXT, DoubleToString(GetIndicator(handle_swt_d1,0), _Digits)); // _Digits вместо Digits

   if(ObjectFind(0,prefix+"Weekly1")!=0)
   Create_Label(0,prefix+"Weekly1",0, 55, 121, CORNER_LEFT_UPPER, DoubleToString(GetIndicator(handle_swt_w1,0), _Digits),"Franklin Gothic Medium", 9, ModifyColorLabel);
   else 
   ObjectSetString(0,prefix+"Weekly1", OBJPROP_TEXT, DoubleToString(GetIndicator(handle_swt_w1,0), _Digits));
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
bool Create_Label(const long              chart_ID=0,               // ID графика
                  const string            name="Label",             // имя метки
                  const int               sub_window=0,             // номер подокна
                  const int               x=0,                      // координата по оси X
                  const int               y=0,                      // координата по оси Y
                  const ENUM_BASE_CORNER  corner=CORNER_LEFT_UPPER, // угол графика для привязки
                  const string            text="Label",             // текст
                  const string            font="Arial",             // шрифт
                  const int               font_size=10,             // размер шрифта
                  const color             clr=clrRed)               // цвет
  {
//--- сбросим значение ошибки
   ResetLastError();
//--- создадим текстовую метку
   if(!ObjectCreate(chart_ID,name,OBJ_LABEL,sub_window,0,0))
     {
      Print(__FUNCTION__, ": не удалось создать метку! Код ошибки = ",GetLastError()); return(false);
     }
   ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x);
   ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y);
   ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner);
   ObjectSetString(chart_ID,name,OBJPROP_TEXT,text);
   ObjectSetString(chart_ID,name,OBJPROP_FONT,font);
   ObjectSetInteger(chart_ID,name,OBJPROP_FONTSIZE,font_size);
   ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- успешное выполнение
   return(true);
  }
//+------------------------------------------------------------------+
double GetIndicator(const int handle, const int i)
  {
   double res[1];
   if(CopyBuffer(handle, 0, i, 1, res) <= 0)
      return 0;
   return res[0];
  }
//+------------------------------------------------------------------+
 
Alexey Viktorov #:

Знаете ли, мне 71 и я не жалуюсь. По 3 раза в день не могу, но иногда бывает и делаю всегда правильно.

Скажите, а зачем вы читаете 11 значений индикатора

если нужно только одно? Да и вообще нужны-ли буферы индикатора если не нужны построения?

Мне чуть больше лет :) И все люди разные. Два моих младших брата сильно не дожили до этого возраста.


11 - это номер буфера. 


SWT-метод

 
Maxim Kuznetsov #:

там могут быть проблемы в момент открытия баров.

Данные таймфреймов внутри терминала обновляются от меньшему к большему, то есть если индикатор запущен на M5 то в 12.00 есть шанс получить старые данные по H4 (c временем открытия 8 часов) потому что бар H4 еще не оформлен терминалом. 

На следующий заход в OnCalculate всё будет уже нормально.

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

Да нет, идут текущие значения без задержки. Есть возможность проверить.

 
Tretyakov Rostyslav #:

Спасибо за вариант с текстом. 
У меня немного другой. ИИ-ассистент нарисовал.
Он еще компактнее и тоже работает.
Но я ни в вашем, ни в том ни хрена не понимаю, поскольку весь мой опыт работы с MQL5 исчерпывается двумя неделями. Пока что тупо переношу (по возможности) коды из MQL4 с корректировкой где нужно.

 
Nikolay Skrigan #:

Спасибо за вариант с текстом. 
У меня немного другой. ИИ-ассистент нарисовал.
Он еще компактнее и тоже работает.
Но я ни в вашем, ни в том ни хрена не понимаю, поскольку весь мой опыт работы с MQL5 исчерпывается двумя неделями. Пока что тупо переношу (по возможности) коды из MQL4 с корректировкой где нужно.

Самый хреновый вариант, это общение с искусственным идиотизмом. Я ещё ни разу не встречал приемлевого варианта кода написанного ИИ.

А этот индикатор "SWT" переписан на MQL5 ?
 
Alexey Viktorov #:
Самый хреновый вариант, это общение с искусственным идиотизмом. Я ещё ни разу не встречал приемлевого варианта кода написанного ИИ.
Полностью поддерживаю.