Какая конструкция правильная? - страница 7

 
Vladon:
В свое время в кодебазе публиковал свой набор на закрытие разных типов.
В этом случае вы даёте скомпилированные файлы, что не имеет пользы в данной ветке.

А здесь, извините, ошиблись форумом.

Не в обиду. 

 

ой, то не то :-), щас.


https://www.mql5.com/ru/code/9052

 
int Close_This_Symbol_All()
{
//----
  string a = "Всего ордеров = " + DoubleToStr(OrdersTotal(),0)+ "\n";
  for (int Cnt = OrdersTotal(); Cnt >= 0; Cnt--) 
  {
    if(!OrderSelect(Cnt, SELECT_BY_POS, MODE_TRADES)) break;

        while (!IsTradeAllowed()) Sleep(1000);
        RefreshRates();
        if(OrderType() == OP_BUY ) OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Bid,Digits), slip, CLR_NONE);
        if(OrderType() == OP_SELL) OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Ask,Digits), slip, CLR_NONE);
       Comment(a+ GetLastError());  
  }
//----
   return(0);
}
Тогда такая конструкция должна, по идее, закрывать вообще все ордера, однако закрывает только по паре текущего окна,  в чём ошибка?
 
Vladon:

ой, то не то :-), щас.


https://www.mql5.com/ru/code/9052


  Да, твой наборчик хорош, однако не могу понять где ошибка в моём коде.
 
valenok2003:

Да, твой наборчик хорош, однако не могу понять где ошибка в моём коде.

int Close_This_Symbol_All()
{
//----
  string a = "Всего ордеров = " + DoubleToStr(OrdersTotal(),0)+ "\n";
  for (int Cnt = OrdersTotal(); Cnt >= 0; Cnt--) 
  {
    if(!OrderSelect(Cnt, SELECT_BY_POS, MODE_TRADES)) break;

        while (!IsTradeAllowed()) Sleep(1000);
        RefreshRates();
        if(OrderType() == OP_BUY ) OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Bid,Digits), slip, CLR_NONE);
        if(OrderType() == OP_SELL) OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Ask,Digits), slip, CLR_NONE);
       Comment(a+ GetLastError());  
  }
//----
   return(0);
}


for (int  Cnt = OrdersTotal(); Cnt >= 0; Cnt--) 
Иногда упертость просто поражает. На 3-й странице этой ветки и дальше по ветке Вам показали правильный пример перебора ордеров. RTFM в конце-то концов. Сколько раз можно повторять : Выход за пределы массива. Ордера с номером
OrdersTotal()

не существует ! Тогда это сработает :

if(!OrderSelect(Cnt, SELECT_BY_POS, MODE_TRADES)) break;
 
VladislavVG:
Иногда упертость просто поражает. На 3-й странице этой ветки и дальше по ветке Вам показали правильный пример перебора ордеров. RTFM в конце-то концов. Сколько раз можно повторять : Выход за пределы массива. Ордера с номером

не существует ! Тогда это сработает :


  Владислав, прошу прощения, это не упёртость, а, скорее, невнимательность. Экспериментировал и код не поправил.

Конечно  правильно :

for (int  Cnt = OrdersTotal()-1; Cnt >= 0; Cnt--) 

Однако,  причина похоже не в этом, поскольку, исправленная конструкция 

int Close_This_Symbol_All()
{
//----
  string a = "Всего ордеров = " + DoubleToStr(OrdersTotal(),0)+ "\n";
  for (int Cnt = OrdersTotal()-1; Cnt >= 0; Cnt--) 
  {
    if(!OrderSelect(Cnt, SELECT_BY_POS, MODE_TRADES)) break;

        while (!IsTradeAllowed()) Sleep(1000);
        RefreshRates();
        if(OrderType() == OP_BUY ) OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Bid,Digits), slip, CLR_NONE);
        if(OrderType() == OP_SELL) OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Ask,Digits), slip, CLR_NONE);
       Comment(a+ GetLastError());  
  }
//----
   return(0);
}

всё-равно закрывает ордера только по паре окна, на которое бросаешь скрипт, но не все пары. 

 

Из профиля топик-стартера "Пишу на MQL4, в том числе на заказ." - типичный пример сверх-свинства. 

Я понимаю, программисты бывают и средней руки. К этому привыкаешь. Да и сам я иногда код пишу не очень, хотя стараюсь. Но что бы такое...

Подтверждаю давнее чьё-то предположение, в голове у топик-стартера шерсть.

 
valenok2003:


Владислав, прошу прощения, это не упёртость, а, скорее, невнимательность. Экспериментировал и код не поправил.

Конечно правильно :

Однако, причина похоже не в этом, поскольку, исправленная конструкция

всё-равно закрывает ордера только по паре окна, на которое бросаешь скрипт, но не все пары.

Если все пары, то Вы не верно используете Ask, Bid - берете с текущего чарта. Если бы Вы обрабатывали ошибки при закрытии ордеров - увидели б сообщения.

вместо Ask - MarketInfo(OrderSymbol(),MODE_ASK);, вместо Bid - MarketInfo(OrderSymbol(),MODE_BID);

Удачи.

ЗЫ и название скрипта смените, а то согласно названию он корректно работает ;).

 
gip:

Из профиля топик-стартера "Пишу на MQL4, в том числе на заказ." - типичный пример сверх-свинства. 

Я понимаю, программисты бывают и средней руки. К этому привыкаешь. Да и сам я иногда код пишу не очень, хотя стараюсь. Но что бы такое...

Подтверждаю давнее чьё-то предположение, в голове у топик-стартера шерсть.

 


Обидно, конечно, такое слышать. Однако я никогда не беру заказы, которые не могу выполнить. А Вы, надеюсь, понимаете что уровни заказов тоже могут быть разными. И, как кто-то сказал  - Не стыдно не знать. Стыдно не спрашивать.... А как я понимаю этот форум как раз и существует, что бы была возможность обучения. И поэтому Ваш, снобизм мне не понятен, и Вашу критику я не принимаю. Хотя я и допускаю, что Вы самый умный на этом форуме.

P.S. Искусство программирования состоит не в умении писать коды, а в умении составлять правильный алгоритм. Это как если вы всю жизнь ездили на Ладе, а затем пересели на Мерседес и не знаете где какие ручки и кнопки, то вы от этого не стали плохим водителем.

 
VladislavVG:

Если все пары, то Вы не верно используете Ask, Bid - берете с текущего чарта. Если бы Вы обрабатывали ошибки при закрытии ордеров - увидели б сообщения.

вместо Ask - MarketInfo(OrderSymbol(),MODE_ASK);, вместо Bid - MarketInfo(OrderSymbol(),MODE_BID);

Удачи.


  Спасибо большое, я ошибки обрабатываю, приходит сообщение - неправильная цена, а я -то никак не могу понять в чём дело.
Причина обращения: