Ошибка OrderSelect() - уход с выбранного ордера

 

Наверное, разработчикам.

Столкнулся с такой проблемой:

Режим: тестирование советника в тестере.

Имеется 2 открытых ордера (для определённости, тикеты 1 и 2).

После выбора ордера функцией OrderSelect() параметры ордера получались с помощью прямого обращения к соответствующим функциям - OrderSymbol(), OrderType() и т.д. Так вот, в определённый момент параметры стали браться не от выбранного ордера (тикет 1), а от второго открытого (тикет 2). То есть произошёл сбой определения выбранного ордера.

Определённый момент такой - вызов функции из другого .mq4 файла, скомпилированного как библиотека. Никакие действия с ордерами до вызова внешней функции не производились.

Проблема решилась только присвоением параметров ордера переменным и передачей этих переменных как параметров в ту самую внешнюю функцию.

То есть:

OrderSelect();

iOrderType = OrderType();

func( iOrderType );

Хотя проблему удалось решить, считаю, что это глюк. Хотелось бы, чтобы он был исправлен. Если я не прав - просьба объяснить, почему.

P.S. Если бы OrderSelect() возвращала тикет, а функции получения параметров ордера типа OrderType() имели параметр OrderType(тикет), таких проблем не было бы в принципе. Но это так, пожелания на будущее. :)

 
Дайте код для возпроизведения. Нужно иметь в виду, что OrderSelect() работает на глобальном уравне - если где-то (в библиотеке?) произходить другой OrderSelect() то соответствено и получиться смена текущего ордера.
 
Itso писал (а) >>
Дайте код для возпроизведения. Нужно иметь в виду, что OrderSelect() работает на глобальном уравне - если где-то (в библиотеке?) произходить другой OrderSelect() то соответствено и получиться смена текущего ордера.

1. Нет никаких других вызовов OrderSelect().

2. Код уже переделал. Попозже верну взад (там немного), дам.

 
Почему у Вас OrderSelect() пустой? Где параметры?
 

Выкладываю код

for ( iiNumOrder = 0; iiNumOrder < iTotal; iiNumOrder++ ) {
if ( OrderSelect( iiNumOrder, SELECT_BY_POS ) ) {
if ( OrderSymbol() == Symbol() &&
OrderMagicNumber() == iMagic &&
( OrderType() == OP_BUY ||
OrderType() == OP_SELL ) ) {

// До этого места тикет = 1
// Вызов внешней функции, внутри которой тикет становится = 2,
// поэтому результат работы функции по второму ордеру

iGetCurProfit = GetCurProfit();

// А здесь опять тикет = 1, поэтому происходит закрытие первого ордера


if ( iGetCurProfit >= dPartTakeProfit ) {
switch ( iOrderType ) {
case OP_BUY : OrderClose( OrderTicket(), dCloseLots, Bid, 3 ); break;
case OP_SELL: OrderClose( OrderTicket(), dCloseLots, Ask, 3 );
} // switch
}

.....................................


Внешняя функция из другого файла


//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
int GetCurProfit()
{
int iCurProfit;
double dTickSize = MarketInfo( Symbol(), MODE_TICKSIZE );


// Здесь тикет = 2

switch ( OrderType() ) {
case OP_BUY : iCurProfit = ( Bid - OrderOpenPrice() ) / dTickSize; break;
case OP_SELL: iCurProfit = ( OrderOpenPrice() - Ask ) / dTickSize;
}
return ( iCurProfit );

} // GetCurProfit()

 
Roger писал (а) >>
Почему у Вас OrderSelect() пустой? Где параметры?

Да на месте... Смотрите код :)

 

Да, уже увидел. Вставь

Print("OrderType - ",OrderType()," Price - ",OrderOpenPrice()," Ticket - ",OrderTicket());

в цикл и в подпрограмму и сравни.

Кстати, чему у тебя равен iOrderTicket?

 
Roger писал (а) >>

Да, уже увидел. Вставь

Print("OrderType - ",OrderType()," Price - ",OrderOpenPrice()," Ticket - ",OrderTicket());

в цикл и в подпрограмму и сравни.

Кстати, чему у тебя равен iOrderTicket?

Print'ы вставлял везде, где только можно, как бы я иначе узнал, где глюк. Просто сюда нет смысла выкладывать отладку.

Все результаты описаны, читай комментарии (выделил зелёным).

-

iOrderTicket - это уже из новой версии, просто забыл вернуть взад. Поправил в тексте, изначально стоял OrderTicket(). Только это дела не меняет, в основном модуле тикет=1 и так, и эдак. Он не сохраняется именно при вызове функции из другого модуля.

 
Воспроизвел советник у себя. Все работает корректно.
 
У меня та же байда. Я ее описал здесь . И у меня нет никаких вызовов функций, а идет между Print() вычисление большого логического выражения.
Причина обращения: