Здравствуйте.
При открытии каждого ордера в коммент. записываю баланс на данный момент,и назначаю тикет (ticket1,ticket2 и т.д.). Потом закрываю ордера относительно баланса последнего ордера.
По аллерту смотрю, если по трэйдам SELECT_BY_POS выбирать
for(int i=1; i<=OrdersTotal(); i++) //это последний открытый ордер
то получается. А по тикету никак.Как исправить?
double comment2() { datetime time=0; int ticket2;//тикет назначенный второму ордеру for(int i=1; i<=OrdersTotal(); i++) { if(OrderSelect(ticket2, SELECT_BY_TICKET)) { if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic ) { ticket2 = OrderTicket(); double comment2=StrToDouble(OrderComment());//баланс при открытии второго ордера } } } return(comment2); }
Тикет должен быть назначен до попытки выбрать ордер по тикету. Как правило это делается при открытии ордера.
Возвращаемое значение
Возвращает номер тикета, который назначен ордеру торговым сервером или -1 в случае неудачи.
Тикет должен быть назначен до попытки выбрать ордер по тикету. Как правило это делается при открытии ордера.
Сделал советник, в тестере прогнал, всё определяет по тикету нормально.На демо поставил, утром смотрю сделки висят, не закрываются. Искал, оказалось тикет не определяет.
for( trade = OrdersTotal()-1; trade >= 0; trade--)//так ставил,это первый ордер { OrderSelect(ticket2, SELECT_BY_TICKET, MODE_TRADES );
Иногда требуется сравнить баланс при открытии ticket2 и ticket 5, не только при 1-ом и последнем.
Два вопроса:
1) Зачем цикл, если Вы выбираете сделку по тикету? Цикл нужен, чтобы выбирать её по номеру в списке ордеров.
2) Почему Вы пытаетесь выбрать сделку по тикету, но тикет не указываете (переменная ticket2 не инициализирована)?
Должно быть примерно так:
double comment2() { int ticket2=123;//тикет назначенный второму ордеру if(OrderSelect(ticket2,SELECT_BY_TICKET)) { if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) { double comment2=StrToDouble(OrderComment());//баланс при открытии второго ордера } } return(comment2); }
Т.е. тикет (в данном примере это "123", т.е. ордер с тикетом 123) Вы должны знать и задать до вызова функции OrderSelect с SELECT_BY_TICKET. Иначе, если Вы его не знаете, нужно перебирать все ордера в списке, пока какой-то не подойдёт заданным параметрам (символ, магический номер).
А если Вы не знаете тикет, и ищете ордер просто с нужным символов и магическим номером, то должно быть примерно так:
double comment2() { double comment2 = 0; for(int i=0; i<OrdersTotal(); i++) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) { comment2=StrToDouble(OrderComment());//баланс при открытии второго ордера } } } return(comment2); }
Три вопроса:
1) Почему проход идёт в цикле от индекса 1, а не 0? Если у Вас всего одна сделка, то по идее этот цикл не выполнит ни одной итерации. UPD этот вопрос уже не актуален, вижу, что в последнем варианте уже до нуля доходит.
2) Зачем цикл, если Вы выбираете сделку по тикету? Цикл нужен, чтобы выбирать её по номеру в списке ордеров.
3) Почему Вы пытаетесь выбрать сделку по тикету, но тикет не указываете (переменная ticket2 не инициализирована)?
Должно быть примерно так:
Т.е. тикет (в данном примере это "123", т.е. ордер с тикетом 123) Вы должны знать и задать до вызова функции OrderSelect с SELECT_BY_TICKET. Иначе, если Вы его не знаете, нужно перебирать все ордера в списке, пока какой-то не подойдёт заданным параметрам (символ, магический номер).
А если Вы не знаете тикет, и ищете ордер просто с нужным символов и магическим номером, то должно быть примерно так:
Спасибо за ответ. Первый вариант без цикла не идёт "0". Второй, это перебор ордеров не по тикету.Так не найти 2-й, 3-й и т.д.Тикет указываю перед OrderSend.
Хммм, как Вы можете задать тикет до OrderSend, если его назначает не пользователь, а сервер? Тикет это номер ордера на сервере.
Покажите код, как Вы это делаете :)
Хммм, как Вы можете задать тикет до OrderSend, если его назначает не пользователь, а сервер? Тикет это номер ордера на сервере.
Покажите код, как Вы это делаете :)
ticket2=OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, SL, TP,comment, Magic, 0, Blue); ticket3=OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, SL, TP,comment, Magic, 0, Blue); ticket4=OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, SL, TP,comment, Magic, 0, Blue);Потом через
OrderTicket();
узнаю номер.
Понял. Но смотрите, в функции comment2() вы объявляете новую переменную ticket2 и она уже не знает ничего о том значении, которое Вы получили при выставлении ордера. Или Вы просто не весь код функции comment2() показываете?
Тогда точно неправильно :)
Должно быть примерно так:
1) Выставили ордер, запомнили его тикет (например, в глобальную переменную терминала).2) В нужной функции выбрали ордер с запомненным тикетом и работаете с ним.
Но это плохое решение. лучше завести три магических номера и уже по ним выбирать ордера перебором в цикле, так будет работать надёжней.
- docs.mql4.com
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Здравствуйте.
При открытии каждого ордера в коммент. записываю баланс на данный момент,и назначаю тикет (ticket1,ticket2 и т.д.). Потом закрываю ордера относительно баланса последнего ордера.
По аллерту смотрю, если по трэйдам SELECT_BY_POS выбирать
for(int i=1; i<=OrdersTotal(); i++) //это последний открытый ордер
то получается. А по тикету никак.Как исправить?