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

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++;

Спасибо.
 

AlexeyVik

Программист mql4 mql5
Здравствуйте!
Как можно решить такую задачу? Найти 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

Новичок форума
Достаточно поставить ещё одно условие
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?
Благодарю Вас за помощь.
 

Вложения

  • 10.mq4
    10.mq4
    5,7 КБ · Просмотры: 16

AlexeNP

Гуру форума
Поставил сразу условие с учетом ( >= 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[0]... поэтому условие fabs (y-StartDay) >= Distance*Point выполняется практически всегда... ну или нужно задать Distance на что-нибудь такое-этакое...

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

Вложения

  • 10.mq4
    10.mq4
    5,8 КБ · Просмотры: 19
Последнее редактирование:

AlexeyVik

Программист mql4 mql5
Поставил сразу условие с учетом ( >= 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

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

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

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[right_bound]+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

Программист mql4 mql5
🤝 Всем привет!

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

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[right_bound]+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

Гуру форума
🤝 Всем привет!

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

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[right_bound]+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

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

width

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

height

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

gravity

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

Один форумчанин попросил вставить стрелки в Танкковский инд.
Подсмотрев в схожих индикаторах, я попытался добавить звук и стрелки. Но что-тот ничего не работает.
Код:
void doAlert(string doWhat)
{
   static string   previousAlert="";
   static datetime previousTime;
   string message;

   //
   //
   //
   //
   //

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

      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[i];
   double gap  = iATR(NULL,0,20,i);

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

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

Код:
//-------------------------------------------------------------------+

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

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

//---

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

   }

//---
 

Вложения

Последнее редактирование:

mobidik

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

Один форумчанин попросил вставить стрелки в Танкковский инд.
Подсмотрев в схожих индикаторах, я попытался добавить звук и стрелки. Но что-тот ничего не работает.
Код:
void doAlert(string doWhat)
{
   static string   previousAlert="";
   static datetime previousTime;
   string message;

   //
   //
   //
   //
   //

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

      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[i];
   double gap  = iATR(NULL,0,20,i);

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

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

Код:
//-------------------------------------------------------------------+

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

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

//---

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

   }

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

gravity

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

Вложения

gravity

Местный знаток
Я там что-то всё таки намудрил) Вчера перестал запускать терминал.
Описал тут.
Переменную k объявил локально, почти как было, но вероятность, что опять там ошибся остаётся.
И поправил пару предупреждений. (приписал (int))
Проверьте пожалуйста, у кого есть время.
Оригинал тут
int1.jpg

int2.jpg
int3_4.jpg
 

Вложения

Последнее редактирование:

AlexeNP

Гуру форума
Я там что-то всё таки намудрил) Вчера перестал запускать терминал.
Описал тут.
Переменную k объявил локально, почти как было, но вероятность, что опять там ошибся остаётся.
И поправил пару предупреждений. (приписал (int))
Проверьте пожалуйста, у кого есть время.
Оригинал тут
строка 157... в чем ее глубинный смысл? и что делает индикатор когда доходит до нее?
 

gravity

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

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

AlexeNP

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

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

AlexeNP

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