Скачал историю с Alpari - Data Bank, конвертнул период_конвертером, тестирую...
Эксперт открывает позицию:
void OpenBuy() { double _OpenPriceLevel, _StopLossLevel, _TakeProfitLevel; _OpenPriceLevel = NormalizeDouble( Ask, _Digits ); _StopLossLevel = ExtremumStopLoss_value; if ( ( _OpenPriceLevel - _StopLossLevel )/_Point > SSL1 ) { _StopLossLevel = NormalizeDouble( _OpenPriceLevel - SSL1*_Point, _Digits ); } if ( TakeProfit > 0 ) { _TakeProfitLevel = NormalizeDouble( _OpenPriceLevel + TakeProfit*_Point, _Digits ); } else { _TakeProfitLevel = 0.0; } int tiket = OrderSend ( _Symbol, OP_BUY, Lot, _OpenPriceLevel, Slippage, _StopLossLevel, _TakeProfitLevel, "", _MagicNumber ); if ( tiket > 0 ) { Q = 0; last_trade = Time[0]; } else { Alert( strComment, ": ошибка при открытии BUY-позиции!!!" ); PlaySound( "wakeup.wav" ); } }Обратите внимание на NormalizeDouble( Ask, _Digits );
В результатах тестирования получаю:
1 2004.06.17 01:00 sell 1 0. 10 1.82465 1.8290 0.0000 0.00 10000. 00
2 2004.06.17 07:59 s/l 1 0. 10 1. 8290 1. 8290 0. 0000 -30. 45 9969. 55
3 2004.06.17 08:00 buy 2 0. 10 1.82865 1.8242 0.0000 0.00 9969. 55
4 2004.06.17 15:50 modify 2 0. 10 1.82865 1.8303 0.0000 0.00 9969. 55
5 2004.06.17 16:12 s/l 2 0. 10 1. 8303 1. 8303 0. 0000 11. 55 9981. 10
Ввожу распринтовку:
Print( "Ask = ", DoubleToStr( Ask, 8 ), ", OP = ", DoubleToStr( _OpenPriceLevel, 8 ), ", digits = ", _Digits );
Получаю:
17:05:15 2004.06.17 01:00 *** GBPUSD,M5: Bid = 1.82465005, OP = 1.82470000, digits = 4
17:05:15 2004.06.17 01:00 *** GBPUSD,M5: open #1 sell 0.10 GBPUSD at 1.8247 sl:
1.8290 ok
17:05:15 2004.06.17 07:59 Tester: stop loss #1 at 1.8290 (1.8286 / 1.8290)
17:05:15 2004.06.17 08:00 *** GBPUSD,M5: Ask = 1.82865005, OP = 1.82870000, digits = 4
17:05:15 2004.06.17 08:00 *** GBPUSD,M5: open #2 buy 0.10 GBPUSD at 1.8287 sl:
1. 8242 ok
17:05:15 2004.06.17 15:50 *** GBPUSD,M5: modify #2 buy 0.10 GBPUSD at 1.8287 sl:
1.8303 tp: 0.0000 ok
17:05:15 2004.06.17 15:50 *** GBPUSD,M5: trade_lib&info_lib - _OrderModify
( 2, 1.8287, 1.8303, 0.0000, 0, 65280 ) - OrderModify(...) - OK. Work time: 0 sec.
17:05:15 2004.06.17 16:12 Tester: stop loss #2 at 1.8303 (1.8303 / 1.8307)
Спрашивается: зачем МТ использует в OrderSend не те цены, которые я передал, а "типа правильные"?
- А _Digits=???
- А _Digits=???
ЗАЧЕМ ЦИТИРОВАТЬ ВЕСЬ ТЕКСТ???
А в чём собственно говоря неправильность состоит?
Slippage наверное не равно 0? Соответственно тестер открывает сделку не по той цене, которая задана с точностью до 4 знаков, а по имеющейся, лежащей в пределах Slippage. Видимо просто Вашей цены не было в истории в тот момент времени, а была только та близкая, у которой в пятой цифре вылазит 5.
Любую импортированную историю необходимо самым жестким образом нормализовать до использования в тестере. Без нормализации будет много проблем.
В инит-е значение Digits не определено.
17:05:15 2004.06.17 01:00 *** GBPUSD,M5: Bid = 1.82465005, OP = 1.82470000, digits = 4
17:05:15 2004.06.17 01:00 *** GBPUSD,M5: open #1 sell 0.10 GBPUSD at 1.8247 sl:
1.8290 ok
17:05:15 2004.06.17 07:59 Tester: stop loss #1 at 1.8290 (1.8286 / 1.8290)
17:05:15 2004.06.17 08:00 *** GBPUSD,M5: Ask = 1.82865005, OP = 1.82870000, digits = 4
17:05:15 2004.06.17 08:00 *** GBPUSD,M5: open #2 buy 0.10 GBPUSD at 1.8287 sl:
1.8242 ok
17:05:15 2004.06.17 15:50 *** GBPUSD,M5: modify #2 buy 0.10 GBPUSD at 1.8287 sl:
1.8303 tp: 0.0000 ok
17:05:15 2004.06.17 15:50 *** GBPUSD,M5: trade_lib&info_lib - _OrderModify
( 2, 1.8287, 1.8303, 0.0000, 0, 65280 ) - OrderModify(...) - OK. Work time: 0 sec.
17:05:15 2004.06.17 16:12 Tester: stop loss #2 at 1.8303 (1.8303 / 1.8307)
>>>>>Спрашивается: зачем МТ использует в OrderSend не те цены, которые я передал, а "типа правильные"?
А в чём собственно говоря неправильность состоит?
Slippage наверное не равно 0? Соответственно тестер открывает сделку не по той цене, которая задана с точностью до 4 знаков, а по имеющейся, лежащей в пределах Slippage. Видимо просто Вашей цены не было в истории в тот момент времени, а была только та близкая, у которой в пятой цифре вылазит 5.
Была просто Ask, по ней и надо было торговать ;)
Мы специально добавили принудительную нормализацию цены в торговых заявках, чтобы не слать на сервер заведомо ошибочные цены.
Любую импортированную историю необходимо самым жестким образом нормализовать до использования в тестере. Без нормализации будет много проблем.
Удивило именно то, что МТ сам подставил цену в заявку, а не взял мою, нормализованную.
Это действительно из-за слиппажа?
Мы специально добавили принудительную нормализацию цены в торговых заявках, чтобы не слать на сервер заведомо ошибочные цены.
Любую импортированную историю необходимо самым жестким образом нормализовать до использования в тестере. Без нормализации будет много проблем.
У меня вопрос о "жесткой нормализации". Я так понямаю функция NormalizeDouble() нормализует "мягко". Поэтому я котировку превратил в строковую переменную, которую разрезал по цифре, присвоил цифры целочисельным переменным а птом с них обратно собрад нужное число через сложение и умножене.
Правда результат лучше не стал.Один и тот же робот при одних и тех же параметрах на том же отрезки времени при разных брокерах дает просто астрономически разные результата хотя скальпером не является и разница в спреде как бы влиять не должна.

- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Эксперт открывает позицию:
Обратите внимание на NormalizeDouble( Ask, _Digits );
В результатах тестирования получаю:
1 2004.06.17 01:00 sell 1 0. 10 1.82465 1.8290 0.0000 0.00 10000. 00
2 2004.06.17 07:59 s/l 1 0. 10 1. 8290 1. 8290 0. 0000 -30. 45 9969. 55
3 2004.06.17 08:00 buy 2 0. 10 1.82865 1.8242 0.0000 0.00 9969. 55
4 2004.06.17 15:50 modify 2 0. 10 1.82865 1.8303 0.0000 0.00 9969. 55
5 2004.06.17 16:12 s/l 2 0. 10 1. 8303 1. 8303 0. 0000 11. 55 9981. 10
Ввожу распринтовку:
Получаю:
17:05:15 2004.06.17 01:00 *** GBPUSD,M5: Bid = 1.82465005, OP = 1.82470000, digits = 4
17:05:15 2004.06.17 01:00 *** GBPUSD,M5: open #1 sell 0.10 GBPUSD at 1.8247 sl: 1.8290 ok
17:05:15 2004.06.17 07:59 Tester: stop loss #1 at 1.8290 (1.8286 / 1.8290)
17:05:15 2004.06.17 08:00 *** GBPUSD,M5: Ask = 1.82865005, OP = 1.82870000, digits = 4
17:05:15 2004.06.17 08:00 *** GBPUSD,M5: open #2 buy 0.10 GBPUSD at 1.8287 sl: 1. 8242 ok
17:05:15 2004.06.17 15:50 *** GBPUSD,M5: modify #2 buy 0.10 GBPUSD at 1.8287 sl: 1.8303 tp: 0.0000 ok
17:05:15 2004.06.17 15:50 *** GBPUSD,M5: trade_lib&info_lib - _OrderModify ( 2, 1.8287, 1.8303, 0.0000, 0, 65280 ) - OrderModify(...) - OK. Work time: 0 sec.
17:05:15 2004.06.17 16:12 Tester: stop loss #2 at 1.8303 (1.8303 / 1.8307)
Спрашивается: зачем МТ использует в OrderSend не те цены, которые я передал, а "типа правильные"?