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

 
FiVik:

Добрый день. Такой вопрос: где можно посмотреть пример кода того, как выводить значения одного индикатора с разных таймфреймов на график цены?

В гугле что-то не получается, наверно делаю не корректный запрос.

Конкретно, нужно вывести на график цены в колонку, значения стандартного отклонения полос Болинджера с Н1 по W1, а во второй колонке значения полученные путем  умножения стандартных отклонения на коэффициенты.

Полосы Болинджера модифицированные. 

 Ключевые слова дл поиска по кодобазе "Multi timeframe" 

Текст выводить можно с помощью OBJ_LABEL.

 
LRA:

1. Попробуйте в MetaEditor: Файл --> Открыть общую папку данных.  Увидите путь к папке. Этот вопрос много раз обсуждался, вот, например, ссылка

2. Попробуйте сначала без include. Когда отладите - начнете инклудить.

3. Исходники вставляйте сюда или с помощью кнопки SRC, которая выше, или кнопкой Прикрепить файл, что ниже.

Большое спасибо.
 

Просьба подсказать, как рисовать горизонтальную линию по цене открытия бара в 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() для индикаторов.

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