АвторСообщение
постоянный участник




Сообщение: 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

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

См. также 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);
}


С уважением! Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 8 [только новые]







Сообщение: 25
Зарегистрирован: 30.05.13
Репутация: 0
ссылка на сообщение  Отправлено: 27.10.14 12:15. Заголовок: Genry пишет: Игорь,..


Genry пишет:

 цитата:
Игорь, подскажите, в Вашей практике встречалась ситуация, когда брокер возвращал 0 (нулевое значение)
по обращении к предопределенной функции (или переменной ) Point ?


Хотя я и не Игорь, но подскажу...
У меня есть класс(базовый для решения базовых задач). Вот он:

Скрытый текст

Если что будет не понятно, спрашивайте. Отвечу. Но там, по сути, всё логично.

Спасибо: 1 
ПрофильЦитата Ответить
постоянный участник




Сообщение: 870
Зарегистрирован: 04.03.13
Откуда: Москва
Репутация: 2
ссылка на сообщение  Отправлено: 27.10.14 13:40. Заголовок: hoz пишет: Хотя я и..


hoz пишет:

 цитата:
Хотя я и не Игорь, но подскажу... У меня есть класс(базовый для решения базовых задач). Вот он:
Если что будет не понятно, спрашивайте. Отвечу. Но там, по сути, всё логично.



День добрый, hoz!

Спасибо за участие в поиске решения данной проблемы.
Неприятная ситуация

Может Alert при распечатке режет разрядность? Или я что-то не так вызываю


С уважением! Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Сообщение: 871
Зарегистрирован: 04.03.13
Откуда: Москва
Репутация: 2
ссылка на сообщение  Отправлено: 27.10.14 14:40. Заголовок: Обновил версию МТ на..


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

С уважением! Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Сообщение: 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;

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);
}

С уважением! Спасибо: 0 
ПрофильЦитата Ответить





Сообщение: 26
Зарегистрирован: 30.05.13
Репутация: 0
ссылка на сообщение  Отправлено: 27.10.14 20:09. Заголовок: Genry пишет: Разобр..


Genry пишет:

 цитата:
Разобрался В итоге все так и оказалось - дело в выводе значения.


Сделайте, раз и навсегда библиотеку, которая будет переводить значения из одного типа в другой. У меня подобне уже пройдено. И будете спокойно при выводе видеть, то что есть на самом деле. Это хоть и просто, но я сам ни раз мудохался в подобных ситуациях. Хотя проблема крылась в подобных примитивных моментах.

Genry пишет:

 цитата:
Тогда не понятно, почему после обновления МТ изменилась работа советника.


Значит код у Вас, где-то не совсем универсальный. Хотя и у метаквотов косяков хватает. Как оказалось, на выходных бывает не работает отладчик Это уже совсем не логично. Но было замечено, что такое бывает.

Спасибо: 1 
ПрофильЦитата Ответить





Сообщение: 882
Зарегистрирован: 03.03.13
Откуда: Украина, Днепродзержинск
Репутация: 2
ссылка на сообщение  Отправлено: 27.10.14 17:10. Заголовок: Пока что с нулевыми ..


Пока что с нулевыми значениями 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 содержит корректное значение. На него можно даже делить.

Спасибо: 1 
ПрофильЦитата Ответить
постоянный участник




Сообщение: 875
Зарегистрирован: 04.03.13
Откуда: Москва
Репутация: 2
ссылка на сообщение  Отправлено: 27.10.14 17:30. Заголовок: Scriptong пишет: В ..


Scriptong пишет:

 цитата:
В итоге, если Point равен нулю, то считаю такое поведение терминала неправильным и выгружаю программу:



Игорь, значит лучше разобраться с ситуацией почему одна из базовых переменных = 0, а не подменять способ расчета?

С уважением! Спасибо: 0 
ПрофильЦитата Ответить





Сообщение: 884
Зарегистрирован: 03.03.13
Откуда: Украина, Днепродзержинск
Репутация: 2
ссылка на сообщение  Отправлено: 27.10.14 17:36. Заголовок: Genry пишет: Игорь,..


Genry пишет:

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


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

Спасибо: 1 
ПрофильЦитата Ответить
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  2 час. Хитов сегодня: 1
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет