# Изучаем язык программирования MQL4

Раздел: Язык программирования MQL4
Автор темы: BorisSedov
Создана: 2019-06-24 18:37
Ответов: 435 | Просмотров: 68649
Страница 20 из 22
Источник: https://forexsystemru.com/threads/87869/page-20

---

## Leonup — 2021-01-28 12:46

Здравствуйте! 
Как можно решить такую задачу? Найти 2 ближайших значения (нижнее и верхнее) экстремумов индикатора zigzag, которые находятся на расстоянии более, допустим, 150-ти пунктов (4 знака) от определенной точки. Такие точки могут находиться и на 10-15 экстремуме. 
Если бы они всегда находились на 3-5 экстремумах, то их можно было бы найти таким образом: 
 
    double y3=0, y2=0, y1=0, zz;    // экстремумы Зиг-Зага
    int x3, x2, x1, sh=ShiftBars;// номера баров
 
  // Берём три экстремума Зиг-Зага
  while (y3==0) {
    zz=iCustom(NULL, 0, "ZigZag", ExtDepth, ExtDeviation, ExtBackstep, 0, sh);
    if (zz!=0 && zz!=EMPTY_VALUE) {
      if         (y1==0) { x1=sh; y1=zz; }
      else if (y2==0) { x2=sh; y2=zz; }
      else if (y3==0) { x3=sh; y3=zz; }
    }
    sh++;
 
Спасибо.

## AlexeyVik — 2021-01-28 16:36

> Цитата (Leonup):
> Здравствуйте!
> Как можно решить такую задачу? Найти 2 ближайших значения (нижнее и верхнее) экстремумов индикатора zigzag, которые находятся на расстоянии более, допустим, 150-ти пунктов (4 знака) от определенной точки. Такие точки могут находиться и на 10-15 экстремуме.
> Если бы они всегда находились на 3-5 экстремумах, то их можно было бы найти таким образом:
>
>     double y3=0, y2=0, y1=0, zz;    // экстремумы Зиг-Зага
>     int x3, x2, x1, sh=ShiftBars;// номера баров
>
>   // Берём три экстремума Зиг-Зага
>   while (y3==0) {
>     zz=iCustom(NULL, 0, "ZigZag", ExtDepth, ExtDeviation, ExtBackstep, 0, sh);
>     if (zz!=0 && zz!=EMPTY_VALUE) {
>       if         (y1==0) { x1=sh; y1=zz; }
>       else if (y2==0) { x2=sh; y2=zz; }
>       else if (y3==0) { x3=sh; y3=zz; }
>     }
>     sh++;
>
> Спасибо.

Достаточно поставить ещё одно условие
if(y1 == 0 && fabs(экстремум_индикатора-определенная_точка))
То-же самое добавить в следующие два условия.

## Leonup — 2021-01-30 13:28

> Цитата (AlexeyVik):
> Достаточно поставить ещё одно условие
> if(y1 == 0 && fabs(экстремум_индикатора-определенная_точка))
> То-же самое добавить в следующие два условия.

Поставил сразу условие с учетом ( >= Distance*Point ): 
if (y1==0 && fabs (y1-StartDay) >= Distance*Point) { x1=sh; y1=zz; }
Как будто бы все верно, но результат такой же, как и при:
if (y1==0) { x1=sh; y1=zz; }
Такой же результат был и по: 
if(y1 == 0 && fabs(y1-StartDay)) { x1=sh; y1=zz; }
 
Помогите, пожалуйста. 
Если у Вас получится, то можно ли сделать так, чтобы 2 ближайших значения (нижнее и верхнее) экстремумов находились на расстоянии Distance (4 знака) ниже и выше от StartDay? 
Благодарю Вас за помощь.

## AlexeNP — 2021-01-30 13:56

> Цитата (Leonup):
> Поставил сразу условие с учетом ( >= Distance*Point ):
> if (y1==0 && fabs (y1-StartDay) >= Distance*Point) { x1=sh; y1=zz; }
> Как будто бы все верно, но результат такой же, как и при:
> if (y1==0) { x1=sh; y1=zz; }
> Такой же результат был и по:
> if(y1 == 0 && fabs(y1-StartDay)) { x1=sh; y1=zz; }
>
> Помогите, пожалуйста.
> Если у Вас получится, то можно ли сделать так, чтобы 2 ближайших значения (нижнее и верхнее) экстремумов находились на расстоянии Distance (4 знака) ниже и выше от StartDay?
> Благодарю Вас за помощь.

StartDay равна open... поэтому условие fabs (y-StartDay) >= Distance*Point выполняется практически всегда... ну или нужно задать Distance на что-нибудь такое-этакое...

....
вкурил я чего хочется)

## AlexeyVik — 2021-01-30 14:13

> Цитата (Leonup):
> Поставил сразу условие с учетом ( >= Distance*Point ):
> if (y1==0 && fabs (**y1-StartDay**) >= Distance*Point) { x1=sh; y1=zz; }
> Как будто бы все верно, но результат такой же, как и при:
> if (y1==0) { x1=sh; y1=zz; }
> Такой же результат был и по:
> if(y1 == 0 && fabs(y1-StartDay)) { x1=sh; y1=zz; }
>
> Помогите, пожалуйста.
> Если у Вас получится, то можно ли сделать так, чтобы 2 ближайших значения (нижнее и верхнее) экстремумов находились на расстоянии Distance (4 знака) ниже и выше от StartDay?
> Благодарю Вас за помощь.

Зачем в выделенном y1 и что такое StartDay?
Текущий экстремум индикатора это ведь zz не так-ли?

## Leonup — 2021-01-30 17:16

> Цитата (AlexeyVik):
> Зачем в выделенном y1 и что такое StartDay?
> Текущий экстремум индикатора это ведь zz не так-ли?

> Цитата (AlexeNP):
> StartDay равна open...

Да, Вы правы. Нужно y заменить на zz.
StartDay – это iOpen (Symbol(), PERIOD_D1,0), открытие дня, взятое с D1, хотя работа будет вестись на H1.

## AlexeyVik — 2021-01-30 20:11

> Цитата (Leonup):
> Да, Вы правы. Нужно y заменить на zz.
> StartDay – это iOpen (Symbol(), PERIOD_D1,0), открытие дня, взятое с D1, хотя работа будет вестись на H1.

Ну так замени, проверь и расскажи всем что получилось. :)

