Скачать MetaTrader 5

OrderProfit() предпоследнего ордера

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

Как можно получить OrderProfit() предпоследнего открытого ордера, пробую как на примере  с низу даёт OrderProfit() только последнего

void prof2()
  {
   datetime t=0;
   int j=-2;
   for(int i=OrdersTotal()-2;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
        {
         if(OrderSymbol()==Symbol())
           {
            if(OrderType()==OP_SELL || OrderType()==OP_BUY)
              {
               if(t<OrderOpenTime())
                 {
                  t=OrderOpenTime();
                  j=i;
                 }
              }
           }
        }
     }
   if(OrderSelect(j,SELECT_BY_POS,MODE_TRADES))
     {
      if(OrderSymbol()==Symbol())
        {
         if(OrderType()==OP_SELL || OrderType()==OP_BUY)
           {
            if(OrderProfit())
              {
               prof=OrderProfit();
              }
           }
        }
     }
   return;
  }
pako
3320
pako  
Vladimir Deryagin:

Как можно получить OrderProfit() предпоследнего открытого ордера, пробую как на примере  с низу даёт OrderProfit() только последнего

Время открытия в массив, отсортировать, посмотреть.

Или еще один цикл, время последнего уже известно,

находите минимальное неравное последнему. 

   for(int i=OrdersTotal()-2;i>=0;i--)// неправильно


   for(int i=OrdersTotal()-1;i>=0;i--)// правильно
     
Vitaly Muzichenko
4389
Vitaly Muzichenko  
Vladimir Deryagin:

Как можно получить OrderProfit() предпоследнего открытого ордера, пробую как на примере  с низу даёт OrderProfit() только последнего

Вот, выбираете номер нужного, не забывайте, первая с индексом "0"

 Comment( GetProfitOpenPosInCurrency(_Symbol, OP_SELL, -1, 1) ); // GetProfitOpenPosInCurrency( symbol, бай или селл(-1 - все), Magic(-1 - любой), индекс позиции (1-предпоследняя, 0-последняя)) 

//===============================================================================================
//------------- Возвращает суммарный профит открытых позиций в валюте депозита -----------------+
//===============================================================================================
double GetProfitOpenPosInCurrency(string symb="0", int type=-1, int mg=-1,int index=0) {
 double p[];
 int c=-1, pr=0;
  if(symb=="0") { symb=Symbol();}
   for (int i=OrdersTotal()-1; i>=0; i--) {
    if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
     if(OrderType()==OP_BUY || OrderType()==OP_SELL) {
      if((OrderSymbol()==symb||symb=="")&&(type<0||OrderType()==type)&&(mg<0||OrderMagicNumber()==mg)) {
       c++;
       ArrayResize(p, c+1);
       p[c]=OrderProfit()+OrderSwap()+OrderCommission();
       pr=c>=index?index:c; // если открытых меньше, чем указано в выборе по индексу, то выведет профит самой первой открытой
 }}}}
  return(p[pr]);
 }
Vladimir Deryagin
352
Vladimir Deryagin  
Vitaly Muzichenko:

Вот, выбираете номер нужного, не забывайте, первая с индексом "0"

То что нужно, Спасибо!!!
Vitaly Muzichenko
4389
Vitaly Muzichenko  
Vladimir Deryagin:
То что нужно, Спасибо!!!

Исправил, а то если не было открытых, была ошибка

//+------------------------------------------------------------------+
//===============================================================================================
//------------- Возвращает суммарный профит открытых позиций в валюте депозита -----------------+
//===============================================================================================
double GetProfitOpenPosInCurrency(string symb="0", int type=-1, int mg=-1,int index=0) {
 double p[];
 int c=-1, pr=0;
  if(symb=="0") { symb=Symbol();}
   for (int i=OrdersTotal()-1; i>=0; i--) {
    if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
     if(OrderType()==OP_BUY || OrderType()==OP_SELL) {
      if((OrderSymbol()==symb||symb=="")&&(type<0||OrderType()==type)&&(mg<0||OrderMagicNumber()==mg)) {
       c++;
       ArrayResize(p, c+1);
       p[c]=OrderProfit()+OrderSwap()+OrderCommission();
       pr=c>=index?index:c;
       
 }}}}
  return(c==-1?0:p[pr]);
 }
Vladimir Deryagin
352
Vladimir Deryagin  
Vitaly Muzichenko:

Исправил, а то если не было открытых, была ошибка

Ну да начало выдавать ошибку массива, сейчас всё супер!
Andrey Maslov
160
Andrey Maslov  

Зачем так усложнять?

Вопрос стоит четко "Как получить профит предпоследнего ордера?".


if(OrdersTotal()>=2)

{

   if(OrderSelekt(OrdersTotal()-2, SELEKT_BY_POS)

   {

      profit=OrderProfit();

   }

}

Vitaly Muzichenko
4389
Vitaly Muzichenko  
Andrey Maslov:

Зачем так усложнять?

Вопрос стоит четко "Как получить профит предпоследнего ордера?".


if(OrdersTotal()>=2)

{

   if(OrderSelekt(OrdersTotal()-2, SELEKT_BY_POS)

   {

      profit=OrderProfit();

   }

}

Потому, что может быть открыто десяток позиций по разным инструментам, и ваши -2 попадут на второстепенный символ от того, который нужен в расчёте.

Dmitry Fedoseev
44559
Dmitry Fedoseev  
Vitaly Muzichenko:

Вот, выбираете номер нужного, не забывайте, первая с индексом "0"

Ненадежный способ. Как ордера сортируются после перезапуска терминала никто не знает, по времени ли, по тикету ли. 

Поэтому надо надеться только на себя - сортировать по времени.  

Dmitry Fedoseev
44559
Dmitry Fedoseev  
Vladimir Deryagin:

Как можно получить OrderProfit() предпоследнего открытого ордера, пробую как на примере  с низу даёт OrderProfit() только последнего

Можно первый раз найти последний, потом второй раз такой же поиск, но найденный ранее игнорировать и будет предпоследний.
Vladimir Deryagin
352
Vladimir Deryagin  
Dmitry Fedoseev:
Можно первый раз найти последний, потом второй раз такой же поиск, но найденный ранее игнорировать и будет предпоследний.
Хорошо возьму на вооружение (до первого сбоя), но то что дал Vitaly Muzichenko пока работает как часики. Да, я и не знаю как последний полученный ордер можно проигнорировать при повторном цикле.
12345
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий