Работа с ордерами посредством magic номеров

 

Здравствуйте. Прошлую мою тему закрыли, поэтому напишу сюда.


Противоположные отложенники устанавливаются группами. К примеру 3 группы ордеров, в каждой группе по 4 ордера (2 байстоп, 2 селлстоп).
Для каждой группы надо проверять: если байстопы в этой группе перешли в рынок то удаляются селлстопы в этой группе, и наоборот. В пределах группы magic номера решил назначить в таком виде: 11,12,13,14 (т.е. первая цифра - номер группы, вторая цифра - номер ордера в группе). 1 и 2 оредра - байстопы, 3 и 4 - селлстопы.

На каждом тике работает цикл по количеству групп, и в каждой группе проверяем если OrderType 1-го ордера равен =0, тогда удаляем 3 и 4 ордера (и наоборот если OrderType=1 у 3-го ордера).

Но должным образом вот это не работает (в большинстве случаев удаляет, но иногда, по непонятным причинам противоположные ордера так и остаются висеть, это случается редко, но этого быть не должно). Я догадываюсь что накодил ерунду, но прошу сильно не пинать, отнетсись с пониманием и объяснить в чём загвоздка и в чём я неправ. Спасибо за уделенное время!

Вот код:

for (int gr=0; gr<maxcount; gr++) //Цикл, бегает по всем группам ордеров

               for (int mk=0; mk <OrdersTotal(); mk++)
               {
                  if (OrderSelect(mk,SELECT_BY_POS,MODE_TRADES))
                  {
                  
                     if (OrderType()==1 && OrderMagicNumber()==((gr+1)*10)+3)
                     {
                        for (int rk=OrdersTotal()-1; rk>=0; rk--)
                        {
                           if (OrderSelect(rk,SELECT_BY_POS,MODE_TRADES) && OrderMagicNumber()==((gr+1)*10)+1)
                           {
                              OrderDelete(OrderTicket());
                           }
                           if (OrderSelect(rk,SELECT_BY_POS,MODE_TRADES) && OrderMagicNumber()==((gr+1)*10)+2)
                           {
                              OrderDelete(OrderTicket());
                           }
                        }

                     }
                     
                     if (OrderType()==0 && OrderMagicNumber()==((gr+1)*10)+1)
                     { 
                        for (int sk=OrdersTotal()-1; sk>=0; sk--)
                        {
                           if (OrderSelect(sk,SELECT_BY_POS,MODE_TRADES) && OrderMagicNumber()==((gr+1)*10)+3)
                           {
                              OrderDelete(OrderTicket());
                           }
                           if (OrderSelect(sk,SELECT_BY_POS,MODE_TRADES) && OrderMagicNumber()==((gr+1)*10)+4)
                           {
                              OrderDelete(OrderTicket());
                           }

                        }

                     }
                  }
                  
               }
   }
 

Все равно что-то сложное делаете. Учитесь жить проще.

Нужны всего две функции. Первая проверяет магик, вторая удаляет не нужное.

 
ilgar-90:

Здравствуйте. Прошлую мою тему закрыли, поэтому напишу сюда.


Противоположные отложенники устанавливаются группами. К примеру 3 группы ордеров, в каждой группе по 4 ордера (2 байстоп, 2 селлстоп).
Для каждой группы надо проверять: если байстопы в этой группе перешли в рынок то удаляются селлстопы в этой группе, и наоборот. В пределах группы magic номера решил назначить в таком виде: 11,12,13,14 (т.е. первая цифра - номер группы, вторая цифра - номер ордера в группе). 1 и 2 оредра - байстопы, 3 и 4 - селлстопы.

На каждом тике работает цикл по количеству групп, и в каждой группе проверяем если OrderType 1-го ордера равен =0, тогда удаляем 3 и 4 ордера (и наоборот если OrderType=1 у 3-го ордера).

Но должным образом вот это не работает (в большинстве случаев удаляет, но иногда, по непонятным причинам противоположные ордера так и остаются висеть, это случается редко, но этого быть не должно). Я догадываюсь что накодил ерунду, но прошу сильно не пинать, отнетсись с пониманием и объяснить в чём загвоздка и в чём я неправ. Спасибо за уделенное время!

Вот код:



Orderdelete убирает только только отложенные ордера, а вы Orderselectом выбираете все подряд, в том числе и уже открытые, которые можно убрать только с помощью Orderclose.
 
Sepulca:

Orderdelete убирает только только отложенные ордера, а вы Orderselectом выбираете все подряд, в том числе и уже открытые, которые можно убрать только с помощью Orderclose.

А мне как раз и надо только отложенные удалять... открытые позиции я совсем не трогаю
Причина обращения: