А как сделать индикатор диапазона окна? - страница 2

 
Если сделать индикатором, то у меня тоже виснит и надо перезапускать терминал. А если сделать скриптом и прицеплять скрипт на график, то все нормально. Правда в первый момент после присоединения скрипта терминал тоже зависает на несколько секунд, но потом работает нормально. При отсоединении скрипта тоже задержка происходит.


Спасибо! Я об этом не подумал. Действительно, в виде скрипта все работает, как надо :-)
Однако, посмотрел по загрузке процессора, она повыше, чем при работе со стандартными индикаторами. А ведь еще не проверял при поступлении котировок, как процессор будет загружаться. А если еще одновременно на экране открыто 6-9 окон с торговыми инструментами, и в каждом выполняется скрипт в реал-тайм при поступлении котировок, тогда что будет? Если постоянная загрузка процессора на 50% и более от его мощности, тогда не очень то хочется пользоваться скриптом.

Размер шрифтов и цвета я смог отрегулировать по своему усмотрению, а вот как передвинуть место расположения надписи? В ObjectCreate есть тип OBJ_LABEL, но вот изменить место надписи на экране не понял как (крестьяне мы, не понимаем :-)) А то если окошко с графиком меньше, то не видно надписи. Оптимально было бы сделать ее чуть ниже названия символа OHLC.
 
1.В индикаторах не допускается зацикливание.
2. В индикаторах не работает Sleep().
При нарушении этих правил МТ зависает.
 
Кстати, я думаю, что от такой надписи Range в пунктах пользы намного больше, нежели от указания OHLC.

Допустим, в стадарте вместо надписи

"GBPUSD, M5 1.7681 1.7681 1.7670 1.7672"

была бы надпись

"GBPUSD, M5 141 points" - то, что нужно! :-))
 
1.В индикаторах не допускается зацикливание.
2. В индикаторах не работает Sleep().
При нарушении этих правил МТ зависает.


Какие коварные МетаКвотесы! Все предусмотрели... ;-)
 
А еще проблема - в одном и том же окне при переключении таймфрейма выскакивает окошко -
"Вы действительно хотите удалить скрипт ScreenAmplitude?"

Не хочу! - таймфрейм не переключается...
Хочу! - скрипт удаляется...

Просто безобразие! ;-)
 
Как сделать чтобы скрипт сам устанавливал надпись куда надо не знаю (не получается никак). Её можно вручную перетащить - щелкнуть на ней мышкой, она выделится и перетащить ее. Остальные проблемы наверно нерешаемы. Насчет загрузки процессора у меня тоже возникает сомнение как с этим и со всеми остальными индикаторами работать. Остается только пользоваться индикатором без зацикливания и ждать тика.
 
Realjin, спасибо за индикатор! :-))
 
Как сделать чтобы скрипт сам устанавливал надпись куда надо не знаю (не получается никак)

ObjectSet( _LabelName, OBJPROP_XDISTANCE, _LabelXDistance );
ObjectSet( _LabelName, OBJPROP_YDISTANCE, _LabelYDistance );


Остальные проблемы наверно нерешаемы.
Надо сделать в виде эксперта и проблем не будет ;)
 
komposter, спасибо!

Надпись передвинул куда нужно. Будет работать у меня в качестве индикатора - и на всех таймфреймах видно, и процессор не грузится. А обновляться пусть будет при новом тике :-))

Всем еще раз спасибо!

Кому нужно, вот текст исправленного индикатора (здесь белый цвет, если что, поменяйте в коде на нужный):

#property copyright "RealJin"
#property link      "much-love@yandex.ru"
#property indicator_chart_window
int deinit()
  {
   ObjectDelete("Window_Range_Label");
   return(0);
  }
int start()
  {      
      int First_Visible_Index=Bars-FirstVisibleBar()-2;
      int Last_Visible_Index=First_Visible_Index-BarsPerWindow()+1;
      if(Last_Visible_Index<0)Last_Visible_Index=0;
      double wr=(High[Highest(NULL,0,MODE_HIGH,First_Visible_Index-Last_Visible_Index+1,Last_Visible_Index)]-Low[Lowest(NULL,0,MODE_LOW,First_Visible_Index-Last_Visible_Index+1,Last_Visible_Index)])/Point;
      if(ObjectFind("Window_Range_Label")!=0){
         ObjectCreate("Window_Range_Label",OBJ_LABEL,0,0,0);
      }
      ObjectSet("Window_Range_Label", OBJPROP_XDISTANCE,10);
      ObjectSet("Window_Range_Label", OBJPROP_YDISTANCE,20);
      ObjectSetText("Window_Range_Label",DoubleToStr(wr,0)+ " points",10,"Arial",White); 
   return(0);
  }
 
komposter правильно сказал - лучше всего делать как эксперт. Немного подправил код, работает на всех таймфреймах, не зависит от тиков, не тормозит, процессор не грузит. Прицеплять как советник:
int init()
{
start();
return(0);
}

int deinit()
{
ObjectDelete("s_Window_Range_Label");
return(0);
}

int start()
{
while(!IsStopped())
  {
  RefreshRates();    
  int Bars_Visible=BarsPerWindow();
  int Last_Visible_Index=FirstVisibleBar()-BarsPerWindow()+1;
  if(Last_Visible_Index<0)Last_Visible_Index=0;
  double wr=(High[Highest(NULL,0,MODE_HIGH,Bars_Visible,Last_Visible_Index)]-Low[Lowest(NULL,0,MODE_LOW,Bars_Visible,Last_Visible_Index)])/Point;
  if(ObjectFind("s_Window_Range_Label")!=0)
    {
    ObjectCreate("s_Window_Range_Label",OBJ_LABEL,0,0,0);
    ObjectSet("s_Window_Range_Label",OBJPROP_XDISTANCE,3);
    ObjectSet("s_Window_Range_Label",OBJPROP_YDISTANCE,15);
    }
  ObjectSetText("s_Window_Range_Label","Range: "+DoubleToStr(wr,0)+ " Points",16,"Arial",Yellow); 
  Sleep(500);
  }
return(0);
}


Сразу не проверил чужой код, еще и в расчетах ошибка была. Неправильные значения какие-то выдавались. Исправил.

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