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

 
Renat Akhtyamov:

Нет, эту строчку убираем. Здесь уже расчет профита, работать так не будет.

Где команда на закрытие в коде - туда

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

и в условии на закрытие

{CloseOrder(OrderTicket());t=TimeCurrent();} 

{DeleteAll();t=TimeCurrent();}

1 не считает, 2 правильно считает, 3 не считает 0

 
Natashe4ka:
//+----------------------------------------------------------------------------+
//     Возвращает суммарный профит в валюте депозита серии закрытых ордеров    |
//+----------------------------------------------------------------------------+
double LastProfitCL(int op=-1){ //"op" позиция (-1 любая позиция)
  double LastProfit=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 (OrderType()!= op || OrderSymbol()!= Symbol() || OrderMagicNumber()!= magic) continue;
    
       if (op<0 || OrderType()==op){if(OrderCloseTime()>=t)LastProfit+=OrderProfit()+OrderCommission()+OrderSwap();}
       }
  return(LastProfit);
   }

и в условии на закрытие

{CloseOrder(OrderTicket());t=TimeCurrent();} 

{DeleteAll();t=TimeCurrent();}

1 не считает, 2 правильно считает, 3 не считает 0

а так

{t=TimeCurrent();CloseOrder(OrderTicket());}
{DeleteAll();}

И еще

У Вас ордера закрываются по тикету?

Значит нужно еще раньше запомнить время начала закрытия серии

Т.е. там где только сформировалось решение на закрытие серии, не важно - будет реальное закрытие или нет

 
Natashe4ka:
//+----------------------------------------------------------------------------+

Понимаю вашу настойчивость, но Я вам дал рабочий вариант, с хорошей функцией закрытия серии позиций для реальной торговли, а не работы в тестере.

Там всё считает и запоминает, даже в случае перезагрузки терминала.

Вот проверьте, просто запустите в тестере, и сравните результаты с историей сделок

 

PS. Забыл в коде записать - вот исправление

Файлы:
e-info.mq4  10 kb
 
Vitaly Muzichenko:

Понимаю вашу настойчивость, но Я вам дал рабочий вариант, с хорошей функцией закрытия серии позиций для реальной торговли, а не работы в тестере.

Там всё считает и запоминает, даже в случае перезагрузки терминала.

Вот проверьте, просто запустите в тестере, и сравните результаты с историей сделок

А как применить это  в моём коде?

У меня от значения LastProfitCL зависит дальнейшее действие

 
Renat Akhtyamov:

а так

{t=TimeCurrent();CloseOrder(OrderTicket());}
{DeleteAll();}

И еще

У Вас ордера закрываются по тикету?

Значит нужно еще раньше запомнить время начала закрытия серии

Т.е. там где только сформировалось решение на закрытие серии, не важно - будет реальное закрытие или нет

А если по стопу закроется то {t=TimeCurrent();CloseOrder(OrderTicket());} {DeleteAll();} уже пропустит значение профита
 
Natashe4ka:

А как применить это  в моём коде?

У меня от значения LastProfitCL зависит дальнейшее действие

Ну так это понятно, просто применяйте по усмотрению в таком виде

  double LastProfit = LastProfitCL(-1, (datetime)GlobalVariableGet(GetGlobalVariableName("LastProfit")));
  
  Comment(" Последний: ",DoubleToString(LastProfit,1) ," Профит: ", DoubleToString(Profit,1) );

Объявите единоразово "LastProfit" и используйте где нужно

 
Natashe4ka:
А ели по стопу закроется то {t=TimeCurrent();CloseOrder(OrderTicket());} {DeleteAll();} уже пропустит значение профита

Да, пропустит.

Можно каждый тик проверять сколько осталось в "живых" ордеров.

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

Тогда и получится то что Вам нужно

Но стопов обычно в автоматах не бывает

 
Natashe4ka:
А если по стопу закроется то {t=TimeCurrent();CloseOrder(OrderTicket());} {DeleteAll();} уже пропустит значение профита

Он будет считать только те, что закрыты последние по времени, и не зависит от суммы закрытия.

 

Вообще, задача полностью не ясна, поэтому дальнейшее обсуждение не веду.

//--------------------------------------------------------- 

Вот тут всё расписал, более не понимаю задачу:

Файлы:
e_info.mq4  10 kb
 
Vitaly Muzichenko:

Вот тут всё расписал, более не понимаю задачу:

Ок, спасибо
 

Так тоже правильно считает если "cnt" обнулить, но потом опять не понятное значение как на скрине №3 было (должно быть значение профита 4,27)

double LastProfitCL(int op=-1){ //"op" позиция (-1 любая позиция)
  int cnt=0;
  double LastProfit=0;
   for(i=0;i<OrdersHistoryTotal();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 ((op<0 || OrderType()==op) && cnt==0) {LastProfit+=OrderProfit()+OrderCommission()+OrderSwap(); cnt++;} else {cnt=0;}
       }
  return(LastProfit);
   }

 

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