Как изменить скрипт?

 

Здравствуйте,

Как изменить код чтобы он удалял все ордера? Использую вот такой код, но он не удаляет все ордера и для части ордеров выдает инвалид прайс. Заранее спасибо

void CloseOrders()
{
int cnt = OrdersTotal();
for (int i=cnt-1; i>=0; i--) {
if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;


if (OrderType() == OP_BUYSTOP) OrderDelete(OrderTicket());
if (OrderType() == OP_SELLSTOP) OrderDelete(OrderTicket());
if (OrderType() == OP_BUYLIMIT) OrderDelete(OrderTicket());
if (OrderType() == OP_SELLLIMIT) OrderDelete(OrderTicket());
RefreshRates();
if (OrderType() == OP_BUY) OrderClose(OrderTicket(), OrderLots(), Bid, 3);
if (OrderType() == OP_SELL) OrderClose(OrderTicket(), OrderLots(), Ask, 3);


}
}

 
bezubir писал(а) >>

Здравствуйте,

Как изменить код чтобы он удалял все ордера? Использую вот такой код, но он не удаляет все ордера и для части ордеров выдает инвалид прайс. Заранее спасибо

После if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue; вставьте RefreshRates(); и/или Bid и Ask замените на OrderClosePrice();

 

вместо

if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;

использовать

if ( !(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) && OrderSymbol()==Symbol()) ) continue;


иначе при закрытии ордеров будут ошибки и потеря времени, когда эксперт стартовавший на одном инструменте будет пытаться закрыть ордера других инструментов по СВОИМ ценам

 

А что RefreshRates(); уже есть я и не заметил) Попробуйте просто заменить Bid и Ask заменить на OrderClosePrice(). Но влюбом случае полностью избавиться от таких ошибок не удасться. Надо ее обрабатывать. Примитивно и не очень правильно, этот цикл закрытия поместить в цикл, while(OrdersTotal()>0){ "Ваш цикл"}.

 
keekkenen писал(а) >>

иначе при закрытии ордеров будут ошибки и потеря времени, когда эксперт стартовавший на одном инструменте будет пытаться закрыть ордера других инструментов по СВОИМ ценам

Использование OrderClosePrice() по идеи должно избавить от использования чужих цен... Но просто реквоты-то все равно могут быть и их обработка нужна.

 
Figar0 >>:

Использование OrderClosePrice() по идеи должно избавить от использования чужих цен... Но просто реквоты-то все равно могут быть и их обработка нужна.

да, верно, что-то я забыл про эту функцию..

 

void CloseOrders()
{
int cnt = OrdersTotal();
for (int i=cnt-1; i>=0; i--) {
if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;


if (OrderType() == OP_BUYSTOP) OrderDelete(OrderTicket());
if (OrderType() == OP_SELLSTOP) OrderDelete(OrderTicket());
if (OrderType() == OP_BUYLIMIT) OrderDelete(OrderTicket());
if (OrderType() == OP_SELLLIMIT) OrderDelete(OrderTicket());
RefreshRates();
if (OrderType() == OP_BUY) OrderClose(OrderTicket(), OrderLots(), OrderClosePrice()., 3);
if (OrderType() == OP_SELL) OrderClose(OrderTicket(), OrderLots(), OrderClosePrice()., 3);


}
}

 
Figar0 писал(а) >>

Но влюбом случае полностью избавиться от таких ошибок не удасться.

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

 
Roger писал(а) >>

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

Это я про реквоты) С ними ничего не поделать.

 
bezubir >>:

Здравствуйте,

Как изменить код чтобы он удалял все ордера? Использую вот такой код, но он не удаляет все ордера и для части ордеров выдает инвалид прайс. Заранее спасибо

void CloseOrders()
{
int cnt = OrdersTotal();
for (int i=cnt-1; i>=0; i--) {
if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;


if (OrderType() == OP_BUYSTOP) OrderDelete(OrderTicket());
if (OrderType() == OP_SELLSTOP) OrderDelete(OrderTicket());
if (OrderType() == OP_BUYLIMIT) OrderDelete(OrderTicket());
if (OrderType() == OP_SELLLIMIT) OrderDelete(OrderTicket());
RefreshRates();
if (OrderType() == OP_BUY) OrderClose(OrderTicket(), OrderLots(), Bid, 3);
if (OrderType() == OP_SELL) OrderClose(OrderTicket(), OrderLots(), Ask, 3);


}
}

int close_ord1=OrdersTotal();
         for (int qe1=0;qe1<close_ord1;qe1++)
            {
               OrderSelect(qe1, SELECT_BY_POS, MODE_TRADES);
                 
                     if(OrderType()==OP_BUY) {RefreshRates();OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),3);Sleep(2000);}
                     if(OrderType()==OP_SELL){RefreshRates();OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),3);Sleep(2000);}
                    
            }
 
Всех благодарю :)
Причина обращения: