try to complete linear regression ...
This commit is contained in:
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user