Дайте код для возпроизведения. Нужно иметь в виду, что OrderSelect() работает на глобальном уравне - если где-то (в библиотеке?) произходить другой OrderSelect() то соответствено и получиться смена текущего ордера.
1. Нет никаких других вызовов OrderSelect().
2. Код уже переделал. Попозже верну взад (там немного), дам.
Выкладываю код
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()
Да, уже увидел. Вставь
Print("OrderType - ",OrderType()," Price - ",OrderOpenPrice()," Ticket - ",OrderTicket());
в цикл и в подпрограмму и сравни.
Кстати, чему у тебя равен iOrderTicket?
Print'ы вставлял везде, где только можно, как бы я иначе узнал, где глюк. Просто сюда нет смысла выкладывать отладку.
Все результаты описаны, читай комментарии (выделил зелёным).
-
iOrderTicket - это уже из новой версии, просто забыл вернуть взад. Поправил в тексте, изначально стоял OrderTicket(). Только это дела не меняет, в основном модуле тикет=1 и так, и эдак. Он не сохраняется именно при вызове функции из другого модуля.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Наверное, разработчикам.
Столкнулся с такой проблемой:
Режим: тестирование советника в тестере.
Имеется 2 открытых ордера (для определённости, тикеты 1 и 2).
После выбора ордера функцией OrderSelect() параметры ордера получались с помощью прямого обращения к соответствующим функциям - OrderSymbol(), OrderType() и т.д. Так вот, в определённый момент параметры стали браться не от выбранного ордера (тикет 1), а от второго открытого (тикет 2). То есть произошёл сбой определения выбранного ордера.
Определённый момент такой - вызов функции из другого .mq4 файла, скомпилированного как библиотека. Никакие действия с ордерами до вызова внешней функции не производились.
Проблема решилась только присвоением параметров ордера переменным и передачей этих переменных как параметров в ту самую внешнюю функцию.
То есть:
OrderSelect();
iOrderType = OrderType();
func( iOrderType );
Хотя проблему удалось решить, считаю, что это глюк. Хотелось бы, чтобы он был исправлен. Если я не прав - просьба объяснить, почему.
P.S. Если бы OrderSelect() возвращала тикет, а функции получения параметров ордера типа OrderType() имели параметр OrderType(тикет), таких проблем не было бы в принципе. Но это так, пожелания на будущее. :)