Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 740

 
Taras Slobodyanik:

делать инициализацию переменных в ОнИните (включая перерисовку объектов)


Поясните про что речь.

Добавил в OnInit после создания метки

    ObjectSetInteger(0, objname, OBJPROP_YDISTANCE, y);
    ChartRedraw();


однако резльтат тот же самый.

 
psyman:


Поясните про что речь.

Добавил в OnInit после создания метки


однако резльтат тот же самый.

надо смотреть код, что там...

пс. тот код что выше работает нормально (не вижу глюков)
(https://www.mql5.com/ru/forum/160683/page739#comment_10290585)


ппс. хотя я заменил переменную Bid на Bid0

Любые вопросы новичков по MQL4, помощь и обсуждение по алгоритмам и кодам
Любые вопросы новичков по MQL4, помощь и обсуждение по алгоритмам и кодам
  • 2019.01.17
  • www.mql5.com
В этой ветке я хочу начать свою помощь тем, кто действительно хочет разобраться и научиться программированию на новом MQL4 и желает легко перейти н...
 
Добрый день, как нужно написать что бы при касании ценой мувинга открылся ордер?
 
Ivan Rozhkov:
Добрый день, как нужно написать что бы при касании ценой мувинга открылся ордер?
if ((prev_bid>ma && curr_bid<=ma) || (prev_bid<ma && curr_bid>=ma))
   //открывается ордер
 
Taras Slobodyanik:

надо смотреть код, что там...

пс. тот код что выше работает нормально (не вижу глюков)
(https://www.mql5.com/ru/forum/160683/page739#comment_10290585)


ппс. хотя я заменил переменную Bid на Bid0

Забыл добавить что это я в 5-ке тестирую. В МТ4 действительно по вертикали метка быстро перемещается на место при открытии графика, не нужно ждать тика или двигать мышью. Несколько раз были глюки с горизонтальным смещением, удалось побороть только перекомпиляцией индикатора.

 
psyman:


Пробовал, нужно подвигать мышью чтобы метка вернулась. Это тот же костыль, только в другой руке :-)

А переключение между графиками для CHARTEVENT_CHART_CHANGE событием не является.

Кто-нибудь может придумать как побороть эту аномалию?


принт мне выводит сообщение, если я переключаю окно графика, как в ту, так и в обратную сторону переключения (я правда на МТ4, но и в доках к МТ4 не написано, что переключение графика можно ловить, как событие CHARTEVENT_CHART_CHANGE )

void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
{
  if(id==CHARTEVENT_CHART_CHANGE) Print("graph");
}

Но да, это всё же костыльный метод. Нужно искать почему Y координата получается разной, при переключении на др. график. Но глядя на код, просится вывод что это ChartTimePriceToXY выдаёт разный результат почему-то.

 
psyman:

Забыл добавить что это я в 5-ке тестирую. В МТ4 действительно по вертикали метка быстро перемещается на место при открытии графика, не нужно ждать тика или двигать мышью. Несколько раз были глюки с горизонтальным смещением, удалось побороть только перекомпиляцией индикатора.

ну, в пятерке там много "особенностей" - от очереди на график, до создания баров из минуток, и срабатывания предыдущего деинита после текущего инита)

в общем - нужно проверять бары/график/объекты - в какой момент происходит ошибка и исправлять.

 
Taras Slobodyanik:


в общем - нужно проверять бары/график/объекты - в какой момент происходит ошибка и исправлять.


Как это сделать, с чего начать?

 
psyman:


Как это сделать, с чего начать?

делать везде принт, то есть в онините печатаем бид (можно и текущую дату) и потом при расчете тоже...
телепатирую что это история не успевает сразу построиться и бары появляются позже

 
Taras Slobodyanik:

делать везде принт, то есть в онините печатаем бид (можно и текущую дату) и потом при расчете тоже...
телепатирую что это история не успевает сразу построиться и бары появляются позже

Для следующего кода история в картинках:

//+------------------------------------------------------------------+
//|                                              !_clr_indicator.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window


string objname="Bid";
input color Bid_color = clrCrimson;

int OnInit()
  {

int x,y;
double Bid0 = SymbolInfoDouble(Symbol(), SYMBOL_BID);
int width = (int)ChartGetInteger(0,CHART_WIDTH_IN_PIXELS,0);  //ширина графика



        Print("1 Bid0 = ", Bid0,  " x = ", x, " y = ", y," TimeCurrent()=", TimeCurrent() );

   ObjectCreate(0, objname, OBJ_LABEL,0, 0, 0);
   
   ObjectSetString(0, objname, OBJPROP_TEXT, DoubleToString(Bid0, _Digits-1));
        ObjectSetInteger(0, objname, OBJPROP_FONTSIZE, 12);
        ObjectSetInteger(0, objname, OBJPROP_COLOR, Bid_color);
        ObjectSetString(0, objname, OBJPROP_FONT, "Verdana");

        ChartTimePriceToXY(0, 0, TimeCurrent(), Bid0, x, y);
        Print("2 Bid0 = ", Bid0,  " x = ", x, " y = ", y," TimeCurrent()=", TimeCurrent() );
         
        ObjectSetInteger(0, objname, OBJPROP_XDISTANCE, width-60);

   ObjectSetInteger(0, objname, OBJPROP_YDISTANCE, y);

   

   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(rates_total);

  }

void OnChartEvent(const int id,const long &lparam,const double &dparam,const string &sparam) 
  { 

int x2,y2;
double Bid2 = SymbolInfoDouble(Symbol(), SYMBOL_BID);
double  cprice;
datetime ctime;
int      cwindow=0;



if(id==CHARTEVENT_CHART_CHANGE) 
   {
   



           ChartTimePriceToXY(0, 0, TimeCurrent(), Bid2, x2, y2); 
      
      Print("5 Bid2 = ", Bid2,  " x2 = ", x2, " y2 = ", y2," TimeCurrent2()=", TimeCurrent() );
      
        ObjectSetInteger(0, objname, OBJPROP_YDISTANCE, y2);
   
   ChartXYToTimePrice(0,x2,x2,cwindow, ctime, cprice);
   

   }



  }



void OnDeinit(const int reason) 
   { 

      ObjectDelete(0,objname);
   } 
 
 


Отключил сеть, добавляю индикатор

Переключаюсь на соседний график


y2 поменял значение, возвращаюсь обратно


y2 вернул свое значение, но метка посчитана по "уехавшему" значению! Кручу колесо мыши

Метка вернулась на свое место!

Причина обращения: