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

 
Ilya Prozumentov:

Это уже только сам автор поймёт, что тут. Лучше код из OnTick() несите

С автором списывался. Ничем не помог. Он сам с трудом ориентируется: "проверяйте свои условия тут я ничем не помогу

за свою часть кода я отвечать может(!) и могу, за вашу нет".

Вот код OnTick():

void OnTick()
  {RefreshRates();
//---
   string TextDisplay="";

/*  Check News   */
   bool trade=true; string nstxt=""; int NewsPWR=0; datetime nextSigTime=0;
   if(MidleNews || HighNews) 
     {RefreshRates();
      if(SourceNews==0)
        {// Investing
        RefreshRates();
         if(CheckInvestingNews(NewsPWR,nextSigTime)){ trade=false; } // news time
        }
     }
   if(trade)
     {// No News, Trade enabled
      nstxt="No News, Waiting";
      if(ObjectFind(0,"NS_Label")!=-1){ ObjectDelete(0,"NS_Label"); }

        }else{// waiting news , check news power
      color clrT=LowColor;
      if(NewsPWR>3)
        {
         nstxt= "Waiting Non-farm Payrolls News";
         clrT = HighColor;
           }else{
         if(NewsPWR>2)
           {
            nstxt= "Waiting High News";
            clrT = HighColor;
              }else{
            if(NewsPWR>1)
              {
               nstxt= "Waiting Midle News";
               clrT = MidleColor;
                 }else{
               nstxt= "Waiting Low News";
               clrT = LowColor;
              }
           }
        }
      // Make Text Label
      if(nextSigTime>0){ nstxt=nstxt+" "+TimeToString(nextSigTime,TIME_MINUTES); }
      if(ObjectFind(0,"NS_Label")==-1)
        {
         LabelCreate(StringConcatenate(nstxt),clrT);
        }
      if(ObjectGetInteger(0,"NS_Label",OBJPROP_COLOR)!=clrT)
        {
         ObjectDelete(0,"NS_Label");
         LabelCreate(StringConcatenate(nstxt),clrT);
        }
     }
   nstxt="\n"+nstxt;
/*  End Check News  */ 


   if(trade && oppoz)  
     {// No news and Trade Allowed
     Fun_New_Bar();
            
      if(New_Bar)      
     { 
      Alert("Открыть позицию"); ManageTrade(); // Your trade functions
     }
     oppoz=false;
     }

   TextDisplay=TextDisplay+nstxt;
   Comment(TextDisplay);

   return;
  }
 
Alekseu Fedotov:

Пробуйте заменить

вот на эту строчку

Кажется подействовало! Вот уже 20 минут сообщения нет. Посмотрим, как отреагирует на новость в 13.00.

 
Artyom Trishkin:
nan - NaN - Not a Number - не число. Попробуйте нормализовать числа в расчёте Z-счёта

Спасибо, помогло.

Странно что функция MathCeil() не работает. Помогло NormalizeDouble() цифра - == Z-счёт равен = -92233720368547.77 . Показатель обалденный, но баланс почти не изменяется




 
Alekseu Fedotov:

Пробуйте заменить

вот на эту строчку

Отлично! Всё сработало по настройкам, отказов нет. Спасибо!

Люблю простые решения и простые коды.

Спасибо также всем обратившим внимание и попытавшимся помочь полному профану.

 

Привязываю ценовую метку к Bid, наблюдаю что работает отлично, переключаюсь на другой график и вижу что вертикальная координата сразу же смещается примерно на 15 пикселей.

Возвращаюсь обратно, метка "сбежала" и находится не на месте до следующего тика, после чего возвращается "на Родину". От чего такое может быть?




//+------------------------------------------------------------------+
//|                                              !_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 Bid = SymbolInfoDouble(Symbol(), SYMBOL_BID);
int width = (int)ChartGetInteger(0,CHART_WIDTH_IN_PIXELS,0);  //ширина графика

   ObjectCreate(0, objname, OBJ_LABEL,0, 0, 0);
   
   ObjectSetString(0, objname, OBJPROP_TEXT, DoubleToString(Bid, _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(), Bid, x, y); 
   ObjectSetInteger(0, objname, OBJPROP_XDISTANCE, width-60);

   Print("y=", y, "  ", ObjectGetInteger(0,objname,OBJPROP_TIME,0));

   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[])
  {


int x2,y2;
double Bid2 = SymbolInfoDouble(Symbol(), SYMBOL_BID);


           ChartTimePriceToXY(0, 0, TimeCurrent(), Bid2, x2, y2); 
      
        ObjectSetInteger(0, objname, OBJPROP_YDISTANCE, y2);

   Print("x2=", x2, "  y2=", y2, "  ", "  Bid=",Bid2);

   return(rates_total);
  }


void OnDeinit(const int reason) 
   { 

      ObjectDelete(0,objname);
   } 
 
 
 
psyman:

Привязываю ценовую метку к Bid, наблюдаю что работает отлично, переключаюсь на другой график и вижу что вертикальная координата сразу же смещается примерно на 15 пикселей.

Возвращаюсь обратно, метка "сбежала" и находится не на месте до следующего тика, после чего возвращается "на Родину". От чего такое может быть?

От того, что перерисовка графика происходит только на следующем тике. Но принудительную перерисовку графика сейчас ставить опасно. В предыдущих двух билдах МТ5 тормоза были не детские. Как в МТ4 не знаю, надо проверять.

 
Alexey Viktorov:

От того, что перерисовка графика происходит только на следующем тике. Но принудительную перерисовку графика сейчас ставить опасно. В предыдущих двух билдах МТ5 тормоза были не детские. Как в МТ4 не знаю, надо проверять.

Так это ведь следствие, непонятно что является причиной смещения.

По горизонтали то же самое происходит и самое неприятное что метка налазит на цену, это для разбора ситуации я бОльшую часть кода вырезал.

Как выйти из этой ситуации?

 
psyman:

Так это ведь следствие, непонятно что является причиной смещения.

По горизонтали то же самое происходит и самое неприятное что метка налазит на цену, это для разбора ситуации я бОльшую часть кода вырезал.

Как выйти из этой ситуации?

попробуй обновлять координаты метки так же и при событии CHARTEVENT_CHART_CHANGE

if(id==CHARTEVENT_MOUSE_MOVE || id==CHARTEVENT_CHART_CHANGE)
 
Ilya Prozumentov:

попробуй обновлять координаты метки так же и при событии CHARTEVENT_CHART_CHANGE


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

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

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

 
psyman:


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

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

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

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

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