Скачать MetaTrader 5

Не работает MarketInfo в тестере.

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Shaitan
209
Shaitan 2009.03.24 19:22 

Здравствуйте, господа!
Встречайте новичка (в MQ4). Профессиональный программист на C/C++.
Пытаюсь разобраться с механическими торговыми системами. Во всех явлениях честно пытался разобраться самостоятельно, пока не столкнулся с тем, что мне оказалось не подвластно.
Суть задачи следующая. Компонента money management должна расчитывать объём сделки исходя из уровня текущей свободной маржи. Эту задачу я успешно решил при помощи любезно предоставленного здесь сотрудниками MQ кода для обратной задачи - расчёт маржи, требующейся на один лот. Написанный мной код замечательно работает на демо-счёте. Однако при тестировании в терминале на тех валютных парах, которые не содержат валюты счёта (кросс-пары), код не работает вообще. Причина, как выяснилось, в том, что не работает вызов функции MarketInfo(base, MODE_BID), где base - промежуточная валютная пара, необходимая для пересчёта лота основной валюты рабочей пары в валюту торгового счёта. Чтобы проще понять, можно заглянуть в функцию MarginCalculate по приведённой мной сцылке. На пальцах - если я работаю в валютной паре EUR/CHF, а счёт в баксах, то чтобы определить маржу на один лот EUR, мне нужно узнать текущий курс EUR/USD, что я и делаю вызовом MarketInfo("EURUSD", MODE_BID). Именно этот вызов на тестировании не работает. Он всегда даёт 0.
Но ведь сам тестер исправно считает прибыль/убыток по каждой сделке. Понятно, что тестер работает неточно, он не будет лопатить всю хистори по второй валютной паре. Экспериментально же можно увидеть, что для своей внутренней работы тестер просто берёт текущий курс. Ну и ладно бы с ним, пусть текущий. Ну так отдай же мне этот самый текущий курс на мой вызов MarketInfo!

Что делать?

Как мне сделать расчёт маржи по кросс-паре, чтобы он адекватно работал в тестере?

Вариант "вбить курс ручками" понимаю, но это плохое решение. Прежде всего, на мультивалютном советнике мне надо вбивать несколько разных курсов. Потом, они постоянно меняются, - значит сегодня мне надо вбить одни промежуточные курсы для тестирования, завтра другие. В-третьих, надо портить код самого советника, пичкая его проверками if ( IsTesting() ), да не одной, а целой кучей.

Rashid Umarov
Админ
11988
Rashid Umarov 2009.03.24 20:36  
Читали ли Вы статью 'Особенности и ограничения тестирования торговых стратегий в MetaTrader 4'? Есть ли у Вас история по нужному кросс-курсу на момент тестирования?
Rustamzhan Salidzhanov
7688
Rustamzhan Salidzhanov 2009.03.24 20:37  
вызывайте iSlose("EURUSD",0,0); что даст то же значение Bid на нужной вам паре
MOLET
531
MOLET 2009.03.24 21:45  
xrust писал(а) >>
вызывайте iSlose("EURUSD",0,0); что даст то же значение Bid на нужной вам паре
iClose("EURUSD",0,0);
Rustamzhan Salidzhanov
7688
Rustamzhan Salidzhanov 2009.03.24 21:47  
MOLET писал(а) >>

Ну очяпятка вышла :)

Shaitan
209
Shaitan 2009.03.25 00:38  
Rosh писал(а) >>
Читали ли Вы статью 'Особенности и ограничения тестирования торговых стратегий в MetaTrader 4'? Есть ли у Вас история по нужному кросс-курсу на момент тестирования?

История подгружена и по рабочей паре и по всем курсам с базовой валютой. Статью читал. В ней есть только одна отсылка к функции MarketInfo:

Использование функции MarketInfo формирует ошибку ERR_FUNCTION_NOT_ALLOWED_IN_TESTING_MODE(4059), однако выдается корректная информация о текущих ценах тестируемого символа, о размере уровней стопов, размере пункта, размере спреда любого символа, присутствующего в окне котировок.

Из этой строки вроде бы не следует, что данный вызов работать не должен.

> iClose("EURUSD",0,0);

Хрен там. Такой способ работает, но при более детальной разборке оказывается, что плохо. Для проверки работы открываю позицию на всю маржу (естественно, округляю до LOT_STEP вниз). Там, где курс базовой валюты ниже текущего (а по EUR/USD он почти везде ниже), получаю ошибку 134 - не хватает маржи. Граничных ошибок нет, - при накидывании скрипта на любое окно с вычислением объёма и проверкой маржи по AccountFreeMarginCheck проверка всегда проходит успешно.

Вывод. В терминале маржиметр работает только по текущему курсу базовой валюты, а не по истории.

Вопрос продолжает быть актуальным.

Vasiliy Smirnov
12343
Vasiliy Smirnov 2009.03.25 00:42  
Да тестер глючит по полной и MarketInfo тоже.
vvavva
463
vvavva 2009.03.25 06:06  
Rosh писал(а) >>
Читали ли Вы статью 'Особенности и ограничения тестирования торговых стратегий в MetaTrader 4'? Есть ли у Вас история по нужному кросс-курсу на момент тестирования?

хотелось бы чтоб индикатор при тестировании имел доступ к инфе что и советник(Bid,MarketInfo, и т.д.)!?

Slava
Модератор
6913
Slava 2009.03.25 09:19  

Сколько можно повторять и писать? MarketInfo в тестере не работает! За исключением только нескольких запросов.

Левитин Сергей В.
5163
Левитин Сергей В. 2009.03.25 09:54  
stringo писал(а) >>

MarketInfo в тестере не работает!

Ну так этож плохо) Вот и спрашивают, в надежде, что надоест отвечать, и сделаете, что бы работал)

Slava
Модератор
6913
Slava 2009.03.25 10:07  
Figar0 писал(а) >>

Ну так этож плохо) Вот и спрашивают, в надежде, что надоест отвечать, и сделаете, что бы работал)

А как он будет работать, если соседние символы не моделируются? А если соседние символы моделируются, то тут же и портфельное тестирование рядышком лежит. А для четвёрки это слишком серьёзное изменение, связанное с полной сменой архитектуры тестера.

123
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий