Помогите пожалуйста с 1 проблемой

 

Добрый день, имеется код(ниже выложу) и по коду у меня возникла сложность
Если коротко как работает индикатор:
При нажатии на кнопку --> строются зоны (зона хай - это минимум свечи М1 + атр; зона лоу - это максимум свечи М1 - атр)
Когда начинается новая свеча зоны тут же строются под новую свечу, а старые удаляются(т.к они под прошлую свечу)

Проблема:
Как в OnChartEvent(если я правильно понял) сделать обновление данных: хай лоу и атр

т.к если индикатор кинуть на график - зоны построются только по данным которые в текущий момент нажатии кнопки

КОД:

#property copyright "Copyright 2017"
#property link      "http://www.ya.ru"
#property version   "1.00"
#property strict
#property indicator_chart_window

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   PutButton("KNOPKA",20,50,"Kropo4ka");
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
  
   if(reason != REASON_CHARTCHANGE && reason != REASON_CLOSE)
     {
   ObjectsDeleteAll(0,0,OBJ_RECTANGLE);
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutRect(string name,datetime t1,double p1,datetime t2,double p2,color clr)
  {
   ObjectDelete(0,name);
//--- создадим прямоугольник по заданным координатам
   ObjectCreate(0,name,OBJ_RECTANGLE,0,t1,p1,t2,p2);
//--- установим цвет прямоугольника
   ObjectSetInteger(0,name,OBJPROP_COLOR,clr);
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| 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(!ObjectGetInteger(0,"KNOPKA",OBJPROP_STATE,false))
           {
                  if(isNewBar(1) == false)
                  {
                  ObjectDelete("ТНмин");
                  ObjectDelete("ТНмин2");
                  ObjectDelete("мин");
                  ObjectDelete("мин2");
                  }
           }
         else
           {
                  if(isNewBar(1) == true)
                  {
                  
                  datetime t2=0;
                  double Hi=0,Lo=0,ATRM=0;
                  t2=iTime(NULL,PERIOD_M1,0);
                  Hi=iHigh(NULL,PERIOD_M1,0);
                  Lo=iLow(NULL,PERIOD_M1,0);
                  ATRM = (NormalizeDouble(iATR(NULL,PERIOD_M1,10,0)/_Point,0));
                  
                  DrawTXT("мин","текст 1",t2,Lo+(ATRM*_Point),Black);
                  DrawTXT("мин2","текст 2",t2,Hi-(ATRM*_Point)/100*90,Black);
                  PutRect("ТНмин",t2+60,Lo+ATRM*_Point,t2,Lo+(ATRM*_Point)/100*90,Black);
                  PutRect("ТНмин2",t2+60,Hi-ATRM*_Point,t2,Hi-(ATRM*_Point)/100*90,Black);  
                  }
           }
         //+Comment(ATRM*_Point);

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
   if(id==CHARTEVENT_OBJECT_CLICK)
     {     
      if(ObjectFind(0,"KNOPKA")==0)
         if(GetState("KNOPKA"))
           {

                  datetime t2=0;
                  double Hi=0,Lo=0,ATRM=0;
                  t2=iTime(NULL,PERIOD_M1,0);
                  Hi=iHigh(NULL,PERIOD_M1,0);
                  Lo=iLow(NULL,PERIOD_M1,0);
                  ATRM = (NormalizeDouble(iATR(NULL,PERIOD_M1,10,0)/_Point,0));
                  
                  DrawTXT("мин","текст 1",t2,Lo+(ATRM*_Point),Black);
                  DrawTXT("мин2","текст 2",t2,Hi-(ATRM*_Point)/100*90,Black);
               PutRect("ТНмин",t2+60,Lo+ATRM*_Point,t2,Lo+(ATRM*_Point)/100*90,Black);
               PutRect("ТНмин2",t2+60,Hi-ATRM*_Point,t2,Hi-(ATRM*_Point)/100*90,Black); 
           }
           else
           {
               ObjectDelete("мин");
               ObjectDelete("мин2");
               ObjectDelete("ТНмин");
               ObjectDelete("ТНмин2");
           }
     }       
  }
  
  
void PutButton(string name,int x,int y,string text)
  {
   ObjectCreate(0,name,OBJ_BUTTON,0,0,0);
//--- установим координаты кнопки
   ObjectSetInteger(0,name,OBJPROP_XDISTANCE,x);
   ObjectSetInteger(0,name,OBJPROP_YDISTANCE,y);
//--- установим размер кнопки
   ObjectSetInteger(0,name,OBJPROP_XSIZE,20);
   ObjectSetInteger(0,name,OBJPROP_YSIZE,30);
//--- установим угол графика, относительно которого будут определяться координаты точки
   ObjectSetInteger(0,name,OBJPROP_CORNER,2);
//--- установим текст
   ObjectSetString(0,name,OBJPROP_TEXT,text);
//--- установим шрифт текста
   ObjectSetString(0,name,OBJPROP_FONT,"Arial");
//--- установим размер шрифта
   ObjectSetInteger(0,name,OBJPROP_FONTSIZE,9);
//--- установим цвет текста
   ObjectSetInteger(0,name,OBJPROP_COLOR,Red);
//--- установим цвет фона
   ObjectSetInteger(0,name,OBJPROP_BGCOLOR,White);
//--- установим цвет границы
   ObjectSetInteger(0,name,OBJPROP_BORDER_COLOR,Blue);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
   ObjectSetInteger(0,name,OBJPROP_HIDDEN,false);
  }  

//+------------------------------------------------------------------+
//| Возвращает true, если появился новый бар для пары символ/период  |
//+------------------------------------------------------------------+
bool isNewBar(int tf)
  {
//--- в статической переменной будем помнить время открытия последнего бара
   static datetime last_time=0;
   
//--- текущее время
   datetime lastbar_time=SeriesInfoInteger(_Symbol,tf,SERIES_LASTBAR_DATE);

//--- если это первый вызов функции
   if(last_time==0)
     {
      //--- установим время и выйдем 
      last_time=lastbar_time;
      return(false);
     }

//--- если время отличается
   if(last_time!=lastbar_time)
     {
      //--- запомним время и вернем true
      last_time=lastbar_time;
      return(true);
     }
//--- дошли до этого места - значит бар не новый, вернем false
   return(false);
  }


//+---------------------Кнопки показа окн----------------------------+
bool GetState(string aName)
  {
   long value=0;
   ObjectGetInteger(0,aName,OBJPROP_STATE,0,value);
   return  (bool)value;
  }
  
void DrawTXT(string name,string text,datetime time,double price,color clr,ENUM_ANCHOR_POINT ANCHOR_=ANCHOR_LEFT_LOWER,int size=8)
  {
      ObjectCreate(0,name,OBJ_TEXT,0,time,price);
      ObjectSetString(0,name,OBJPROP_TEXT,text);
      ObjectSetInteger(0,name,OBJPROP_BACK,true);
      ObjectSetString(0,name,OBJPROP_FONT,"Comic Sans MS");
      ObjectSetInteger(0,name,OBJPROP_FONTSIZE,size);
      ObjectSetInteger(0,name,OBJPROP_ANCHOR,ANCHOR_);
      ObjectSetInteger(0,name,OBJPROP_COLOR,clr);
      ObjectSetInteger(0,name,OBJPROP_SELECTABLE,false);
      ObjectSetInteger(0,name,OBJPROP_SELECTED,false);
      ObjectSetInteger(0,name,OBJPROP_HIDDEN,true);
  }
 
vebster005:

Добрый день, имеется код(ниже выложу) и по коду у меня возникла сложность
Если коротко как работает индикатор:
При нажатии на кнопку --> строются зоны (зона хай - это минимум свечи М1 + атр; зона лоу - это максимум свечи М1 - атр)
Когда начинается новая свеча зоны тут же строются под новую свечу, а старые удаляются(т.к они под прошлую свечу)

Проблема:
Как в OnChartEvent(если я правильно понял) сделать обновление данных: хай лоу и атр

т.к если индикатор кинуть на график - зоны построются только по данным которые в текущий момент нажатии кнопки

КОД:

Два вопроса:

Вот это как читается?

if(!ObjectGetInteger(0,"KNOPKA",OBJPROP_STATE,false))

По моему «если не false» равно «если true» зачем было писать именно так?

Зачем объекты удалять и создавать новые? Разве не проще поменять им координаты?

И после проверки состояния кнопки, «если нажата» то в конце этого блока её обязательно вернуть в исходное положение

ObjectSetInteger(0, "KNOPKA", OBJPROP_STATE, false)
 
Alexey Viktorov:

Два вопроса:

Вот это как читается?

По моему «если не false» равно «если true» зачем было писать именно так?

Зачем объекты удалять и создавать новые? Разве не проще поменять им координаты?

И после проверки состояния кнопки, «если нажата» то в конце этого блока её обязательно вернуть в исходное положение

Спасибо что ответили мне
да, верно... не заметил на счет 

if(!ObjectGetInteger(0,"KNOPKA",OBJPROP_STATE,false))

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

Могли бы вы ответить как менять координаты зон?

 
Стоп стоп, а зачем её переводить в исходное положение? 
Если кнопка нажата - показываются зоны и тут же переводится в не нажатое состояние, зачем так?? или я чего то не понимаю
 
Пожалуйста ответьте как менять координаты?
 
vebster005:
Стоп стоп, а зачем её переводить в исходное положение? 
Если кнопка нажата - показываются зоны и тут же переводится в не нажатое состояние, зачем так?? или я чего то не понимаю

Ну как пружинка работает в кнопке дверного звонка. Нажал — звонит, отпустил — кнопка вернулась в исходное положение. Работает только при изменении положения отжата—>нажата

vebster005:
Пожалуйста ответьте как менять координаты?
Как менять координаты читайте пожалуйста в документации.
 
Alexey Viktorov:

Ну как пружинка работает в кнопке дверного звонка. Нажал — звонит, отпустил — кнопка вернулась в исходное положение. Работает только при изменении положения отжата—>нажата

Как менять координаты читайте пожалуйста в документации.

1) Пожалуйста хотя бы намекните как это сделать
2) В этой документации?:

https://docs.mql4.com/ru/constants/objectconstants/enum_object/obj_rectangle

OBJ_RECTANGLE - Типы объектов - Константы объектов - Константы, перечисления и структуры - Справочник MQL4
OBJ_RECTANGLE - Типы объектов - Константы объектов - Константы, перечисления и структуры - Справочник MQL4
  • docs.mql4.com
Следующий скрипт создает и перемещает на графике прямоугольник. Для создания и изменения свойств графического объекта написаны специальные функции, которые вы можете использовать "как есть" в своих собственных программах. //| Cоздает прямоугольник по заданным координатам                    |               time1=0,           ...
 
vebster005:

1) Пожалуйста хотя бы намекните как это сделать

Вот-же показал

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Помогите пожалуйста с 1 проблемой

Alexey Viktorov, 2020.08.24 08:01

Два вопроса:

Вот это как читается?

if(!ObjectGetInteger(0,"KNOPKA",OBJPROP_STATE,false))

По моему «если не false» равно «если true» зачем было писать именно так?

Зачем объекты удалять и создавать новые? Разве не проще поменять им координаты?

И после проверки состояния кнопки, «если нажата» то в конце этого блока её обязательно вернуть в исходное положение

ObjectSetInteger(0, "KNOPKA", OBJPROP_STATE, false)

 
vebster005:


2) В этой документации?:

Ну я-же не знаю какие у вас объекты. Но по первым выражениям «Следующий скрипт создает и перемещает на графике прямоугольник.» видимо то что надо или очень похожее, если объекты другие.

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