## gravity — 2021-01-31 15:01

🤝 Всем привет!

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

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

```
  
   dy=(FONTSIZE/10.0);
   dx=(FONTSIZE/15.0);
 
   ObjectCreate(0,objname,OBJ_BUTTON,0,0,0);
   ObjectSet(objname, OBJPROP_CORNER, Corner);
   ObjectSetInteger(0,objname,OBJPROP_XDISTANCE,XDISTANCE);
   ObjectSetInteger(0,objname,OBJPROP_YDISTANCE,YDISTANCE);
   ObjectSetInteger(0,objname,OBJPROP_XSIZE,XSIZE*dx+30);
   ObjectSetInteger(0,objname,OBJPROP_YSIZE,YSIZE*dy);
```

2) Знаю что нужно посчитать длину текста через StringLen и как то увязать это с размером шрифта, но как это реализовать, не додумался.

3) Для адаптации при раскрытии навигатора, пока нашёл в справочнике такую подсказку

```
  double   top=WindowPriceMax();
  double   bottom=WindowPriceMin();
  datetime left=Time[WindowFirstVisibleBar()];
  int      right_bound=WindowFirstVisibleBar()-WindowBarsPerChart();
  if(right_bound<0) right_bound=0;
  datetime right=Time+Period()*60; 
```

но тоже, не получается прийти к результату.

4) Ещё была проблема, что кнопка срабатывала при переключении ТФ.
Подсмотрев в одном индикаторе, дополнил код, но работает ли, пока незнаю, завтра только получится проверить.

```
   if(id==CHARTEVENT_OBJECT_CLICK && ObjectGet(sparam,OBJPROP_TYPE)==OBJ_BUTTON)//if(sparam==objname) // Close button has been pressed
```

```
//+------------------------------------------------------------------+
//|                                               CloseAllButton.mq4 |
//|                                                          FX Seal |
//|                                            http://www.fxseal.com |
//+------------------------------------------------------------------+
#property copyright "FX Seal"
#property link      "http://www.fxseal.com"
#property version   "1.00"
#property strict

enum corner_Rus // перечисление именованных констант
{
CORNER_0=0,                             // правый верхний
CORNER_1=1,                             // левый верхний
CORNER_2=2,                             // правый нижний
CORNER_3=3,                             // левый нижний
};
 
//extern ENUM_BASE_CORNER Corner = 1;
extern  corner_Rus Corner = 0;// Угол привязки
extern int XDISTANCE = 1150,  //Смещение по горизонтали
//extern int XDISTANCE = 25   //стандарт
//extern int XDISTANCE = 1170,
           YDISTANCE = 110,   //Смещение по вертикали
//YDISTANCE = 25// стандарт
           XSIZE     = 120,   // Ширина кнопки
           //XSIZE     = 100, //стандарт
           YSIZE     = 30,    // Высота кнопки
           //YSIZE     = 50,  //стандарт
           FONTSIZE  = 12;    // Размер шрифта
extern string text   = "Закрыть ВСЁ"; // Текст
//extern string text   = "CLOSE ALL"; //стандарт
extern color BGCOLOR      = clrRed, // Цвет кнопки
             BORDER_COLOR = clrRed, // Цвет рамки
             text_COLOR   = clrWhite; //Цвет текста
string objname="CloseButton";  
double dy=0,
       dx=0;        
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   dy=(FONTSIZE/10.0);
   dx=(FONTSIZE/15.0);
 
   ObjectCreate(0,objname,OBJ_BUTTON,0,0,0);
   ObjectSet(objname, OBJPROP_CORNER, Corner);
   ObjectSetInteger(0,objname,OBJPROP_XDISTANCE,XDISTANCE);
   ObjectSetInteger(0,objname,OBJPROP_YDISTANCE,YDISTANCE);
   ObjectSetInteger(0,objname,OBJPROP_XSIZE,XSIZE*dx+30);
   ObjectSetInteger(0,objname,OBJPROP_YSIZE,YSIZE*dy);

   ObjectSetString(0,objname,OBJPROP_TEXT,text);

   ObjectSetInteger(0,objname,OBJPROP_COLOR,text_COLOR);
   ObjectSetInteger(0,objname,OBJPROP_BGCOLOR,BGCOLOR);
   ObjectSetInteger(0,objname,OBJPROP_BORDER_COLOR,BORDER_COLOR);
   ObjectSetInteger(0,objname,OBJPROP_BORDER_TYPE,BORDER_FLAT);
   ObjectSetInteger(0,objname,OBJPROP_HIDDEN,true);
   ObjectSetInteger(0,objname,OBJPROP_STATE,false);
   ObjectSetInteger(0,objname,OBJPROP_FONTSIZE,FONTSIZE);

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
     ObjectDelete(0,objname);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---

  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//---
   if(id==CHARTEVENT_OBJECT_CLICK && ObjectGet(sparam,OBJPROP_TYPE)==OBJ_BUTTON)//if(sparam==objname) // Close button has been pressed
     {
      for(int i=OrdersTotal()-1; i>=0; i--)
        {
         OrderSelect(i,SELECT_BY_POS);
         if(OrderType()==OP_BUY || OrderType()==OP_SELL)
            OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),5);
         else
            OrderDelete(OrderTicket());
        }
      ObjectSetInteger(0,objname,OBJPROP_STATE,false);
     }
  }
//+------------------------------------------------------------------+
```

## AlexeyVik — 2021-01-31 16:22

> Цитата (gravity):
> 🤝 Всем привет!
>
> Есть советник - рисует кнопку - при нажатии кнопки закрываются все открытые ордера.
> Хочу сделать, чтобы кнопка адаптировалась к изменению шрифта, размера текста и смещению окна (при раскрытии навигатора). Чтобы всегда оставалась в зоне видимости.
>
> 1) Кажется получилось сделать, чтобы размер кнопки менялся в зависимости от шрифта.
> 
> 
```

>    dy=(FONTSIZE/10.0);
>    dx=(FONTSIZE/15.0);
>
>    ObjectCreate(0,objname,OBJ_BUTTON,0,0,0);
>    ObjectSet(objname, OBJPROP_CORNER, Corner);
>    ObjectSetInteger(0,objname,OBJPROP_XDISTANCE,XDISTANCE);
>    ObjectSetInteger(0,objname,OBJPROP_YDISTANCE,YDISTANCE);
>    ObjectSetInteger(0,objname,OBJPROP_XSIZE,XSIZE*dx+30);
>    ObjectSetInteger(0,objname,OBJPROP_YSIZE,YSIZE*dy);
```

> 
> 2) Знаю что нужно посчитать длину текста через StringLen и как то увязать это с размером шрифта, но как это реализовать, не додумался.
>
> 3) Для адаптации при раскрытии навигатора, пока нашёл в справочнике такую подсказку
> 
> 
```
  double   top=WindowPriceMax();
>   double   bottom=WindowPriceMin();
>   datetime left=Time[WindowFirstVisibleBar()];
>   int      right_bound=WindowFirstVisibleBar()-WindowBarsPerChart();
>   if(right_bound<0) right_bound=0;
>   datetime right=Time+Period()*60; 
```

> но тоже, не получается прийти к результату.
>
> 
>
> 4) Ещё была проблема, что кнопка срабатывала при переключении ТФ.
> Подсмотрев в одном индикаторе, дополнил код, но работает ли, пока незнаю, завтра только получится проверить.
> 
```
   if(id==CHARTEVENT_OBJECT_CLICK && ObjectGet(sparam,OBJPROP_TYPE)==OBJ_BUTTON)//if(sparam==objname) // Close button has been pressed
```

>
> 
> 
```
//+------------------------------------------------------------------+
> //|                                               CloseAllButton.mq4 |
> //|                                                          FX Seal |
> //|                                            http://www.fxseal.com |
> //+------------------------------------------------------------------+
> #property copyright "FX Seal"
> #property link      "http://www.fxseal.com"
> #property version   "1.00"
> #property strict
>
>
> enum corner_Rus // перечисление именованных констант
> {
> CORNER_0=0,                             // правый верхний
> CORNER_1=1,                             // левый верхний
> CORNER_2=2,                             // правый нижний
> CORNER_3=3,                             // левый нижний
> };
>
> //extern ENUM_BASE_CORNER Corner = 1;
> extern  corner_Rus Corner = 0;// Угол привязки
> extern int XDISTANCE = 1150,  //Смещение по горизонтали
> //extern int XDISTANCE = 25   //стандарт
> //extern int XDISTANCE = 1170,
>            YDISTANCE = 110,   //Смещение по вертикали
> //YDISTANCE = 25// стандарт
>            XSIZE     = 120,   // Ширина кнопки
>            //XSIZE     = 100, //стандарт
>            YSIZE     = 30,    // Высота кнопки
>            //YSIZE     = 50,  //стандарт
>            FONTSIZE  = 12;    // Размер шрифта
> extern string text   = "Закрыть ВСЁ"; // Текст
> //extern string text   = "CLOSE ALL"; //стандарт
> extern color BGCOLOR      = clrRed, // Цвет кнопки
>              BORDER_COLOR = clrRed, // Цвет рамки
>              text_COLOR   = clrWhite; //Цвет текста
> string objname="CloseButton";
> double dy=0,
>        dx=0;
> //+------------------------------------------------------------------+
> //| Expert initialization function                                   |
> //+------------------------------------------------------------------+
> int OnInit()
>   {
> //---
>    dy=(FONTSIZE/10.0);
>    dx=(FONTSIZE/15.0);
>
>    ObjectCreate(0,objname,OBJ_BUTTON,0,0,0);
>    ObjectSet(objname, OBJPROP_CORNER, Corner);
>    ObjectSetInteger(0,objname,OBJPROP_XDISTANCE,XDISTANCE);
>    ObjectSetInteger(0,objname,OBJPROP_YDISTANCE,YDISTANCE);
>    ObjectSetInteger(0,objname,OBJPROP_XSIZE,XSIZE*dx+30);
>    ObjectSetInteger(0,objname,OBJPROP_YSIZE,YSIZE*dy);
>
>    ObjectSetString(0,objname,OBJPROP_TEXT,text);
>
>    ObjectSetInteger(0,objname,OBJPROP_COLOR,text_COLOR);
>    ObjectSetInteger(0,objname,OBJPROP_BGCOLOR,BGCOLOR);
>    ObjectSetInteger(0,objname,OBJPROP_BORDER_COLOR,BORDER_COLOR);
>    ObjectSetInteger(0,objname,OBJPROP_BORDER_TYPE,BORDER_FLAT);
>    ObjectSetInteger(0,objname,OBJPROP_HIDDEN,true);
>    ObjectSetInteger(0,objname,OBJPROP_STATE,false);
>    ObjectSetInteger(0,objname,OBJPROP_FONTSIZE,FONTSIZE);
>
> //---
>    return(INIT_SUCCEEDED);
>   }
> //+------------------------------------------------------------------+
> //| Expert deinitialization function                                 |
> //+------------------------------------------------------------------+
> void OnDeinit(const int reason)
>   {
> //---
>      ObjectDelete(0,objname);
>   }
> //+------------------------------------------------------------------+
> //| Expert tick function                                             |
> //+------------------------------------------------------------------+
> void OnTick()
>   {
> //---
>
>   }
> //+------------------------------------------------------------------+
> //| ChartEvent function                                              |
> //+------------------------------------------------------------------+
> void OnChartEvent(const int id,
>                   const long &lparam,
>                   const double &dparam,
>                   const string &sparam)
>   {
> //---
>    if(id==CHARTEVENT_OBJECT_CLICK && ObjectGet(sparam,OBJPROP_TYPE)==OBJ_BUTTON)//if(sparam==objname) // Close button has been pressed
>      {
>       for(int i=OrdersTotal()-1; i>=0; i--)
>         {
>          OrderSelect(i,SELECT_BY_POS);
>          if(OrderType()==OP_BUY || OrderType()==OP_SELL)
>             OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),5);
>          else
>             OrderDelete(OrderTicket());
>         }
>       ObjectSetInteger(0,objname,OBJPROP_STATE,false);
>      }
>   }
> //+------------------------------------------------------------------+
```

> 

1. Это решается с помощью определения разрешения экрана. Ищи в документации по «dpi» там есть пример использования.
2. Длина и высота строки… Это описано в разделе работы с ресурсами.
Мне сейчас лениво искать где это. Постарайся найти сам.

