Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Знаете ли вы, что MQL5 способен создавать собственные графические инструменты?
khorosh
8176
khorosh 2016.02.29 22:51 
//+------------------------------------------------------------------+
//|                                                   TestSubstr.mq4 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
 {
//---
  ENUM_LINE_STYLE InpStyle=STYLE_DASH; // Стиль линии 
  int             InpWidth=1;          // Толщина линии 
  bool            InpBack=false;       // Линия на заднем плане 
  bool            InpSelection=false;  // Выделить для перемещений 
  bool            InpHidden=false;     // Скрыт в списке объектов 
  long            InpZOrder=0;         // Приоритет на нажатие мышью 
  int BarEnd = 120;
  double priceMidLevel = Bid;
  double priceUpLevel  = Bid + 500*Point;
  
  if(!HLineCreate(0,"Level_Mid_"+IntegerToString(BarEnd,4,' '),0,priceMidLevel,Yellow,InpStyle,InpWidth,InpBack, 
     InpSelection,InpHidden,InpZOrder)) 
    { 
     Alert("Не удалось создать горизонталь Mid, ошибка ",GetLastError()); 
    }
  if(!HLineCreate(0,"Level_Up_"+IntegerToString(BarEnd,4,' '),0,priceUpLevel,Red,InpStyle,InpWidth,InpBack, 
     InpSelection,InpHidden,InpZOrder)) 
    { 
     Alert("Не удалось создать горизонталь Up, ошибка ",GetLastError()); 
    }       
  Sleep(3000);
  DeleteObj("Level_");      
 }
//+------------------------------------------------------------------+ 
//| Создает горизонтальную линию                                     | 
//+------------------------------------------------------------------+ 
bool HLineCreate(const long            chart_ID=0,        // ID графика 
                 const string          name="HLine",      // имя линии 
                 const int             sub_window=0,      // номер подокна 
                 double                price=0,           // цена линии 
                 const color           clr=clrRed,        // цвет линии 
                 const ENUM_LINE_STYLE style=STYLE_SOLID, // стиль линии 
                 const int             width=1,           // толщина линии 
                 const bool            back=false,        // на заднем плане 
                 const bool            selection=true,    // выделить для перемещений 
                 const bool            hidden=true,       // скрыт в списке объектов 
                 const long            z_order=0)         // приоритет на нажатие мышью 
 { 
//--- если цена не задана, то установим ее на уровне текущей цены Bid 
   if(!price) 
      price=SymbolInfoDouble(Symbol(),SYMBOL_BID); 
//--- сбросим значение ошибки 
   ResetLastError(); 
//--- создадим горизонтальную линию 
   if(!ObjectCreate(chart_ID,name,OBJ_HLINE,sub_window,0,price)) 
     { 
      Print(__FUNCTION__, 
            ": не удалось создать горизонтальную линию! Код ошибки = ",GetLastError()); 
      return(false); 
     } 
//--- установим цвет линии 
   ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr); 
//--- установим стиль отображения линии 
   ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style); 
//--- установим толщину линии 
   ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width); 
//--- отобразим на переднем (false) или заднем (true) плане 
   ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back); 
//--- включим (true) или отключим (false) режим перемещения линии мышью 
//--- при создании графического объекта функцией ObjectCreate, по умолчанию объект 
//--- нельзя выделить и перемещать. Внутри же этого метода параметр selection 
//--- по умолчанию равен true, что позволяет выделять и перемещать этот объект 
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection); 
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection); 
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов 
   ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden); 
//--- установим приоритет на получение события нажатия мыши на графике 
   ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order); 
//--- успешное выполнение 
   return(true); 
  }
//=======================================================================================

void DeleteObj(string text)
 {
  string name = "";
  string substr = "";
  int obj_total=ObjectsTotal();
  //--- сбросим значение ошибки 
  ResetLastError(); 
  for(int i=0;i<obj_total;i++) 
   { 
    name=ObjectName(i);
    substr = StringSubstr(name, 0, 6);
    if(substr==text) 
      {
       if(!ObjectDelete(name))
         {
          Print("Ошибка удаления объекта ", GetLastError());
         }
      }    
   } 
 }

Сделал функцию для удаления группы объектов имеющих несколько одинаковых символов в начале имени. Решил протестировать. В скрипте создаю 2 горизонтальные линии , паузу, чтобы было визуально видно, что линии созданы, а затем их удаление. Но почему-то удаляется только одна линия. Помогите найти ошибку. Вроде код простой и всё на виду однако ж...)

Vitaly Muzichenko
3267
Vitaly Muzichenko 2016.02.29 23:02  
khorosh:

Сделал функцию для удаления группы объектов имеющих несколько одинаковых символов в начале имени. Решил протестировать. В скрипте создаю 2 горизонтальные линии , паузу, чтобы было визуально видно, что линии созданы, а затем их удаление. Но почему-то удаляется только одна линия. Помогите найти ошибку. Вроде код простой и всё на виду однако ж...)

Покажите код удаления

Такая конструкция удаляет всё

string _prefix="lsc_";
  for(int k=ObjectsTotal()-1; k>=0; k--) {
   if(StringSubstr(ObjectName(k),0,4)==_prefix) { // 4 символа в префиксе
     ObjectDelete(ObjectName(k));
   }
  }

Удаляйте с конца, а не с начала:  for(int i=0;i<obj_total;i++

 

P.S.

Можно использовать так, это лучше

// Функция удаляет объект по префиксу
void DeleteObj() {
 for(int k=ObjectsTotal()-1; k>=0; k--) {
  if(StringSubstr(ObjectName(k),0,4)==_prefix) {
    Obj_Delete(ObjectName(k));
  }
 }
}

// Функция удаляет объект по имени
void Obj_Delete(string txt) {
  if(ObjectFind(0,txt)!=-1) {
    ObjectDelete(0,txt);
  }
}
khorosh
8176
khorosh 2016.02.29 23:13  
Vitaly Muzichenko:

Покажите код удаления

Такая конструкция удаляет всё

Вставил код. Что-то с первого раза не вставляется. А я и не знал, что это префикс называется.) Пробовал и с конца и с начала. Удаление с начала взял из примера в документации.
khorosh
8176
khorosh 2016.02.29 23:33  
Vitaly Muzichenko:


Покажите код удаления

Такая конструкция удаляет всё

Удаляйте с конца, а не с начала:  for(int i=0;i<obj_total;i++

 

P.S.

Можно использовать так, это лучше

Так действительно работает, а я когда проверял с конца здесь for(int k=ObjectsTotal()-1; k>=0; k--) вместо > по запарке < поставил. Поэтому тоже не работало, думал, что причина в чём то другом. А зачем же они в документации неправильные примеры дают. Я с ордерами то знал этот нюанс. Ну подумал, здесь объекты может здесь можно и с начала, тем более пример в документации.

Спасибо. 

Alexandr Gavrilin
29652
Alexandr Gavrilin 2016.03.01 05:12  
void DeleteAll(string sfind="")
     {
      string del[];
      string spattern=spfx;

      if(sfind!="") spattern=sfind;

      int i;
      ArrayResize(del,ObjectsTotal());

      for(i=ObjectsTotal()-1;i>=0;i--) del[i]=ObjectName(i);
      for(i=0;i<ArraySize(del);i++)
        {
         if(del[i]!="" && (StringFind(del[i],spattern,0)>=0 || spattern==""))
           {
            ObjectDelete(del[i]);
           }
        }
     }
как вариант еще можете так удалять.
Alexander Puzanov
29237
Alexander Puzanov 2016.03.01 06:31  
khorosh:

Сделал функцию для удаления группы объектов имеющих несколько одинаковых символов в начале имени

И в MQL4 и в MQL5 есть штатная функция удаления объектов с фильтром по префиксу ObjectDeleteAll - зачем вам самописка?
Dmitry Fedoseev
42643
Dmitry Fedoseev 2016.03.01 13:59  
Alexander Puzanov:
И в MQL4 и в MQL5 есть штатная функция удаления объектов с фильтром по префиксу ObjectDeleteAll - зачем вам самописка?
А вы вдруг с луны свалились? Нужна для того, чтобы удалять только свои объекты и не удалять созданные другими индикаторами и экспертами. Это 580 работ в job'e.
Dmitry Fedoseev
42643
Dmitry Fedoseev 2016.03.01 14:00  
Alexandr Gavrilin:
как вариант еще можете так удалять.
Вот меня бы сейчас человек 10 пиннало за такой код. 
Alexander Puzanov
29237
Alexander Puzanov 2016.03.01 17:19  
Dmitry Fedoseev:
А вы вдруг с луны свалились? Нужна для того, чтобы удалять только свои объекты и не удалять созданные другими индикаторами и экспертами. Это 580 работ в job'e.

Вы слезьте с луны своей, може и работ прибавится

"чтобы удалять только свои объекты и не удалять созданные другими индикаторами и экспертами" делайте так:

string gs_Prefix = "Мои_объекты";

...

ObjectsDeleteAll(0, gs_Prefix);

Сходите таки по ссылке. Если конечно лунное там или собственное сияние справку читать не мешает :)

Dmitry Fedoseev
42643
Dmitry Fedoseev 2016.03.01 17:53  
Alexander Puzanov:

Вы слезьте с луны своей, може и работ прибавится

"чтобы удалять только свои объекты и не удалять созданные другими индикаторами и экспертами" делайте так:

Сходите таки по ссылке. Если конечно лунное там или собственное сияние справку читать не мешает :)

Когда появился этот вариант функции знаешь?
Alexander Puzanov
29237
Alexander Puzanov 2016.03.01 18:32  
Dmitry Fedoseev:
Когда появился этот вариант функции знаешь?
https://www.mql5.com/ru/forum/59943 
Новая версия платформы MetaTrader 4 build 840: Улучшения и исправления
Новая версия платформы MetaTrader 4 build 840: Улучшения и исправления
  • www.mql5.com
MQL4: Исправлена генерация события CHARTEVENT_OBJECT_CREATE при создании графического объекта копированием. - - Категория: общее обсуждение
/ /12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий