Просчет профита закрытых ордеров "HELP" - страница 7

 
Sergey Gritsay:
и где это все это есть? вы это записываете куда-то в переменную или массив? покажите сначала где вы это храните, дальше будет видно что дальше делать.
Ни где. Нужно это всё грамотно создать и собрать данные профита.
 
Natashe4ka:

Хорошо, тогда по полочкам: есть время закрытия ордеров, есть тикет или номер ордеров которые совпадают по времени закрытия. Как это объединить и посчитать профит этих ордеров?
Вроде не сложно, но так и не понятно. 

Пока ни кто не может понять выделил красным, каких этих. Нужны точные критерии поиска этих ордеров. По этому постарайтесь объяснить, как говориться на пальцах, с картинками и так далее
 
Sergey Gritsay:
Пока ни кто не может понять выделил красным, каких этих. Нужны точные критерии поиска этих ордеров. По этому постарайтесь объяснить, как говориться на пальцах, с картинками и так далее

?

Почему это никто не может понять, Вы имели ввиду себя скорее всего?

Всё уже давно понятно.

Мадам просто хочет сделать самостоятельно, не афишируя подробности своей программы.

 
Sergey Gritsay:
Пока ни кто не может понять выделил красным, каких этих. Нужны точные критерии поиска этих ордеров. По этому постарайтесь объяснить, как говориться на пальцах, с картинками и так далее

Да Я уже дал абсолютно 100% рабочее условие и приложил это ввиде готового кода. При этом нужно заметить то, что в коде используется способ, которому не страшны перезагрузки терминала, и при включении терминала ничего не потеряется и продолжит работать. Но тут изобретают велосипед, который будет работать только в тестере. 

Sergey, так-же обратите внимание, в оригинальном коде ТС при закрытии серии с 5 позиций, так-же удаляется ордер в середине закрытия, это в свою очередь ни к чему хорошему не приведёт в реальной торговле. В общем, всем всё понятно, кроме ТС.

 
ну все вроде въехал чего Наталья хочет получить
//+------------------------------------------------------------------+
//|                                                   Natashe4ka.mq4 |
//|                                                   Sergey Gritsay |
//|                         https://www.mql5.com/ru/users/sergey1294 |
//+------------------------------------------------------------------+
#property copyright "Sergey Gritsay"
#property link      "https://www.mql5.com/ru/users/sergey1294"
#property version   "1.00"
#property strict

input int Magic=1;//Identification number
double Profit=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   color ProfitColor=0;

// START //
   LastProfitCL_1(Profit,TimeCurrent(),-1);
  
   if(Profit<0)ProfitColor=clrRed;
   else if(Profit>0)ProfitColor=clrLimeGreen;
   else ProfitColor=clrDarkGray;
  
   ObjectCreate("Last Profit",OBJ_LABEL,0,0,0);
   ObjectSet("Last Profit",OBJPROP_CORNER,1);
   ObjectSet("Last Profit",OBJPROP_XDISTANCE,5);
   ObjectSet("Last Profit",OBJPROP_YDISTANCE,15);
   ObjectSetText("Last Profit",StringConcatenate("Last Profit: ",DoubleToStr(Profit,2)),10,"Arial",ProfitColor);
// END START //

  }
