Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 1091

 

Просьба подсказать, как рисовать горизонтальную линию по цене открытия бара в 07:00.

Написал такой код, но линия почему-то не рисуется.  Где ошибка?

extern string StartTime = "07:00";          //Начальное время для анализа, 00:00 EST
extern string AlTime = "18:55";          //Время для трейдинга
extern string EndTime   = "20:00";          //Время экспирации
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {       
   ObjectCreate(ChartID(),"CORDON",OBJ_HLINE,0,0,Ask);        //созд гор линию по цене Ask
   
   ObjectSetInteger(ChartID(),"CORDON",OBJPROP_COLOR,clrDarkBlue);  //цвет темно-сиий
      
   ObjectSetInteger(ChartID(),"CORDON",OBJPROP_WIDTH,1);  //толщина линии 1
      
   ObjectSetInteger(ChartID(),"CORDON",OBJPROP_STYLE,STYLE_SOLID);  //линия сплош
   
   int IndexOfBar = iBarShift(ChartID(),PERIOD_H1, StringToTime(StartTime), true); //Считаем индекс бара по заданному времени StartTime
   double StartPrice = Open[IndexOfBar];                    //Получаем цену по индексу
   
   ObjectMove(ChartID(),"CORDON", 0, 0, StartPrice);          // меняем распол линии   
   return(0);
   }
[Удален]  
RichLux:

Просьба подсказать, как рисовать горизонтальную линию по цене открытия бара в 07:00.

Написал такой код, но линия почему-то не рисуется.  Где ошибка?

Если убрать ObjectMove линию видно? Попробуйте Alert(StartPrice);
 
LRA:
Если убрать ObjectMove линию видно? Попробуйте Alert(StartPrice);

Если убрать ObjectMove линии не видно, а вот если в строке "double StartPrice = Open[IndexOfBar];" вместо "IndexOfBar" написать числовое значение, например "double StartPrice = Open[5];" то рисует линию по цене открытия пятого бара.

За идею с Алертом спасибо - он показывает значение "0". 

Кстати линия есть и в списке объектов, со значением 0. 

 
RichLux:

Просьба подсказать, как рисовать горизонтальную линию по цене открытия бара в 07:00.

Написал такой код, но линия почему-то не рисуется.  Где ошибка? 

Нельзя в ините рисовать и вычисления производить, это грубая ошибка. Инит должен завершать работу как можно быстрее.

Ошибка тут - int IndexOfBar = iBarShift(ChartID() _Symbol ,PERIOD_H1, StringToTime(StartTime), true); //Считаем индекс бара по заданному времени StartTime

Время можно задавать сразу в формате datetime, не надо машинное время терять на преобразование, вот так работает:

#property strict
#property show_inputs

extern datetime StartTime = D'07:00';          //Начальное время для анализа, 00:00 EST
extern datetime AlTime = D'18:55';          //Время для трейдинга
extern datetime EndTime   = D'20:00';          //Время экспирации
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart()
{       
   ObjectCreate(0,"CORDON",OBJ_HLINE,0,0,Ask);        //созд гор линию по цене Ask
   
   ObjectSetInteger(0,"CORDON",OBJPROP_COLOR,clrDarkBlue);  //цвет темно-сиий
      
   ObjectSetInteger(0,"CORDON",OBJPROP_WIDTH,1);  //толщина линии 1
      
   ObjectSetInteger(0,"CORDON",OBJPROP_STYLE,STYLE_SOLID);  //линия сплош
   
   int IndexOfBar = iBarShift(_Symbol,0, StartTime, false); //Считаем индекс бара по заданному времени StartTime
   double StartPrice = Open[IndexOfBar];                    //Получаем цену по индексу
   Print(IndexOfBar,", ",StartPrice);
   ObjectMove(0,"CORDON", 0, 0, StartPrice);          // меняем распол линии   
}
   
 
evillive:

Нельзя в ините рисовать и вычисления производить, это грубая ошибка. Инит должен завершать работу как можно быстрее.

Ошибка тут - int IndexOfBar = iBarShift(ChartID() _Symbol ,PERIOD_H1, StringToTime(StartTime), true); //Считаем индекс бара по заданному времени StartTime

Время можно задавать сразу в формате datetime, не надо машинное время терять на преобразование, вот так работает:

 

 Спасибо за ценные для меня советы.

И отдельное спасибо за то, что подняли мой боевой дух, обнаружив ошибку. Я снова начинаю верить, что смогу подружиться с MQL4

[Удален]  
RichLux:  вариант кода не работает. Линия на графике так и не появилась... 
// Вставил такой код в скрипт - линию рисует синюю на черном графике слабо видно
#property strict                                                       // -------- Возможно, Дело в этой строке
        
extern string StartTime = "07:00";          //Начальное время для анализа, 00:00 EST
extern string AlTime = "18:55";          //Время для трейдинга
extern string EndTime   = "20:00";          //Время экспирации
void OnStart()
{
   ObjectCreate("CORDON",OBJ_HLINE,0,0,Ask);    //созд гор линию по цене Ask   --- Для текущего графика ID пропускаем
   ObjectSetInteger(0,"CORDON",OBJPROP_COLOR,DarkBlue);  //цвет темно-сиий  --- 0 = текущий график   DarkBlue - то же самое
   ObjectSetInteger(0,"CORDON",OBJPROP_WIDTH,1);  //толщина линии 1
   ObjectSetInteger(0,"CORDON",OBJPROP_STYLE,STYLE_SOLID);  //линия сплош

   // Первый параметр нужен типа string, а функция ChartID возвращает long
   int IndexOfBar = iBarShift(NULL,PERIOD_H1, StringToTime(StartTime), true); //  --- NULL = текущий график  ЗДЕСЬ И БЫЛА ОШИБКА???
   double StartPrice = Open[IndexOfBar];                    //Получаем цену по индексу
   ObjectMove(ChartID(),"CORDON", 0, 0, StartPrice);          // меняем распол линии   
}
 
evillive:

Нельзя в ините рисовать и вычисления производить, это грубая ошибка. Инит должен завершать работу как можно быстрее.


 

А если вычисления с инита вынести в отдельную функцию, а потом эту функцию вставить в инит, так это не будет грубой ошибкой?

LRA:

уже все работает. 

 
RichLux:

А если вычисления с инита вынести в отдельную функцию, а потом эту функцию вставить в инит, так это не будет грубой ошибкой?

Будет грубой ошибкой, если код инсполняется слишком долго, то инит завершит работу принудительно и код просто не успеет весь исполниться. Исполняемый код, в том числе и вызовы вторичных функций, должен находиться в предопределенных функциях MQL -  OnTick() для советников, OnStart() для скриптов, OnCalculate() для индикаторов.

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

 
Переустановка ОС. Как восстановить после переустановки ОС МТ4 в том состоянии, в котором он был до переустановки.
Индикаторы, советники, скрипты; шаблоны, профили; счета
[Удален]  
AlexandrL:
Переустановка ОС. Как восстановить после переустановки ОС МТ4 в том состоянии, в котором он был до переустановки.
Индикаторы, советники, скрипты; шаблоны, профили; счета
Перед переустановкой скопировать папку терминала на флэшку. Если семерка и выше - то и общую папку. Подробности тут