MetaTrader 4 Client Terminal build 646: Умный поиск, книги в Маркете и обновление окна параметров MQL4-программы - страница 14

 
Добавте пожалуйста инициализацию индикаторов при смене счета - очень не хватает!
 

У меня странно работает функция GlobalVariableTime()

Код:

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   GlobalVariableSet("Test",1);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   GlobalVariableGet("Test");
   Comment(TimeToString(GlobalVariableTime("Test"),TIME_DATE|TIME_MINUTES|TIME_SECONDS)+" | "+TimeToString(TimeCurrent(),TIME_DATE|TIME_MINUTES|TIME_SECONDS));
  }

Результат:

Билд №646

В МТ5 этот же код отрабатывает корректно.

 
stringo:

В соответствующем chr-файле найдите строчку Digits=4 (это значение прописывается для неизвестных системе инструментов). Поменяйте на нужное Вам.

Да, такой метод костылей работает, и на этом спасибо. Но если бы кол-во разрядов пункта подхватывало из hst файла, было бы значительно лучше.
 
chief2000:
В режиме тестирования с визуализацией на Всех Тиках в момент загрузки истории на графике становятся видны все бары (когда история загружена лишние удаляются) - если в этот момент загрузить индикатор то он видит всю историю=заглядывает в будущее, что неправильно.




Могу еще добавить: - если в шаблоне "tester.tpl" есть индикатор с "OBJ_ARROW, OBJ_trend, ... и др.", то будущие объекты при визуальном тестировании тоже видны.

Этот эффект наблюдаю давно, с 616-й сборки, но мне он не мешает, более того, если бы его иметь в реале ...(!!!)
 
AlexeyVik:
Используй OBJPROP_ANCHOR Положение точки привязки графического объекта и относительно этой точки координаты x y



Можно сделать и по вашему:

 ObjectCreate(TextLableName, OBJ_LABEL, win, 0, 0);
  ObjectSetInteger(0,TextLableName,OBJPROP_ANCHOR,ANCHOR_RIGHT_UPPER);
  ObjectSetInteger(0,TextLableName,OBJPROP_XDISTANCE,1863);
  ObjectSetInteger(0,TextLableName,OBJPROP_YDISTANCE,Y);
  ObjectSetText(TextLableName,Text,TextSize,FontName,TextColor);

Но! Когда надо изменить текст в этой метке, повторно делаем:

ObjectSetText(TextLableName,Text,TextSize,FontName,TextColor);

и если было

То после увеличения длинны текста в метке точка привязки остается на месте, хотя в свойствах объекта - верхний правый. А на деле не верхний правый.

Вот в этом и баг.

 
MrSoros:



Можно сделать и по вашему:

Но! Когда надо изменить текст в этой метке, повторно делаем:

и если было

То после увеличения длинны текста в метке точка привязки остается на месте, хотя в свойствах объекта - верхний правый. А на деле не верхний правый.

Вот в этом и баг.


Это не баг, а особенность реализации. В новых четвёрочных объектах типа Label - две точки, отвечающие за привязку, а не одна, как было раньше.

Если Вы создаёте объект вручную, то эти точки совпадают. Если Вы создаёте объект программно, то будьте добры управлять обеими точками: OBJPROP_ANCHOR и OBJPROP_CORNER

У нас на эту тему и пример есть OBJ_LABEL_Example

 

К вопросам по FileFlush. В MQL5 он должен работать, там поизучал скриптом (ниже). После записи каждой строки из 21 символа либо FileFlush, либо три операции: FileClose, FileOpen, FileSeek в конец файла.

Получил неожиданные результаты. FileFlush выполнялся от 25 миллисекунд и дольше. А тройка операций за время не выше 0.1 миллисекунды.

25 мс сильно не соответствует обычной оценке в 4-6 мс на ожидание полуоборота магнитной пластины.

Также и FileClose, о котором все говорят, что происходит сброс буферов на диск, то есть Flush, очевидно, не реализует запись на магнитную пластину. За 100 мкс в среднем это невозможно.

Поскольку перед этим поразбирался в системе команд интерфейса ATA (интерфейсы жестких дисков IDE, EIDE, SATA основаны на нем) и вообще не нашел как таковой команды сброса на магнитные пластины, теперь так представляю исполнение Flush: меняется режим работы диска сначала на работу без буферизации, затем возврат на работу с буферизацией. Такие команды в ATA есть. Они сложные, как я понимаю. Зато действительно прямо сейчас корректируется магнитная дорожка.

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

Разница, на первый взгляд, в уровне надежности. Однако известно, что уже в 2000 году буферы новых дисков в 4 Мб при отключении электропитания вполне надежно записывались на пластины за счет инерции вращения и накопленного в обкладках конденсаторов заряда. Сейчас, значит, и 64 Мб успевают записаться.

Вот так мне теперь кажется, для MQL5. Насколько я понимаю, в MQL4 разработчики пошли дальше, вообще убрав Flush.

#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
void OnStart() {
string S;
uint BegSTime; // Время начала работы в миллисекундах
double T; // Окончание в мс
int Fi, Le, k, N;
S="EURUSDX;EURUSD;EURUSD;\n";
Le=StringLen(S);
Fi=FileOpen ("flud",FILE_BIN|FILE_READ|FILE_WRITE|FILE_ANSI|FILE_SHARE_READ,0,CP_ACP); // если не было, создаст
FileSeek(Fi, 0, SEEK_END); // В конец файла
N=10; // Сколько раз пишем
BegSTime=GetTickCount(); // Время начала работы в миллисекундах
for (k=0;k<N;k++) {
  FileWriteString(Fi, S, Le);
  FileFlush(Fi); // Или эта строка, или три следующие
/*  FileClose(Fi);
  Fi=FileOpen ("flud",FILE_BIN|FILE_READ|FILE_WRITE|FILE_ANSI|FILE_SHARE_READ,0,CP_ACP);
  FileSeek(Fi, 0, SEEK_END); // В конец файла
*/ 
  }
FileClose(Fi);
T=GetTickCount()-BegSTime;
Print("FileFlush "+IntegerToString(N)+" раз за "+(string)T+" мс (по "+DoubleToString(T/N,3)+" мс)");
//Print("FileCloseOpenSeek "+IntegerToString(N)+" раз за "+(string)T+" мс (по "+DoubleToString(T/N,3)+" мс)");
}
 

Нельзя ли пошагово рассказать, что как должно происходить обновление?

В частности,

- на каком этапе,

- что означает,

- что должно происходить дальше

когда терминал запущен с флагом /skipupdate.

Спасибо.

 

Wine 1.6

Не работают ограничения на минимальный размер окна свойств пользовательского индикатора. Его можно уменьшить до нуля!

 

На строках типа:

if (FileReadStruct(hFile, buffer) < 0)

и

if (FileWriteStruct(hFile, buffer) < 0)

компилятор постоянно выдает предупреждения о том, что выражения всегда имеют результат false. То есть предполагается, что указанные функции не могут вернуть -1. Хотя в справке написано:

В случае удачи функция возвращает количество прочитанных (записанных) байт или -1 в случае ошибки.

Ошибка в справке, в компиляторе или в представленном коде?

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