ChartGetInteger(), ChartTimePriceToXY() - серьезные проблемы вызывают зависание - страница 3

 
Vitaly Muzichenko #:
Пример подходит?
Посмотрю потом в процессе разработки. Пока в другой рутине. Спасибо за пример.
А разве для создания объектов их нельзя привязывать к координатам цена-время? Просто я объектами кроме Canvas, перестал пользоваться очень давно и уже не помню. Или можно привязывать только одну координату вместо двух? Например в прямоугольник или линии?
Просто пытаюсь понять необходимость новой библиотеки.
 
Nikolai Semko #:
Посмотрю потом в процессе разработки. Пока в другой рутине. Спасибо за пример.
А разве для создания объектов их нельзя привязывать к координатам цена-время? Просто я объектами кроме Canvas, перестал пользоваться очень давно и уже не помню. Или можно привязывать только одну координату вместо двух? Например в прямоугольник или линии?
Просто пытаюсь понять необходимость новой библиотеки.

Иногда есть только цена и координата, но нет времени, так вот для получения времени используем ChartTimePriceToXY = это как-раз случай с моего примера кода.

Частенько, нужно привязать кнопку ко времени текущего бара-10 баров, но кнопка привязывается координатами, поэтому нужно перевести цену и время в координаты.

Сейчас сделаю другой пример, более расширенный.

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//+------------------------------------------------------------------+
#property version   "1.00"
#property indicator_chart_window
#property indicator_plots 0

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{
  ChartSetInteger(0, CHART_EVENT_MOUSE_MOVE, true);
  double pr_max = ChartGetDouble(0, CHART_PRICE_MAX);
  double pr_min = ChartGetDouble(0, CHART_PRICE_MIN);
  double price = pr_min + (pr_max - pr_min) / 2.0;
  HLineCreate("line", price, clrRed);
  Out_txt(iTime(NULL, 0, 0), price);
  return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
  ObjectDelete(0, "line");
  ObjectDelete(0, "txt");
  ChartRedraw();
}

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int32_t rates_total,
                const int32_t 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 int32_t &spread[])
{
  return(rates_total);
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam)
{
  if(id == CHARTEVENT_MOUSE_MOVE) {
    datetime time = iTime(NULL, 0, 0);
    double price=ObjectGetDouble(0, "line", OBJPROP_PRICE);
    Out_txt(time, price);
  }
}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Out_txt(datetime time, double price)
{
  int x, y;
  ChartTimePriceToXY(0, 0, time, price, x, y);
  LabelCreate("txt", x, y, (string)time+" / "+DoubleToString(price,_Digits), clrRed);
}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void HLineCreate(const string name, double price, const color clr)
{
  ObjectCreate(0,name,OBJ_HLINE,0,0,0);
  ObjectSetDouble (0,name,OBJPROP_PRICE,price);
  ObjectSetInteger(0,name,OBJPROP_COLOR,clr);
  ObjectSetInteger(0,name,OBJPROP_STYLE,STYLE_SOLID);
  ObjectSetInteger(0,name,OBJPROP_WIDTH,1);
  ObjectSetInteger(0,name,OBJPROP_BACK,false);
  ObjectSetInteger(0,name,OBJPROP_SELECTABLE,true);
  ObjectSetInteger(0,name,OBJPROP_SELECTED,true);
  ObjectSetInteger(0,name,OBJPROP_HIDDEN,false);
}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void LabelCreate(const string name, const int x, const int y, const string text, const color clr)
{
  if(ObjectFind(0,name) < 0) {
    ObjectCreate(0,name,OBJ_LABEL,0,0,0);
    ObjectSetInteger(0,name,OBJPROP_CORNER,CORNER_LEFT_UPPER);
    ObjectSetInteger(0,name,OBJPROP_COLOR,clr);
    ObjectSetString (0,name,OBJPROP_FONT,"Arial");
    ObjectSetInteger(0,name,OBJPROP_FONTSIZE,8);
    ObjectSetInteger(0,name,OBJPROP_ANCHOR,ANCHOR_LEFT_LOWER);
    ObjectSetInteger(0,name,OBJPROP_BACK,false);
    ObjectSetInteger(0,name,OBJPROP_SELECTABLE,true);
    ObjectSetInteger(0,name,OBJPROP_SELECTED,true);
    ObjectSetInteger(0,name,OBJPROP_HIDDEN,false);
  }
  ObjectSetInteger(0,name,OBJPROP_XDISTANCE,x);
  ObjectSetInteger(0,name,OBJPROP_YDISTANCE,y);
  ObjectSetString (0,name,OBJPROP_TEXT,text);
}
//+------------------------------------------------------------------+