Скачать MetaTrader 5

MQL4 Как привязать работу советника с определенной свечи?

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Пользуйся поиском на MQL5.community. Это просто!
Ivan Molchanov
193
Ivan Molchanov 2016.05.23 17:20 

Здравствуйте!

Прошу помочь советом, как бы проще привязать работу советника к определенной свече (т.е. чтобы алгоритм советника начинал свой расчет с определенной свечи)?

Назовем ее "стартовой свечой" :)

Я пока вижу два варианта, но оба мне не нравятся.

1. Использовать смещение стартовой свечи относительно той свечи, на которой происходит установка советника (т.е. например бар 5 относительно к иллюстрации, которая приложена). При этом прописать алгоритм определения времени этой стартовой свечи уже внутри советника, и дальше все пойдет при появлении новых баров. В принципе, нормально, но если работать на младших ТФ, то во время установки и прописания всех параметров, может появиться новая свеча, и возможны такие накладки/ошибки. А также очевидный минус - необходимость переуказания бара при перезапуске советника...

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

Есть элегантные идеи?

 

Vladimir Kazakov
5720
Vladimir Kazakov 2016.05.23 17:35  

Создать объект вертикальная линия с определенным именем, чтобы советник его мог найти.

Ivan Molchanov
193
Ivan Molchanov 2016.05.23 17:49  
Vladimir Kazakov:

Создать объект вертикальная линия с определенным именем, чтобы советник его мог найти.

Да, спасибо, это вариант. Например назову ее "start", советник сможет определить ее datetime, и будет использовать это datetime как время моего стартового бара.

А с помощью какой функции можно получить время вертикальной линии? 

Vladimir Kazakov
5720
Vladimir Kazakov 2016.05.23 17:55  

Что-нибудь типа:

   string name="START_BAR";
   ObjectCreate(0,name,OBJ_VLINE,0,Time[0],0);
   ChartRedraw();
   MessageBox("Try to move VLINE, then press OK");
   datetime start_time=ObjectGetInteger(0,name,OBJPROP_TIME);
   ObjectDelete(0,name);
   MessageBox(TimeToString(start_time));
Ivan Molchanov
193
Ivan Molchanov 2016.05.30 13:03  
Vladimir Kazakov:

Что-нибудь типа:

Спасибо! Работает. Сейчас у меня такая проблема: вышеприведенный код я использую при инициализации эксперта (onInit), а дальнейшую обработку веду по каждому тику (onTick). Почему то данные из первой части, в частности start_time, не передается во вторую часть. Как это решить?

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#property strict

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+

void OnInit()
  {
   string name="START_BAR";
   ObjectCreate(0,name,OBJ_VLINE,0,Time[0],0);
   ChartRedraw();
   MessageBox("Try to move VLINE, then press OK");
   datetime start_time=ObjectGetInteger(0,name,OBJPROP_TIME);
   ObjectDelete(0,name);
   MessageBox(TimeToString(start_time));
 }
 
 void OnTick()
 {
  int bar=iBarShift(0,0,start_time);
 
 }
Vladimir Kazakov
5720
Vladimir Kazakov 2016.05.30 13:27  

Сейчас у start_time область видимости (и существования) только внутри функции OnInit.

Чтобы она везде была видна (и жила все время работы программы), ее нужно объявить на глобальном уровне, например, непосредственно перед OnInit, а внутри функции объявление (datetime) нужно убрать (иначе будет создана локальная переменная, которая "замаскирует" глобальную).

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий