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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Yuriy Vins
1502
Yuriy Vins  

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

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

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

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

Допустим предыдущий ордер был на 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.. и так далее..

 }

}


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

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

Sergey Savinkin
2105
Sergey Savinkin  

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

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

MQL5.community - Памятка пользователя
MQL5.community - Памятка пользователя
  • www.mql5.com
Теперь вы можете не только читать статьи и скачивать программы на языке MQL5, но и участвовать в обсуждении интересующих вас тем на Форуме, оставлять комментарии к статьям и опубликованным кодам. Кроме того, вы можете не только выкладывать собственные разработки в Code Base, но и публиковать Статьи, за которые мы предлагаем вознаграждение...
Yuriy Vins
1502
Yuriy Vins  
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.. и так далее..

 }

}
Yuriy Vins
1502
Yuriy Vins  
Sergey Savinkin:

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

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

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

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

Sergey Savinkin
2105
Sergey Savinkin  
a_universal:

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

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

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

Andrei Fandeev
36127
Andrei Fandeev  
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 Вам нужно вставить проверку Профит больше или меньше нуля. Ну и дальше в зависимости от задачи которая поставлена.
Renat Akhtyamov
16182
Renat Akhtyamov  

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

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

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

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

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

Igor Makanu
9909
Igor Makanu  

найти последний ордер в истории по магику, если не нашел, то вернет -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 и найдете последний убыток, или поиском по форуму - полезные ф-ции от Игорь Ким, там есть пример как найти ордер в истории закрытый по стоплоссу

Konstantin Nikitin
9278
Konstantin Nikitin  
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 */
}
Andrei Fandeev
36127
Andrei Fandeev  
Konstantin Nikitin:

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

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

Konstantin Nikitin
9278
Konstantin Nikitin  
Andrei Fandeev:

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

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий