last ...
This commit is contained in:
@@ -560,65 +560,90 @@ class XCXOM1EAExpert : public XCBase
|
|||||||
if (has)
|
if (has)
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
// Configure Indicator ...
|
// XFIMA ...
|
||||||
XOM1Inputs iDZoneOMInputs;
|
|
||||||
iDZoneOMInputs.Default();
|
|
||||||
iDZoneOMInputs.showFiboZone = true;
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Configure Signaller ...
|
XOM1Inputs iFIMAOMInputs;
|
||||||
XOM1SignallerConfig iDZoneSignallerConfig;
|
iFIMAOMInputs.Default();
|
||||||
iDZoneSignallerConfig.processAllTicks = false;
|
iFIMAOMInputs.showFiboZone = true;
|
||||||
|
|
||||||
//
|
//
|
||||||
XCXOM1SignallerBase *iDZoneSignaller = NULL;
|
XOM1SignallerConfig iFIMASignallerConfig;
|
||||||
|
iFIMASignallerConfig.processAllTicks = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
XCXOM1SignallerBase *iFIMASignaller = NULL;
|
||||||
|
|
||||||
|
//
|
||||||
|
// iMAC5020 ...
|
||||||
|
|
||||||
|
//
|
||||||
|
XOM1Inputs iMAC5020OMINputs;
|
||||||
|
iMAC5020OMINputs.Default();
|
||||||
|
iMAC5020OMINputs.showPV = false;
|
||||||
|
iMAC5020OMINputs.showSAR = false;
|
||||||
|
iMAC5020OMINputs.maFastLength = 20;
|
||||||
|
iMAC5020OMINputs.maSlowLength = 50;
|
||||||
|
iMAC5020OMINputs.showFiboZone = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
XOM1SignallerConfig iMAC5020SignallerConfig;
|
||||||
|
iMAC5020SignallerConfig.processAllTicks = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
XCXIMAC5020Signaller *iMAC5020Signaller = NULL;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Configure Signallers ...
|
// Configure Signallers ...
|
||||||
for (int i = 0; i < count; i++)
|
for (int i = 0; i < count; i++)
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
// Define Signaller ...
|
// Register XFIMA Signaller ...
|
||||||
iDZoneSignaller = new XCXOM1SignallerBase(
|
// iFIMASignaller = new XCXOM1FIMASignaller(
|
||||||
"XDZN",
|
// "XDZN",
|
||||||
|
// symbolConfigurations[i].symbol,
|
||||||
|
// symbolConfigurations[i].period,
|
||||||
|
// iFIMAOMInputs,
|
||||||
|
// iFIMASignallerConfig //
|
||||||
|
// );
|
||||||
|
// if (iFIMASignaller != NULL)
|
||||||
|
// {
|
||||||
|
// //
|
||||||
|
// // Register Signaller ...
|
||||||
|
// XCXOM1SignallerBase *signaller = iFIMASignaller;
|
||||||
|
// RegisterSignaller(signaller);
|
||||||
|
// ZeroMemory(signaller);
|
||||||
|
// }
|
||||||
|
|
||||||
|
//
|
||||||
|
// Register XIMAC5020 Signaller ...
|
||||||
|
iMAC5020Signaller = new XCXIMAC5020Signaller(
|
||||||
|
"XIMAC5020",
|
||||||
symbolConfigurations[i].symbol,
|
symbolConfigurations[i].symbol,
|
||||||
symbolConfigurations[i].period,
|
symbolConfigurations[i].period,
|
||||||
iDZoneOMInputs,
|
iMAC5020OMINputs,
|
||||||
iDZoneSignallerConfig //
|
iMAC5020SignallerConfig //
|
||||||
);
|
);
|
||||||
if (iDZoneSignaller != NULL)
|
if (iMAC5020Signaller != NULL)
|
||||||
{
|
{
|
||||||
//
|
|
||||||
// Attach Signaller OnSignal Event Handlers ...
|
|
||||||
count = ArraySize(mOnSignalEventHandlers);
|
|
||||||
has = IsValidSize(count);
|
|
||||||
if (has)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
for (int i = 0; i < count; i++)
|
|
||||||
{
|
|
||||||
iDZoneSignaller.AddOnSignalEventHandler(mOnSignalEventHandlers[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Attach Can Analyse Event Handler ...
|
|
||||||
iDZoneSignaller.canAnalyseEventListener = canAnalyseEventHandler;
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Register Signaller ...
|
// Register Signaller ...
|
||||||
Add(
|
XCXOM1SignallerBase *signaller = iMAC5020Signaller;
|
||||||
iDZoneSignaller,
|
RegisterSignaller(signaller);
|
||||||
eaSignallers //
|
ZeroMemory(signaller);
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Cleanup Resources ...
|
// Cleanup Resources ...
|
||||||
iDZoneOMInputs.Clean();
|
|
||||||
iDZoneSignallerConfig.Clean();
|
//
|
||||||
ZeroMemory(iDZoneSignaller);
|
iFIMAOMInputs.Clean();
|
||||||
|
iMAC5020OMINputs.Clean();
|
||||||
|
ZeroMemory(iFIMASignaller);
|
||||||
|
iFIMASignallerConfig.Clean();
|
||||||
|
ZeroMemory(iMAC5020Signaller);
|
||||||
|
iMAC5020SignallerConfig.Clean();
|
||||||
}
|
}
|
||||||
SpecifiedClean(symbolConfigurations);
|
SpecifiedClean(symbolConfigurations);
|
||||||
|
|
||||||
@@ -1004,6 +1029,43 @@ class XCXOM1EAExpert : public XCBase
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Register Signaller ...
|
||||||
|
*/
|
||||||
|
void RegisterSignaller(XCXOM1SignallerBase *signaller)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Validate Signaller ...
|
||||||
|
if (signaller == NULL)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Attach Signaller OnSignal Event Handlers if Exists ...
|
||||||
|
int count = ArraySize(mOnSignalEventHandlers);
|
||||||
|
bool has = IsValidSize(count);
|
||||||
|
if (has)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
for (int i = 0; i < count; i++)
|
||||||
|
{
|
||||||
|
signaller.AddOnSignalEventHandler(mOnSignalEventHandlers[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Attach Can Analyse Event Handler ...
|
||||||
|
signaller.canAnalyseEventListener = canAnalyseEventHandler;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Register Signaller ...
|
||||||
|
Add(
|
||||||
|
signaller,
|
||||||
|
eaSignallers //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Private ...
|
// Private ...
|
||||||
private:
|
private:
|
||||||
|
|||||||
@@ -192,7 +192,275 @@ class XCXOM1SignallerBase
|
|||||||
*
|
*
|
||||||
* @param barIndex: int
|
* @param barIndex: int
|
||||||
*/
|
*/
|
||||||
void ProcessTick(int barIndex = 0)
|
virtual void ProcessTick(int barIndex = 0)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check Guards Based on MarketConditions ...
|
||||||
|
*
|
||||||
|
* @param guards: XGuard[]
|
||||||
|
* @param barIndex: int
|
||||||
|
*
|
||||||
|
* @return ( int )
|
||||||
|
*/
|
||||||
|
int CheckForGuard(
|
||||||
|
XGuard &guards[],
|
||||||
|
int barIndex = 0 //
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
int result = 0;
|
||||||
|
|
||||||
|
//
|
||||||
|
SpecifiedClean(guards);
|
||||||
|
|
||||||
|
//
|
||||||
|
result = ArraySize(guards);
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Virtuals ...
|
||||||
|
|
||||||
|
//
|
||||||
|
// Protected ...
|
||||||
|
protected:
|
||||||
|
//
|
||||||
|
// Props ...
|
||||||
|
|
||||||
|
//
|
||||||
|
XCXOM1Helper *mHelper; // Indicator Helper ...
|
||||||
|
|
||||||
|
//
|
||||||
|
int mProcessedTicksCount; // Prcoessed Ticks Count ...
|
||||||
|
datetime mLastCheckedBarTime; // Last Checked Bar Time ...
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check Permissions for Analysing Market ...
|
||||||
|
*
|
||||||
|
* @param _symbol: Symbol ...
|
||||||
|
* @param _period: Period ...
|
||||||
|
* @param time: Specified Date Time ...
|
||||||
|
*
|
||||||
|
* @return ( bool )
|
||||||
|
*/
|
||||||
|
bool CanAnalyse(
|
||||||
|
string _symbol,
|
||||||
|
ENUM_TIMEFRAMES _period,
|
||||||
|
datetime time //
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
if (canAnalyseEventListener != NULL)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
result = canAnalyseEventListener(
|
||||||
|
_symbol,
|
||||||
|
_period,
|
||||||
|
time //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle New Bar's Process ...
|
||||||
|
*
|
||||||
|
* @param barIndex: int
|
||||||
|
*/
|
||||||
|
void ProcessNewBar(int barIndex = 0)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Normalize Bar Index ...
|
||||||
|
if (barIndex < 0)
|
||||||
|
{
|
||||||
|
barIndex = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Try to Update Zone's Lifetime ...
|
||||||
|
int count = ArraySize(zones);
|
||||||
|
bool has = count > 0;
|
||||||
|
if (has)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Loop through Zones ...
|
||||||
|
for (int i = 0; i < count; i++)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Update Lifetime by Bar Index ...
|
||||||
|
// zones[i].UpdateByBarIndex(barIndex);
|
||||||
|
|
||||||
|
//
|
||||||
|
// drawer.DrawZone(
|
||||||
|
// zones[i],
|
||||||
|
// true, // Draw Price ...
|
||||||
|
// true, // Draw Middle ...
|
||||||
|
// true // Draw From ...
|
||||||
|
// );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Check XOMZones Validations ...
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Process Exists Zones ...
|
||||||
|
* Detect a Zone for trigger ...
|
||||||
|
*
|
||||||
|
* @param barIndex: int
|
||||||
|
*/
|
||||||
|
void ProcessZones(int barIndex = 0)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Check Zones Exists ...
|
||||||
|
int count = ArraySize(zones);
|
||||||
|
bool has = IsValidSize(count);
|
||||||
|
if (!has)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Loop Through Zones ...
|
||||||
|
for (int i = 0; i < count; i++)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Converts iZone to Signal and Notify Signal ...
|
||||||
|
*
|
||||||
|
* @param iZone: XOM1Zone
|
||||||
|
*/
|
||||||
|
void PrepareSignal(XOM1Zone &zone)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Validate Zone ...
|
||||||
|
if (!zone.IsValid())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Create Signal ...
|
||||||
|
XSignal signal;
|
||||||
|
|
||||||
|
//
|
||||||
|
signal.time = zone.to;
|
||||||
|
signal.provider = name;
|
||||||
|
signal.symbol = zone.symbol;
|
||||||
|
signal.period = zone.period;
|
||||||
|
signal.mode = X_ORDER_MODE_MARKET;
|
||||||
|
signal.conditions = "XConditions";
|
||||||
|
signal.comment = ToXString(zone.reason);
|
||||||
|
signal.type = zone.IsBullish()
|
||||||
|
? POSITION_TYPE_BUY
|
||||||
|
: POSITION_TYPE_SELL;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Get Entry ...
|
||||||
|
signal.entry = GetXEntry(zone.symbol, zone.dir);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Calculate SL ...
|
||||||
|
double providedSL = zone.IsBullish()
|
||||||
|
? zone.lower
|
||||||
|
: zone.upper;
|
||||||
|
signal.sl = providedSL;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Calculate Risk ...
|
||||||
|
double risk = MathAbs(signal.entry - signal.sl);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Calculate Reward ...
|
||||||
|
double r2r = 2;
|
||||||
|
double reward = risk * r2r;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Calculate TP ...
|
||||||
|
double providedTP = zone.IsBullish()
|
||||||
|
? signal.entry + reward
|
||||||
|
: signal.entry - reward;
|
||||||
|
signal.tp = providedTP;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Calculate Targets ...
|
||||||
|
// TODO: Handle this ...
|
||||||
|
|
||||||
|
//
|
||||||
|
// Set Min Volume ...
|
||||||
|
signal.volume = 0.01;
|
||||||
|
|
||||||
|
//
|
||||||
|
NotifyOnSignalEvent(signal);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Private ...
|
||||||
|
private:
|
||||||
|
//
|
||||||
|
// Props ...
|
||||||
|
|
||||||
|
//
|
||||||
|
TOnSignal mOnSignalEventHandlers[]; // Signal Recieved Event Handlers ...
|
||||||
|
};
|
||||||
|
|
||||||
|
//
|
||||||
|
class XCXOM1FIMASignaller : public XCXOM1SignallerBase
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Public ...
|
||||||
|
public:
|
||||||
|
//
|
||||||
|
|
||||||
|
//
|
||||||
|
// Constructor ...
|
||||||
|
XCXOM1FIMASignaller(
|
||||||
|
string _name, // Name ...
|
||||||
|
string _symbol, // Symbol ...
|
||||||
|
ENUM_TIMEFRAMES _period, // Period ...
|
||||||
|
XOM1Inputs &_inputs, // Indicator Inputs ...
|
||||||
|
XOM1SignallerConfig &_config // Config ...
|
||||||
|
) : XCXOM1SignallerBase(_name,
|
||||||
|
_symbol,
|
||||||
|
_period,
|
||||||
|
_inputs,
|
||||||
|
_config //
|
||||||
|
)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Deconstructor ...
|
||||||
|
~XCXOM1FIMASignaller()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Overrides ...
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle Ticks Process ...
|
||||||
|
*
|
||||||
|
* @param barIndex: int
|
||||||
|
*/
|
||||||
|
virtual void ProcessTick(int barIndex = 0)
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
// Normalize Bar Index ...
|
// Normalize Bar Index ...
|
||||||
@@ -557,219 +825,53 @@ class XCXOM1SignallerBase
|
|||||||
iBar.Clean();
|
iBar.Clean();
|
||||||
iConditions.Clean();
|
iConditions.Clean();
|
||||||
}
|
}
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
//
|
||||||
* Check Guards Based on MarketConditions ...
|
class XCXIMAC5020Signaller : public XCXOM1SignallerBase
|
||||||
*
|
{
|
||||||
* @param guards: XGuard[]
|
//
|
||||||
* @param barIndex: int
|
// Public ...
|
||||||
*
|
public:
|
||||||
* @return ( int )
|
//
|
||||||
*/
|
|
||||||
int CheckForGuard(
|
//
|
||||||
XGuard &guards[],
|
// Constructor ...
|
||||||
int barIndex = 0 //
|
XCXIMAC5020Signaller(
|
||||||
)
|
string _name, // Name ...
|
||||||
|
string _symbol, // Symbol ...
|
||||||
|
ENUM_TIMEFRAMES _period, // Period ...
|
||||||
|
XOM1Inputs &_inputs, // Indicator Inputs ...
|
||||||
|
XOM1SignallerConfig &_config // Config ...
|
||||||
|
) : XCXOM1SignallerBase(_name,
|
||||||
|
_symbol,
|
||||||
|
_period,
|
||||||
|
_inputs,
|
||||||
|
_config //
|
||||||
|
)
|
||||||
{
|
{
|
||||||
//
|
|
||||||
int result = 0;
|
|
||||||
|
|
||||||
//
|
|
||||||
SpecifiedClean(guards);
|
|
||||||
|
|
||||||
//
|
|
||||||
result = ArraySize(guards);
|
|
||||||
|
|
||||||
//
|
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Virtuals ...
|
// Deconstructor ...
|
||||||
|
~XCXIMAC5020Signaller()
|
||||||
//
|
|
||||||
// Protected ...
|
|
||||||
protected:
|
|
||||||
//
|
|
||||||
// Private ...
|
|
||||||
private:
|
|
||||||
//
|
|
||||||
// Props ...
|
|
||||||
|
|
||||||
//
|
|
||||||
XCXOM1Helper *mHelper; // Indicator Helper ...
|
|
||||||
|
|
||||||
//
|
|
||||||
TOnSignal mOnSignalEventHandlers[]; // Signal Recieved Event Handlers ...
|
|
||||||
|
|
||||||
//
|
|
||||||
int mProcessedTicksCount; // Prcoessed Ticks Count ...
|
|
||||||
datetime mLastCheckedBarTime; // Last Checked Bar Time ...
|
|
||||||
|
|
||||||
//
|
|
||||||
bool CanAnalyse(
|
|
||||||
string _symbol,
|
|
||||||
ENUM_TIMEFRAMES _period,
|
|
||||||
datetime time //
|
|
||||||
)
|
|
||||||
{
|
{
|
||||||
//
|
|
||||||
bool result = false;
|
|
||||||
|
|
||||||
//
|
|
||||||
if (canAnalyseEventListener != NULL)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
result = canAnalyseEventListener(
|
|
||||||
_symbol,
|
|
||||||
_period,
|
|
||||||
time //
|
|
||||||
);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
result = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Overrides ...
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handle New Bar's Process ...
|
* Handle Ticks Process ...
|
||||||
*
|
*
|
||||||
* @param barIndex: int
|
* @param barIndex: int
|
||||||
*/
|
*/
|
||||||
void ProcessNewBar(int barIndex = 0)
|
virtual void ProcessTick(int barIndex = 0)
|
||||||
{
|
{
|
||||||
//
|
|
||||||
// Normalize Bar Index ...
|
|
||||||
if (barIndex < 0)
|
|
||||||
{
|
|
||||||
barIndex = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Try to Update Zone's Lifetime ...
|
|
||||||
int count = ArraySize(zones);
|
|
||||||
bool has = count > 0;
|
|
||||||
if (has)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
// Loop through Zones ...
|
|
||||||
for (int i = 0; i < count; i++)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
// Update Lifetime by Bar Index ...
|
|
||||||
// zones[i].UpdateByBarIndex(barIndex);
|
|
||||||
|
|
||||||
//
|
|
||||||
// drawer.DrawZone(
|
|
||||||
// zones[i],
|
|
||||||
// true, // Draw Price ...
|
|
||||||
// true, // Draw Middle ...
|
|
||||||
// true // Draw From ...
|
|
||||||
// );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Check XOMZones Validations ...
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Process Exists Zones ...
|
|
||||||
* Detect a Zone for trigger ...
|
|
||||||
*
|
|
||||||
* @param barIndex: int
|
|
||||||
*/
|
|
||||||
void ProcessZones(int barIndex = 0)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
// Check Zones Exists ...
|
|
||||||
int count = ArraySize(zones);
|
|
||||||
bool has = IsValidSize(count);
|
|
||||||
if (!has)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Loop Through Zones ...
|
|
||||||
for (int i = 0; i < count; i++)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Converts iZone to Signal and Notify Signal ...
|
|
||||||
*
|
|
||||||
* @param iZone: XOM1Zone
|
|
||||||
*/
|
|
||||||
void PrepareSignal(XOM1Zone &zone)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
// Validate Zone ...
|
|
||||||
if (!zone.IsValid())
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Create Signal ...
|
|
||||||
XSignal signal;
|
|
||||||
|
|
||||||
//
|
|
||||||
signal.time = zone.to;
|
|
||||||
signal.provider = name;
|
|
||||||
signal.symbol = zone.symbol;
|
|
||||||
signal.period = zone.period;
|
|
||||||
signal.mode = X_ORDER_MODE_MARKET;
|
|
||||||
signal.conditions = "XConditions";
|
|
||||||
signal.comment = ToXString(zone.reason);
|
|
||||||
signal.type = zone.IsBullish()
|
|
||||||
? POSITION_TYPE_BUY
|
|
||||||
: POSITION_TYPE_SELL;
|
|
||||||
|
|
||||||
//
|
|
||||||
// Get Entry ...
|
|
||||||
signal.entry = GetXEntry(zone.symbol, zone.dir);
|
|
||||||
|
|
||||||
//
|
|
||||||
// Calculate SL ...
|
|
||||||
double providedSL = zone.IsBullish()
|
|
||||||
? zone.lower
|
|
||||||
: zone.upper;
|
|
||||||
signal.sl = providedSL;
|
|
||||||
|
|
||||||
//
|
|
||||||
// Calculate Risk ...
|
|
||||||
double risk = MathAbs(signal.entry - signal.sl);
|
|
||||||
|
|
||||||
//
|
|
||||||
// Calculate Reward ...
|
|
||||||
double r2r = 2;
|
|
||||||
double reward = risk * r2r;
|
|
||||||
|
|
||||||
//
|
|
||||||
// Calculate TP ...
|
|
||||||
double providedTP = zone.IsBullish()
|
|
||||||
? signal.entry + reward
|
|
||||||
: signal.entry - reward;
|
|
||||||
signal.tp = providedTP;
|
|
||||||
|
|
||||||
//
|
|
||||||
// Calculate Targets ...
|
|
||||||
// TODO: Handle this ...
|
|
||||||
|
|
||||||
//
|
|
||||||
// Set Min Volume ...
|
|
||||||
signal.volume = 0.01;
|
|
||||||
|
|
||||||
//
|
|
||||||
NotifyOnSignalEvent(signal);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
|
// Extensions ...
|
||||||
|
|
||||||
|
//
|
||||||
Reference in New Issue
Block a user