глобальная инициализация не удалась!!!!!!! - страница 5

 
deysmacro:
Comment() не влияет на график, в большинстве случаев.

  if(ObjectFind(Symbol()+"Lot_Size_Label")==0)
   {         
  int x_check=ObjectGet(Symbol()+"Lot_Size_Label",OBJPROP_XDISTANCE);
  int y_check=ObjectGet(Symbol()+"Lot_Size_Label",OBJPROP_YDISTANCE);
  Comment(x_check+ " , "+y_check); 
   }

Comment(), чтобы проверить, каковы данные коорд.

Они должны меняться, когда метка идет вправо, но они не меняются.

То есть, коорды такие, какими они должны быть.

Ярлык исчезает вправо.

 

Координатами являются XDISTANCE = 225; YDISTANCE = 27; CORNER = 3;

Во-первых, загружаем инди на график, метка на месте:

Во-вторых, закрываем MT4 и запускаем заново, метка уходит вправо:

В-третьих, после сдвига Tf's, метка прыгает обратно:

Это что-то связанное с якорями, относящимися к расчетам углов, и, должно быть, ошибка в B646.

 
Какое отношение это имеет к тому, что глобальная инициализация не удалась?
 
SDC:
Какое отношение все это имеет к сбою глобальной инициализации?

Этот B646 серьезно глючит!
 
Dadas:


Спасибо, у меня была та же проблема с объектами, которые не удалялись при деинитизации.

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

Я обошел это, вероятно, самым простым способом, с помощью ObjectDelete() в start().

Да, замена init() на OnInit() и deinit() на OnDeinit() вернула ярлыки на свои места! Спасибо!

Потом через некоторое время не помогло!!! Они все еще танцуют тот же танец.


Не за что, Дадас. Однако я бы не стал использовать ObjectDelete() в методе запуска. Это лучше сделать в OnDeInit(). Причина в следующем: если вы поместите код в OnStart() или OnCalculate(), он будет выполняться каждый раз, когда наступает тик. Это плохо по двум причинам: 1) это добавляет много операций, использующих время, которое вы не можете позволить себе терять в приложении реального времени, и 2) это не имеет смысла делать в большинстве ситуаций - обычно это имеет значение только при деинициализации графика. Вы должны делать это в методах "запуска", только если изменение цены каким-то образом повлияет на ваши объекты. В качестве примера рассмотрим следующее (это часть приложения, которое я собираюсь продать, но поделиться этим - круто :-) ).

// If no trade is progress, there is no Position Value to display
      if (ObjectFind("PositionValue") > 0)
                ObjectDelete("PositionValue");
                
      if (ObjectFind("PipsProfitLoss") > 0)
                ObjectDelete("PipsProfitLoss");
                
      if (ObjectFind("CurrentStop") > 0)
                ObjectDelete("CurrentStop");
                
      if (ObjectFind("PipsLockedIn") > 0)
                ObjectDelete("PipsLockedIn");
                
      if (ObjectFind("ProfitLockedIn") > 0)
                ObjectDelete("ProfitLockedIn");
                
      if (GlobalVariableCheck(CurrentPairPercentageRisk))
         GlobalVariableDel(CurrentPairPercentageRisk);

Этот код отлавливает объекты, оставшиеся после закрытия сделки, если они существуют.

Кстати - НЕ делайте этого:

string AcctCurrency = AccountCurrency();
       
      if (AcctCurrency == "")
          return(rates_total);

Вы неправильно поняли замысел кода. Он предназначен для того, чтобы НЕ запускать инди, пока сервер не "успокоится". Вот почему я возвращаю 0. Таким образом, код indie не будет выполняться, пока не будет доступна вся необходимая ему информация. Честно говоря, я еще не работал с OnCalculate(), потому что мне это не требовалось, но я могу сказать, что то, что вы делаете - это приглашение к катастрофе. Вы не говорите своей программе: "Не запускайте этот код, пока у вас нет достоверных данных". Вы просто бросаете все на ветер и надеетесь на лучшее. По правде говоря, я не знаю, что будет делать ваш код, если он не получит надежную информацию от сервера. После значительного количества прочитанного, их новый метод OnCalculate() не имеет для меня никакого смысла. Мне кажется, что он без необходимости вычисляет и передает грузу информацию, которую вы бы сделали сами, если бы вам это было нужно, и экономит время вычислений, не утруждая себя тем, что вам не нужно. Я не уверен, чего они пытаются добиться этим.

Счастливого кодинга!

 
ProfessorMetal:


Не за что, Дадас. Однако я бы не стал использовать ObjectDelete() в методе start. Это лучше сделать в OnDeInit(). Причина в следующем: если вы поместите код в OnStart() или OnCalculate(), он будет выполняться каждый раз, когда наступает тик. Это плохо по двум причинам: 1) это добавляет много операций, использующих время, которое вы не можете позволить себе терять в приложении реального времени, и 2) это не имеет смысла делать в большинстве ситуаций - обычно это имеет значение только при деинициализации графика. Вы должны делать это в методах "запуска", только если изменение цены каким-то образом повлияет на ваши объекты. В качестве примера рассмотрим следующее (это часть приложения, которое я собираюсь продать, но поделиться этим - круто :-) ).

