Files
include/tradestatisticspanel.mqh
2025-02-07 19:17:11 +03:30

357 lines
26 KiB
Plaintext

//+---------------------------------------------------------------------+
//| TradeStatisticsPanel.mqh |
//| jafferwilson |
//| https://www.mql5.com/en/users/jafferwilson |
//+---------------------------------------------------------------------+
#property copyright "jafferwilson"
#property link "https://www.mql5.com/en/users/jafferwilson"
//+------------------------------------------------------------------+
//| Include |
//+------------------------------------------------------------------+
#include <Controls\Dialog.mqh>
#include <Controls\Button.mqh>
#include <Controls\Label.mqh>
#include <CTradeStatistics.mqh>
//+------------------------------------------------------------------+
//| Defines |
//+------------------------------------------------------------------+
#define INDENT_LEFT 15 // left offset
#define INDENT_TOP 30 // top offset
#define BUTTON_HEIGHT 19
#define BUTTON_WIDTH 120
#define BUTTON_OFFSET 70 // right offset button
#define VALUE_TEXT_LEN 16 // max len text(value)
#define VALUE_ROWS 15 // max rows (value)
//+------------------------------------------------------------------+
//| Rarameters for create panel |
//+------------------------------------------------------------------+
struct Params
{
long chart;
int subwin;
string name;
//---
int x1;
int y1;
int x2;
int y2;
//---
string font_name;
int font_size;
color font_color;
};
//+------------------------------------------------------------------+
//| Class CPanelDialog |
//+------------------------------------------------------------------+
class CPanelDialog : public CAppDialog
{
private:
CLabel m_label[3][20];
CLabel m_value[3][20];
CButton m_button[1];
string FontName;
int FontSize;
color FontColor;
int FontHeight;
public:
virtual bool Create(Params &p);
void SetLabelParam(int index,int col,string text);
string GetButtonName(int index){if(index>0)index=0; return(m_button[index].Name());}
protected:
virtual bool OnResize(void);
//--- create dependent controls
bool CreateButton(int index,bool only_move=false);
bool CreateLabel(int index,int col,int index,bool only_move=false);
string ParamCaption(int index);
};
//+------------------------------------------------------------------+
//| Create |
//+------------------------------------------------------------------+
bool CPanelDialog::Create(Params &p)
{
if(!CAppDialog::Create(p.chart,p.name,p.subwin,p.x1,p.y1,p.x2,p.y2)) return(false);
FontName=p.font_name;
FontSize=p.font_size;
FontColor=p.font_color;
FontHeight=FontSize*2;
//---
Caption(p.name);
//--- create controls
if(!CreateButton(0)) return(false);
//--- col#1
if(!CreateLabel(0,0,STAT_INITIAL_DEPOSIT))return(false);
if(!CreateLabel(1,0,STAT_PROFIT))return(false);
if(!CreateLabel(2,0,STAT_GROSS_PROFIT))return(false);
if(!CreateLabel(3,0,STAT_GROSS_LOSS))return(false);
if(!CreateLabel(4,0,STAT_PROFIT_FACTOR))return(false);
if(!CreateLabel(5,0,STAT_RECOVERY_FACTOR))return(false);
if(!CreateLabel(6,0,STAT_AHPR))return(false);
if(!CreateLabel(7,0,STAT_GHPR))return(false);
if(!CreateLabel(8,0,STAT_Z_SCORE))return(false);
if(!CreateLabel(10,0,STAT_TRADES))return(false);
if(!CreateLabel(11,0,STAT_DEALS))return(false);
//---col#2
if(!CreateLabel(0,1,STAT_EXPECTED_PAYOFF))return(false);
if(!CreateLabel(1,1,STAT_SHARPE_RATIO))return(false);
if(!CreateLabel(2,1,STAT_LR_CORRELATION))return(false);
if(!CreateLabel(3,1,STAT_LR_STANDARD_ERROR))return(false);
if(!CreateLabel(5,1,STAT_SHORT_TRADES))return(false);
if(!CreateLabel(6,1,STAT_PROFIT_TRADES))return(false);
if(!CreateLabel(7,1,STAT_MAX_PROFITTRADE))return(false);
if(!CreateLabel(8,1,STAT_AVG_PROFIT_TRADE))return(false);
if(!CreateLabel(9,1,STAT_MAX_CONWINS))return(false);
if(!CreateLabel(10,1,STAT_CONPROFITMAX))return(false);
if(!CreateLabel(11,1,STAT_PROFITTRADES_AVGCON))return(false);
//--- col#3
if(!CreateLabel(1,2,STAT_BALANCE_DD_ABSOLUTE))return(false);
if(!CreateLabel(2,2,STAT_BALANCE_DD))return(false);
if(!CreateLabel(3,2,STAT_BALANCE_DD_RELATIVE))return(false);
if(!CreateLabel(5,2,STAT_LONG_TRADES))return(false);
if(!CreateLabel(6,2,STAT_LOSS_TRADES))return(false);
if(!CreateLabel(7,2,STAT_MAX_LOSSTRADE))return(false);
if(!CreateLabel(8,2,STAT_AVG_LOSS_TRADE))return(false);
if(!CreateLabel(9,2,STAT_MAX_CONLOSSES))return(false);
if(!CreateLabel(10,2,STAT_CONLOSSMAX))return(false);
if(!CreateLabel(11,2,STAT_LOSSTRADES_AVGCON))return(false);
//--- succeed
return(true);
}
//+------------------------------------------------------------------+
//| ParamCaption |
//+------------------------------------------------------------------+
string CPanelDialog::ParamCaption(int index)
{
switch(index)
{
case STAT_INITIAL_DEPOSIT: return("Initial Deposit");
case STAT_PROFIT: return("Total Net Profit");
case STAT_BALANCE: return("Balance");
case STAT_EQUITY: return("Equity");
case STAT_GROSS_PROFIT: return("Gross Profit");
case STAT_GROSS_LOSS: return("Gross Loss");
case STAT_PROFIT_FACTOR: return("Profit Factor");
case STAT_RECOVERY_FACTOR: return("Recovery Factor");
case STAT_EXPECTED_PAYOFF: return("Expected Payoff");
case STAT_BALANCE_DD_ABSOLUTE: return("Balance Dr. Abs.");
case STAT_BALANCE_DD: return("Balance Dr. Max.");
case STAT_BALANCE_DD_RELATIVE: return("Balance Dr. Rel.");
case STAT_TRADES: return("Total Trades");
case STAT_DEALS: return("Total Deals");
case STAT_SHORT_TRADES: return("Short Trades");
case STAT_LONG_TRADES: return("Long Trades");
case STAT_PROFIT_TRADES: return("Profit Trades");
case STAT_LOSS_TRADES: return("Loss Trades");
//---
case STAT_MAX_PROFITTRADE: return("Largest Profit Trade");
case STAT_MAX_LOSSTRADE: return("Largest Loss Trade");
case STAT_CONPROFITMAX: return("Max. Cons. Profit");
case STAT_MAX_CONWINS: return("Max. Cons. Wins");
case STAT_CONLOSSMAX: return("Max. Cons. Loss");
case STAT_MAX_CONLOSSES: return("Max. Cons. Losses");
case STAT_AVG_PROFIT_TRADE: return("Avg. Profit Trade");
case STAT_AVG_LOSS_TRADE: return("Avg. Loss Trade");
case STAT_PROFITTRADES_AVGCON: return("Avg. Cons. Wins");
case STAT_LOSSTRADES_AVGCON: return("Avg. Cons. Losses");
case STAT_GHPR: return("GHPR");
case STAT_AHPR: return("AHPR");
case STAT_SHARPE_RATIO: return("Sharpe Ratio");
case STAT_Z_SCORE: return("Z Score");
case STAT_LR_CORRELATION: return("LR Correlation");
case STAT_LR_STANDARD_ERROR: return("LR Standard Error");
default: return("---");
}
}
//+------------------------------------------------------------------+
//| OnResize |
//+------------------------------------------------------------------+
bool CPanelDialog::OnResize(void)
{
//--- call method of parent class
if(!CAppDialog::OnResize()) return(false);
//--- move button
CreateButton(0,true);
//--- move labels
for(int c=0;c<=2;c++)
for(int i=0;i<=11;i++)
CreateLabel(i,c,0,true);
//--- succeed
return(true);
}
//+------------------------------------------------------------------+
//| CreateLabel |
//+------------------------------------------------------------------+
bool CPanelDialog::CreateLabel(int i,int col,int name,bool only_move=false)
{
int delta=Height()-ClientAreaHeight();
//--- range check
int range1=(int)MathMin(ArrayRange(m_label,0),ArrayRange(m_value,0));
if(col>=range1)col=range1-1;
int range2=(int)MathMin(ArrayRange(m_label,1),ArrayRange(m_value,1));
if(i>=range2)i=range2-1;
int width_3=ClientAreaWidth()/3;
int x1,y1,x2,y2;
int x11,y11,x22,y22;
//--- coords
switch(col)
{
case 1://col#2
//---
x1 = INDENT_LEFT + width_3;
y1 = INDENT_TOP + FontHeight*i;
x2 = x1;
y2 = y1 + FontHeight;
//---
x11 = (int)(width_3*1.5);
y11 = INDENT_TOP + FontHeight*i;
x22 = x11;
y22 = y1 + FontHeight;
break;
case 2://col#3
//---
x1 = INDENT_LEFT + width_3*2;
y1 = INDENT_TOP + FontHeight*i;
x2 = x1;
y2 = y1 + FontHeight;
//---
x11 = (int)(width_3*2.5);
y11 = INDENT_TOP + FontHeight*i;
x22 = x11;
y22 = y1 + FontHeight;
break;
default://col#1
//---
x1 = INDENT_LEFT;
y1 = INDENT_TOP + FontHeight*i;
x2 = x1;
y2 = y1 + FontHeight;
//---
x11 = width_3/2;
y11 = INDENT_TOP + FontHeight*i;
x22 = x11;
y22 = y11 + FontHeight;
break;
}
if(only_move)
{
m_label[col][i].Move(x1,y1);
m_value[col][i].Move(x11,y11);
return(true);
}
//--- create label
if(!m_label[col][i].Create(m_chart_id,m_name+"Label_"+IntegerToString(i)+"_"+IntegerToString(col),m_subwin,x1,y1-delta,x2,y2-delta)) return(false);
if(!Add(m_label[col][i])) return(false);
m_label[col][i].Text(ParamCaption(name));
m_label[col][i].Font(FontName);
m_label[col][i].FontSize(FontSize);
m_label[col][i].Color(FontColor);
//--- create value
if(!m_value[col][i].Create(m_chart_id,m_name+"Value_"+IntegerToString(i)+"_"+IntegerToString(col),m_subwin,x11,y11-delta,x22,y22-delta)) return(false);
if(!Add(m_value[col][i])) return(false);
m_value[col][i].Font(FontName);
m_value[col][i].FontSize(FontSize);
m_value[col][i].Color(FontColor);
m_value[col][i].Text("");
//--- succeed
return(true);
}
//+------------------------------------------------------------------+
//| CreateButton |
//+------------------------------------------------------------------+
bool CPanelDialog::CreateButton(int index,bool only_move=false)
{
int delta=Height()-ClientAreaHeight();
int x1=0,y1=0,x2=0,y2=0;
string caption;
switch(index)
{
case 0://--- Calculate
x1=ClientAreaWidth()-BUTTON_WIDTH-BUTTON_OFFSET;
y1=-delta+3;
caption="Calculate";
break;
}
if(only_move) return(m_button[index].Move(x1,1));
//--- ðàçìåðû
x2 = x1 + BUTTON_WIDTH;
y2 = y1 + BUTTON_HEIGHT;
//--- create
if(!m_button[index].Create(m_chart_id,m_name+"Button_"+IntegerToString(index),m_subwin,x1,y1,x2,y2)) return(false);
m_button[index].FontSize(8);
//m_button[index].Font(FontName);
m_button[index].Text(caption);
if(!Add(m_button[index])) return(false);
//--- succeed
return(true);
}
//+------------------------------------------------------------------+
//| SetLabelParam |
//+------------------------------------------------------------------+
void CPanelDialog::SetLabelParam(int i,int col,string text)
{
//--- check range
int range1=ArrayRange(m_value,0);
if(col>=range1)col=range1-1;
int range2=ArrayRange(m_value,1);
if(i>=range2)i=range2-1;
//--- fill spaces for line format
int text_length=StringLen(text);
if(text_length<VALUE_TEXT_LEN)
{
string temp;
StringInit(temp,VALUE_TEXT_LEN-text_length,' ');
text=temp+text;
}
m_value[col][i].Text(text);
m_value[col][i].Color(FontColor);
}
//+------------------------------------------------------------------+