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

 
Nikolai Semko #:

Библиотеку все равно придется таскать. Иначе никак.

Если не используешь канвас, то все равно нужна библиотека. Если будет время, то сделаю и опубликую без канваса. Слишком много нюансов, чтобы объяснить коротко. А пока можно использовать библиотеку iCanvas_CB. Сбрось пример, покажу как это сделать с минимальными затратами.

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

Возможно позже, как только оптимизирую.

Спасибо!

 
Vitaly Muzichenko #:

-- 5

-- 4



В пятёрке такие рывки, что ощущение, будто про ChartRedraw() забыл после изменения координат всех объектов.

В четвёрке это априори терминалом делается. В пятёрке - самостоятельно управлять перерисовкой графика нужно.

Это и плохо, и хорошо одновременно. Плохо для тех, кому не думая нужно, а хорошо - для тех, кто знает когда нужно ему перерисовать график, а не терминалу всегда.

 
Artyom Trishkin #:

В пятёрке такие рывки, что ощущение, будто про ChartRedraw() забыл после изменения координат всех объектов.

В четвёрке это априори терминалом делается. В пятёрке - самостоятельно управлять перерисовкой графика нужно.

Это и плохо, и хорошо одновременно. Плохо для тех, кому не думая нужно, а хорошо - для тех, кто знает когда нужно ему перерисовать график, а не терминалу всегда.

ChartRedraw() используется

--

Вот таких штук много, не знаю кто писал, но сейчас сокращаю код


 
Vitaly Muzichenko #:

ChartRedraw() используется

--

Вот таких штук много, не знаю кто писал, но сейчас сокращаю код


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

 
Alexey Viktorov #:

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

Если тянуть медленно - проблем нет

 
Vitaly Muzichenko #:

Если тянуть медленно - проблем нет

Так и я об этом. Если тянуть медленно, то новые параметры объекта успевают отработать. Попробуйте делать изменения не каждый чих, а через 3-5… 

Такой счётчик, если 0, то обработать и ++, до 3х просто ++ и выход без обработки, если 3 опять 0 и выход без обработки. И так далее…

 
Nikolai Semko #:

Библиотеку все равно придется таскать. Иначе никак.

Если не используешь канвас, то все равно нужна библиотека. Если будет время, то сделаю и опубликую без канваса. Слишком много нюансов, чтобы объяснить коротко. А пока можно использовать библиотеку iCanvas_CB. Сбрось пример, покажу как это сделать с минимальными затратами.

Приветствую, Николай!

Случайно не появилась возможность краткой замены ChartTimePriceToXY без использования библиотеки?

Нужно получить координату цены

void out_txt_TP(double pr_tp) // цена линии
{
  int x, y;
  ChartTimePriceToXY(0, 0, iTime(NULL, 0, 0), pr_tp, x, y);
  double pr_ord    = prefO_pr;
  double distance  = MathAbs(pr_tp - pr_ord);
  int    pips      = (int)MathRound(distance / poi);
  double d         = tick_size > 0 ? distance / tick_size * tick_value * Lot : 0;
  LabelCreate(0, prefO+"tp", 0, 5, y-2, "TP +"+DoubleToString(d,2)+"$ +"+IntegerToString(pips)+"pp", 8, clr_TP);
}
 
Vitaly Muzichenko #:

Приветствую, Николай!

Случайно не появилась возможность краткой замены ChartTimePriceToXY без использования библиотеки?

Нужно получить координату цены

Приветстую Виталий,
Нет ещё, но постараюсь сделать в ближайшую неделю.
Только посоветуйте, какой наглядный визуальный пример к ней сделать, если не нужен Canvas
 
Nikolai Semko #:
Приветстую Виталий,
Нет ещё, но постараюсь сделать в ближайшую неделю.
Только посоветуйте, какой наглядный визуальный пример к ней сделать, если не нужен Canvas

Спасибо!

Набросал пример

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2020, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#property version   "1.00"
#property indicator_chart_window
#property indicator_plots 0


//+------------------------------------------------------------------+
void HLineCreate(const long chart_ID=0, const string name="HLine", const int sub_window=0,
                 double price=0, const color clr=clrRed, const ENUM_LINE_STYLE style=STYLE_SOLID,
                 const int width=1, const bool back=false, const bool selection=true,
                 const bool hidden=true, const long z_order=0);
void LabelCreate(const long chart_ID=0, const string name="Label", const int sub_window=0,
                 const int x=0, const int y=0, const string text="Label", const int font_size=10,
                 const color clr=clrRed, const string font="Arial",
                 const ENUM_BASE_CORNER corner=CORNER_RIGHT_UPPER,
                 const double angle=0.0, const ENUM_ANCHOR_POINT anchor=ANCHOR_RIGHT_LOWER,
                 const bool back=false, const bool selection=false, const bool hidden=true,
                 const long z_order=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(0, "line", 0, price, clrRed, STYLE_SOLID, 1);
  Out_txt(price);
  return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| 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) {
    double price=ObjectGetDouble(0, "line", OBJPROP_PRICE);
    Out_txt(price);
  }
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Out_txt(double price)
{
  int x, y;
  ChartTimePriceToXY(0, 0, iTime(NULL, 0, 0), price, x, y);
  LabelCreate(0, "txt", 0, 5, y-2, DoubleToString(price,_Digits), 8, clrRed);
}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void HLineCreate(const long chart_ID, const string name, const int sub_window,
                 double price, const color clr, const ENUM_LINE_STYLE style,
                 const int width, const bool back, const bool selection,
                 const bool hidden, const long z_order)
{
  ObjectCreate(chart_ID,name,OBJ_HLINE,sub_window,0,price);
  ObjectSetDouble (chart_ID,name,OBJPROP_PRICE,price);
  ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
  ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
  ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
  ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
  ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
  ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
  ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
  ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void LabelCreate(const long chart_ID, const string name, const int sub_window,
                 const int x, const int y, const string text, const int font_size,
                 const color clr, const string font, const ENUM_BASE_CORNER corner,
                 const double angle, const ENUM_ANCHOR_POINT anchor,
                 const bool back, const bool selection, const bool hidden,
                 const long z_order)
{
  if(ObjectFind(chart_ID,name) < 0) {
    ObjectCreate(chart_ID,name,OBJ_LABEL,sub_window,0,0);
    ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner);
    ObjectSetString (chart_ID,name,OBJPROP_FONT,font);
    ObjectSetInteger(chart_ID,name,OBJPROP_FONTSIZE,font_size);
    ObjectSetDouble (chart_ID,name,OBJPROP_ANGLE,angle);
    ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor);
    ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
    ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
    ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
    ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
    ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
  }
  ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x);
  ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y);
  ObjectSetString (chart_ID,name,OBJPROP_TEXT,text);
  ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
}
//+------------------------------------------------------------------+
 
Nikolai Semko #:
Приветстую Виталий,
Нет ещё, но постараюсь сделать в ближайшую неделю.
Только посоветуйте, какой наглядный визуальный пример к ней сделать, если не нужен Canvas
Пример подходит?