Непойму, почему скрипт для удаления всех ордеров оставляет последний ордер открытым и не удаляет его. Помогите, туплю.

 
Скрипт ниже прекрасно удаляет все SELL ордера кроме 1го. Непонимаю, почему. Помогите плиз.


#property copyright "Copyright © 2006, maloma"
#property link      "http://www.fxomega.com"
#property link      "http://www.masterforex.kh.ua"
 
//-- Удаляем все SELL ордера --
 
       int    i,j,kk=0;
       bool   res=false;
 
int start(){
 
 if (OrdersTotal()>0){
  j=OrdersTotal()-1;
  for(i=j;i>=0;i--){
   for (kk=1;kk<=50;kk++){
    OrderSelect(kk,SELECT_BY_POS,MODE_TRADES);
    if (OrderType()==OP_SELL){
     RefreshRates();
     res=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),3,Yellow);
     Sleep(2000);
     if (res) break;
    }
   }
  }
 }
 return(0);
}
 
int start(){
 
 if (OrdersTotal()>0){
  j=OrdersTotal()-1;
  for(i=j;i>=0;i--){
    OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
    if (OrderType()==OP_SELL){
     res=false;
     while (!res){
     RefreshRates();
     res=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),3,Yellow);
     Sleep(2000);
    } 
   }
  }
 }
 return(0);
}
Лучше так сделать.
А зачем цикл с kk был? Ордера по этому циклу выбирались, а не по предыдущему. Поэтому было некорректное закрытие.
 
favoritefx:

Лучше так сделать.
А зачем цикл с kk был? Ордера по этому циклу выбирались, а не по предыдущему. Поэтому было некорректное закрытие.
Вот молодец. Спасибо. Надо спать по ночам, а не писать. цикл kk повторяет закрытие, если была неудачная попытка.
 
maloma писал (а):
Скрипт ниже прекрасно удаляет все SELL ордера кроме 1го. Непонимаю, почему. Помогите плиз.

Причина простая: цикл кк начинается с 1. Это работает, пока количество ордеров больше 1, а на последнем ордере не работает.
Исправить: OrderSelect не по кк, а по i.
Но вообще-то, так это не делается.

1. Если есть встречные рыночные ордера, то сначала надо закрывать их встречно.
2. Если после встречного закрытия ещё остались ордера, то сначала закрывать рыночные, а потом отложенные.
3. При этом закрывать сначала большие, потом маленькие (для рыночных).
4. При этом закрывать сначала те, что ближе к курсу, потом - те, что дальше, причём независимо от стоимости (для отложенных)
5. Если два отложенных на одном расстоянииот курса, но разной стоимости, то сначала большие.
6. Чтоб всё это стало возможным нужен учёт ордеров: Учёт ордеров в большой программе.
7. :)

Если уж делать так, как в Вашем примере, то по крайней мере нужно использовать 1 цикл while(), условием у которого OrdersTotal()>0.

 
SK. писал (а):
maloma:
Скрипт ниже прекрасно удаляет все SELL ордера кроме 1го. Непонимаю, почему. Помогите плиз.

Причина простая: цикл кк начинается с 1. Это работает, пока количество ордеров больше 1, а на последнем ордере не работает.
Исправить: OrderSelect не по кк, а по i.
Но вообще-то, так это не делается.

1. Если есть встречные рыночные ордера, то сначало надо закрывать их встречно.
2. Если после встречного закрытия ещё остались ордера, то сначала закрывать рыночные, а потом отложенные.
3. При этом закрывать сначала большие, потом маленькие (для рыночных).
4. При этом закрывать сначала те, что ближе к курсу, потом - те, что дальше, причём независимо от стоимости (для отложенных)
5. Если два отложенных на одном расстоянииот курса, но разной стоимости, то сначала большие.
6. Чтоб всё это стало возможным нужен учёт ордеров: Учёт ордеров в большой программе.
7. :)

Если уж делать так, как в Вашем примере, то по крайней мере нужно использовать 1 цикл while(), условием у которого OrdersTotal()>0.

Спасибо, совет учту, но именно этот скрипт я накидал для закрытия всех чисто рыночных селов. Ни больше, ни меньше. А kk на i я исправил уже.
 
SK. писал (а):
maloma писал (а):
Скрипт ниже прекрасно удаляет все SELL ордера кроме 1го. Непонимаю, почему. Помогите плиз.

Причина простая: цикл кк начинается с 1. Это работает, пока количество ордеров больше 1, а на последнем ордере не работает.
Исправить: OrderSelect не по кк, а по i.
Но вообще-то, так это не делается.

1. Если есть встречные рыночные ордера, то сначало надо закрывать их встречно.
2. Если после встречного закрытия ещё остались ордера, то сначала закрывать рыночные, а потом отложенные.
3. При этом закрывать сначала большие, потом маленькие (для рыночных).
4. При этом закрывать сначала те, что ближе к курсу, потом - те, что дальше, причём независимо от стоимости (для отложенных)
5. Если два отложенных на одном расстоянииот курса, но разной стоимости, то сначала большие.
6. Чтоб всё это стало возможным нужен учёт ордеров: Учёт ордеров в большой программе.
7. :)

Если уж делать так, как в Вашем примере, то по крайней мере нужно использовать 1 цикл while(), условием у которого OrdersTotal()>0.

Добрый день, скажите пожалуйста
хотелось бы понять 3 правило

> 3. При этом закрывать сначала большие, потом маленькие (для рыночных).


почему закрываются сначала большие ? а потом маленькие ?
 
YuraZ писал (а):

почему закрываются сначала большие ? а потом маленькие ?

Закрыть ВСЕ ордера - это значит, что ситуация может выйти из-под контроля и трейдер от греха подальше закрывает всё подряд без разбору. Если сделать такую функцию, которая закрывала бы все ордера интеллектуально, то следует это делать в том порядке, что представлен выше.

А большие (имееется ввиду большей стоимости) потому, что при непредсказуемости рынка большие ордера могут наделать больше беды, чем маленькие. По-моему, это самоочевидно.
----------

Всё это в том случае, когда трейдер подозревает, что теряет контроль над ситуацией.
А в обычном торговом режиме решение должно приматься в специально предназначенных для этого аналитических функциях.
В такие функции программист закладывает алгоритм в соответствии со своим пониманием жизни. Вполне может быть, что закрытие в такой функции будет предполагать иной порядок (не обязательно сначала большие).
----------

По моим представлениям в терминале всегда должен быть открыт только один ордер (либо ни одного).
 
SK. писал (а):
YuraZ писал (а):

почему закрываются сначала большие ? а потом маленькие ?

Закрыть ВСЕ ордера - это значит, что ситуация может выйти из-под контроля и трейдер от греха подальше закрывает всё подряд без разбору. Если сделать такую функцию, которая закрывала бы все ордера интеллектуально, то следует это делать в том порядке, что представлен выше.

А большие (имееется ввиду большей стоимости) потому, что при непредсказуемости рынка большие ордера могут наделать больше беды, чем маленькие. По-моему, это самоочевидно.
----------

Всё это в том случае, когда трейдер подозревает, что теряет контроль над ситуацией.
А в обычном торговом режиме решение должно приматься в специально предназначенных для этого аналитических функциях.
В такие функции программист закладывает алгоритм в соответствии со своим пониманием жизни. Вполне может быть, что закрытие в такой функции будет предполагать иной порядок (не обязательно сначала большие).
----------

По моим представлениям в терминале всегда должен быть открыт только один ордер (либо ни одного).
Спасибо - понятно, при данной оговорке вполне очевидное решение!
 
YuraZ:
SK. писал (а):
YuraZ писал (а):

почему закрываются сначала большие ? а потом маленькие ?

Закрыть ВСЕ ордера - это значит, что ситуация может выйти из-под контроля и трейдер от греха подальше закрывает всё подряд без разбору. Если сделать такую функцию, которая закрывала бы все ордера интеллектуально, то следует это делать в том порядке, что представлен выше.

А большие (имееется ввиду большей стоимости) потому, что при непредсказуемости рынка большие ордера могут наделать больше беды, чем маленькие. По-моему, это самоочевидно.
----------

Всё это в том случае, когда трейдер подозревает, что теряет контроль над ситуацией.
А в обычном торговом режиме решение должно приматься в специально предназначенных для этого аналитических функциях.
В такие функции программист закладывает алгоритм в соответствии со своим пониманием жизни. Вполне может быть, что закрытие в такой функции будет предполагать иной порядок (не обязательно сначала большие).
----------

По моим представлениям в терминале всегда должен быть открыт только один ордер (либо ни одного).
Спасибо - понятно, при данной оговорке вполне очевидное решение!

 

Нутак как друзья мои получилось саздать скин который закрывает все ордера.Если нетрудно пришлите на sumkin@e1.ru

Причина обращения: