!ExistPosition() означает что открытых позиций нет - так вроде бы?
!ExistPosition() означает что открытых позиций нет - так вроде бы?
Да, именно, так.
И тем не менее советник открывает от 1 до 8 дополнительных позиций. Билд 186. Пробовал 185.
В реалтайме эта функция хорошо себя зарекомендовала, но вот не ожидал глюков при тестировании на истории. Сейчас пока гоняю с условием if (OrdersTotal()==0) вместо if (!ExistPosition()).
Доработал функцию таким образом:
//+------------------------------------------------------------------+ //| Возвращает флаг существования позиции | //+------------------------------------------------------------------+ bool ExistPosition() { bool Exist=False; if (IsTesting()) { if (OrdersTotal()!=0) Exist=True; } else { for (int i=0; i<OrdersTotal(); i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC) { if (OrderType()==OP_BUY || OrderType()==OP_SELL) { Exist=True; break; } } } } } return(Exist); }
Чтобы можно было ей пользоваться и в реалтайме, и на истории. Жалко только, что на истории она теперь не отличает позиции от ордеров. Подскажите, что можно сделать?
До недавнего времени я пользовался такой вот функцией
//+------------------------------------------------------------------+ //| Возвращает флаг существования позиции | //+------------------------------------------------------------------+ bool ExistPosition() { }
Сегодня обнаружил, что она работает некорректно. Т.е. не смотря на условие if (!ExistPosition()) { перед открытием позиции, тестер всё равно открывает дополнительные позиции.
в это сложно поверить. попробуйте поставить пару принтов для проверки ситуации. ну или пришлите Ваш код на stringo at metaquotes dot ru для выяснения. конфиденциальность гарантирую.
У меня такой код работал и работает до сих пор.
//+------------------------------------------------------------------+ //| посчитаем количество открытых ордеров | //+------------------------------------------------------------------+ int TotalExpert() { int total,totalExpert; total=OrdersTotal(); totalExpert=0; LongOrderExist=false; ShortOrderExist=false; if (OrdersTotal()>0) { for (int cnt=0;cnt<total;cnt++) { OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); if ((OrderMagicNumber()==ExpertMagicNumber)&&(Symbol()==OrderSymbol())) { totalExpert++; if (OrderType()==OP_BUY) { LongOrderExist=true; } if (OrderType()==OP_SELL) { ShortOrderExist=true; } } } } return(totalExpert); }
наверняка проблема в "OrderMagicNumber()==MAGIC" это условие не срабатывает и функция возвращает фальсе (тип переменной Magic), а if (OrderType()==OP_BUY || OrderType()==OP_SELL) я бы заменил на
if (OrderType()<2)
if (OrderType()<2)
Всем огромное СПАСИБО за участие!
Ошибка была моей и заключалась она в следующем:
Ошибка была моей и заключалась она в следующем:
ticket=OrderSend(Symbol(),op,Lots,pp,Slippage,ldStop,ldTake,lsComm,0,0,clOpen);
а надо было так
ticket=OrderSend(Symbol(),op,Lots,pp,Slippage,ldStop,ldTake,lsComm,MAGIC,0,clOpen);
Slawa, Rosh, мне стыдно...
и не такое бывает ;)
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Сегодня обнаружил, что она работает некорректно. Т.е. не смотря на условие if (!ExistPosition()) { перед открытием позиции, тестер всё равно открывает дополнительные позиции.
Поэтому прошу совета. Каким ещё образом можно добиться открытия только одной позиции?