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

 

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

Скриншоты торговой платформы 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
}
 
Fleder:

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

Это я неправильный пример привел - там было сравнение с int, а здесь с long

for(int t=0
void OnStart()
{
  long t=0;
 

Приоритет  типов uint и ulong выше, чем у int и long:

Преобразования при объединении бинарной операцией 

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

Но похоже, что это не относится к  проверяемым выражениям циклов.