You mixed horses and people into one pile :)
Describe your task - explain what exactly do you want to do?
Also, it is not clear how the object profitStatistics is getting the values.
More code is involved than you have posted, obviously.
Somewhere outside of the posted code is the error, as it seems.
You mixed horses and people into one pile :)
Describe your task - explain what exactly do you want to do?
I only want to calculate the average and the standard deviation of the profits of my EA ... (I will post the complete class)
I only want to calculate the average and the standard deviation of the profits of my EA ... (I will post the complete class)
You don't need the complete code at this stage.
How do you want to calculate the parameters? What is needed for this - to refer to the trade history for each position?
Also, it is not clear how the object profitStatistics is getting the values.
More code is involved than you have posted, obviously.
Somewhere outside of the posted code is the error, as it seems.
This is the complete code:
#include <Trade\DealInfo.mqh> //+------------------------------------------------------------------+ #ifndef PROFITSTATICS_MQH #define PROFITSTATICS_MQH //+------------------------------------------------------------------+ class ProfitStatistics { CDealInfo dealInfo; public: int deals; double average; double standarDeviation; double totalProfit; double confidenceIntervalUpper; double confidenceIntervalLower; public: //+------------------------------------------------------------------+ void ProfitStatistics() { totalProfit = 0.0; average = 0; deals = 0; } //+------------------------------------------------------------------+ ~ProfitStatistics() { } //+------------------------------------------------------------------+ void Calculate(int pMagicNumber) { totalProfit = 0; deals = 0; average = 0; double partialProfit[]; ArrayResize(partialProfit,PositionsTotal()-1,0); for(int i=0; i<=PositionsTotal()-1; i++) { if(dealInfo.SelectByIndex(i)) { if(dealInfo.Magic()!=pMagicNumber)continue; partialProfit[deals] = dealInfo.Commission() + dealInfo.Swap() + dealInfo.Profit(); totalProfit += partialProfit[deals]; deals++; } } if(deals!=0) { average = totalProfit/deals; standarDeviation = GetStandarDeviation(partialProfit); confidenceIntervalUpper = average + standarDeviation; confidenceIntervalLower = average + standarDeviation; } ArrayFree(partialProfit); } //+------------------------------------------------------------------+ private: double GetStandarDeviation(double &partialProfit[]) { double variance=0; for(int i=0; i<deals; i++) variance += (partialProfit[i] - average)*(partialProfit[i] - average); variance /= deals; return sqrt(variance); } }; //+------------------------------------------------------------------+ #endif //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { profitStatistics.Calculate(EXPERT_MAGIC); Comment( " \ndeals=", profitStatistics.deals, " \ntotalProfit=", profitStatistics.totalProfit, " \naverage=", profitStatistics.average, " \nCIU=", profitStatistics.confidenceIntervalUpper, " \nCIL=", profitStatistics.confidenceIntervalLower ); } //+--
I still don't understand - what exactly do you want to do?
The main misunderstanding is why try to cross a knight and a bishop:
for(int i=0; i<=PositionsTotal()-1; i++) { if(dealInfo.SelectByIndex(i)) { if(dealInfo.Magic()!=pMagicNumber)continue; partialProfit[deals] = dealInfo.Commission() + dealInfo.Swap() + dealInfo.Profit(); totalProfit += partialProfit[deals]; deals++; } }
I still don't understand - what exactly do you want to do?
The main misunderstanding is why try to cross a knight and a bishop:
It is not like that? I want the average of the positions that have already been closed .... How to do it correctly?
I still don't understand - what exactly do you want to do?
The main misunderstanding is why try to cross a knight and a bishop:
Ok i changed PositionsTotal() by HistoryDealsTotal()... but it still not working :-(
It is not like that? I want the average of the positions that have already been closed .... How to do it correctly?
Flies - separately, cutlets - separately.
If you want information on POSITIONS - work WITH POSITIONS:
*** #include <Trade\PositionInfo.mqh> #include <Trade\SymbolInfo.mqh> //--- CPositionInfo m_position; // object of CPositionInfo class CSymbolInfo m_symbol; // object of CSymbolInfo class *** //+------------------------------------------------------------------+ //| Profit all positions | //+------------------------------------------------------------------+ double ProfitAllPositions(void) { double profit=0.0; for(int i=PositionsTotal()-1; i>=0; i--) if(m_position.SelectByIndex(i)) // selects the position by index for further access to its properties if(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==InpMagic) profit+=m_position.Commission()+m_position.Swap()+m_position.Profit(); //--- return(profit); }
Flies - separately, cutlets - separately.
If you want information on POSITIONS - work WITH POSITIONS:
- Free trading apps
- Over 8,000 signals for copying
- Economic news for exploring financial markets
You agree to website policy and terms of use
I am doing the following (the code below) but I only see zeros whith "Comment output". I don't know if it is because "CDealInfo" does not work in test mode, or i'm doing somthing wrong.
Can someone tell me please?
Thank you!!