- Программно или вручную?
- Если программно, то:
- Для какого языка: MQL4 или MQL5?
- Как предполагается идентифицирование линии, для которой следует определить индекс бара?
- Программно или вручную?
- Если программно, то:
- Для какого языка: MQL4 или MQL5?
- Как предполагается идентифицирование линии, для которой следует определить индекс бара?
Програмно. MQL 5. Линия будет только одна. Она будет ставиться вручную пользователем. Это просто ограничение для меня на количество анализируемых баров для эксперта.
В MQL 4 номер бара под линией, как я помню, определял по времени.
Перебираем в цикле объекты графика, находим нужную Vline. Читаем время объекта. По времени определяем бар.
Функции ObjectsTotal, ObjectGetInteger, CopyTime.
Програмно. MQL 5. Линия будет только одна. Она будет ставиться вручную пользователем. Это просто ограничение для меня на количество анализируемых баров для эксперта.
В MQL 4 номер бара под линией, как я помню, определял по времени.
Даже если линия должна быть одна, ей всё-же лучше дать определённое имя, так не надо будет искать её перебором всех объектов. Следовательно создать линию лучше при запуске советника на каком-то расстоянии и потом её двигать как душе угодно. Затем определяется время этой линии и последнее
int Bars( string symbol_name, // имя символа ENUM_TIMEFRAMES timeframe, // период datetime start_time, // с какой даты время этой линии datetime stop_time // по какую дату текущее время );
А вообще, если забыть про mql4 то номер бара вообще не нужен. Всё что надо будет определить определяется по указанному времени.
- www.mql5.com
int Bars_Count;
long Vline_Time;
ObjectCreate(0,"Vline",OBJ_VLINE,0,TimeCurrent(),0,0,0,0,0);
ObjectSetInteger(0,"Vline",OBJPROP_SELECTABLE,1,1);
Теперь нужен обработчик события, который среагирует на перетаскивание мышью Vline.
OnChartEvent(CHARTEVENT_OBJECT_DRAG,"VLine") ;
В теле обработчика :
Vline_Time=ObjectGetInteger(0,"Vline",OBJPROP_TIME,0);
Bars_Count=Bars(Symbol(),0,TimeCurrent(),Vline_Time);
Alert (Bars_Count);
Вот всё что надо было написать...
#property indicator_chart_window #property indicator_plots 0 /**************Custom indicator initialization function**************/ int OnInit() { if(ObjectFind(0, "Vline") < 0) { ObjectCreate(0, "Vline", OBJ_VLINE, 0, TimeCurrent(), 0); ObjectSetInteger(0, "Vline", OBJPROP_SELECTABLE, true); } return(INIT_SUCCEEDED); }/*******************************************************************/ /****************Custom indicator iteration function*****************/ int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { //--- //--- return value of prev_calculated for next call return(rates_total); }/*******************************************************************/ void OnChartEvent(const int id, // идентификатор события const long& lparam, // параметр события типа long const double& dparam, // параметр события типа double const string& sparam // параметр события типа string ) { int Bars_Count; datetime Vline_Time; if(id == 2 && sparam == "Vline") { Vline_Time = (datetime)ObjectGetInteger(0, "Vline", OBJPROP_TIME); Bars_Count = Bars(_Symbol, PERIOD_CURRENT, Vline_Time, TimeCurrent()); Print(Bars_Count, " ********** ", Vline_Time); } }/*******************************************************************/Если нумерация нужна с нуля, то значение Bars_Count просто уменьшить на 1.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования