[ВНИМАНИЕ, ТЕМА ЗАКРЫТА!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда. - страница 858

 

Вопрос простой, но что-то немогу додуматься.

В конкретный момент времени имеется 4 открытых позиции. Пытаюсь все закрыть слудующим образом:

for (int i=0;i<OrdersTotal();i++)
  {
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {
        if(OrderType()==OP_BUY)
           OrderClose(OrderTicket(),OrderLots(),Bid,3,White);
        if(OrderType()==OP_SELL)
           OrderClose(OrderTicket(),OrderLots(),Ask,3,White);
      }
  }

 Но закрываются не все, а через одну. По факту они скажем имею следующие номера: 2,4,6,7. Так вот закрывается 2-ая и 6-ая позиции.

В чем подвох? 

 
usver:

Вопрос простой, но что-то немогу додуматься.

В конкретный момент времени имеется 4 открытых позиции. Пытаюсь все закрыть слудующим образом:

 Но закрываются не все, а через одну. По факту они скажем имею следующие номера: 2,4,6,7. Так вот закрывается 2-ая и 6-ая позиции.

В чем подвох? 


в том что после закрытия позиции меняется нумерация в OrderSelect(i,SELECT_BY_POS,MODE_TRADES) и одновременно не могут все закрыться

ЗЫ: мне очень помогли ф-ции И.Ким,я немного изменил - убрал лишние скобки и вытянул в одну строчку:

//+------------------------------------------------------------------+
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:


в том что после закрытия позиции меняется нумерация в OrderSelect(i,SELECT_BY_POS,MODE_TRADES) и одновременно не могут все закрыться

ЗЫ: мне очень помогли ф-ции И.Ким,я немного изменил - убрал лишние скобки и вытянул в одну строчку:

поищите поиском по форуму - найдете оригиналы 


Большое спасибо наводку и пример. Буду разбираться.

По ходу задам еще один вопрос.

Задача следующая: нужно определить, какого типа был закрыт ордер, сработавший по стоп-лоссу, чтобы в последствии сравнить будущий закрытый по стоп-лоссу ордер с предидущим (читай - сравнить их типы). Полистав документацию, не смог найти чего-либо, связанного с обработкой последнего события.

В данный момент времени, эту операцию я реализовал, как закрытие ордера, при достижении заданной границы (Bid-OrderOpenPrice()>=TP*Point). Что дало мне возможность сохранить в переменную тип последнего закрытого ордера и, при следующем закрытии, сравнить с только что закрытым ( if(type==OrderType()) ). Все работает прекрасно при тестировании, но хотелось бы все таки реализовать это с использование стоп-лоссов. 

Я пытался выбирать закрытый ордер из истории при помощи OrderSelect() и аргумента MODE_HISTORY. Т.к. условий на закрытие ордеров нет, то изменение переменной OrdersTotal() можно рассматривать, как раз таки, как срабатывание стоп-лосса. Но столкнулся с проблемой - я не могу определить номер последнего закрытого ордера (т.к. количество их постоянно меняется), ну или просто не догадался, как это сделать.

Вопрос такой: как реализовать это с использованием стопп-лоссов? Может есть способы намного проще? Ну а если же направление мысли правильное, то как найти последний закрытый ордер?

 
IgorM:


в том что после закрытия позиции меняется нумерация в OrderSelect(i,SELECT_BY_POS,MODE_TRADES) и одновременно не могут все закрыться

ЗЫ: мне очень помогли ф-ции И.Ким,я немного изменил - убрал лишние скобки и вытянул в одну строчку:

поищите поиском по форуму - найдете оригиналы

Ну Вы и наговорили... всё в одну кучу
https://docs.mql4.com/ru/trading/OrderSelect
 
usver:

Вопрос простой, но что-то немогу додуматься.

В конкретный момент времени имеется 4 открытых позиции. Пытаюсь все закрыть слудующим образом:

Но закрываются не все, а через одну. По факту они скажем имею следующие номера: 2,4,6,7. Так вот закрывается 2-ая и 6-ая позиции.

В чем подвох?

Вы говорите о номерах по порядку? или тикетах?

 
abolk:

Вы говорите о номерах по порядку? или тикетах?


Я уже сам запутался. Это тикеты, но привел я их, чтобы ситуация была понятна. Закрываются через один.
 

Ура у мя все заработало!!!


Виктор большое вам спасибо, ошибка была у меня я не правильно написал имя индикатора.

 
abolk:
Ну Вы и наговорили... всё в одну кучу
https://docs.mql4.com/ru/trading/OrderSelect


попробуйте изменить/убрать тейки или стопы у группы ордеров - задача простая, но я столкнулся с тем, что выбирая ордер по OrderSelect(i,SELECT_BY_POS,MODE_TRADES) нумерация ордеров изменялась прямо в теле цикла и получалось по нескольку раз модифицировать уже модифицированный(без тейка )  ордер - ошибка №1, вот почему я и предположил, что у usver схожая проблема

 

подскажите, плз - как сделать чтобы индикатор пересчитывался по закрытию нескольких баров, ну к примеру: хочу, чтобы перерисовка/пересчет индикатора был каждые 5 новых баров 

 
IgorM:


подскажите, плз - как сделать чтобы индикатор пересчитывался по закрытию нескольких баров, ну к примеру: хочу, чтобы перерисовка/пересчет индикатора был каждые 5 новых баров 

Вы же разбираетесь в программировании. 

Это логическая задача и чтобы её решить не надо быть шибко грамотным. Подумайте головой.

Случаи разные бывают. Где именно должна быть перерисовка, на каком ТФ, как должна происходить перерисовка и т д.. Как можно ответить на Ваш вопрос.

Запоминайте время бара и через пять баров обнуляйте это время и запоминайте снова. В момент обнуления времени можно ставить условие на пересчёт. Поможет Функция iTime(NULL,0,0). Остальное всё логика.  

 
IgorM:


  подскажите, плз - как сделать чтобы индикатор пересчитывался по закрытию нескольких баров, ну к примеру: хочу, чтобы перерисовка/пересчет индикатора был каждые 5 новых баров 


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

Использовать переменную Bars и отслеживать ее изменение. Увеличилось на 5, запомнили и т.д. 

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