как выставить линию на графике другого таймфрйма

 

ObjectCreate  работает только с текущим графиком, а нужен другой график другого таймфрейма

как вариант

PostMessageA(hwnd, WM_COMMAND, i, 0);

но нужную команду на форуме  не нашел.

команда 33244 - горизонтальная линия --- соотв  не подходит, она просто эмулирует нажатие кнопки

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




 
dav1977:

ObjectCreate  работает только с текущим графиком, а нужен другой график другого таймфрейма

как вариант

PostMessageA(hwnd, WM_COMMAND, i, 0);

но нужную команду на форуме  не нашел.

команда 33244 - горизонтальная линия --- соотв  не подходит, она просто эмулирует нажатие кнопки

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




ObjectCreate работает с другими графиками:

bool  ObjectCreate(
   long          chart_id,      // идентификатор графика
   string        object_name,   // имя объекта
   ENUM_OBJECT   object_type,   // тип объекта
   int           sub_window,    // индекс окна
   datetime      time1,         // время первой точки привязки
   double        price1,        // цена первой точки привязки
   ...
   datetime      timeN=0,       // время N-точки привязки
   double        priceN=0       // цена N-точки привязки
   );

 

какая то путаница получается

в   ObjectSet  не указывать что-ли идентификатор

в документации такие тонкости н указаны

// установка флага видимости объекта. Объект будет отрисован только на 15-минутном и 1-часовом периодах графика
  ObjectSet("MyObject"OBJPROP_TIMEFRAMESOBJ_PERIOD_M15 | OBJ_PERIOD_H1);


только  надо дополнить  как брать chart_id,      // идентификатор графика  

chart_id = WindowHandle (_Symbol, PERIOD_M5);


 Разработчики учитесь писать документацию нормально



 
dav1977:

 Разработчики учитесь писать документацию нормально


Учитесь читать документацию.

MQL4 был изменён, и синтаксис стал, как у MQL5. Для установки свойств объекта на чужом графике используйте функции ObjectSetDouble, ObjectSetInteger, ObjectSetString

 
dav1977:

какая то путаница получается

в   ObjectSet  не указывать что-ли идентификатор

в документации такие тонкости н указаны

// установка флага видимости объекта. Объект будет отрисован только на 15-минутном и 1-часовом периодах графика
  ObjectSet("MyObject"OBJPROP_TIMEFRAMESOBJ_PERIOD_M15 | OBJ_PERIOD_H1);


только  надо дополнить  как брать chart_id,      // идентификатор графика  

chart_id = WindowHandle (_Symbol, PERIOD_M5);


 Разработчики учитесь писать документацию нормально

Рисует в первом графике, в главном окне, с любого другого:

void OnStart()
  {
   long ch=ChartFirst();
    if(!ObjectCreate(ch,"rr1",OBJ_VLINE,0,Time[0],Open[0])) Print("Err. obj. create - ",GetLastError());
  }
 

сделал так,  сканирую как в примере документации и рисую

И ВСЕ РАВНО НЕ РИСУТ!!

потом понял, что если кликнуть мышью по окну М30 то линия появляется

получается надо еще как-то обновить окно программно???

long currChart,prevChart=ChartFirst();
   int i=0,limit=100;
   Print("ChartFirst = ",ChartSymbol(prevChart),"               ID = ",prevChart);
   while(i<limit)// у нас наверняка не больше 100 открытых графиков
     {
      currChart=ChartNext(prevChart); // на основании предыдущего получим новый график
      if(currChart<0) break;          // достигли конца списка графиков
      
      if (_Symbol==ChartSymbol(currChart)) {
            Print("i=",i,"     period=",ChartPeriod(currChart),"  ID =",currChart);
            if (ChartPeriod(currChart) == 15)  descriptM15=currChart;
            if (ChartPeriod(currChart) == 30)  descriptM30=currChart;
            if (ChartPeriod(currChart) == 240)  descriptH4=currChart;
                                       }
      prevChart=currChart;// запомним идентификатор текущего графика для ChartNext()
      i++;// не забудем увеличить счетчик
     }




//========= И РИСУЮ  ==========

    if(!ObjectCreate(descriptM30,"SLgrafM30",OBJ_HLINE,0,0,  price)) 
           Print("Err. obj. create - ",GetLastError());
           else {Print ("М30 создан ok ");}
   
      ObjectSet("SLgrafM30", OBJPROP_PRICE1,  price );
     ObjectSet("SLgrafM30", OBJPROP_PRICE2,  price );

 ObjectSet("SLgrafM30", OBJPROP_TIMEFRAMES, OBJ_PERIOD_M15 | OBJ_PERIOD_M30);
  ObjectSet("SLgrafM30", OBJPROP_STYLE, STYLE_DASH);  
  ObjectSet("SLgrafM30", OBJPROP_COLOR, Red ); 



 
dav1977:

получается надо еще как-то обновить окно программно??

Используйте ChartRedraw после выполнения графических построений.
 

попробовал в иницилизации советника удалить уже нарисованные линии с именами SLgrafM30 и SLgrafM15

 ObjectDelete("SLgrafM30");
 ObjectDelete("SLgrafM15");

 Sleep(1000);          
 ChartRedraw(descriptM30);
 ChartRedraw(descriptM15);
 Sleep(1000);  

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


все хорошо работает только на локальном графику

на других графиках с построениями какие то проблемы

или я не знаю каких-то тонкостей

 
dav1977:

попробовал в иницилизации советника удалить уже нарисованные линии с именами SLgrafM30 и SLgrafM15

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


все хорошо работает только на локальном графику

на других графиках с построениями какие то проблемы

или я не знаю каких-то тонкостей

У ObjectDelete также есть перегруженная версия с идентификатором графика. Вы же используете перегрузку функции, которая работает только с локальным графиком (нет chartID).