Как вывести число справа от текущей цены - страница 3

 
Ihor Herasko:

https://getsharex.com/

Я дал Вам удочку. Рыбку ловить придется самому.

вы ответьте у вас тоже самое? так же?

 
vebster005:

вы ответьте у вас тоже самое? так же?

Чем меньше масштаб, тем меньше дергание. Вы в коде разобрались? И почему перед Вами все должны держать ответ?

 
Ihor Herasko:

Чем меньше масштаб, тем меньше дергание. Вы в коде разобрались? И почему перед Вами все должны держать ответ?

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

 
vebster005:

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

Просто внимательно вникните в код и найдете решение проблемы самостоятельно. Сложного там ничего нет, только кропотливая (монотонная) работа по подбору коэффициентов.

 
Ihor Herasko:

Просто внимательно вникните в код и найдете решение проблемы самостоятельно. Сложного там ничего нет, только кропотливая (монотонная) работа по подбору коэффициентов.

Решение того чтобы не дребезжало и нормально четко двигалось?

 
vebster005:

Решение того чтобы не дребезжало и нормально четко двигалось?

Решение всего. Если Вам непонятен тот код, который уже есть, то дальше нет смысла что-либо делать. Был дан ответ на вопрос, который Вы задали в теме. Это основное направление движения. Дальше будет возникать огромное количество деталей. Это нормально.

 

В mql5 это решается совсем просто.

/****************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[])
 {
  int x, y;
  ChartTimePriceToXY(ChartID(), 0, 0, SymbolInfoDouble(_Symbol, SYMBOL_BID), x, y);
  ShowLable("00", 10, y, DoubleToString(SymbolInfoDouble(_Symbol, SYMBOL_BID), _Digits), CORNER_RIGHT_UPPER, ANCHOR_RIGHT_LOWER);
  return(rates_total);
 }/*******************************************************************/

/********************************************************************/
void OnChartEvent(const int id,         // идентификатор события
                  const long& lparam,   // параметр события типа long
                  const double& dparam, // параметр события типа double
                  const string& sparam  // параметр события типа string
                 )
 {
  int x, y;
  ChartTimePriceToXY(ChartID(), 0, 0, SymbolInfoDouble(_Symbol, SYMBOL_BID), x, y);
  if(id == CHARTEVENT_CHART_CHANGE)
   {
    ShowLable("00", 10, y, DoubleToString(SymbolInfoDouble(_Symbol, SYMBOL_BID), _Digits), CORNER_RIGHT_UPPER, ANCHOR_RIGHT_LOWER);
    ChartRedraw();
   }
 }/*******************************************************************/

/*********************************************************************/
void ShowLable(string name, int X, int Y, string text, ENUM_BASE_CORNER corner, ENUM_ANCHOR_POINT anchor)
 {
  if(ObjectFind(0, name) < 0)
   {
    ObjectCreate(0, name, OBJ_LABEL, 0, 0, 0);
    ObjectSetInteger(0, name, OBJPROP_COLOR, clrTeal);
    ObjectSetInteger(0, name, OBJPROP_CORNER, corner);
    ObjectSetInteger(0, name, OBJPROP_ANCHOR, anchor);
    ObjectSetInteger(0, name, OBJPROP_BACK, false);
    ObjectSetInteger(0, name, OBJPROP_HIDDEN, false);
    ObjectSetInteger(0, name, OBJPROP_SELECTABLE, true);
    //ObjectSetInteger(0, name, OBJPROP_SELECTED, true);
   }
  ObjectSetInteger(0, name, OBJPROP_XDISTANCE, X);
  ObjectSetInteger(0, name, OBJPROP_YDISTANCE, Y);
  ObjectSetString(0, name, OBJPROP_TEXT, text);
 }/*******************************************************************/

Но в mql4 почему-то выделенный код не работает. Но... решение не составляет труда. Просто надо воспользоваться коэффициентом отношения текущей цены к разнице максимальной и минимальной цены. И этот коэффициент использовать при вычислении координаты в пикселях.

/****************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[])
 {
  int chart_height = (int)ChartGetInteger(ChartID(), CHART_HEIGHT_IN_PIXELS);
  double k = 1;
  double price_max = ChartGetDouble(ChartID(), CHART_PRICE_MAX),
         price_min= ChartGetDouble(ChartID(), CHART_PRICE_MIN);
  k = (price_max-SymbolInfoDouble(_Symbol, SYMBOL_BID))/(price_max-price_min);
  ShowLable("00", 10, int(chart_height*k), DoubleToString(SymbolInfoDouble(_Symbol, SYMBOL_BID), _Digits), CORNER_RIGHT_UPPER, ANCHOR_RIGHT_LOWER);
  return(rates_total);
 }/*******************************************************************/

/********************************************************************/
void OnChartEvent(const int id,         // идентификатор события
                  const long& lparam,   // параметр события типа long
                  const double& dparam, // параметр события типа double
                  const string& sparam  // параметр события типа string
                 )
 {
  int chart_height = (int)ChartGetInteger(ChartID(), CHART_HEIGHT_IN_PIXELS);
  double k = 1;
  double price_max = ChartGetDouble(ChartID(), CHART_PRICE_MAX),
         price_min= ChartGetDouble(ChartID(), CHART_PRICE_MIN);
  k = (price_max-SymbolInfoDouble(_Symbol, SYMBOL_BID))/(price_max-price_min);
  if(id == CHARTEVENT_CHART_CHANGE)
   {
    ShowLable("00", 10, int(chart_height*k), DoubleToString(SymbolInfoDouble(_Symbol, SYMBOL_BID), _Digits), CORNER_RIGHT_UPPER, ANCHOR_RIGHT_LOWER);
    ChartRedraw();
   }
 }/*******************************************************************/

/*********************************************************************/
void ShowLable(string name, int X, int Y, string text, ENUM_BASE_CORNER corner, ENUM_ANCHOR_POINT anchor)
 {
  if(ObjectFind(0, name) < 0)
   {
    ObjectCreate(0, name, OBJ_LABEL, 0, 0, 0);
    ObjectSetInteger(0, name, OBJPROP_COLOR, clrTeal);
    ObjectSetInteger(0, name, OBJPROP_CORNER, corner);
    ObjectSetInteger(0, name, OBJPROP_ANCHOR, anchor);
    ObjectSetInteger(0, name, OBJPROP_HIDDEN, false);
    ObjectSetInteger(0, name, OBJPROP_SELECTABLE, true);
    //ObjectSetInteger(0, name, OBJPROP_SELECTED, true);
   }
  ObjectSetInteger(0, name, OBJPROP_XDISTANCE, X);
  ObjectSetInteger(0, name, OBJPROP_YDISTANCE, Y);
  ObjectSetString(0, name, OBJPROP_TEXT, text);
 }/*******************************************************************/
 
Alexey Viktorov:

В mql5 это решается совсем просто.

Но в mql4 почему-то выделенный код не работает. Но... решение не составляет труда. Просто надо воспользоваться коэффициентом отношения текущей цены к разнице максимальной и минимальной цены. И этот коэффициент использовать при вычислении координаты в пикселях.

Спасибо подскажите почему если не запустить индикатор и свернуть его и через некоторое время опять развернуть то число пропадает, но как только пошевелить график влево-вправо то оно снова появится, можно ли то исправить?

 
vebster005:

Спасибо подскажите почему если не запустить индикатор и свернуть его и через некоторое время опять развернуть то число пропадает, но как только пошевелить график влево-вправо то оно снова появится, можно ли то исправить?

Да по идее, должно восстановиться при первом тике. А что пропадает, это вообще странно.


ps; Видимо перемещается куда-то далеко в связи с тем, что высота окна становится равна нулю.

 
Sergey Kolemanov:

Работает если в параметрах задать не 0 а время на графике.

Да? Сейчас проверю. Но по идее время не должно никак влиять...


И ведь действительно работает... Спасибо за подсказку. Поставил TimeCurrent() для совместимости и от лишних заморочек...

Значит окончательный вариант для любой платформы

/****************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[])
 {
  int x, y;
  ChartTimePriceToXY(ChartID(), 0, TimeCurrent(), SymbolInfoDouble(_Symbol, SYMBOL_BID), x, y);
  ShowLable("00", 10, y, DoubleToString(SymbolInfoDouble(_Symbol, SYMBOL_BID), _Digits), CORNER_RIGHT_UPPER, ANCHOR_RIGHT_LOWER);
  return(rates_total);
 }/*******************************************************************/

/********************************************************************/
void OnChartEvent(const int id,         // идентификатор события
                  const long& lparam,   // параметр события типа long
                  const double& dparam, // параметр события типа double
                  const string& sparam  // параметр события типа string
                 )
 {
  int x, y;
  ChartTimePriceToXY(ChartID(), 0, TimeCurrent(), SymbolInfoDouble(_Symbol, SYMBOL_BID), x, y);
  if(id == CHARTEVENT_CHART_CHANGE)
   {
    ShowLable("00", 10, y, DoubleToString(SymbolInfoDouble(_Symbol, SYMBOL_BID), _Digits), CORNER_RIGHT_UPPER, ANCHOR_RIGHT_LOWER);
    ChartRedraw();
   }
 }/*******************************************************************/

/*********************************************************************/
void ShowLable(string name, int X, int Y, string text, ENUM_BASE_CORNER corner, ENUM_ANCHOR_POINT anchor)
 {
  if(ObjectFind(0, name) < 0)
   {
    ObjectCreate(0, name, OBJ_LABEL, 0, 0, 0);
    ObjectSetInteger(0, name, OBJPROP_COLOR, clrTeal);
    ObjectSetInteger(0, name, OBJPROP_CORNER, corner);
    ObjectSetInteger(0, name, OBJPROP_ANCHOR, anchor);
    ObjectSetInteger(0, name, OBJPROP_BACK, false);
    ObjectSetInteger(0, name, OBJPROP_HIDDEN, false);
    ObjectSetInteger(0, name, OBJPROP_SELECTABLE, true);
    //ObjectSetInteger(0, name, OBJPROP_SELECTED, true);
   }
  ObjectSetInteger(0, name, OBJPROP_XDISTANCE, X);
  ObjectSetInteger(0, name, OBJPROP_YDISTANCE, Y);
  ObjectSetString(0, name, OBJPROP_TEXT, text);
 }/*******************************************************************/
Причина обращения: