Копировать объекты с графика и переместить вставить на другие графики - страница 2

 
Vitalii Petrushynskyi:

Если работать на трех графиках с разными ТФ, то много времени занимает перерисовывание уровней с W1 в D1, за тем перерисовать их на м5. 

А так, действительно нужен автокопировщик графических объектов с одного окна во все остальные, открытые. Идея на скрине.


PS Это одолжен быть  индикатор! а не советник

так отрисуйте на одном - сохраните его в  шаблон, и на одной и той же паре, можно устанавливать с обрисованными линиями   

 
че вы придумываете все новое и новое) это все давно в маркете лежит, поискали бы вначале поиском
 
Andrey Khatimlianskii:
Находим объект в интерисующем нас окне, запоминаем его параметры, создаём такой же в другом окне.
В чём проблема? )

самое быстро сохранить шаблон - загрузить шаблон, если надо то и восстановить на новый шаблон индикаторы и советники. делается не сильно сложно. Только решение с сохранением индикатров и советников не пройдет валидацию для маркета, а так можно сделать

 
Юрий:
Да, я так и делаю, но, согласись, было бы удобнее, например при создании нового графика взять и скопировать выделенные объекты. Метатрейдер этого не может.

для того и придуманы скрипты для автоматизации, функционал позволяет определять выделен объект или нет.

 
Vitalii Petrushynskyi:

Если работать на трех графиках с разными ТФ, то много времени занимает перерисовывание уровней с W1 в D1, за тем перерисовать их на м5. 

А так, действительно нужен автокопировщик графических объектов с одного окна во все остальные, открытые. Идея на скрине.


PS Это одолжен быть  индикатор! а не советник

https://www.mql5.com/ru/articles/4465

 

Огромное спасибо. Это то, что я ищу.


P.S.

Без лишних слов и рассуждений. Кратко и по делу.


P.P.S.

MT5. А у меня MT4. Теперь задача этот код под MT4  адаптировать. Как это сделать с нулевым знанием программирования, ответ очевиден ..

 

Здесь смысл совсем другой, но может пригодиться: 