//+------------------------------------------------------------------+
//Вариант 1
//+------------------------------------------------------------------+
bool LastProfitCL_1(double &LastProfit,//сюда записываем профит
                  datetime timecurent,// текущее время
                  int op=-1//"op" позиция (-1 любая позиция)                
                  )
  {
   double profit=0;
   int cnt=0;
   datetime timecurents=0;
   int total=OrdersHistoryTotal();

   for(int i=total-1;i>=0;i--)
     {
      if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))continue;
      if(OrderMagicNumber()!=Magic)continue;
      if(OrderSymbol()!=_Symbol)continue;
      if(OrderType()>1)continue;// исключим удаленные отложенные ордера
      if(OrderCloseTime()!=timecurent)continue;
      if(OrderType()==op || op==-1)
        {
         profit+=OrderProfit()+OrderCommission()+OrderSwap();
         cnt++;
        }
     }
   if(cnt!=0)
     {
      LastProfit=profit;
      return(true);
     }
   return(false);
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//|   Вариант 2                                                               |
//+------------------------------------------------------------------+
bool LastProfitCL_2(double &LastProfit,//сюда записываем профит
                  datetime timecurent,// текущее время
                  int op=-1//"op" позиция (-1 любая позиция)                
                  )
  {
   double profit=0;
   int cnt=0;
   datetime timecurents=0;
   int total=OrdersHistoryTotal();
   if(OrderSelect(total-1,SELECT_BY_POS,MODE_HISTORY))
     {
      timecurents=OrderCloseTime();
     }
   for(int i=total-1;i>=0;i--)
     {
      if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))continue;
      if(OrderMagicNumber()!=Magic)continue;
      if(OrderSymbol()!=_Symbol)continue;
      if(OrderCloseTime()<timecurents)continue;
      if(OrderType()>1)continue;// исключим удаленные отложенные ордера
      if(OrderType()==op || op==-1)
        {
         profit+=OrderProfit()+OrderCommission()+OrderSwap();
         cnt++;
        }
     }
   if(cnt!=0)
     {
      LastProfit=profit;
      return(true);
     }
   return(false);
  }
//+------------------------------------------------------------------+
....
 

Внес исправления во второй вариант функции

bool LastProfitCL_2(double &LastProfit,//сюда записываем профит
                    datetime timecurent,// текущее время
                    int op=-1//"op" позиция (-1 любая позиция)                
                    )
  {
   double profit=0;
   int cnt=0;
   datetime timecurents=0;
   int total=OrdersHistoryTotal();
   for(int i=total-1;i>=0;i--)
     {
      if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))continue;
      if(OrderType()>1)continue;// исключим удаленные отложенные ордера
      if(OrderType()!=op && op!=-1)continue;  
      if(OrderMagicNumber()!=Magic)continue;
      if(OrderSymbol()!=_Symbol)continue;
      if(timecurents==0)timecurents=OrderCloseTime(); // запомним время последнего закрытого ордера
      if(OrderCloseTime()<timecurents)continue;

      profit+=OrderProfit()+OrderCommission()+OrderSwap();
      cnt++;
     }
   if(cnt!=0)
     {
      LastProfit=profit;
      return(true);
     }
   return(false);
  }

..........
 

 
Sergey Gritsay:

Внес исправления во второй вариант функции

Спасибо за помощь.
Вариант 1 не правильно работает
Вариант 2 работает правильно.
И мой вариант тоже работает правильно, но если ордера переносятся на другой день и больше, то значение просчета не понятное получается профит 190, а должно быть 4,27

См. скрин №3 https://www.mql5.com/ru/forum/162930/page3

//+----------------------------------------------------------------------------+
//     Возвращает суммарный профит в валюте депозита серии закрытых ордеров    |
//+----------------------------------------------------------------------------+
double LastProfitCL(int op=-1){ //"op" позиция (-1 любая позиция)
  double LastProfit=0;
  datetime t=0;
   for(i=OrdersHistoryTotal()-1;i>=0;i--)
     if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && (OrderType()==OP_BUY || OrderType()==OP_SELL) && OrderSymbol()==Symbol() && OrderMagicNumber()==magic) {
       if (OrderSymbol()!=Symbol()||OrderMagicNumber()!=magic) continue;
       if (t<OrderCloseTime()) {t=OrderCloseTime();}
       if ((op<0||OrderType()==op) && t==OrderCloseTime()) {LastProfit+=OrderProfit()+OrderCommission()+OrderSwap();}
       }
  return(LastProfit);
   }


 

 
Как оказалось проблема не в кол-ве ордеров а в переносе ордеров на другой день и более.
 
Natashe4ka:
Как оказалось проблема не в кол-ве ордеров а в переносе ордеров на другой день и более.
Так вы серией закрываете или как? Что за перенос, если все ордера закрыть за один цикл?
 
Vitalie Postolache:
Так вы серией закрываете или как? Что за перенос, если все ордера закрыть за один цикл?

Ордера закрываются серией, но если условий для закрытия нет, то ордера собираются день-два и т.д.
Хотя кол-во ордеров тоже влияет на значение профита.
Если больше 3-х ордеров, то значение берётся последнего закрытого ордера только. 

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