Этот код перехватывает объекты, оставшиеся после закрытой сделки, если они существуют.

Кстати - НЕ делайте этого:

Вы неправильно поняли замысел кода. Он предназначен для того, чтобы НЕ запускать инди, пока сервер не "успокоится". Вот почему я возвращаю 0. Таким образом, код инди не будет выполняться, пока не будет доступна вся необходимая ему информация. Честно говоря, я еще не работал с OnCalculate(), потому что мне это не требовалось, но я могу сказать, что то, что вы делаете - это приглашение к катастрофе. Вы не говорите своей программе: "Не запускайте этот код, пока у вас нет достоверных данных". Вы просто бросаете все на ветер и надеетесь на лучшее. По правде говоря, я не знаю, что будет делать ваш код, если он не получит надежную информацию от сервера. После значительного количества прочитанного, их новый метод OnCalculate() не имеет для меня никакого смысла. Мне кажется, что он без необходимости вычисляет и передает грузу информацию, которую вы бы сделали сами, если бы вам это было нужно, и экономит время вычислений, не утруждая себя тем, что вам не нужно. Я не уверен, чего они пытаются добиться этим.

Счастливого кодинга!


Еще раз спасибо!

Я нашел ответ на вопрос о плавающих метках.

Похоже, что теперь мы должны привязать объектный якорь в самом коде:

https://docs.mql4.com/en/constants/objectconstants/enum_anchorpoint

Итак, я должен добавить что-то вроде следующего:

if(Corner==0) Anchor=ANCHOR_LEFT;
if(Corner==1) Anchor=ANCHOR_RIGHT;
if(Corner==2) Anchor=ANCHOR_LEFT;
if(Corner==3) Anchor=ANCHOR_RIGHT; 

и затем использовать другую строку для установки объекта:

    ObjectSet(objname,OBJPROP_ANCHOR,Anchor);

Жизнь определенно не становится легче!

И это не помогает, в конце концов!!!

BTW. Я скажу вам, чего они пытаются достичь:

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

Это должно быть как можно более коммерческим.

До недавнего времени почти любой мог возиться с простым mql4.

Теперь цель - коммерциализировать все!

 
Dadas:

Это B646 - серьезная ошибка!
Возможно, это так, но global initialization failed - это специфическая ошибка, не связанная с обсуждением точек привязки объектов.
 
ProfessorMetal:


Их новый метод OnCalculate() не имеет для меня никакого смысла. Мне кажется, что он без необходимости вычисляет и передает грузу информацию, которую вы бы сделали сами, если бы вам это было нужно, и экономит время вычислений, не утруждая себя тем, что вам не нужно. Я не уверен, чего они пытаются добиться этим.

Счастливого кодинга!

OnCalculate предоставляет результат подсчета того, сколько баров уже было обработано индикатором. Она заменяет старую функцию IndicatorCounted. Она также обеспечивает совместимость с mql5, поскольку массивы серий передаются ей по ссылке, в отличие от старого способа использования глобальных массивов серий в mql4. С точки зрения кодирования разница очень мала.

 

Еще раз приветствую вас, Дадас. Я забыл об использовании свойства ANCHOR, хотя я использую его в некоторых своих материалах.

SDC, спасибо за информацию. В документации не совсем понятно его назначение. Я подозреваю, что смысл мог потеряться при переводе с русского на английский. Теперь это имеет больше смысла. Я предполагаю, что он не предназначен для использования вместо OnStart(), а вместо IndicatorCounted(). Было бы неплохо добавить в документацию пример, показывающий своего рода "до" и "после" замены IndicatorCounted() на OnCalculate(). Мне нужно будет вернуться и просмотреть документацию в свете вашего объяснения и посмотреть, как части собираются вместе. Еще раз спасибо.

Проф

 

Вы используете int OnCalculate() вместо int start(). Она запускается на каждом тике, как start(). До и после будет выглядеть примерно так,

int start()
  {
   int i=0, limit=0;
   int counted_bars=IndicatorCounted();
//---- check for possible errors
   if(counted_bars < 0) return(-1);
//----
   limit = Bars-counted_bars-1;
   for (i = limit; i >= 0; i--)
   {
//---- indicator calculations
   }
   return(0);
  }

//--------------------------------------------------
//--------------------------------------------------

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 i=0, limit=0;
//--- check for possible errors
   if(prev_calculated < 0) return(-1);
//---
   limit = rates_total-prev_calculated;
   for(i = limit; i >= 0; i--)
   {
//--- indicator calculations
   }
   return(rates_total);
  }

Формальные параметры OnCalculate делают его более самодостаточным, кодеру не нужно полагаться на вызов всевозможных глобальных параметров, что, очевидно, в кругах oop считается плохим кодером, который получает пощечину. На практике нет особой разницы между использованием любого из них. Кроме того, OnCalculate такой же, как и в mql5, так что у вас есть возможность писать совместимый код.