// Копирование графического объекта
int fObjectCopy(string OldName,string NewName,string Text="Прежний",int Action=0){
   int Error;
   if( OldName==NewName ) Action=2;
   if( ObjectFind(OldName)==0 ){                   // Копирование OldName в NewName
      int      Type     =ObjectType(OldName);
      datetime Time1    =ObjectGet(OldName,OBJPROP_TIME1);
      double   Price1   =ObjectGet(OldName,OBJPROP_PRICE1);
      datetime Time2    =ObjectGet(OldName,OBJPROP_TIME2);
      double   Price2   =ObjectGet(OldName,OBJPROP_PRICE2);
      datetime Time3    =ObjectGet(OldName,OBJPROP_TIME3);
      double   Price3   =ObjectGet(OldName,OBJPROP_PRICE3);
      bool     Фон      =ObjectGet(OldName,OBJPROP_BACK);
      color    Цвет     =ObjectGet(OldName,OBJPROP_COLOR);
      bool     Луч      =ObjectGet(OldName,OBJPROP_RAY);
      int      Стиль    =ObjectGet(OldName,OBJPROP_STYLE);
      int      Видимость=ObjectGet(OldName,OBJPROP_TIMEFRAMES);
      int      Размер   =ObjectGet(OldName,OBJPROP_WIDTH);
      int      Угол     =ObjectGet(OldName,OBJPROP_ANGLE);
      int      Знак     =ObjectGet(OldName,OBJPROP_ARROWCODE);
      if( Text=="Прежний" ) Text=ObjectDescription(OldName);
      if( Action==1 ){                             // Спрятать оригинал
         if( !ObjectSet(OldName,OBJPROP_TIMEFRAMES,EMPTY) ){
            Error=GetLastError();
            if( !РежимОтладки ) PlaySound("alert.wav");
            Print("***** "+OldName+" - ошибка при задании невидимости "+Error);
      }  }
      if( Action==2 ) Error=fObjectDelete(OldName);// Удалить оригинал
      Error=fObjectDelete(NewName);                // Удалить копию
      if( ObjectCreate(NewName,Type,0,Time1,Price1,Time2,Price2,Time3,Price3) ){
         if( !ObjectSetText(NewName,Text)
          || !ObjectSet(NewName,OBJPROP_BACK,Фон)
          || !ObjectSet(NewName,OBJPROP_COLOR,Цвет)
          || !ObjectSet(NewName,OBJPROP_RAY,Луч)
          || !ObjectSet(NewName,OBJPROP_STYLE,Стиль)
          || !ObjectSet(NewName,OBJPROP_TIMEFRAMES,Видимость)
          || !ObjectSet(NewName,OBJPROP_WIDTH,Размер)
          || !ObjectSet(NewName,OBJPROP_ANGLE,Угол)
          || !ObjectSet(NewName,OBJPROP_ARROWCODE,Знак) ){
            Error=GetLastError();
            if( !РежимОтладки ) PlaySound("alert.wav");
            Print("***** "+NewName+" - ошибка модификации параметров "+Error);
      }  }
      else {
         Error=GetLastError();
         if( !РежимОтладки ) PlaySound("alert.wav");
         Print("***** "+OldName+" - Копия "+NewName+" не создана, ошибка "+Error);
   }  }
   else {
      Error=MyError;
      if( РежимОтладки ) Print("*** "+OldName+" - объект для копирования не найден");
   }
   return(Error);
}
//-----------------------------------------------------------------------------
// Копирование HLine в Line
int fHLine2Line(string OldName,string NewName,string Text="Прежний",int Action=0){
   int Error, Type=ObjectType(OldName);
   bool Ray;
   datetime Time0;
   double Price0;
   if( Type!=OBJ_HLINE ){
      Print("***   "+OldName+" недопустимый тип: "+Type);
      return(MyError);
   }
   if( OldName==NewName ) Action=2;
   if( ObjectFind(OldName)==0 ){                   // Копирование OldName в NewName
      double Price1=ObjectGet(OldName,OBJPROP_PRICE1);
      datetime Time1=ObjectGet(OldName,OBJPROP_TIME1);
      if( Time1==Time[LastBar-1] ){
         Time1 =0;
         Price1=0;
      }
      if( Price1<=Zero ){
         Print("***   "+OldName+" не задана цена");
         return(MyError);
      }
      double Price2=ObjectGet(OldName,OBJPROP_PRICE2);
      datetime Time2=ObjectGet(OldName,OBJPROP_TIME2);
      if( Time2==Time[LastBar-1] ){
         Time2 =0;
         Price2=0;
      }
      double Price3=ObjectGet(OldName,OBJPROP_PRICE3);
      datetime Time3=ObjectGet(OldName,OBJPROP_TIME3);
      if( Time3==Time[LastBar-1] ){
         Time3 =0;
         Price3=0;
      }
      if( (MathAbs(Price1-Price2)>Zero && Price2>Zero )
       || (MathAbs(Price1-Price3)>Zero && Price3>Zero ) ){
         Print("***   "+OldName+" цены в точках уровня не совпадают");
         return(MyError);
      }
      if( Price3>Zero ){
         Ray=false;                                // Задан отрезок 2(1)-3
         if( Price2>Zero ){                        // Отрезок 2-3
            Time0 =Time1;
            Price0=Price1;
            Time1 =Time2;                          // Начало отрезка
            Price1=Price2;
         }
         Time2=Time3;                              // Конец отрезка
         Price2=Price3;
         Time3=Time0;                              // Промежуточная точка
         Price3=Price0;
         if( РежимОтладки ) Print("*     "+OldName+" заданы цены отрезка: "
                                 +DoubleToStr(Price1,Digits)+" / "+TimeToStr(Time1)
                                 +" ... "+DoubleToStr(Price3,Digits)+" / "+TimeToStr(Time3)
                                 +" ... "+DoubleToStr(Price2,Digits)+" / "+TimeToStr(Time2));
      }
      else{
         if( Price2>Zero ){
            Ray=true;                              // Задан луч 2-1
            Time0 =Time1;
            Price0=Price1;
            Time1 =Time2;                          // Начало луча
            Price1=Price2;
            Time2 =Time0;                          // Промежуточная точка
            Price2=Price0;
            if( РежимОтладки ) Print("*     "+OldName+" заданы цены луча: "
                                    +DoubleToStr(Price1,Digits)+" / "+TimeToStr(Time1)
                                    +" ... "+DoubleToStr(Price2,Digits)+" / "+TimeToStr(Time2));
         }
         else{                                     // Задан уровень 1
            if( РежимОтладки ) Print("*     "+OldName+" задана только цена уровня: "
                                    +DoubleToStr(Price1,Digits)+" / "+TimeToStr(Time1));
            Error=fObjectCopy(OldName,NewName,Text,Action);
            return(Error);
      }  }
      bool  Фон      =ObjectGet(OldName,OBJPROP_BACK);
      color Цвет     =ObjectGet(OldName,OBJPROP_COLOR);
      int   Стиль    =ObjectGet(OldName,OBJPROP_STYLE);
      int   Видимость=ObjectGet(OldName,OBJPROP_TIMEFRAMES);
      int   Размер   =ObjectGet(OldName,OBJPROP_WIDTH);
      if( Text=="Прежний" ) Text=ObjectDescription(OldName);
      if( Action==1 ){                             // Спрятать оригинал
         if( !ObjectSet(OldName,OBJPROP_TIMEFRAMES,EMPTY) ){
            Error=GetLastError();
            if( !РежимОтладки ) PlaySound("alert.wav");
            Print("***** "+OldName+" - ошибка при задании невидимости "+Error);
      }  }
      if( Action==2 ) Error=fObjectDelete(OldName);// Удалить оригинал
      Error=fObjectDelete(NewName);                // Удалить копию
      if( ObjectCreate(NewName,OBJ_TREND,0,Time1,Price1,Time2,Price2,Time3,Price3) ) {
         if( !ObjectSetText(NewName,Text)
          || !ObjectSet(NewName,OBJPROP_RAY,Ray)
          || !ObjectSet(NewName,OBJPROP_BACK,Фон)
          || !ObjectSet(NewName,OBJPROP_COLOR,Цвет)
          || !ObjectSet(NewName,OBJPROP_STYLE,Стиль)
          || !ObjectSet(NewName,OBJPROP_TIMEFRAMES,Видимость)
          || !ObjectSet(NewName,OBJPROP_WIDTH,Размер) ){
            Error=GetLastError();
            if( !РежимОтладки ) PlaySound("alert.wav");
            Print("***** "+NewName+" - ошибка модификации параметров "+Error);
      }  }
      else{
         Error=GetLastError();
         if( !РежимОтладки ) PlaySound("alert.wav");
         Print("***** "+OldName+" - Копия "+NewName+" не создана, ошибка "+Error);
   }  }
   else{
      Error=MyError;
      Print("***   "+OldName+" - Объект для копирования не найден!");
   }
   return(Error);
}
 
Алексей Тарабанов:

Здесь смысл совсем другой, но может пригодиться: 

А что это? Какой-то фрагмент кода? Как из него получить индикатор? Выложите, пожалуйста, уже скомпилированный файл?

 

Вот скрипт. Использую для копирования объектов с терминала на терминал. С графика на график тоже можно.

Объекты в именах которых есть 'Exception' - копироваться не будут.

Копируются трендовые, вертикальные, горизонталтные линии и фибо сетки.

Объекты которые были на графике - удаляются.

 
Andrey Anisimov:

Вот скрипт. Использую для копирования объектов с терминала на терминал. С графика на график тоже можно.

Объекты в именах которых есть 'Exception' - копироваться не будут.

Практически как ctrl-C если поставить на горячие клавиши. Вот только одно что бы вставить объект, нужно дополнительно переключать на "установить объекты", что усложняет процедуру быстрой вставки. Есть возможность в коде по умолчанию для вставки объектов установить первой функцию "установить объекты"? Тогда будет полноценный аналог ctrl-V.

т.е. на выходе два скрипта GetSetObjects_Copy и GetSetObjects_Paste у каждого своё сочетание горячих клавиш.

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