Здравствуйте! Наткнулся на следующую проблему:
Если несколько ордеров в рынке, допустим, штук 7, мне надо закрыть все эти 7 ордеров. Использую такую конструкцию:
if(какое-то мое условия) {
while(!del && !IsStopped()) // все делаем в цикле while
{
for(int i=OrdersTotal()-1; i>=0; i--)//этот цикл крутится пока есть открытые ордера
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))//выбираем ордера
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)// далее выбираем нужные
{
if(OrderType()==OP_SELL) OrderClose(OrderTicket(),OrderLots(),Ask,30,Red);//если это селл-ордер, начинаем долбить сервер
}
}
}
if(CountTrades(OP_SELL,Magic)==0) { PlaySound("ok.wav"); del=true; }//если ордеров не осталось, играем музыку и выходим из цикла while
}
}
Из-за проскальзывания или какого-нибудь отказа сервера (и пр.), закрываются только 1-2-3 ордера (когда как). Остальные остаются висеть и видно, что цикл while крутится (проверял, print печатает тысячи итераций), но терминал не долбит сервер запросами OrderClose на каждой итерации цикла. Хотя по идее долбить должен до полного закрытия ордеров.
Прошу знатоков помочь в вопросе. заранее спасибо.
При использовании предопределённой переменной Ask или Bid обязательно нужно перед отсылкой торгового запроса на сервер получить самые последние данные при помощи RefreshRates(). Можете вместо Ask использовать SymbolInfoDouble(OrderSymbol(),SYMBOL_ASK) или SymbolInfoDouble(OrderSymbol(),SYMBOL_BID), а можете попробовать вместо Ask или Bid просто вписать OderClosePrice() - но это не документированная возможность, и слепо полагаться на её работоспособность не стоит.
И ещё есть не документированная фишка, закрывать ордера по OrderClosePeice()
Тогда и делить их на Buy или Sell не надо.
И ещё есть не документированная фишка, закрывать ордера по OrderClosePeice()
Тогда и делить их на Buy или Sell не надо.
???
Я ж разве ж не написал о том?
???
Я ж разве ж не написал о том?
А у меня сил не хватает читать столько много букафф :))))
ps что касается её работоспособности, я думаю раньше вообще закроют МТ4 чтом отменят эту фишку.
А у меня сил не хватает читать столько много букафф :))))
РедБул окрыляяеет ...
Здравствуйте! Наткнулся на следующую проблему:
Если несколько ордеров в рынке, допустим, штук 7, мне надо закрыть все эти 7 ордеров. Использую такую конструкцию:
Из-за проскальзывания или какого-нибудь отказа сервера (и пр.), закрываются только 1-2-3 ордера (когда как). Остальные остаются висеть и видно, что цикл while крутится (проверял, print печатает тысячи итераций), но терминал не долбит сервер запросами OrderClose на каждой итерации цикла. Хотя по идее долбить должен до полного закрытия ордеров.Прошу знатоков помочь в вопросе. заранее спасибо.
всё проще чем вы думаете :-)
достаточно посмотреть лог компиляции - там чуть не криком написано "результат OrderClose должен проверяться". Пойдите бедному терминалу навстречу - проверьте результат и в зависимости от кода ошибки примите меры.
Спасибо всем.
OderClosePrice() терминал не распознает.
Пропишу SymbolInfoDouble(OrderSymbol(),SYMBOL_ASK), посмотрим что выгорит.
всё проще чем вы думаете :-)
достаточно посмотреть лог компиляции - там чуть не криком написано "результат OrderClose должен проверяться". Пойдите бедному терминалу навстречу - проверьте результат и в зависимости от кода ошибки примите меры.
В логах этого не написано. И OrderClose не возвращает ошибок, а лишь true/false.
Все таки усложнил функцию, посмотрим как запоет:
{
bool del=false;
while(!del && !IsStopped())
{
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
if(OrderType()==OP_SELL && ProfitPoints<=pointsSell)
{
bool err=true;
err=OrderClose(OrderTicket(),OrderLots(),SymbolInfoDouble(OrderSymbol(),SYMBOL_ASK),30,Red);
if(!err)
{
Print("Ошибка закрытия ордеров: ",GetLastError());
}
}
}
}
}
if(CountTrades(OP_SELL,Magic)==0) { PlaySound("ok.wav"); del=true; }
}
}
Спасибо всем.
OderClosePrice() терминал не распознает.
Пропишу SymbolInfoDouble(OrderSymbol(),SYMBOL_ASK), посмотрим что выгорит.
В логах этого не написано. И OrderClose не возвращает ошибок, а лишь true/false.
Ну если буква r пропущена только здесь? в этом сообщении, то это "Очевидное не вероятное" у всех работает, а у тебя нет... Так не бывает.
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Здравствуйте! Наткнулся на следующую проблему:
Если несколько ордеров в рынке, допустим, штук 7, мне надо закрыть все эти 7 ордеров. Использую такую конструкцию:
if(какое-то мое условия) {
while(!del && !IsStopped()) // все делаем в цикле while
{
for(int i=OrdersTotal()-1; i>=0; i--)//этот цикл крутится пока есть открытые ордера
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))//выбираем ордера
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)// далее выбираем нужные
{
if(OrderType()==OP_SELL) OrderClose(OrderTicket(),OrderLots(),Ask,30,Red);//если это селл-ордер, начинаем долбить сервер
}
}
}
if(CountTrades(OP_SELL,Magic)==0) { PlaySound("ok.wav"); del=true; }//если ордеров не осталось, играем музыку и выходим из цикла while
}
}
Из-за проскальзывания или какого-нибудь отказа сервера (и пр.), закрываются только 1-2-3 ордера (когда как). Остальные остаются висеть и видно, что цикл while крутится (проверял, print печатает тысячи итераций), но терминал не долбит сервер запросами OrderClose на каждой итерации цикла. Хотя по идее долбить должен до полного закрытия ордеров.
Прошу знатоков помочь в вопросе. заранее спасибо.