This commit is contained in:
2025-05-18 06:23:43 +03:30
parent c3eef12ca0
commit ccbb9e0105
4 changed files with 506 additions and 740 deletions
+272 -2
View File
@@ -26,9 +26,9 @@
//
#include <ChartObjects/ChartObject.mqh>
#include <ChartObjects/ChartObjectsArrows.mqh>
#include <ChartObjects/ChartObjectsFibo.mqh>
#include <ChartObjects/ChartObjectsLines.mqh>
#include <ChartObjects/ChartObjectsShapes.mqh>
#include <ChartObjects/ChartObjectsFibo.mqh>
#include <ChartObjects/ChartObjectsTxtControls.mqh>
//
@@ -155,6 +155,207 @@ string ToString(ENUM_X_CHART_IDS value)
return result;
}
//
// Library Functions ...
/**
* Converts a XBoxZone struct to XSignal instance ...
*
* @param box: XBoxZone instance reference, provide source info ...
* @param signal: XSignal instance reference, holds prepared converted signal ...
*
* @return ( bool )
*/
bool ToSignal(
XBoxZone &box,
XSignal &signal,
double &rewardRatios[] //
)
{
//
bool result = false;
//
signal.Clean();
//
result = box.IsValid() &&
HasChild(rewardRatios);
if (!result)
{
return result;
}
//
XOHCL entryBar;
result = entryBar.Init(
box.symbol,
box.period,
box.ToIndex() - 1 //
);
if (!result)
{
//
entryBar.Clean();
//
return result;
}
//
bool isBullish = box.IsBullish();
bool isBearish = box.IsBearish();
//
ENUM_POSITION_TYPE iType =
isBullish
? POSITION_TYPE_BUY
: POSITION_TYPE_SELL;
ENUM_X_POSITION_TYPES iXType =
isBullish
? X_POSITION_TYPE_LONG
: X_POSITION_TYPE_SHORT;
//
double points = GetPoints(box.symbol);
//
double risk = box.GetRange();
//
double entry =
isBullish
? box.upper
: box.lower;
entry = entryBar.open;
//
double sl =
isBullish
? box.lower
: box.upper;
//
double tp = 0;
//
// Calculate Target ...
XTarget targets[];
//
double tmp[];
int idx = -1;
XTarget iTarget;
bool has = false;
double iRatio = 0;
double iReward = 0;
double iRewardPrice = 0;
Copy(
rewardRatios,
tmp //
);
while (HasChild(tmp))
{
//
idx = -1;
iRatio = GetMaxWidthIndex(
tmp,
idx //
);
//
has = IsValidIndex(idx);
if (!has)
{
break;
}
//
has = iRatio > 0;
//
ArrayRemove(
tmp,
idx,
1 //
);
//
bool canSetTP = tp <= 0;
//
iReward = iRatio * risk;
//
iRewardPrice =
isBullish
? entry + iReward
: entry - iReward;
if (canSetTP)
{
tp = iRewardPrice;
}
else
{
//
iTarget.target = iRewardPrice;
AddRef(
iTarget,
targets //
);
//
iTarget.Clean();
}
}
Clean(tmp);
//
// Filling Signal ...
signal.tp = tp;
signal.sl = sl;
signal.type = iType;
signal.comment = "";
signal.entry = entry;
signal.time = box.to;
signal.volume = 0.01;
signal.provider = box.type;
signal.symbol = box.symbol;
signal.period = box.period;
signal.mode = X_ORDER_MODE_MARKET;
//
if (HasChild(targets))
{
//
Copy(
targets,
signal.targets //
);
}
//
result = signal.IsValid();
//
// Cleanup Resources ...
//
if (!result)
{
signal.Clean();
}
//
Clean(tmp);
Clean(targets);
iTarget.Clean();
entryBar.Clean();
//
return result;
}
//
// Implementation ...
@@ -1774,6 +1975,7 @@ class XCSignalObject : public XCBaseObject
* @param name: String ...
* @param window: Integer ...
* @param signal: XSignal instance ...
* @param length: int, Specified Length of Signal ...
*
* @return ( bool )
*/
@@ -1781,12 +1983,16 @@ class XCSignalObject : public XCBaseObject
long chart_id,
const int window,
XSignal &signal,
int length = 3,
string prefix = NULL //
)
{
//
bool result = false;
//
length = NormalizeInt(length, 3);
//
result = signal.IsValid();
if (!result)
@@ -1803,7 +2009,7 @@ class XCSignalObject : public XCBaseObject
string nameMD5 = ToMD5(name);
//
int delay = (PeriodSeconds(signal.period) * 2);
int delay = (PeriodSeconds(signal.period) * length);
datetime time1 = (datetime)((int)signal.time - delay);
datetime time2 = (datetime)((int)signal.time + delay);
@@ -2108,6 +2314,70 @@ class XCSignalObject : public XCBaseObject
CArrayObj mTargetTrends;
};
//
// XRR Object ...
class XCRRObject : public XCSignalObject
{
//
// Public ...
public:
//
// Constructor ...
bool CreateBoxRR(
long chart_id,
const int window,
XBoxZone &box,
double &rewardRatios[],
int length = 3,
string prefix = NULL //
)
{
//
bool result = false;
//
length = NormalizeInt(length, 3);
//
result = box.IsValid();
if (!result)
{
return result;
}
//
XSignal signal;
result = ToSignal(
box,
signal,
rewardRatios //
);
if (!result)
{
//
signal.Clean();
//
return result;
}
//
result = Create(
chart_id,
window,
signal,
length,
prefix //
);
//
signal.Clean();
//
return result;
}
};
class XCOHCLObject : public XCBaseObject
{
//