SOS!!! Проблема с данными, подскажите, кто чем может.

 

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

int start()
{
  Alert("Point:",Point);  
  Alert("Размер свободных средств, необходимых для открытия 1 лота на покупку:",MarketInfo("EURUSD",MODE_MARGINREQUIRED));  
  Alert("Размер залоговых средств для поддержки открытых позиций в расчете на 1 лот:",MarketInfo("EURUSD",MODE_MARGINMAINTENANCE));  
  Alert("Начальные залоговые требования для 1 лота:",MarketInfo("EURUSD",MODE_MARGININIT));  
  Alert("Метод вычисления свопов. 0 - в пунктах; 1 - в базовой валюте инструмента; 2 - в процентах; 3 - в валюте залоговых средств:",MarketInfo("EURUSD",MODE_SWAPTYPE));
  Alert("Максимальный размер лота:",MarketInfo("EURUSD",MODE_MAXLOT));  
  Alert("Шаг изменения размера лота:",MarketInfo("EURUSD",MODE_LOTSTEP));
  Alert("Минимальный размер лота:",MarketInfo("EURUSD",MODE_MINLOT));
  Alert("Размер свопа для коротких позиций:",MarketInfo("EURUSD",MODE_SWAPSHORT));
  Alert("Размер свопа для длинных позиций:",MarketInfo("EURUSD",MODE_SWAPLONG));
  Alert("Минимальный шаг изменения цены инструмента в валюте котировки:",MarketInfo("EURUSD",MODE_TICKSIZE));
  Alert("Размер минимального изменения цены инструмента в валюте депозита:",MarketInfo("EURUSD",MODE_TICKVALUE));
  Alert("Размер контракта в базовой валюте инструмента:",MarketInfo("EURUSD",MODE_LOTSIZE));
  Alert("Минимально допустимый уровень стоп-лосса/тейк-профита в пунктах:",MarketInfo("EURUSD",MODE_STOPLEVEL));
  Alert("Спрэд в пунктах:",MarketInfo("EURUSD",MODE_SPREAD));
  Alert("Количество цифр после десятичного точки в цене инструмента:",MarketInfo("EURUSD",MODE_DIGITS));
  Alert("Размер пункта в валюте котировки:",MarketInfo("EURUSD",MODE_POINT));
  Alert("Максимальная дневная цена:",MarketInfo("EURUSD",MODE_HIGH));  
  Alert("Минимальная дневная цена:",MarketInfo("EURUSD",MODE_LOW));
}

Алерт вылетал с каждым новым тиком, иногда всё данные были в порядке, а проблема вот в чем, с регулярной периодичностью, данных либо просто не было, либо был 0. И причем речь идёт о важных показателях!!!

А что самое интересное, этот “советник” бы включен на РЕАЛЬНОМ счете.
А если бы он начал торговать используя “ошибочные” данные? Ужас…


Мысли, комментарии, может кто cталкивался с этим…

 
алерт дублирует в журнал. Покажите что он написал...
 
sergeev >>:
алерт дублирует в журнал. Покажите что он написал...

Посмотрел в терминале закладку "Эксперты". Там всё тоже самое, что и в окошке Алерта.

 
sergeev писал(а) >>
алерт дублирует в журнал. Покажите что он написал...

По приведенному коду свалял скрипт с заменой Alert() на Print() и получил в логе:

15:34:42 Compiling 'Yest'
15:34:42 Yest EURUSD,M15: loaded successfully
15:34:42 Yest EURUSD,M15: Point:0.00001
15:34:42 Yest EURUSD,M15: Размер свободных средств, необходимых для открытия 1 лота на покупку:287.29
15:34:42 Yest EURUSD,M15: Размер залоговых средств для поддержки открытых позиций в расчете на 1 лот:0
15:34:42 Yest EURUSD,M15: Начальные залоговые требования для 1 лота:0
15:34:42 Yest EURUSD,M15: Метод вычисления свопов. 0 - в пунктах; 1 - в базовой валюте инструмента; 2 - в процентах; 3 - в валюте залоговых средств:0
15:34:42 Yest EURUSD,M15: Максимальный размер лота:1
15:34:46 Yest EURUSD,M15: Шаг изменения размера лота:0.01
15:34:46 Yest EURUSD,M15: Минимальный размер лота:0.01
15:34:46 Yest EURUSD,M15: Размер свопа для коротких позиций:-1
15:34:46 Yest EURUSD,M15: Размер свопа для длинных позиций:-0.9
15:34:46 Yest EURUSD,M15: Минимальный шаг изменения цены инструмента в валюте котировки:0
15:34:46 Yest EURUSD,M15: Размер минимального изменения цены инструмента в валюте депозита:1
15:34:46 Yest EURUSD,M15: Размер контракта в базовой валюте инструмента:100000
15:34:46 Yest EURUSD,M15: Минимально допустимый уровень стоп-лосса/тейк-профита в пунктах:50
15:34:46 Yest EURUSD,M15: Спрэд в пунктах:13
15:34:46 Yest EURUSD,M15: Количество цифр после десятичного точки в цене инструмента:5
15:34:46 Yest EURUSD,M15: Размер пункта в валюте котировки:0
15:34:46 Yest EURUSD,M15: Максимальная дневная цена:1.4376
15:34:46 Yest EURUSD,M15: Минимальная дневная цена:1.4325

Есть, конечно, прибабахи. Как Print(), так и Alert() не выводят пятый знак вещественных чисел.

Поэтому первый оператор заменен на

Print("Point:",DoubleToStr(Point,5));
Теперь по поводу пропуска данных. Все данные попадают в Log, но могут отсутствовать при выводе на экран Alert() или при отладочной печати Print()

Это, по-видимому, связано с ограничением на размер буфера вывода. Скорость записи в буфер многократно превосходит скорость вывода на экран.

Данные для вывода на экран берутся из буфера вывода. Как только буфер заполняется, он сбрасывается в Log и буфер очищается.

 
Mislaid >>:

По приведенному коду свалял скрипт с заменой Alert() на Print() и получил в логе:

15:34:42 Compiling 'Yest'
15:34:42 Yest EURUSD,M15: loaded successfully
15:34:42 Yest EURUSD,M15: Point:0.00001
15:34:42 Yest EURUSD,M15: Размер свободных средств, необходимых для открытия 1 лота на покупку:287.29
15:34:42 Yest EURUSD,M15: Размер залоговых средств для поддержки открытых позиций в расчете на 1 лот:0
15:34:42 Yest EURUSD,M15: Начальные залоговые требования для 1 лота:0
15:34:42 Yest EURUSD,M15: Метод вычисления свопов. 0 - в пунктах; 1 - в базовой валюте инструмента; 2 - в процентах; 3 - в валюте залоговых средств:0
15:34:42 Yest EURUSD,M15: Максимальный размер лота:1
15:34:46 Yest EURUSD,M15: Шаг изменения размера лота:0.01
15:34:46 Yest EURUSD,M15: Минимальный размер лота:0.01
15:34:46 Yest EURUSD,M15: Размер свопа для коротких позиций:-1
15:34:46 Yest EURUSD,M15: Размер свопа для длинных позиций:-0.9
15:34:46 Yest EURUSD,M15: Минимальный шаг изменения цены инструмента в валюте котировки:0
15:34:46 Yest EURUSD,M15: Размер минимального изменения цены инструмента в валюте депозита:1
15:34:46 Yest EURUSD,M15: Размер контракта в базовой валюте инструмента:100000
15:34:46 Yest EURUSD,M15: Минимально допустимый уровень стоп-лосса/тейк-профита в пунктах:50
15:34:46 Yest EURUSD,M15: Спрэд в пунктах:13
15:34:46 Yest EURUSD,M15: Количество цифр после десятичного точки в цене инструмента:5
15:34:46 Yest EURUSD,M15: Размер пункта в валюте котировки:0
15:34:46 Yest EURUSD,M15: Максимальная дневная цена:1.4376
15:34:46 Yest EURUSD,M15: Минимальная дневная цена:1.4325

Есть, конечно, прибабахи. Как Print(), так и Alert() не выводят пятый знак вещественных чисел.

Поэтому первый оператор заменен на

Print("Point:",DoubleToStr(Point,5));
Теперь по поводу пропуска данных. Все данные попадают в Log, но могут отсутствовать при выводе на экран Alert() или при отладочной печати Print()

Это, по-видимому, связано с ограничением на размер буфера вывода. Скорость записи в буфер многократно превосходит скорость вывода на экран.

Данные для вывода на экран берутся из буфера вывода. Как только буфер заполняется, он сбрасывается в Log и буфер очищается.

Какой же вывод? Можно ли в советнике безусловно "доверять" этим данным или всё же стоит их обязательно проверять, есть они или нет?

 
Для этих целей служит специальная функция . Никто не мешает вам вызвать ее после . Если ошибки нет, то полученные данные можно использовать. Если ошибка есть, то обрабатывайте ошибку. Точно также нужно поступать со всеми данными, которые вы запрашиваете у терминала - iTime, iOpen, iClose и т. д.
 
EvGeniyLand писал(а) >>

Какой же вывод? Можно ли в советнике безусловно "доверять" этим данным или всё же стоит их обязательно проверять, есть они или нет?

Пока с такими проблемами не встречался.

На этапе отладки проверять надо всегда, сколько не лениво.

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

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