Ошибки, баги, вопросы - страница 1126

 

Я пишу ТЗ для советника на MT4 с приоритетом на ускоренную обработку данных.

Прошу Вас подсказать, имеет ли значение для ускорение работы последовательность выполнения расчета или  выборочное (как правильно называется - репрезентативное?).

Прикладываю два варианта в виде картинок, на которых отображены блок схемы.

Если можно, то напишите как должен выглядеть код, если выборочное исполнение блоков будет происходить - чисто примитивный макет, и даст ли это существенный прирост скорости!? 

Файлы:
Logic_V_01.png  26 kb
Logic_V_02.png  30 kb
 
void OnStart()
{
        uchar max=0;
        for(int t=0;t<LONG_MAX;t++)   {max++;}    //так получаем предупреждение expression is always true, цикл работает
        for(int t=0;t<LONG_MAX+1;t++) {max++;}    //так предупреждение есть, но цикл не работает
        for(int t=0;t<ULONG_MAX;t++)  {max++;}    //так нет предупреждения и цикл не пашет
        Print("Done!");
}
 

 Как объясняется такое закрытие позиции в тестере? Расширением спреда?

Скриншоты торговой платформы MetaTrader

EURUSD, M20, 2014.04.12

Альфа-Форекс, MetaTrader 5, Real

temp_file_screenshot_63279.png

EURUSD, M20, 2014.04.12, Альфа-Форекс, MetaTrader 5, Real


 
Crucian:

 Как объясняется такое закрытие позиции в тестере? Расширением спреда?

[img]https://charts.mql5.com/4/434/eurusd-m20-alfa-foreks-temp-file-screenshot-63279-png.png[/img] 

Если произошло расширение спрэда (а судя по скрину - пунктов на 720! по пятизнаку), то всё верно.

Позиция на продажу закрылась по цене Ask. Это если были выставлены стопы.

Кстати, у вашего брокера Альфа-Форекс  в конце недели и в начале бывают просто гигантские спрэды.

Наверное они записались в историю котировок, а тестер сэмулировал торговлю по ним.

 

Стопы  на выходные оставлять опасно - от гэпа они всё равно не спасут, а расширение спрэда поймать могут легко.

 
Fleder:
for(int t=0;t<LONG_MAX+1;t++) {max++;}    //так предупреждение есть, но цикл не работает

Здесь нет ошибки, поскольку  LONG_MAX+1 < 0

for(int t=0;t<LONG_MAX;t++)   {max++;}    //так получаем предупреждение expression is always true, цикл работает
Здесь предупреждение обоснованнное (t<LONG_MAX всегда true, если t int ) бесконечный цикл
 
void OnStart()
{
  uchar max=0;
  for(int t=0;t<ULONG_MAX-1e0;t++)  {max++;}      //так цикл работает, предупреждения нет так как ULONG_MAX-1e0 имеет тип double
  for(int t=0;t<ULONG_MAX-1;t++)    {max++;}      //а так нет и предупреждения тоже нет
  Print("Done!");
}
 
Fleder:
for(int t=0;t<ULONG_MAX-1;t++)    {max++;}      //а так нет и предупреждения тоже нет
Здесь нет ошибки, поскольку ULONG_MAX-1 < 0, т.е. в операции сравнения приводится к int или long - точнее идет побитовое сравнение
 
A100:
Нет ошибки, поскольку ULONG_MAX-1 < 0, поскольку в операции сравнения приводится к int

Тогда как объяснить это:

void OnStart()
{
  long t=0;
  bool comp=(ULONG_MAX-1>t);
  Print("comp = ",comp);   //comp = true
  Print(ULONG_MAX-1);      //18446744073709551614
  Print(ULONG_MAX);        //18446744073709551615
}
 
A100:
Здесь нет ошибки, поскольку ULONG_MAX-1 < 0, т.е. в операции сравнения приводится к int или long

Вы имеете в виду сравнение именно в проверяемом выражении в цикле?

Потому как в простом сравнении вроде как не так. 

 
A100:

Просто поменяйте их местами :)

А что даёт эта перестановка? t как была меньше, чем ULONG_MAX-1, так и осталась.

void OnStart()
{
  long t=0;
  Print( (t < ULONG_MAX-1) == (ULONG_MAX-1 < t)); //false
}