## AlexeNP — 2021-01-31 17:01

> Цитата (gravity):
> 🤝 Всем привет!
>
> Есть советник - рисует кнопку - при нажатии кнопки закрываются все открытые ордера.
> Хочу сделать, чтобы кнопка адаптировалась к изменению шрифта, размера текста и смещению окна (при раскрытии навигатора). Чтобы всегда оставалась в зоне видимости.
>
> 1) Кажется получилось сделать, чтобы размер кнопки менялся в зависимости от шрифта.
> 
> 
```

>    dy=(FONTSIZE/10.0);
>    dx=(FONTSIZE/15.0);
>
>    ObjectCreate(0,objname,OBJ_BUTTON,0,0,0);
>    ObjectSet(objname, OBJPROP_CORNER, Corner);
>    ObjectSetInteger(0,objname,OBJPROP_XDISTANCE,XDISTANCE);
>    ObjectSetInteger(0,objname,OBJPROP_YDISTANCE,YDISTANCE);
>    ObjectSetInteger(0,objname,OBJPROP_XSIZE,XSIZE*dx+30);
>    ObjectSetInteger(0,objname,OBJPROP_YSIZE,YSIZE*dy);
```

> 
> 2) Знаю что нужно посчитать длину текста через StringLen и как то увязать это с размером шрифта, но как это реализовать, не додумался.
>
> 3) Для адаптации при раскрытии навигатора, пока нашёл в справочнике такую подсказку
> 
> 
```
  double   top=WindowPriceMax();
>   double   bottom=WindowPriceMin();
>   datetime left=Time[WindowFirstVisibleBar()];
>   int      right_bound=WindowFirstVisibleBar()-WindowBarsPerChart();
>   if(right_bound<0) right_bound=0;
>   datetime right=Time+Period()*60; 
```

> но тоже, не получается прийти к результату.
>
> 
>
> 4) Ещё была проблема, что кнопка срабатывала при переключении ТФ.
> Подсмотрев в одном индикаторе, дополнил код, но работает ли, пока незнаю, завтра только получится проверить.
> 
```
   if(id==CHARTEVENT_OBJECT_CLICK && ObjectGet(sparam,OBJPROP_TYPE)==OBJ_BUTTON)//if(sparam==objname) // Close button has been pressed
```

>
> 
> 
```
//+------------------------------------------------------------------+
> //|                                               CloseAllButton.mq4 |
> //|                                                          FX Seal |
> //|                                            http://www.fxseal.com |
> //+------------------------------------------------------------------+
> #property copyright "FX Seal"
> #property link      "http://www.fxseal.com"
> #property version   "1.00"
> #property strict
>
>
> enum corner_Rus // перечисление именованных констант
> {
> CORNER_0=0,                             // правый верхний
> CORNER_1=1,                             // левый верхний
> CORNER_2=2,                             // правый нижний
> CORNER_3=3,                             // левый нижний
> };
>
> //extern ENUM_BASE_CORNER Corner = 1;
> extern  corner_Rus Corner = 0;// Угол привязки
> extern int XDISTANCE = 1150,  //Смещение по горизонтали
> //extern int XDISTANCE = 25   //стандарт
> //extern int XDISTANCE = 1170,
>            YDISTANCE = 110,   //Смещение по вертикали
> //YDISTANCE = 25// стандарт
>            XSIZE     = 120,   // Ширина кнопки
>            //XSIZE     = 100, //стандарт
>            YSIZE     = 30,    // Высота кнопки
>            //YSIZE     = 50,  //стандарт
>            FONTSIZE  = 12;    // Размер шрифта
> extern string text   = "Закрыть ВСЁ"; // Текст
> //extern string text   = "CLOSE ALL"; //стандарт
> extern color BGCOLOR      = clrRed, // Цвет кнопки
>              BORDER_COLOR = clrRed, // Цвет рамки
>              text_COLOR   = clrWhite; //Цвет текста
> string objname="CloseButton";
> double dy=0,
>        dx=0;
> //+------------------------------------------------------------------+
> //| Expert initialization function                                   |
> //+------------------------------------------------------------------+
> int OnInit()
>   {
> //---
>    dy=(FONTSIZE/10.0);
>    dx=(FONTSIZE/15.0);
>
>    ObjectCreate(0,objname,OBJ_BUTTON,0,0,0);
>    ObjectSet(objname, OBJPROP_CORNER, Corner);
>    ObjectSetInteger(0,objname,OBJPROP_XDISTANCE,XDISTANCE);
>    ObjectSetInteger(0,objname,OBJPROP_YDISTANCE,YDISTANCE);
>    ObjectSetInteger(0,objname,OBJPROP_XSIZE,XSIZE*dx+30);
>    ObjectSetInteger(0,objname,OBJPROP_YSIZE,YSIZE*dy);
>
>    ObjectSetString(0,objname,OBJPROP_TEXT,text);
>
>    ObjectSetInteger(0,objname,OBJPROP_COLOR,text_COLOR);
>    ObjectSetInteger(0,objname,OBJPROP_BGCOLOR,BGCOLOR);
>    ObjectSetInteger(0,objname,OBJPROP_BORDER_COLOR,BORDER_COLOR);
>    ObjectSetInteger(0,objname,OBJPROP_BORDER_TYPE,BORDER_FLAT);
>    ObjectSetInteger(0,objname,OBJPROP_HIDDEN,true);
>    ObjectSetInteger(0,objname,OBJPROP_STATE,false);
>    ObjectSetInteger(0,objname,OBJPROP_FONTSIZE,FONTSIZE);
>
> //---
>    return(INIT_SUCCEEDED);
>   }
> //+------------------------------------------------------------------+
> //| Expert deinitialization function                                 |
> //+------------------------------------------------------------------+
> void OnDeinit(const int reason)
>   {
> //---
>      ObjectDelete(0,objname);
>   }
> //+------------------------------------------------------------------+
> //| Expert tick function                                             |
> //+------------------------------------------------------------------+
> void OnTick()
>   {
> //---
>
>   }
> //+------------------------------------------------------------------+
> //| ChartEvent function                                              |
> //+------------------------------------------------------------------+
> void OnChartEvent(const int id,
>                   const long &lparam,
>                   const double &dparam,
>                   const string &sparam)
>   {
> //---
>    if(id==CHARTEVENT_OBJECT_CLICK && ObjectGet(sparam,OBJPROP_TYPE)==OBJ_BUTTON)//if(sparam==objname) // Close button has been pressed
>      {
>       for(int i=OrdersTotal()-1; i>=0; i--)
>         {
>          OrderSelect(i,SELECT_BY_POS);
>          if(OrderType()==OP_BUY || OrderType()==OP_SELL)
>             OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),5);
>          else
>             OrderDelete(OrderTicket());
>         }
>       ObjectSetInteger(0,objname,OBJPROP_STATE,false);
>      }
>   }
> //+------------------------------------------------------------------+
```

> 

Возвращает ширину и высоту строки при текущих настройках шрифта.

bool  TextGetSize(
const string text, // строка текста
uint& width, // ширина буфера в точках
uint& height // высота буфера в точках
   );

Параметры

text

  Строка для которой получаем длину и ширину.

width

  Входной параметр для получения ширины.

height

  Входной параметр для получения высоты.

## gravity — 2021-02-01 14:08

Прошлую задачу ещё не решил, но тут нашёл другую)

Один форумчанин попросил вставить стрелки в [Танкковский инд]('https://forexsystemsru.com/threads/indikatory-sobranie-sochinenij-tankk.86203/post-1631352').
Подсмотрев в схожих индикаторах, я попытался добавить звук и стрелки. Но что-тот ничего не работает.

```
void doAlert(string doWhat)
{
   static string   previousAlert="";
   static datetime previousTime;
   string message;

   //
   //
   //
   //
   //

   if (previousAlert!=doWhat || previousTime!=Time)
   {
      previousAlert = doWhat;
      previousTime  = Time;

      message= StringConcatenate(" HMA'BB - "+Symbol()+", M"+Period(),doWhat," - ",TimeToStr(TimeLocal(),TIME_SECONDS));
         if (AlertsMessage) Alert(message);
         if (AlertsEmail)   SendMail(StringConcatenate(Symbol(),WindowExpertName()),message);
         if (AlertsSound)   PlaySound("alert2.wav");
    }
}

//---------------------------------------------------------------------+

void drawArrow(int i,color theColor,int theCode, int ArrowSize,bool up)
{
   string name = ID+":"+Time;
   double gap  = iATR(NULL,0,20,i);

      //
      //
      //
      //
      //
  
         ObjectCreate(name,OBJ_ARROW,0,Time,0);
         ObjectSet   (name,OBJPROP_ARROWCODE,theCode);
         ObjectSet   (name,OBJPROP_COLOR,theColor);
         ObjectSet   (name, OBJPROP_WIDTH,ArrowSize);
         if (up)
               ObjectSet(name,OBJPROP_PRICE1,High + arrowsUpperGap * gap);
         else  ObjectSet(name,OBJPROP_PRICE1,Low  - arrowsLowerGap * gap);
}

//---------------------------------------------------------------------+
```

```
//-------------------------------------------------------------------+

if(Arr_show)
//{
//ObjectDelete(ID+":"+Time);
         {
               if(Close > UPP[i+SignalBar])// && Close[i+SignalBar+1] < UPP[i+SignalBar+1])
               drawArrow(i,arrowsUpColor,arrowsUpCode,Arr_width,false);
               else ObjectDelete(ID+":"+Time);
           
               if(Close < DNN[i+SignalBar]) //&& Close[i+SignalBar+1] > DNN[i+SignalBar+1])
               drawArrow(i,arrowsDnColor,arrowsDnCode,Arr_width,true);
               else ObjectDelete(ID+":"+Time);

         }
//}
//-------------------------------------------------------------------+

//---

   if (AlertsOn)
   {
         
         if (Close > UPP && Close[SignalBar+1] < UPP[SignalBar+1]) doAlert("цена выше канала");
         if (Close < DNN && Close[SignalBar+1] > DNN[SignalBar+1]) doAlert("цена ниже канала");

   }

//---

```

## mobidik — 2021-02-01 16:56

> Цитата (gravity):
> Прошлую задачу ещё не решил, но тут нашёл другую)
>
> Один форумчанин попросил вставить стрелки в [Танкковский инд]('https://forexsystemsru.com/threads/indikatory-sobranie-sochinenij-tankk.86203/post-1631352').
> Подсмотрев в схожих индикаторах, я попытался добавить звук и стрелки. Но что-тот ничего не работает.
> 
> 
```
void doAlert(string doWhat)
> {
>    static string   previousAlert="";
>    static datetime previousTime;
>    string message;
>
>    //
>    //
>    //
>    //
>    //
>
>    if (previousAlert!=doWhat || previousTime!=Time)
>    {
>       previousAlert = doWhat;
>       previousTime  = Time;
>
>       message= StringConcatenate(" HMA'BB - "+Symbol()+", M"+Period(),doWhat," - ",TimeToStr(TimeLocal(),TIME_SECONDS));
>          if (AlertsMessage) Alert(message);
>          if (AlertsEmail)   SendMail(StringConcatenate(Symbol(),WindowExpertName()),message);
>          if (AlertsSound)   PlaySound("alert2.wav");
>     }
> }
>
> //---------------------------------------------------------------------+
>
> void drawArrow(int i,color theColor,int theCode, int ArrowSize,bool up)
> {
>    string name = ID+":"+Time;
>    double gap  = iATR(NULL,0,20,i);
>
>       //
>       //
>       //
>       //
>       //
>
>          ObjectCreate(name,OBJ_ARROW,0,Time,0);
>          ObjectSet   (name,OBJPROP_ARROWCODE,theCode);
>          ObjectSet   (name,OBJPROP_COLOR,theColor);
>          ObjectSet   (name, OBJPROP_WIDTH,ArrowSize);
>          if (up)
>                ObjectSet(name,OBJPROP_PRICE1,High + arrowsUpperGap * gap);
>          else  ObjectSet(name,OBJPROP_PRICE1,Low  - arrowsLowerGap * gap);
> }
>
> //---------------------------------------------------------------------+
```

>
> 
```
//-------------------------------------------------------------------+
>
> if(Arr_show)
> //{
> //ObjectDelete(ID+":"+Time);
>          {
>                if(Close > UPP[i+SignalBar])// && Close[i+SignalBar+1] < UPP[i+SignalBar+1])
>                drawArrow(i,arrowsUpColor,arrowsUpCode,Arr_width,false);
>                else ObjectDelete(ID+":"+Time);
>
>                if(Close < DNN[i+SignalBar]) //&& Close[i+SignalBar+1] > DNN[i+SignalBar+1])
>                drawArrow(i,arrowsDnColor,arrowsDnCode,Arr_width,true);
>                else ObjectDelete(ID+":"+Time);
>
>          }
> //}
> //-------------------------------------------------------------------+
>
> //---
>
>    if (AlertsOn)
>    {
>
>          if (Close > UPP && Close[SignalBar+1] < UPP[SignalBar+1]) doAlert("цена выше канала");
>          if (Close < DNN && Close[SignalBar+1] > DNN[SignalBar+1]) doAlert("цена ниже канала");
>
>    }
>
> //---
> 
```

> 

Стрелки следует включить в предыдущий цикл, их же нужно на истории отобразить. Сигнальный бар в их условиях прописывать не имеет смысла, это актуально только для алерта. По условиям для стрелок: главная ошибка - имена стрелок, как на бай, так и на селл, совпадают, что не допустимо. Если выполняется условие на бай - рисуем стрелу, при этом, соответственно, условие на селл не выполняется и оно удаляет стрелу установленную по условию на бай. Нужно их разделить по именам.
Алерт - работает.

## gravity — 2021-02-01 18:43

> Цитата (mobidik):
> Стрелки следует включить в предыдущий цикл, их же нужно на истории отобразить. Сигнальный бар в их условиях прописывать не имеет смысла, это актуально только для алерта. По условиям для стрелок: главная ошибка - имена стрелок, как на бай, так и на селл, совпадают, что не допустимо. Если выполняется условие на бай - рисуем стрелу, при этом, соответственно, условие на селл не выполняется и оно удаляет стрелу установленную по условию на бай. Нужно их разделить по именам.
> Алерт - работает.

Благодарю!   Всё получилось  🙂 🤝

## gravity — 2021-02-02 09:39

> Цитата (mobidik):
> +

Я там что-то всё таки намудрил) Вчера перестал запускать терминал.
Описал [тут]('https://forexsystemsru.com/threads/terminal-ne-zapuskaetsja-posle-zapuska-otobrazhaetsja-v-dispetchere-zadach-no-okna-ne-otobrazhajutsja.89735/post-1637999').
Переменную **k** объявил локально, почти как было, но вероятность, что опять там ошибся остаётся.
И поправил пару предупреждений. (приписал **(int)**)
Проверьте пожалуйста, у кого есть время.
Оригинал [тут]('https://forexsystemsru.com/threads/indikatory-sobranie-sochinenij-tankk.86203/post-1631352')

## AlexeNP — 2021-02-02 11:30

> Цитата (gravity):
> Я там что-то всё таки намудрил) Вчера перестал запускать терминал.
> Описал [тут]('https://forexsystemsru.com/threads/terminal-ne-zapuskaetsja-posle-zapuska-otobrazhaetsja-v-dispetchere-zadach-no-okna-ne-otobrazhajutsja.89735/post-1637999').
> Переменную **k** объявил локально, почти как было, но вероятность, что опять там ошибся остаётся.
> И поправил пару предупреждений. (приписал **(int)**)
> Проверьте пожалуйста, у кого есть время.
> Оригинал [тут]('https://forexsystemsru.com/threads/indikatory-sobranie-sochinenij-tankk.86203/post-1631352')
> 
>
>
>
>
> 

строка 157... в чем ее глубинный смысл? и что делает индикатор когда доходит до нее?

## gravity — 2021-02-02 12:10

> Цитата (AlexeNP):
> строка 157... в чем ее глубинный смысл? и что делает индикатор когда доходит до нее?

**Оператор возврата return     **        
Оператор return прекращает выполнение текущей функции и возвращает управление вызвавшей программе. Результат вычисления выражения возвращается вызываемой функции. Выражение может содержать оператор присваивания.

я так понимаю, этот **return **там явно лишний, так как он не внутри функции, а внутри тела оператора **if **.
Когда доходит до него, то, если не ошибаюсь,  **return()** возвращает значение = 0 в функцию **start()**, которая после этого прекращает работу и снова запускается функция **init()**,

*Или не в init(), а на первую строчку кода?*

и так программа выполнят все операции снова и снова (зацикливается).
*Или ретурн пытается вернуть значение оператору if ?*

## gravity — 2021-02-02 12:25

> Цитата (gravity):
> +

Только не пойму, как тогда работал цикл **for** после этого **return(); **?

## AlexeNP — 2021-02-02 12:44

> Цитата (gravity):
> 
> 
> **Оператор возврата return     **
> Оператор return прекращает выполнение текущей функции и возвращает управление вызвавшей программе. Результат вычисления выражения возвращается вызываемой функции. Выражение может содержать оператор присваивания.
> 
> 
>
> я так понимаю, этот **return **там явно лишний, так как он не внутри функции, а внутри тела оператора **if **.
> Когда доходит до него, то, если не ошибаюсь,  **return()** возвращает значение = 0 в функцию **start()**, которая после этого прекращает работу и снова запускается функция **init()**,
> 
> 
> *Или не в init(), а на первую строчку кода?*
> 
> 
> и так программа выполнят все операции снова и снова (зацикливается).
> *Или ретурн пытается вернуть значение оператору if ?*

после этого return'а снова запускается функция start... ну, и продолжает пока не устанет

## gravity — 2021-02-02 12:48

> Цитата (AlexeNP):
> после этого return'а снова запускается функция start... ну, и продолжает пока не устанет

а [это]('https://forexsystemsru.com/threads/izuchaem-jazyk-programmirovanija-mql4.87869/post-1638044') как?

## AlexeNP — 2021-02-02 12:58

> Цитата (gravity):
> а [это]('https://forexsystemsru.com/threads/izuchaem-jazyk-programmirovanija-mql4.87869/post-1638044') как?

если не выполняется if (TimeFrame!=_Period), то ело до того return'a не доходит... но если это условие выполняется... то бишь, заданный в индикаторе TimeFrame отличается от того на котором запущен индикатор, то ...

---

Следующая страница: https://forexsystemru.com/threads/87869/page-21
