Как правильно выбрать последний ордер в истории?

 

Уважаемые коллеги!

Совсем недавно я увлекся программированием, и как у всех новичков столкнулся с проблемой правильного написания кода. А именно;

Мне необходимо задать советнику такие условия:

Если предыдущий ордер закрылся с минусом по стопу, то нужно перевернуться и открыть ордер в противоположную сторону.

Допустим предыдущий ордер был на BUY, значит если он получил стоп - то открыться на SELL.

Я так понимаю, мне необходимо сделать переборку ордеров из истории, я сделал это так:

for(int i=0, i<OrdersHistoryTotal(), i++)   //создаю цикл

{

if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==true)  // выбираю ордер

 {

Continue;                                                                        // оператор Continue продолжает цикл перебора ордеров до тех пор пока не дойдет до последнего ордера..

 }

}

if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==true)  // теперь, когда в переменную i записался номер последнего ордера

{

if(OrderProfit<0 && OrderType==OP_BUY)  // Проверяю, если Прибыль выбранного ордера меньше нуля и данный ордер я вляется ордером на покупку, то..

 {

 ticket=OrderSend.. OP_SELL.. и так далее..

 }

}


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

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

 

1. Для форматирования кода используйте Alt + S. https://www.mql5.com/ru/articles/24#editor

2. Почему выбираете ордера, а не позиции?

MQL5.community - Памятка пользователя
MQL5.community - Памятка пользователя
  • www.mql5.com
Теперь вы можете не только читать статьи и скачивать программы на языке MQL5, но и участвовать в обсуждении интересующих вас тем на Форуме, оставлять комментарии к статьям и опубликованным кодам. Кроме того, вы можете не только выкладывать собственные разработки в Code Base, но и публиковать Статьи, за которые мы предлагаем вознаграждение...
 
Sergey Savinkin:

1. Для форматирования кода используйте Alt + S. https://www.mql5.com/ru/articles/24#editor

2. Почему выбираете ордера, а не позиции?

То есть вот так:


for(int i=0, i<OrdersHistoryTotal(), i++)   //создаю цикл

{

if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==true)  // выбираю ордер

 {

Continue;                                                                        // оператор Continue продолжает цикл перебора ордеров до тех пор пока не дойдет до последнего ордера..

 }

}

if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==true)  // теперь, когда в переменную i записался номер последнего ордера

{

if(OrderProfit<0 && OrderType==OP_BUY)  // Проверяю, если Прибыль выбранного ордера меньше нуля и данный ордер я вляется ордером на покупку, то..

 {

 ticket=OrderSend.. OP_SELL.. и так далее..

 }

}
 
Sergey Savinkin:

1. Для форматирования кода используйте Alt + S. https://www.mql5.com/ru/articles/24#editor

2. Почему выбираете ордера, а не позиции?

А в чем разница между ордерами и позициями в MQL ?

Или Вы имеете в виду что мне нужно было выбирать открытые позиции , нежели закрытые ордера?

 
a_universal:

А в чем разница между ордерами и позициями в MQL ?

Или Вы имеете в виду что мне нужно было выбирать открытые позиции , нежели закрытые ордера?

Ваш вопрос был в другой ветке, я сразу не посмотрел, что это МТ4. По МТ4 не помогу.

 
a_universal:

Зачем Вы перебираете все ордера в истории?
Сделайте перебор наоборот, от OrdersHistoryTotal  к Нулю. i--

И при первом же найденном ордере прервать цикл.

Вот, как пример, нахождение направления последнего закрывшегося ордера:

int f_VectorLastClose()
{    
   int value=0;
   for (int i = OrdersHistoryTotal(); i>=0; i--)
   {
      if(!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY){continue};
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
      {
         if(OrderType()==OP_BUY)
         {
            return(1);
         }
         if(OrderType()==OP_SELL)
         {
            return(-1);
         }
      }        
   }  
   return(value);
}
Вместо/перед return Вам нужно вставить проверку Профит больше или меньше нуля. Ну и дальше в зависимости от задачи которая поставлена.
 

Если ордеров не один, то по стопу может закрыться не обязательно последний

если глубина истории будет не полной, также будет не верно работать алгоритм

если нужен конкретно последний ордер, то нужно запомнить его тикет и проверять - будет ли выбран он по тикету

также наблюдается попытка автоматизации ручной торговли

в автоторговле ордера закрывают в основном по алгоритму

 

найти последний ордер в истории по магику, если не нашел, то вернет -1, -1 , -1.0

int LastfOrder(int magic_,int &ordtype,double &lot)
  {
   int i,k=OrdersHistoryTotal();
   string sy=Symbol();
   datetime t,lasttime=0;
   ordtype=-1;
   lot=-1.0;
   int ticket=-1;
   for(i=0; i<k; i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
        {
         if((OrderMagicNumber()==magic_) && (OrderSymbol()==sy))
           {
            t=OrderCloseTime();
            if(t>lasttime)
              {
               lasttime=t;
               ticket=OrderTicket();
               ordtype=OrderType();
               lot=OrderLots();
              }
           }
        }
     }
   return(ticket);
  }
//_______________________________________________________________________

добавьте условие OrderProfit()<0.0 и найдете последний убыток, или поиском по форуму - полезные ф-ции от Игорь Ким, там есть пример как найти ордер в истории закрытый по стоплоссу

 
for(int i=OrdersHistoryTotal()-1; i>=0; i--)
{
     if( !OrderSelect(i, SELECT_BY_POS,MODE_HISTORY )  continue;
     if( OrderMagicNumber() != 1234 )   continue;
     if( OrderSymbol() != _Symbol )     continue;
     if( OrderComment() != "[sl]" )     continue;
     /* work */
}
 
Konstantin Nikitin:

Автор пишет "Если предыдущий ордер закрылся с минусом по стопу, то нужно перевернуться"
т.е. ваш код найдет не это, а последний закрывшийся по СЛ (и он не обязательно будет предыдущий )

И кстати формулировка у автора не совсем ясная.
Нужно именно "с минусом" или именно "по стопу"?
Потому как в плюс но со стопом может закрыться ордер с тралом СЛ.
Так же и в минус но по ТейкПрофиту может закрыться ордер, например в сеточных стратегиях.

 
Andrei Fandeev:

Автор пишет "Если предыдущий ордер закрылся с минусом по стопу, то нужно перевернуться"
т.е. ваш код найдет не это, а последний закрывшийся по СЛ (и он не обязательно будет последний)

А дальнейшую проверку ту какая интересует разве сложно организовать. Есть направление, а применить для себя как нужно, это уже проблем не составляет.

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