Форум » Консультации по программированию » Point Возвращает размер пункта текущего инструмента в валюте котировки. » Ответить

Point Возвращает размер пункта текущего инструмента в валюте котировки.

Genry: День добрый, Коллеги! Игорь, подскажите, в Вашей практике встречалась ситуация, когда брокер возвращал 0 (нулевое значение) по обращении к предопределенной функции (или переменной ) Point ? При этом на 3-х значных котировках XAUUSD, USDJPY возвращает 0.001, а на 5-ти значных EurUSD, GBPusd - 0.00000 Брокер - Альпари. Подскажите, как лечить данный геморрой Написал кусок кода для проверки данной ситуации: //------------------------------------------------------------------------------- /* Документация на 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(" Значение Point у данного брокера: ", Point,", рассчетное значение Point ", dPoint); Alert(" Значение Digits у данного брокера: ", Digits); if (i == 3) check = false; i++; } return(0); }

Ответов - 8

hoz: Genry пишет: Игорь, подскажите, в Вашей практике встречалась ситуация, когда брокер возвращал 0 (нулевое значение) по обращении к предопределенной функции (или переменной ) Point ? Хотя я и не Игорь, но подскажу... У меня есть класс(базовый для решения базовых задач). Вот он: // 1.4 Функция гарантированного получения Point требуемого инструмента. =================================================================== double BaseInfo::GetPoint (string fs_Symbol = "") { double ld_Point = 0.0; //---- if (fs_Symbol == "") { fs_Symbol = _Symbol; } ld_Point = MarketInfo (fs_Symbol, MODE_POINT); //---- Если результата нет if (ld_Point == 0.0) { int li_Digits = (int) MarketInfo (fs_Symbol, MODE_DIGITS); if (li_Digits > 0) { ld_Point = 1.0 / MathPow (10, li_Digits); } } else { return (ld_Point); } //---- return (ld_Point); } Если что будет не понятно, спрашивайте. Отвечу. Но там, по сути, всё логично.

Genry: hoz пишет: Хотя я и не Игорь, но подскажу... У меня есть класс(базовый для решения базовых задач). Вот он: Если что будет не понятно, спрашивайте. Отвечу. Но там, по сути, всё логично. День добрый, hoz! Спасибо за участие в поиске решения данной проблемы. Неприятная ситуация , во многих советниках Point используется многократно. После запуска торговли сегодня ночью размер счета сократился с 1800 до 600 баксов и причина скорее всего вызвана этой ошибкой. Утром в пятницу все работало, а потом прошло автоматическое обновление метатрейдера от Альпари : был MT v4 билд 722, поменялся на MT версия 4 билд 735 от 17 октября 2014 . К сожалению и Ваш вариант проблемы не решил. У меня был подобный расчет: double dPoint = MathPow(10, -1*Digits); В Вашем варианте: ld_Point = 1.0 / MathPow (10, li_Digits); Я добавил эту функцию в тест: //----------------------------------- /* Документация на 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; double GetPoint (string fs_Symbol = "") { double ld_Point = 0.0; //---- if (fs_Symbol == "") { fs_Symbol = _Symbol; } ld_Point = MarketInfo (fs_Symbol, MODE_POINT); //---- Если результата нет if (ld_Point == 0.0) { int li_Digits = (int) MarketInfo (fs_Symbol, MODE_DIGITS); if (li_Digits > 0) { ld_Point = 1.0 / MathPow (10, li_Digits); } } else { return (ld_Point); } //---- return (ld_Point); } int start() { if (check) { Alert("Значение Digits у данного брокера: ", Digits); Alert("Инструмент: ", Symbol()," Значение Point у данного брокера: ", Point); Alert("Pассчетное значение Point вариант 1: ", dPoint); Alert("Вариант 2: ", GetPoint()); if (i == 1) check = false; i++; } return(0); //------------------------------------------------------------- Результат для Альпари Может Alert при распечатке режет разрядность? Или я что-то не так вызываю

Genry: Обновил версию МТ на билд 745 с сайта метаквотов, ситуация не изменилась


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; double GetPoint (string fs_Symbol = "") { double ld_Point = 0.0; //---- if (fs_Symbol == "") { fs_Symbol = _Symbol; } ld_Point = MarketInfo (fs_Symbol, MODE_POINT); //---- Если результата нет if (ld_Point == 0.0) { int li_Digits = (int) MarketInfo (fs_Symbol, MODE_DIGITS); if (li_Digits > 0) { ld_Point = 1.0 / MathPow (10, li_Digits); } } else { return (ld_Point); } //---- return (ld_Point); } 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); }

hoz: Genry пишет: Разобрался В итоге все так и оказалось - дело в выводе значения. Сделайте, раз и навсегда библиотеку, которая будет переводить значения из одного типа в другой. У меня подобне уже пройдено. И будете спокойно при выводе видеть, то что есть на самом деле. Это хоть и просто, но я сам ни раз мудохался в подобных ситуациях. Хотя проблема крылась в подобных примитивных моментах. Genry пишет: Тогда не понятно, почему после обновления МТ изменилась работа советника. Значит код у Вас, где-то не совсем универсальный. Хотя и у метаквотов косяков хватает. Как оказалось, на выходных бывает не работает отладчик Это уже совсем не логично. Но было замечено, что такое бывает.

Scriptong: Пока что с нулевыми значениями Point не сталкивался, но в последних своих разработках использую проверку этого значения на старте программы, т. к. на него впоследствии приходится делить. В итоге, если Point равен нулю, то считаю такое поведение терминала неправильным и выгружаю программу: double g_point; int OnInit() { g_point = Point; if (g_point == 0) { Alert(WindowExpertName(), ": фатальная ошибка терминала - пункт равен нулю. Индикатор/советник отключен."); return INIT_FAILED; } return INIT_SUCCEEDED; } void OnTick() { ... int pointsAmount = (int)MathRound((price1 - price2) / g_point); ... } Заметьте, что повсюду в программе используется g_point, а не Point. Значение g_point определяется всего один раз на старте программы и, соответственно, один раз проверяется. Если оно равно нулю, то программа не запустится. Если же запустились, то g_point содержит корректное значение. На него можно даже делить.

Genry: Scriptong пишет: В итоге, если Point равен нулю, то считаю такое поведение терминала неправильным и выгружаю программу: Игорь, значит лучше разобраться с ситуацией почему одна из базовых переменных = 0, а не подменять способ расчета?

Scriptong: Genry пишет: Игорь, значит лучше разобраться с ситуацией почему одна из базовых переменных = 0, а не подменять способ расчета? На мой взгляд, да. Это фундаментальная величина для работы программы. И если терминал возвращает 0, то что-то не так с терминалом, и, скорее всего, проблема его нестабильной работы может проявиться и в других ситуациях. Хотя "разобраться" звучит чересчур оптимистично. Мы ведь не разработчики терминала



полная версия страницы