try to complete linear regression ...

This commit is contained in:
2024-06-27 01:33:54 +03:30
parent ba6fd4f135
commit b827ff2a38
2 changed files with 579 additions and 0 deletions
+146
View File
@@ -3372,6 +3372,120 @@ struct XMarketCycle
}
};
//
// Linear Regression ...
//
struct XLinearRegressionWorkStruct
{
//
struct sDataStruct
{
//
double value;
double sumY;
double sumXY;
};
//
sDataStruct data[];
//
int dataSize;
int period;
double sumX;
double sumXX;
double divisor;
//
// Constructor ...
XLinearRegressionWorkStruct() : dataSize(-1), period(-1) {}
};
//
struct XLinearRegression
{
//
XLinearRegressionWorkStruct m_work;
//
// Calculate Linear Regression ...
double Calculate(
double value,
int period,
double &_slope,
double &_intercept,
int r,
int bars //
)
{
//
if (m_work.dataSize <= bars)
{
m_work.dataSize = ArrayResize(m_work.data, bars + 500, 2000);
}
//
if (period < 1)
{
period = 1;
}
//
if (m_work.period != (int)period)
{
//
m_work.period = (int)period;
m_work.sumX = m_work.period * (m_work.period - 1.0) / 2.0;
m_work.sumXX = m_work.period * (m_work.period - 1.0) * (2.0 * m_work.period - 1.0) / 6.0;
m_work.divisor = m_work.sumX * m_work.sumX - m_work.period * m_work.sumXX;
//
if (m_work.divisor)
{
m_work.divisor = 1.0 / m_work.divisor;
}
}
//
m_work.data[r].value = value;
//
if (r >= m_work.period)
{
//
m_work.data[r].sumY = m_work.data[r - 1].sumY + value - m_work.data[r - m_work.period].value;
m_work.data[r].sumXY = m_work.data[r - 1].sumXY + m_work.data[r].sumY - m_work.data[r - m_work.period].value * (m_work.period - 1.0) - value;
}
else
{
//
m_work.data[r].sumY = value;
m_work.data[r].sumXY = 0;
//
for (int k = 1; k < m_work.period && r >= k; k++)
{
//
m_work.data[r].sumY += m_work.data[r - k].value;
m_work.data[r].sumXY += k * m_work.data[r - k].value;
}
}
//
_slope = (m_work.period * m_work.data[r].sumXY - m_work.sumX * m_work.data[r].sumY) * m_work.divisor;
_intercept = (m_work.data[r].sumY - _slope * m_work.sumX) / (double)m_work.period;
//
double result = (_intercept + _slope * (m_work.period - 1.0));
//
return result;
}
//
};
//
// Styling Buffers ...
@@ -4504,6 +4618,38 @@ double GetAppliedPrice(
return (0);
}
//
double iGetPrice(
int tprice,
double open,
double high,
const double low,
const double close //
)
{
//
switch (tprice)
{
case PRICE_CLOSE:
return (close);
case PRICE_OPEN:
return (open);
case PRICE_HIGH:
return (high);
case PRICE_LOW:
return (low);
case PRICE_MEDIAN:
return ((high + low) / 2.0);
case PRICE_TYPICAL:
return ((high + low + close) / 3.0);
case PRICE_WEIGHTED:
return ((high + low + close + close) / 4.0);
}
//
return (0);
}
//
// Calculate TP/SL for Specified Type of Positions ...
void CalculateTPSL(