Обновление платформы MetaTrader 4 билд 625: Журналы в MetaTrader Market и новый MetaViewer - страница 39

 

После обновления терминала функция GetWindowTextW(cm,fs,nMaxCount) стала выдавать пустую строку.

Длину строки через определяет GetWindowTextLengthW(cm) определяет четко, а вот саму строку не определяет(

Может какие то проблемы с кодировками?

 

Проблема решена) Нужно было поставить & в определении функции

int GetWindowTextW(int hWnd,string &lpString,int nMaxCount);

 
AlexeyVik:

Господа разработчики, а сложно-ли сделать возможность сохранения в свойствах графика пользовательскую цветовую схему?


Шаблон, профиль, это всё понятно. Но шаблон сохраняет всё что есть на графике. Индикаторы, советник и все графические объекты, которые не всегда нужны на другом графике и наоборот, в шаблоне нет графики, а изменить цветовую схему хочется сохранив графику и индикаторы с настройками...

Вот пример необходимости:

Чтобы не утруждать себя многие выкладывают сет-файлы в которых как раз и присутствуют все индикаторы и графические элементы... чтобы изменить цветовую схему на привычную себе, сохранив настройки индикаторов и графику, другого способа как переставить все 11 настроек нет, а хотелось-бы.

Если это не сложно...


+100% ЗА! Очень бы хотелось иметь эту опцию! Было бы очень удобно при открытии нового графика не терять время на эту рутину!
 
Batman:

Из билда в билд переходит нелогичная работа выставления мышью стоплосса в безубыток:

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

... modification of order #1365694943 sell 0.10 EURUSD at 1.37567 sl: 0.00000 tp: 0.00000 -> sl: 0.00000 tp: 1.37541 failed [Invalid S/L or T/P]

Почему такое логичное действие вызывает ошибку???

Почему для выставления стоплосса в безубыток нужно сначала выставить стоплосс выше цены открытия и лишь затем перетянуть его на нужный уровень?

Ошибка возникает потому, что терминал пытается вместо стоплосса установить тейкпрофит выше текущей цены.

Давно уже пора откорректировать этот момент, ориентируясь при выставлении стоплосса/тейкпрофита не на его положение относительно цены открытия, а относительно ТЕКУЩЕЙ ЦЕНЫ. В таком случае и ошибки не будет и выставление безубытка будет производиться в одно действие, а не в два.


Уважаемые разработчики, выскажите, пожалуйста, свою позицию по указанному почти десять страниц назад недостатку работы терминала. Совсем ведь не трудно внести эту маленькую поправочку...
 

Объект Button абсолютно неработоспособен.

При смене ТФ сбрасывается состояние, не считывается свойство нажата/отжата и т.д.

Планируется ли исправлять в ближайших билдах?

 
При смене таймфрейма вызываются функции OnDeinit() и OnInit(), соответственно все объекты в ДеИните удаляются, а в ОнИните создаются вновь. Так и должно быть. Если вам нужно, чтобы кнопка сохранялась при смене таймфрейма, проверяйте причины вызова этих функций с помощью UninitializeReason().
 
Sergey_Mechanic:
При смене таймфрейма вызываются функции OnDeinit() и OnInit(), соответственно все объекты в ДеИните удаляются, а в ОнИните создаются вновь. Так и должно быть. Если вам нужно, чтобы кнопка сохранялась при смене таймфрейма, проверяйте причины вызова этих функций с помощью UninitializeReason().

Соглашусь частично по поводу инициализации, хотя по моему мнению, если явно не задается значение свойства в инициализации, то было бы логичным сохранить прежнее состояние, как это делается с другими графическими объектами. Тем не менее, считывание свойства не работает вообще, то есть как раз та функция, для которой и предназначен объект не работает.
 

Какое "прежнее"? )) Советник запускается с нуля! Прошла инициализация - как заново родился, никаких "прежних" значений нет. Но на это можно повлиять, прошлая жизнь таки возможна. )

Со считыванием свойств тоже всё в порядке.

PS. Вот, не поленился, написал игрушку. ) Рисует на графике кнопку, которую нажимать нельзя. Если нажмёте, она вас обматерит и выключится на 10 секунд. Попробуйте попереключать при этом таймфреймы, посмотрите, как изменится поведение кнопки. Уверяю вас, никак не изменится. Она этого даже не заметит. А всё дело в ДеИнит, обратите на неё внимание.

#property strict

// Инициализация
int OnInit()
{
   if(ObjectFind(ChartID(), "Button") == -1)
   {
      ObjectCreate(ChartID(), "Button", OBJ_BUTTON, 0, 0, 0);
      
      ObjectSetInteger(ChartID(), "Button", OBJPROP_CORNER, 1);
      ObjectSetInteger(ChartID(), "Button", OBJPROP_XDISTANCE, 180);
      ObjectSetInteger(ChartID(), "Button", OBJPROP_YDISTANCE, 20);
      ObjectSetInteger(ChartID(), "Button", OBJPROP_XSIZE, 100);
      ObjectSetInteger(ChartID(), "Button", OBJPROP_YSIZE, 20);
      ObjectSetString (ChartID(), "Button", OBJPROP_TEXT, "Не нажимай!");
      ObjectSetInteger(ChartID(), "Button", OBJPROP_COLOR, clrBlack);
      ObjectSetInteger(ChartID(), "Button", OBJPROP_SELECTABLE, false);
      ObjectSetInteger(ChartID(), "Button", OBJPROP_HIDDEN, true);
      ObjectSetInteger(ChartID(), "Button", OBJPROP_ZORDER, 0);
      ObjectSetInteger(ChartID(), "Button", OBJPROP_STATE, false);
   }
   
   return(INIT_SUCCEEDED);
}

// Деинициализация
void OnDeinit(const int reason)
{
   // не удаляем кнопку и таймер при смене таймфрейма
   if(reason != REASON_CHARTCHANGE)
   {
      ObjectDelete(ChartID(), "Button");
      EventKillTimer();
   }
}

// Обработчик нажатия кнопки
void OnChartEvent(const int id, const long & lparam, const double & dparam, const string & sparam)
{
   if(id == CHARTEVENT_OBJECT_CLICK && sparam == "Button")
   {
      // Кнопка нажата
      if(ObjectGetInteger(ChartID(), "Button", OBJPROP_STATE) == true)
      {
         MessageBox("Не нажимай, говорю!\nДеактивируюсь на 10 секунд...");
         EventSetTimer(10);
      }
      else
      {
         // Нефиг нажимать, пока неактивна
         ObjectSetInteger(ChartID(), "Button", OBJPROP_STATE, true);
      }
   }
}

// Таймер деактивации кнопки
void OnTimer()
{
   ObjectSetInteger(ChartID(), "Button", OBJPROP_STATE, false);
   WindowRedraw();
   EventKillTimer();
}
 
Sergey_Mechanic:

Какое "прежнее"? )) Советник запускается с нуля! Прошла инициализация - как заново родился, никаких "прежних" значений нет. Но на это можно повлиять, прошлая жизнь таки возможна. )

Со считыванием свойств тоже всё в порядке.

PS. Вот, не поленился, написал игрушку. ) Рисует на графике кнопку, которую нажимать нельзя. Если нажмёте, она вас обматерит и выключится на 10 секунд. Попробуйте попереключать при этом таймфреймы, посмотрите, как изменится поведение кнопки. Уверяю вас, никак не изменится. Она этого даже не заметит. А всё дело в ДеИнит, обратите на неё внимание.


А вот так не пашет. По идее должен выводить состояние кнопки и при смене ТФ сохранять состояние.

bool stt; //состояние кнопки;

int init()
 {
 
 ObjectCreate(0,"BTTN",OBJ_BUTTON,0,0,0);
 ObjectSetInteger(0,"BTTN",OBJPROP_CORNER,0);   
 ObjectSetInteger(0,"BTTN",OBJPROP_XDISTANCE,20);      
 ObjectSetInteger(0,"BTTN",OBJPROP_YDISTANCE,30);  
 ObjectSetString(0,"BTTN",OBJPROP_FONT,"Arial Black");
 ObjectSetInteger(0,"BTTN",OBJPROP_FONTSIZE,8); 
 ObjectSetInteger(0,"BTTN",OBJPROP_COLOR,Black);
 ObjectSetInteger(0,"BTTN",OBJPROP_BGCOLOR,DarkGray);
 ObjectSetInteger(0,"BTTN",OBJPROP_STATE,stt);
 ObjectSetString(0,"BTTN",OBJPROP_TEXT,"Press");  
 return(0);
 }

int start()
  {
   stt=ObjectGetInteger(0,"ВТТN",OBJPROP_STATE);
   Comment("State=",stt); 
   return(0);
  }
 
int deinit()
  {
   stt=ObjectGetInteger(0,"ВТТN",OBJPROP_STATE); 
   ObjectDelete(0,"BTTN");
   return(0);                      
  }
  


 
krubb:


А вот так не пашет. По идее должен выводить состояние кнопки и при смене ТФ сохранять состояние.



Да, тут не могу сообразить, в чём дело. Генерирует ошибку 4202 - ERR_OBJECT_DOES_NOT_EXIST, хотя объект есть. Непонятно.
Причина обращения: