Сообщение: 869
Зарегистрирован: 04.03.13
Откуда: Москва
Репутация:
2
Отправлено: 27.10.14 11:03. Заголовок: Point Возвращает размер пункта текущего инструмента в валюте котировки.
День добрый, Коллеги!
Игорь, подскажите, в Вашей практике встречалась ситуация, когда брокер возвращал 0 (нулевое значение) по обращении к предопределенной функции (или переменной ) Point ?
При этом на 3-х значных котировках XAUUSD, USDJPY возвращает 0.001, а на 5-ти значных EurUSD, GBPusd - 0.00000
Брокер - Альпари. Подскажите, как лечить данный геморрой
Написал кусок кода для проверки данной ситуации: //------------------------------------------------------------------------------- /* Документация на MQL4 http://docs.mql4.com/ru/predefined/pointvar
double Point
Размер пункта текущего инструмента в валюте котировки.
bool check = true; int i; double dPoint = MathPow(10, -1*Digits); // для 5-ти знака 0.00001;
int start() { if (check) { Alert(" Значение Point у данного брокера: ", Point,", рассчетное значение Point ", dPoint); Alert(" Значение Digits у данного брокера: ", Digits); if (i == 3) check = false; i++; } return(0); }
Игорь, подскажите, в Вашей практике встречалась ситуация, когда брокер возвращал 0 (нулевое значение) по обращении к предопределенной функции (или переменной ) Point ?
Хотя я и не Игорь, но подскажу... У меня есть класс(базовый для решения базовых задач). Вот он:
Сообщение: 870
Зарегистрирован: 04.03.13
Откуда: Москва
Репутация:
2
Отправлено: 27.10.14 13:40. Заголовок: hoz пишет: Хотя я и..
hoz пишет:
цитата:
Хотя я и не Игорь, но подскажу... У меня есть класс(базовый для решения базовых задач). Вот он: Если что будет не понятно, спрашивайте. Отвечу. Но там, по сути, всё логично.
День добрый, hoz!
Спасибо за участие в поиске решения данной проблемы. Неприятная ситуация
Может Alert при распечатке режет разрядность? Или я что-то не так вызываю
Сообщение: 874
Зарегистрирован: 04.03.13
Откуда: Москва
Репутация:
2
Отправлено: 27.10.14 16:17. Заголовок: Genry пишет: Может ..
Genry пишет:
цитата:
Может Alert при распечатке режет разрядность?
Разобрался В итоге все так и оказалось - дело в выводе значения. Тогда не понятно, почему после обновления МТ изменилась работа советника.
Вот так работают все 3 варианта: /* Документация на MQL4 http://docs.mql4.com/ru/predefined/pointvar double Point Размер пункта текущего инструмента в валюте котировки. См. также MarketInfo(). Пример: OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,NormalizeDouble(Ask+TakeProfit*Point,Digits)); */
bool check = true; int i; double dPoint = MathPow(10, -1*Digits); // для 5-ти знака 0.00001;
int start() { if (check) { Alert("Значение Digits у данного брокера: ", Digits); Alert("Инструмент: ", Symbol()," Значение Point у данного брокера: ", DoubleToStr(Point, Digits)); // Point); Alert("Pассчетное значение Point вариант 1: ", DoubleToStr(dPoint, Digits)); // dPoint); Alert("Вариант 2: ", DoubleToStr(GetPoint(), Digits)); // GetPoint()); if (i == 1) check = false; i++; } return(0); }
Разобрался В итоге все так и оказалось - дело в выводе значения.
Сделайте, раз и навсегда библиотеку, которая будет переводить значения из одного типа в другой. У меня подобне уже пройдено. И будете спокойно при выводе видеть, то что есть на самом деле. Это хоть и просто, но я сам ни раз мудохался в подобных ситуациях. Хотя проблема крылась в подобных примитивных моментах.
Genry пишет:
цитата:
Тогда не понятно, почему после обновления МТ изменилась работа советника.
Значит код у Вас, где-то не совсем универсальный. Хотя и у метаквотов косяков хватает. Как оказалось, на выходных бывает не работает отладчик Это уже совсем не логично. Но было замечено, что такое бывает.
Отправлено: 27.10.14 17:10. Заголовок: Пока что с нулевыми ..
Пока что с нулевыми значениями Point не сталкивался, но в последних своих разработках использую проверку этого значения на старте программы, т. к. на него впоследствии приходится делить. В итоге, если Point равен нулю, то считаю такое поведение терминала неправильным и выгружаю программу:
цитата:
double g_point; int OnInit() { g_point = Point; if (g_point == 0) { Alert(WindowExpertName(), ": фатальная ошибка терминала - пункт равен нулю. Индикатор/советник отключен."); return INIT_FAILED; }
Заметьте, что повсюду в программе используется g_point, а не Point. Значение g_point определяется всего один раз на старте программы и, соответственно, один раз проверяется. Если оно равно нулю, то программа не запустится. Если же запустились, то g_point содержит корректное значение. На него можно даже делить.
Игорь, значит лучше разобраться с ситуацией почему одна из базовых переменных = 0, а не подменять способ расчета?
На мой взгляд, да. Это фундаментальная величина для работы программы. И если терминал возвращает 0, то что-то не так с терминалом, и, скорее всего, проблема его нестабильной работы может проявиться и в других ситуациях. Хотя "разобраться" звучит чересчур оптимистично. Мы ведь не разработчики терминала
Все даты в формате GMT
2 час. Хитов сегодня: 1
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет