Предварительный билд терминала MetaTrader 4: Новый умный поиск, книги в Маркете и обновление окна параметров MQL4-программы - страница 8

 
И еще по свойству OBJPROP_YSIZE у объекта OBJ_LABEL. Если объект создается программно и сразу же по нему читается свойство OBJPROP_YSIZE - возвращается 0. Через какое-то время размер возвращается нормально. Т.е. например если по щелчку мыши на объекте "A" создается объект "B" (OBJ_LABEL) и сразу же проверяется свойство OBJPROP_YSIZE - получаем 0. По еще одному щелчку мыши на объекте "A" - размер объекта "B" уже возвращается нормально.
 
Zhunko:

Прикрепил известный индикатор новостей. До 509 работал и не только у меня.

Сейчас адаптировал его под 625.

Вывод на печать символов в строке 175 сразу после чтения файла.

Посмотрите файл "News.csv" (создаётся после запуска индикатора) в HEX-редакторе. Там видны все комбинации символов - "\r\n". После чтения, взамен, появляются символы "rn".

05:14:06 News_3 EURUSD,M5: 68 117
05:14:06 News_3 EURUSD,M5: 69 115
05:14:06 News_3 EURUSD,M5: 70 10
05:14:06 News_3 EURUSD,M5: 71 83

05:14:06 News_3 EURUSD,M5: 72 117
05:14:06 News_3 EURUSD,M5: 73 110
05:14:06 News_3 EURUSD,M5: 74 32
05:14:06 News_3 EURUSD,M5: 75 65
05:14:06 News_3 EURUSD,M5: 76 112

Этот код работал в воскресение, когда не было котировок! Запустил в понедельник, когда котировки пошли, перестал правильно читать файл.

Это совсем непонятно. Какая связь?...

============================

Посмотрел внимательно... Оказывается, символы "\r" и "\n" после чтения произвольно меняется на какой-нибудь другой!

Разобрался! Комбинация "\r\n" заменяется на "\n"! Зачем?

Повторю вопрос - Зачем?

Там же есть макрос с параметром. Как-то странно этот параметр обрабатывается компилятором. В С++ можно имя параметра любое вставить. Потом оно подменяется переменной. Тут же, в MQL, только то, которое используется в коде. Т.е. только имя переменной.

 

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

Простой код советника, который при размещении должен нарисовать линию на графике. И рисует, но не в тестере. В тестере почему-то выдаёт ошибку 4202 ERR_OBJECT_DOES_NOT_EXIST. Конечно does not exist, потому я его и создаю. :) Что ему надо?

#property strict

int OnInit()
{
        ResetLastError();
        
        if(ObjectCreate(ChartID(), "Line", OBJ_HLINE, 0, 0, Bid) == false)
        {
                Print("Error code: ", IntegerToString(GetLastError()));
                return(INIT_FAILED);
        }
        
        return(INIT_SUCCEEDED);
}

void OnTick()
{

}
 
Sergey_Mechanic:

Вот ещё проблемка - не рисуются объекты в тестере. Причём я не знаю, было ли такое раньше, или только в последних билдах появислоь, т.к. никогда не делал этого раньше, как-то не доводилось. Вот простой код советника - при размещении должен нарисовать линию на графике. И рисует, но не в тестере. В тестере почему-то выдаёт ошибку 4202 ERR_OBJECT_DOES_NOT_EXIST. Конечно does not exist, потому я его и создаю. :) Что ему надо?

А если

if(ObectFind(бла-бла-бла)<0) ObjectCteate(бла-бла-бла)

 
artmedia70:

А если

if(ObectFind(бла-бла-бла)<0) ObjectCteate(бла-бла-бла)



При чём здесь это? Когда запускем визуализацию, понятно, что никаких объектов на графике ещё нет. Собственно, и ошибка сообщает об этом же. Почему-то.
 
Sergey_Mechanic:

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

Вам ехать? Или шашечки? Если ехать, то делайте. Если шашечки, то ждите ответа разработчиков.

У меня в тестере работает и в OnInit() и в OnTick(). Не нужно - звиняйте.

 

Мне линию нарисовать. Если у вас рисует - покажите свой код, если не жалко.

ЗЫ. Добавил я сейчас в код эту проверку. Естественно, ничего не изменилось.

 
Sergey_Mechanic:

Мне линию нарисовать. Если у вас рисует - покажите свой код, если не жалко.

ЗЫ. Добавил я сейчас в код эту проверку. Ничего не изменилось, как и ожидалось.

//+----------------------------------------------------------------------------+
void SetHLine(color cl, string nm="", double p1=0, int st=0, int wd=1) {
   if (ObjectFind(nm)<0) ObjectCreate(nm, OBJ_HLINE, 0, 0, 0);
   ObjectSet(nm, OBJPROP_PRICE1, p1);
   ObjectSet(nm, OBJPROP_COLOR , cl);
   ObjectSet(nm, OBJPROP_STYLE , st);
   ObjectSet(nm, OBJPROP_WIDTH , wd);
}
//+----------------------------------------------------------------------------+
 
alxm:
Некорректно работает функция ChartXYToTimePrice. Если координата X находится слева от нулевого бара на графике - то координаты преобразуются как и положено. А если координата X находится справа от нулевого бара - функция возвращает ошибку 4051 (Недопустимое значение параметра функции)


Я уже про это то же писал:

Не верный возврат времени

Errors, MetaTrader 4, Открыта, Начата: 2014.01.13 13:59, #928691

//+------------------------------------------------------------------+
//|                                                         Test.mq4 |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
int zz=0;
double x=0;
datetime y=0;
long shirina;
void OnInit(){Comment("");}
void OnTick()
  {
ChartGetInteger(0,CHART_WIDTH_IN_PIXELS ,0,shirina);
ChartXYToTimePrice(0,int(shirina-50),100,zz,y,x); 

Comment(shirina," ",shirina-50," ",y," ",x);

Но к сожалению че то не как,

Ренат обратите на это внимание, если зона х и у координат находятся в видимом диапазоне а так же дата и время по шкале находятся в видимом диапазоне то

ChartXYToTimePrice Все таки должна возвращать координаты х и у при их запросе из под видимого времени и наоборот...

Даже если это видимое время еще не наступило !

 
artmedia70:



Ваш вариант работает, спасибо за наводку. Но дело, конечно же, не в проверке наличия объекта, которого заведомо нет. Есть два варианта функции ObjectCreate() - с указанием ChartID и без него. В моём коде первый вариант, в вашем - второй. В тестере, как выяснилось, работает только второй вариант.

#property strict

int OnInit()
{
        ResetLastError();
        
        if(ObjectCreate("Line", OBJ_HLINE, 0, 0, Bid) == false)
        {
                Print("Error code: ", IntegerToString(GetLastError()));
                return(INIT_FAILED);
        }
        
        return(INIT_SUCCEEDED);
}

void OnTick()
{

}