Подскажите в отношении времени.

 

Почему в этой функции не производится сравнение времени?

Она должна выдавать прибыль всехзакрытых  сделок за текущие сутки, а она выдает за всю историю.

double ProfitDef() {
  double pr = 0;
  datetime dt = iTime(Symbol(),1440,0);
  datetime dm = TimeCurrent();
  
  if(OrdersHistoryTotal()!=0){
for(int i = OrdersHistoryTotal()-1;i>0;i--){
  if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) continue;  
  if(OrderSymbol()!=Symbol() && dm > dt)continue;
  { 
  pr+= OrderProfit();
  //Print("Общая прибыль/убыток по незакрытым операциям составляет ", pr);
  }}}
  return(pr);
}

 

может быть так?

  if(OrderSymbol()!=Symbol() || dm < dt) continue;

и, кстати

for(int i = OrdersHistoryTotal()-1;i>=0;i--){

индекс позиций начинается с нуля

 
double ProfitDef() {
  double pr = 0;
  datetime dt = iTime(Symbol(),1440,0);
  datetime dm = TimeCurrent();
  
  if(OrdersHistoryTotal()!=0){
for(int i = OrdersHistoryTotal()-1;i>=0;i--){
  if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) continue;  
  dm=OrderCloseTime(); // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  if(OrderSymbol()!=Symbol() && dm > dt)continue;
  { 
  pr+= OrderProfit();
  //Print("Общая прибыль/убыток по незакрытым операциям составляет ", pr);
  }}}
  return(pr);
}
 

точно! только условие должно остаться

 if(OrderSymbol()!=Symbol() || dm < dt) continue;
 
GarF1eld писал(а) >>

точно! только условие должно остаться

Нет конечно, тогда будут все ордера до сегоднешнего дня, а надо за текущие сутки. Соответственно время закрытия ордера должно быть больше времени начала формирования текущей дневной свечки..
 

в dm хранится время закрытия перебираемого ордера.

в dt хранится время начала текущего дня.

...

возможно вы не заметили

continue;
 
//+------------------------------------------------------------------+
//|  LastDayProfit                                                   |
//+------------------------------------------------------------------+  
double LastDayProfit(int day=0,string Sy="",int Typ=-1,int Mag=-1){
int i,time;
double profit;
string sy;
if(Sy==""){sy=Symbol();}else{sy=Sy;}
  for(i=0;i<=OrdersHistoryTotal();i++){
    if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)){
      if(Sy==""||OrderSymbol()==Sy){
        if(Typ==-1||OrderType()==Typ){
          if(Mag==-1||OrderMagicNumber()==Mag){
            if(OrderCloseTime()>=iTime(sy,1440,day)){
              profit=profit+OrderProfit()+OrderSwap()+OrderCommission();
            }
          }
        }
      }
    }
  }
return(profit);  
}
 
GarF1eld писал(а) >>

возможно вы не заметили

Точно) Совершенно лишний в данном случае оператор. В случае невыполнения прямого условия управление и так "перелетит" в начало цикла.

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