Скачать MetaTrader 5

Странный глюк в скрипте, глюк только на GBPUSD

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Forex Trader
114269
Forex Trader  
Приветствую.
Я написал себе скрипт который расставляет отложные ордера в рейндже выбранном пользователем скрипта.
Скрипт расставляет ордера чётко по определённым уровням с шагом в 20пп например 1.2800, 2820, 2840 и тд.
Но изначально он проверяет на наличие какой-либо открытой позиции/ордера на выбранном уровне. Тоесть в скрипте я написал функцию tester в которую передаётся выбранный уровень - к примеру 1.2820 на евре - далее тестер прочёсывает все ордера и позиции на предмет сходсва их OpenPrice с выбранным уровнем.
вот тело функции проверки:

bool tester(double level, int poza, int order)
{
int cnt, total=OrdersTotal();
string Sym=Symbol();
Print("Тестер запущен, ", "Total = ", total, " Выбранный уровень = ", level);
if (total>0)
{
for (cnt=0;cnt<total;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderSymbol() == Symbol())
{
Print("Выбран ордер № ", cnt, " открытый на = ", OrderOpenPrice(), " выбранный уровень = ", level);
if (OrderOpenPrice()==level)
{
Print("одер на уровне ", level);
if (OrderType() == poza || OrderType() == order)
{
Print("Место Занято ", level);
return(1);
}
}

}
}
}

return(0);
}


так в чём собственно проблема: я расставля на фунте отложные ордера байстопы - на 9160 и 9180.
но там уже есть 2 отложных, именно на 9160 и 9180. но скрипт их невидит и ставит поверх них ещё по ордеру. в тоже время на франке так-же самое запускаю скрипт на расстановку ордеров там где они уже есть и он их видит и следовательно выдаёт ответ "Место Занято". Парадокс, но я с ним вчера весь день ковырялся так и не понял причину глюка. Причём скрипт работает на ура, на всех парах кроме фунта. он там просто отказывается видеть расставленные ордера.
вот какой ответ даёт скрипт
2006.08.11 17:36:46 SetOrdersV GBPUSD,H1: Я поставлю байстоп на = 1.916
2006.08.11 17:36:46 SetOrdersV GBPUSD,H1: Выбран ордер № 17 открытый на = 1.916 выбранный уровень = 1.916
2006.08.11 17:36:46 SetOrdersV GBPUSD,H1: Тестер запущен, Total = 18 Выбранный уровень = 1.916

Но что интересно, если в нём руками в скрипте присвоить значению level = 1.916 тоесть строка будет выглядеть: if (OrderOpenPrice()==1.916)

то смотрите каков результат получается:
2006.08.11 17:39:29 SetOrdersV GBPUSD,H1: deinitialized
2006.08.11 17:39:29 SetOrdersV GBPUSD,H1: Место Занято 1.916
2006.08.11 17:39:29 SetOrdersV GBPUSD,H1: одер на уровне 1.916
2006.08.11 17:39:29 SetOrdersV GBPUSD,H1: Выбран ордер № 17 открытый на = 1.916 выбранный уровень = 1.916
2006.08.11 17:39:29 SetOrdersV GBPUSD,H1: Тестер запущен, Total = 18 Выбранный уровень = 1.916

в тоже время тестер нормально работает на других парах. вот пример:
2006.08.11 17:42:11 SetOrdersV EURUSD,H1: Место Занято 1.296
2006.08.11 17:42:11 SetOrdersV EURUSD,H1: одер на уровне 1.296
2006.08.11 17:42:11 SetOrdersV EURUSD,H1: Выбран ордер № 18 открытый на = 1.296 выбранный уровень = 1.296
2006.08.11 17:42:11 SetOrdersV EURUSD,H1: Тестер запущен, Total = 19 Выбранный уровень = 1.296

Я уже незнаю что делатью помогите
MetaQuotes Software Corp.
Модератор
182668
MetaQuotes Software Corp.  
Это стандартная проблема в сравнении вещественных чисел в строке:
if (OrderOpenPrice()==level)

лучше написать:
if (NormalizeDouble(OrderOpenPrice()-level,Digits)==0.0)
Forex Trader
114269
Forex Trader  
Спасибо!
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий