тут вашей вины или терминала нет.
эта проблема от незнания.
дело в том, что после удаления одеров - меняется его позиция в списке.
поэтому надо пойти двумя путями.
1. Или составить список тикетов ордеров на удаление. И потом проходить по этому списку и удалять, используя SELECT_BY_TICKET
2. Или удалять в обратном порядке. то есть от OrdersTotal()-1 до 0
первый вариант предпочтительнее (с моей точки зрения вы имеете больший контроль),
так как список ордеров (нумерация по порядку) может быть изменен другими экспертами в момент выполнения данного цикла.
PS. С такими вопросами лучше в ветку сюда
for(i=Orders-1;i>=0;i--){
//+------------------------------------------------------------------+ void CloseAllFirstProfit() { int i, k=OrdersTotal(); for (i=k-1; i>=0; i--) if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) if (OrderType()==OP_BUY || OrderType()==OP_SELL) if (OrderProfit()+OrderSwap()>0) ClosePosBySelect(); k=OrdersTotal(); for (i=k-1; i>=0; i--) if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) if (OrderType()==OP_BUY || OrderType()==OP_SELL) ClosePosBySelect(); } //+------------------------------------------------------------------+ void ClosePosBySelect() { if (OrderType()==OP_BUY) OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 10, CLR_NONE); if (OrderType()==OP_SELL) OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 10, CLR_NONE); } //+------------------------------------------------------------------+
IgorM, впервые вижу, чтоб кто-то конструировал условне операторы так, как это делаете Вы.
for() if() if() ... if() {}
Это вообще, разрешено и если да, то где об этом почитать? Если разрешено, то по логике вещей, эти ифы должны соединяться между собой коньъюнкцией (оператором AND).
IgorM, впервые вижу, чтоб кто-то конструировал условне операторы так, как это делаете Вы.
for() if() if() ... if() {}
Это вообще, разрешено и если да, то где об этом почитать? Если разрешено, то по логике вещей, эти ифы должны соединяться между собой коньъюнкцией (оператором AND).
А вот так нормально:
for() if() if() if() { //... }
?
Нормально было бы вот так:
for(){ if(){ if(){ if(){ //... } } } }
По крайней мере в таком коде сознание не путается. То есть, мы свято выполняем правило кода. При такой расстановке сокобок при прочтении кода вниманию не нужно возвращаться назад для внесения ясности
//+------------------------------------------------------------------+ //| close.mq4 | //| Copyright © 2004, MetaQuotes Software Corp. | //| http://www.metaquotes.net/ | //+------------------------------------------------------------------+ #property copyright "Copyright © 2004, MetaQuotes Software Corp." #property link "http://www.metaquotes.net/" #property show_confirm //+------------------------------------------------------------------+ //| script "Закрывает все открытые позиции" | //+------------------------------------------------------------------+ int start() { bool result; int error; //---- while (OrdersTotal()>0) { if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES)) { if(OrderType()==OP_BUY) result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),MarketInfo(OrderSymbol(),MODE_DIGITS)),3,CLR_NONE); if(OrderType()==OP_SELL) result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),MarketInfo(OrderSymbol(),MODE_DIGITS)),3,CLR_NONE); if (OrderType()==OP_BUYLIMIT || OrderType()==OP_BUYSTOP || OrderType()==OP_SELLLIMIT || OrderType()==OP_SELLSTOP) OrderDelete(OrderTicket()); if(result!=TRUE) { error=GetLastError(); Print("LastError = ",error, " ",Symbol()); } else error=0; } else Print( "Error when order select ", GetLastError()); } //---- return(0); } //+------------------------------------------------------------------+
я таким пользуюсь
я таким пользуюсь
В таком коде трудно искать потреявшуюся скобку. Такой код более трудночитаем - в нём смысловые блоки, которые должно отмечать сознание без запинки, неоправданно соединены. Я имею ввиду не синтаксис, а психологию восприятия кода. Посмотрите, насколько проще воспринимать код, если у него вот такая организация: http://s2.ipicture.ru/uploads/20110106/2mVI83l7.jpg
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Народ, здрасти..
вот не пойму что за хрень
вот отрывок из советника:
Orders=OrdersTotal();
for(i=0;i<Orders;i++){
if(OrderSelect(i,SELECT_BY_POS)==false) continue;
if(OrderType()==OP_SELL) tmp=Ask;
if(OrderType()==OP_BUY) tmp=Bid;
for(j=1;j<10;j++){
if(OrderClose(OrderTicket(),OrderLots(),tmp,Slippage)==true){
j=11;
PlaySound("ok.wav");
}
}
}
По сути это должно закрыть ВСЕ открытые ордера.... Но почемуто закрывает только 1-2 ордера... Сайт уже излазил, код стопудова верный, может в терминале косяк..... Может если кто с этим сталкивался, поможете разобраться? :-)