Ненормализованная история и открытие позиций

 
Скачал историю с 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 не те цены, которые я передал, а "типа правильные"?
 
komposter писал (а):
Скачал историю с 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=??? 
 
teraptor:
- А _Digits=???
Глобальная переменная. В инит-е ей присваивается значение Digits.

ЗАЧЕМ ЦИТИРОВАТЬ ВЕСЬ ТЕКСТ???
 
komposter писал (а):
teraptor писал (а):
- А _Digits=???
Глобальная переменная. В инит-е ей присваивается значение Digits.

ЗАЧЕМ ЦИТИРОВАТЬ ВЕСЬ ТЕКСТ???

Рука дрогнула...
 
teraptor писал (а):
Рука дрогнула...
2 раза подряд? =)
И кнопочкой правка пользоваться не умеем?
 
komposter писал (а):
teraptor писал (а):
- А _Digits=???
Глобальная переменная. В инит-е ей присваивается значение Digits.

В инит-е значение Digits не определено.
 
>>>>>Спрашивается: зачем МТ использует в OrderSend не те цены, которые я передал, а "типа правильные"?

А в чём собственно говоря неправильность состоит?
Slippage наверное не равно 0? Соответственно тестер открывает сделку не по той цене, которая задана с точностью до 4 знаков, а по имеющейся, лежащей в пределах Slippage. Видимо просто Вашей цены не было в истории в тот момент времени, а была только та близкая, у которой в пятой цифре вылазит 5.
 
Мы специально добавили принудительную нормализацию цены в торговых заявках, чтобы не слать на сервер заведомо ошибочные цены.

Любую импортированную историю необходимо самым жестким образом нормализовать до использования в тестере. Без нормализации будет много проблем.
 
Valmars:
В инит-е значение 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)



solandr:
>>>>>Спрашивается: зачем МТ использует в OrderSend не те цены, которые я передал, а "типа правильные"?

А в чём собственно говоря неправильность состоит?
Slippage наверное не равно 0? Соответственно тестер открывает сделку не по той цене, которая задана с точностью до 4 знаков, а по имеющейся, лежащей в пределах Slippage. Видимо просто Вашей цены не было в истории в тот момент времени, а была только та близкая, у которой в пятой цифре вылазит 5.
Об этом я действительно не подумал. Получается, что цены NormalizeDouble( Ask, 4 ) не было =)
Была просто Ask, по ней и надо было торговать ;)

Renat писал (а):
Мы специально добавили принудительную нормализацию цены в торговых заявках, чтобы не слать на сервер заведомо ошибочные цены.

Любую импортированную историю необходимо самым жестким образом нормализовать до использования в тестере. Без нормализации будет много проблем.
Я об этом знаю - вы неоднократно говорили.
Удивило именно то, что МТ сам подставил цену в заявку, а не взял мою, нормализованную.
Это действительно из-за слиппажа?
 
Renat:
Мы специально добавили принудительную нормализацию цены в торговых заявках, чтобы не слать на сервер заведомо ошибочные цены.

Любую импортированную историю необходимо самым жестким образом нормализовать до использования в тестере. Без нормализации будет много проблем.

У меня вопрос о "жесткой нормализации". Я так понямаю функция NormalizeDouble() нормализует "мягко". Поэтому я котировку превратил в строковую переменную, которую разрезал по цифре, присвоил цифры целочисельным переменным а птом с них обратно собрад нужное число через сложение и умножене.

Правда результат лучше не стал.Один и тот же робот при одних и тех же параметрах на том же отрезки времени при разных брокерах дает просто астрономически разные результата хотя скальпером не является и разница в спреде как бы влиять не должна.

Причина обращения: