Помогите найти причину неправильной работы индикатора

 

Добрый ночи, добавил кнопку отображения Label, но по нажатию на кнопку -  LABEL прерывисто возвращается к цене. Без кнопки прерывистости нету
ТЫК

БЕЗ КНОПКИ (оригинал)

//+------------------------------------------------------------------+
//|                                              Copyright 2020, ЕЕЕ |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, EEE"
#property link      "http://www.ya.ru"
#property version   "1.00" 
#property strict
#property indicator_chart_window

int OnInit(void)
{
   return(INIT_SUCCEEDED);
}

void OnDeinit(const int reason)
{
   ObjectDelete(0, "Sample");
}

/****************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[])
 {
  int x, y;
  ChartTimePriceToXY(ChartID(), 0, TimeCurrent(), SymbolInfoDouble(_Symbol, SYMBOL_BID), x, y);
  ShowLable("00", 10, y, DoubleToString(SymbolInfoDouble(_Symbol, SYMBOL_BID), _Digits), CORNER_RIGHT_UPPER, ANCHOR_RIGHT_LOWER);
  return(rates_total);
 }/*******************************************************************/

/********************************************************************/
void OnChartEvent(const int id,         // идентификатор события
                  const long& lparam,   // параметр события типа long
                  const double& dparam, // параметр события типа double
                  const string& sparam  // параметр события типа string
                 )
 {
  int x, y;
  ChartTimePriceToXY(ChartID(), 0, TimeCurrent(), SymbolInfoDouble(_Symbol, SYMBOL_BID), x, y);
  if(id == CHARTEVENT_CHART_CHANGE)
   {
    ShowLable("00", 10, y, DoubleToString(SymbolInfoDouble(_Symbol, SYMBOL_BID), _Digits), CORNER_RIGHT_UPPER, ANCHOR_RIGHT_LOWER);
    ChartRedraw();
   }
 }/*******************************************************************/
 
 
 

/*********************************************************************/
void ShowLable(string name, int X, int Y, string text, ENUM_BASE_CORNER corner, ENUM_ANCHOR_POINT anchor)
 {
  if(ObjectFind(0, name) < 0)
   {
    ObjectCreate(0, name, OBJ_LABEL, 0, 0, 0);
    ObjectSetInteger(0, name, OBJPROP_COLOR, clrTeal);
    ObjectSetInteger(0, name, OBJPROP_CORNER, corner);
    ObjectSetInteger(0, name, OBJPROP_ANCHOR, anchor);
    ObjectSetInteger(0, name, OBJPROP_BACK, false);
    ObjectSetInteger(0, name, OBJPROP_HIDDEN, false);
    ObjectSetInteger(0, name, OBJPROP_SELECTABLE, true);
    //ObjectSetInteger(0, name, OBJPROP_SELECTED, true);
   }
  ObjectSetInteger(0, name, OBJPROP_XDISTANCE, X);
  ObjectSetInteger(0, name, OBJPROP_YDISTANCE, Y);
  ObjectSetString(0, name, OBJPROP_TEXT, text);
 }/*******************************************************************/
//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
//| Отображение объекта "Текст"                                                                                                                                                                       |
//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
void ShowText(string name, datetime time, double price, string text, string toolTip, color clr, ENUM_ANCHOR_POINT anchor)
{
   if (ObjectFind(0, name) < 0)
   {
      ObjectCreate(0, name, OBJ_TEXT, 0, time, price);
      ObjectSetString(0, name, OBJPROP_FONT, "Tahoma");
      ObjectSetInteger(0, name, OBJPROP_FONTSIZE, 10);
      ObjectSetString(0, name, OBJPROP_TEXT, text); 
      ObjectSetString(0, name, OBJPROP_TOOLTIP, toolTip);
      ObjectSetInteger(0, name, OBJPROP_COLOR, clr);
      ObjectSetInteger(0, name, OBJPROP_ANCHOR, anchor);
      ObjectSetInteger(0, name, OBJPROP_BACK, false);
      ObjectSetInteger(0, name, OBJPROP_HIDDEN, true);
      ObjectSetInteger(0, name, OBJPROP_SELECTABLE, false);
      return;
   }
   
   ObjectMove(0, name, 0, time, price);
   ObjectSetInteger(0, name, OBJPROP_COLOR, clr);
   ObjectSetString(0, name, OBJPROP_TEXT, text); 
}

С КНОПКОЙ

//+------------------------------------------------------------------+
//|                                              Copyright 2020, ЕЕЕ |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, EEE"
#property link      "http://www.ya.ru"
#property version   "1.00"
#property strict
#property indicator_chart_window

int sp; // переменная кнопки для сохранения положения

int OnInit(void)
{
   PutButton("BUTON",33,33,"BUTON", false); // создадим кнопку
   return(INIT_SUCCEEDED);
}

void OnDeinit(const int reason)
{
   ObjectDelete(0, "Sample");
}

/****************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[])
 {
  int x, y;
  ChartTimePriceToXY(ChartID(), 0, TimeCurrent(), SymbolInfoDouble(_Symbol, SYMBOL_BID), x, y);
  
   if (sp) {
      ShowLable("00", 10, y, DoubleToString(SymbolInfoDouble(_Symbol, SYMBOL_BID), _Digits), CORNER_RIGHT_UPPER, ANCHOR_RIGHT_LOWER);
   }
 

  return(rates_total);
 }/*******************************************************************/

/********************************************************************/
void OnChartEvent(const int id,         // идентификатор события
                  const long& lparam,   // параметр события типа long
                  const double& dparam, // параметр события типа double
                  const string& sparam  // параметр события типа string
                 )
 {
  int x, y;
  ChartTimePriceToXY(ChartID(), 0, TimeCurrent(), SymbolInfoDouble(_Symbol, SYMBOL_BID), x, y);
  
  
   if (id == CHARTEVENT_OBJECT_CLICK && CHARTEVENT_CHART_CHANGE) {
         if (sparam == "BUTON") {
                  if(ObjectGetInteger(0,"BUTON",OBJPROP_STATE)==true) {
                  ShowLable("00", 10, y, DoubleToString(SymbolInfoDouble(_Symbol, SYMBOL_BID), _Digits), CORNER_RIGHT_UPPER, ANCHOR_RIGHT_LOWER);
                  ChartRedraw();
                  sp = 1;
               }
               else
               {
                  ObjectDelete("00");
                  sp = 0;
               }
         }   
   }
   
   
// Так тоже не правильно работает
/*  
   if (id == CHARTEVENT_OBJECT_CLICK) {
         if (sparam == "BUTON") {
                  if(ObjectGetInteger(0,"BUTON",OBJPROP_STATE)==true) {
                  sp = 1;
               }
               else
               {
                  sp = 0;
               }
         }   
   }

   if (sp && id ==  CHARTEVENT_CHART_CHANGE) {
         if (sparam == "BUTON") {
                  if(ObjectGetInteger(0,"BUTON",OBJPROP_STATE)==true) {
                  ShowLable("00", 10, y, DoubleToString(SymbolInfoDouble(_Symbol, SYMBOL_BID), _Digits), CORNER_RIGHT_UPPER, ANCHOR_RIGHT_LOWER);
                  ChartRedraw();
               }
               else
               {
                  ObjectDelete("00");
               }
         }   
   }
*/

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

/*********************************************************************/
void ShowLable(string name, int X, int Y, string text, ENUM_BASE_CORNER corner, ENUM_ANCHOR_POINT anchor)
 {
  if(ObjectFind(0, name) < 0)
   {
    ObjectCreate(0, name, OBJ_LABEL, 0, 0, 0);
    ObjectSetInteger(0, name, OBJPROP_COLOR, clrTeal);
    ObjectSetInteger(0, name, OBJPROP_CORNER, corner);
    ObjectSetInteger(0, name, OBJPROP_ANCHOR, anchor);
    ObjectSetInteger(0, name, OBJPROP_BACK, false);
    ObjectSetInteger(0, name, OBJPROP_HIDDEN, false);
    ObjectSetInteger(0, name, OBJPROP_SELECTABLE, true);
    //ObjectSetInteger(0, name, OBJPROP_SELECTED, true);
   }
  ObjectSetInteger(0, name, OBJPROP_XDISTANCE, X);
  ObjectSetInteger(0, name, OBJPROP_YDISTANCE, Y);
  ObjectSetString(0, name, OBJPROP_TEXT, text);
 }/*******************************************************************/
//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
//| Отображение объекта "Текст"                                                                                                                                                                       |
//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
void ShowText(string name, datetime time, double price, string text, string toolTip, color clr, ENUM_ANCHOR_POINT anchor)
{
   if (ObjectFind(0, name) < 0)
   {
      ObjectCreate(0, name, OBJ_TEXT, 0, time, price);
      ObjectSetString(0, name, OBJPROP_FONT, "Tahoma");
      ObjectSetInteger(0, name, OBJPROP_FONTSIZE, 10);
      ObjectSetString(0, name, OBJPROP_TEXT, text); 
      ObjectSetString(0, name, OBJPROP_TOOLTIP, toolTip);
      ObjectSetInteger(0, name, OBJPROP_COLOR, clr);
      ObjectSetInteger(0, name, OBJPROP_ANCHOR, anchor);
      ObjectSetInteger(0, name, OBJPROP_BACK, false);
      ObjectSetInteger(0, name, OBJPROP_HIDDEN, true);
      ObjectSetInteger(0, name, OBJPROP_SELECTABLE, false);
      return;
   }
   
   ObjectMove(0, name, 0, time, price);
   ObjectSetInteger(0, name, OBJPROP_COLOR, clr);
   ObjectSetString(0, name, OBJPROP_TEXT, text); 
}


void PutButton(string name,int xx,int yy,string text,bool state)
  {
   ObjectCreate(0,name,OBJ_BUTTON,0,0,0);
//--- установим координаты кнопки
   ObjectSetInteger(0,name,OBJPROP_XDISTANCE,xx);
   ObjectSetInteger(0,name,OBJPROP_YDISTANCE,yy);
//--- установим размер кнопки
   ObjectSetInteger(0,name,OBJPROP_XSIZE,80);
   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,12);
//--- установим цвет текста
   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,0);
   ObjectSetInteger(0,name,OBJPROP_STATE,state); 
  }
Как вывести число справа от текущей цены - Спасибо, что потратили на меня время.
Как вывести число справа от текущей цены - Спасибо, что потратили на меня время.
  • 2020.02.10
  • www.mql5.com
Просто внимательно вникните в код и найдете решение проблемы самостоятельно. Спасибо подскажите почему если не запустить индикатор и свернуть его и через некоторое время опять развернуть то число пропадает. но как только пошевелить график влево-вправо то оно снова появится
 
Разобрался
Причина обращения: