!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, мне стыдно...
и не такое бывает ;)
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
//+------------------------------------------------------------------+ //| Возвращает флаг существования позиции | //+------------------------------------------------------------------+ bool ExistPosition() { bool Exist=False; 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); }Сегодня обнаружил, что она работает некорректно. Т.е. не смотря на условие if (!ExistPosition()) { перед открытием позиции, тестер всё равно открывает дополнительные позиции.
Поэтому прошу совета. Каким ещё образом можно добиться открытия только одной позиции?