last works on trademanager symbol configurations ...
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -1,8 +1,8 @@
|
|||||||
`
|
`
|
||||||
//
|
//
|
||||||
// an Structure for Holds an Specified Symbols
|
// an Structure for Holds an Specified Symbols
|
||||||
// Positions Info ...
|
// Positions Info ...
|
||||||
struct XTradeSymbolInfo
|
struct XTradeSymbolInfo
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
// Properties ...
|
// Properties ...
|
||||||
@@ -141,3 +141,798 @@ struct XTradeSymbolInfo
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//
|
||||||
|
void SetForceCloseTradesAt(
|
||||||
|
string _forceCloseAt //
|
||||||
|
)
|
||||||
|
{
|
||||||
|
forceCloseAt = _forceCloseAt;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
void SetTradeSession(
|
||||||
|
string symbol,
|
||||||
|
string start,
|
||||||
|
string end,
|
||||||
|
string name = NULL //
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Validate Args ...
|
||||||
|
bool has = IsValid(end) &&
|
||||||
|
IsValid(start) &&
|
||||||
|
IsValid(symbol);
|
||||||
|
if (!has)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Create Session ...
|
||||||
|
|
||||||
|
//
|
||||||
|
XTradeSession session;
|
||||||
|
|
||||||
|
//
|
||||||
|
session.end = end;
|
||||||
|
session.name = name;
|
||||||
|
session.start = start;
|
||||||
|
|
||||||
|
//
|
||||||
|
int sessionIDX = -1;
|
||||||
|
has = FindSymbolSession(
|
||||||
|
sessionIDX,
|
||||||
|
symbol //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
if (!has)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Add New Symbol Session ...
|
||||||
|
|
||||||
|
//
|
||||||
|
XSymbolSessions iSymbolSession;
|
||||||
|
iSymbolSession.symbol = symbol;
|
||||||
|
|
||||||
|
//
|
||||||
|
AddTradingSession(
|
||||||
|
session,
|
||||||
|
iSymbolSession //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
AddRef(
|
||||||
|
iSymbolSession,
|
||||||
|
sessions //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
iSymbolSession.Clean();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Update Trading Sessions of Exists Symbol Session ...
|
||||||
|
AddTradingSession(
|
||||||
|
session,
|
||||||
|
sessions[sessionIDX] //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Cleanup Resources ...
|
||||||
|
session.Clean();
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
void SetTradeRestrictions(
|
||||||
|
ENUM_XTRADE_RESTRICTION_PERIOD _period,
|
||||||
|
int _maxAllowedTPs,
|
||||||
|
int _maxAllowedSLs,
|
||||||
|
int _maxAllowedTrades //
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Normalizing Args ...
|
||||||
|
_maxAllowedTPs = NormalizeInt(_maxAllowedTPs, 0);
|
||||||
|
_maxAllowedSLs = NormalizeInt(_maxAllowedSLs, 0);
|
||||||
|
_maxAllowedTrades = NormalizeInt(_maxAllowedTrades, 0);
|
||||||
|
|
||||||
|
//
|
||||||
|
restrictionsPeriod = _period;
|
||||||
|
maxAllowedTPs = _maxAllowedTPs;
|
||||||
|
maxAllowedSLs = _maxAllowedSLs;
|
||||||
|
maxAllowedTrades = _maxAllowedTrades;
|
||||||
|
}
|
||||||
|
//
|
||||||
|
// Symbol Info ...
|
||||||
|
|
||||||
|
//
|
||||||
|
bool FindSymbolIndex(
|
||||||
|
int &index,
|
||||||
|
XTradeSymbolInfo &item //
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
index = -1;
|
||||||
|
|
||||||
|
//
|
||||||
|
result = item.IsValid();
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
result = HasChild(symbols);
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
index = FindIndex(
|
||||||
|
item,
|
||||||
|
symbols //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
result = IsValidIndex(index);
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
bool FindSymbolIndex(
|
||||||
|
int &index,
|
||||||
|
string symbol //
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
index = -1;
|
||||||
|
|
||||||
|
//
|
||||||
|
result = IsValid(symbol) &&
|
||||||
|
HasChild(symbols);
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
int count = ArraySize(symbols);
|
||||||
|
for (int i = 0; i < count; i++)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
result = symbols[i].symbol == symbol;
|
||||||
|
if (result)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
index = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
result = IsValidIndex(index);
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
void AddOrUpdateSymbolInfo(XTradeSymbolInfo &item)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool has = item.IsValid();
|
||||||
|
if (!has)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
int index = -1;
|
||||||
|
bool isExists = FindSymbolIndex(
|
||||||
|
index,
|
||||||
|
item //
|
||||||
|
);
|
||||||
|
if (!isExists)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
AddRef(
|
||||||
|
item,
|
||||||
|
symbols //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//
|
||||||
|
symbols[index].longs += item.longs;
|
||||||
|
symbols[index].shorts += item.shorts;
|
||||||
|
symbols[index].trades += item.trades;
|
||||||
|
symbols[index].losses += item.losses;
|
||||||
|
symbols[index].profits += item.profits;
|
||||||
|
symbols[index].managedSLs += item.managedSLs;
|
||||||
|
symbols[index].managedTPs += item.managedTPs;
|
||||||
|
symbols[index].managedTrades += item.managedTrades;
|
||||||
|
symbols[index].managedProfits += item.managedProfits;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Handle Remove on Managed SL based On Managed TP ...
|
||||||
|
if (item.managedTPs > 0)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
symbols[index].managedSLs -= item.managedTPs;
|
||||||
|
if (symbols[index].managedSLs < 0)
|
||||||
|
{
|
||||||
|
symbols[index].managedSLs = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Handle Remove on Managed TP based On Managed SL ...
|
||||||
|
if (item.managedSLs > 0)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
symbols[index].managedTPs -= item.managedSLs;
|
||||||
|
if (symbols[index].managedTPs < 0)
|
||||||
|
{
|
||||||
|
symbols[index].managedTPs = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
void ResetSymbolsRestrictions()
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool has = HasChild(symbols);
|
||||||
|
if (has)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
string prefix = "Protector: ";
|
||||||
|
|
||||||
|
//
|
||||||
|
datetime start = TimeCurrent();
|
||||||
|
double balance = trader.mAccount.GetBalance();
|
||||||
|
bool hasRestrictions = HasRestrictions(restrictionsPeriod);
|
||||||
|
if (!hasRestrictions)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
balance = 0;
|
||||||
|
start = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
int count = ArraySize(symbols);
|
||||||
|
for (int i = 0; i < count; i++)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XTradeSymbolInfo iInfo = symbols[i];
|
||||||
|
if (reportRestrictions)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
string message = iInfo.GetRestrictionDescription(restrictionsPeriod);
|
||||||
|
alert.SendAlert(message);
|
||||||
|
}
|
||||||
|
SaveRestrictions(iInfo);
|
||||||
|
|
||||||
|
//
|
||||||
|
symbols[i].managedSLs = 0;
|
||||||
|
symbols[i].managedTPs = 0;
|
||||||
|
symbols[i].managedTrades = 0;
|
||||||
|
symbols[i].managedProfits = 0;
|
||||||
|
symbols[i].managedStart = start;
|
||||||
|
symbols[i].managedBalance = balance;
|
||||||
|
|
||||||
|
//
|
||||||
|
iInfo.Clean();
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
string message = prefix + "Reset Symbols Restrictions";
|
||||||
|
HandleReportProtector(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
void HandleRestrictions()
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool isNewDay = timeTracker.IsNewDay();
|
||||||
|
bool isNewHour = timeTracker.IsNewHour();
|
||||||
|
bool isNewWeek = timeTracker.IsNewWeek();
|
||||||
|
bool isNewMonth = timeTracker.IsNewMonth();
|
||||||
|
|
||||||
|
//
|
||||||
|
// Reset Force Closed Flag on new Day Starts ...
|
||||||
|
if (isNewDay)
|
||||||
|
{
|
||||||
|
isForceCloseAtTime = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
bool canResetRestrictions =
|
||||||
|
(
|
||||||
|
//
|
||||||
|
// Hourly ...
|
||||||
|
(isNewHour &&
|
||||||
|
restrictionsPeriod == XTRADE_RESTRICATION_HOURLY)
|
||||||
|
//
|
||||||
|
||
|
||||||
|
//
|
||||||
|
// Daily ...
|
||||||
|
(isNewDay &&
|
||||||
|
restrictionsPeriod == XTRADE_RESTRICATION_DAILY)
|
||||||
|
//
|
||||||
|
||
|
||||||
|
//
|
||||||
|
// Weekly ...
|
||||||
|
(isNewWeek &&
|
||||||
|
restrictionsPeriod == XTRADE_RESTRICATION_WEEKLY)
|
||||||
|
//
|
||||||
|
||
|
||||||
|
//
|
||||||
|
// Monthly ...
|
||||||
|
(isNewMonth &&
|
||||||
|
restrictionsPeriod == XTRADE_RESTRICATION_MONTHLY)
|
||||||
|
//
|
||||||
|
)
|
||||||
|
//
|
||||||
|
;
|
||||||
|
if (canResetRestrictions)
|
||||||
|
{
|
||||||
|
ResetSymbolsRestrictions();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
bool SaveRestrictions(XTradeSymbolInfo &info)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
if (!mSaveRestrictions)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
result = info.IsValid();
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
string filePath = GetRestrictionsFilePath(info.symbol);
|
||||||
|
result = IsValid(filePath);
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
string content = info.GetRestrictionDescription(restrictionsPeriod);
|
||||||
|
|
||||||
|
//
|
||||||
|
result = collector.Append(
|
||||||
|
filePath,
|
||||||
|
content //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Symbol Session ...
|
||||||
|
|
||||||
|
//
|
||||||
|
bool FindSymbolSession(
|
||||||
|
int &index,
|
||||||
|
string symbol //
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
index = -1;
|
||||||
|
|
||||||
|
//
|
||||||
|
result = IsValid(symbol) &&
|
||||||
|
HasChild(sessions);
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
int count = ArraySize(sessions);
|
||||||
|
for (int i = 0; i < count; i++)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
result = sessions[i].symbol == symbol;
|
||||||
|
if (result)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
index = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
result = IsValidIndex(index);
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
void AddTradingSession(
|
||||||
|
XTradeSession &session,
|
||||||
|
XSymbolSessions &symbolSession //
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool has = session.IsValid() &&
|
||||||
|
symbolSession.IsValid();
|
||||||
|
if (!has)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Check Session Exists in Symbol Session ...
|
||||||
|
bool isExists = false;
|
||||||
|
if (HasChild(symbolSession.sessions))
|
||||||
|
{
|
||||||
|
//
|
||||||
|
int count = ArraySize(symbolSession.sessions);
|
||||||
|
for (int i = 0; i < count; i++)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
isExists = symbolSession.sessions[i].end == session.end &&
|
||||||
|
symbolSession.sessions[i].start == session.start;
|
||||||
|
if (isExists)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
if (!isExists)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
AddRef(
|
||||||
|
session,
|
||||||
|
symbolSession.sessions //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check Signal Execution Conditions ...
|
||||||
|
*
|
||||||
|
* @param signal: XSignal instance reference ...
|
||||||
|
* @param executionResult: ENUM_X_SIGNAL_EXECUTION_RESULT member reference ...
|
||||||
|
*
|
||||||
|
* @return ( bool )
|
||||||
|
*/
|
||||||
|
bool CheckSignal(
|
||||||
|
XSignal &signal,
|
||||||
|
ENUM_X_SIGNAL_EXECUTION_RESULT &executionResult //
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Cleanup ...
|
||||||
|
executionResult = X_SIGNAL_EXECUTION_UNKNOWN;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Validate Signal ...
|
||||||
|
result = signal.IsValid();
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Reporting Signal ...
|
||||||
|
if (reportSignals)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
string message = signal.GetMessage("Provided");
|
||||||
|
alert.SendAlert(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
SaveSignal(signal);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Check Trade Permission ...
|
||||||
|
if (!allowTrade)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
result = false;
|
||||||
|
executionResult = X_SIGNAL_EXECUTION_FAILED_NOT_ALLOWED;
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
bool isLong = IsLong(signal.type);
|
||||||
|
bool isShort = IsShort(signal.type);
|
||||||
|
|
||||||
|
//
|
||||||
|
bool isLongAndAllowed =
|
||||||
|
isLong &&
|
||||||
|
allowLongs;
|
||||||
|
|
||||||
|
//
|
||||||
|
bool isShortAndAllowed =
|
||||||
|
isShort &&
|
||||||
|
allowShorts;
|
||||||
|
|
||||||
|
//
|
||||||
|
result = isLongAndAllowed ||
|
||||||
|
isShortAndAllowed;
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
executionResult = X_SIGNAL_EXECUTION_FAILED_NOT_ALLOWED;
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Check Symbol Info Exists or not ...
|
||||||
|
int symbolInfoIDX = -1;
|
||||||
|
bool isSymbolInfoExists = FindSymbolIndex(
|
||||||
|
symbolInfoIDX,
|
||||||
|
signal.symbol //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Check Symbol Session Exists or not ...
|
||||||
|
int symbolSessionIDX = -1;
|
||||||
|
bool isSymbolSessionExists = FindSymbolSession(
|
||||||
|
symbolSessionIDX,
|
||||||
|
signal.symbol //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Chack Trade Session Validating ...
|
||||||
|
if (isSymbolSessionExists)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
result = sessions[symbolSessionIDX].CanTrade();
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
executionResult = X_SIGNAL_EXECUTION_FAILED_DELAY_NOT_PASSED;
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Check Trade Permissions Based on SL(s) Count ...
|
||||||
|
bool hasRestrictions = restrictionsPeriod != XTRADE_RESTRICATION_NONE;
|
||||||
|
if (hasRestrictions)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Only Can Check Restrictions when
|
||||||
|
// Symbol Info Exists ...
|
||||||
|
if (isSymbolInfoExists)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool isTPAllowed = maxAllowedTPs == 0
|
||||||
|
? true
|
||||||
|
: symbols[symbolInfoIDX].managedTPs < maxAllowedTPs;
|
||||||
|
bool isSLAllowed = maxAllowedSLs == 0
|
||||||
|
? true
|
||||||
|
: symbols[symbolInfoIDX].managedSLs < maxAllowedSLs;
|
||||||
|
bool isTradeAllowed = maxAllowedTrades == 0
|
||||||
|
? true
|
||||||
|
: symbols[symbolInfoIDX].managedTrades < maxAllowedTrades;
|
||||||
|
|
||||||
|
//
|
||||||
|
result = isTPAllowed &&
|
||||||
|
isSLAllowed &&
|
||||||
|
isTradeAllowed;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Report Error ...
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
executionResult = X_SIGNAL_EXECUTION_FAILED_MAX_REACHED;
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Execute Specified Signal ...
|
||||||
|
*
|
||||||
|
* @param signal: XSignal instance reference ...
|
||||||
|
* @param conditions: XCATBEAStrategyConditions instance reference ...
|
||||||
|
*
|
||||||
|
* @return ( bool )
|
||||||
|
*/
|
||||||
|
bool Execute(XSignal &signal)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
result = signal.IsValid();
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
int idx = -1;
|
||||||
|
bool isExists = HasTrade(
|
||||||
|
idx,
|
||||||
|
signal //
|
||||||
|
);
|
||||||
|
result = !isExists;
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
ENUM_X_SIGNAL_EXECUTION_RESULT executionResult;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Checking Signal For Execution ...
|
||||||
|
result = CheckSignal(
|
||||||
|
signal,
|
||||||
|
executionResult //
|
||||||
|
);
|
||||||
|
if (result)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
result = trader.ExecuteSignal(
|
||||||
|
signal,
|
||||||
|
executionResult //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Alert Signal Execution ...
|
||||||
|
if (reportTrades)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
string executionMessage = ToString(executionResult);
|
||||||
|
|
||||||
|
//
|
||||||
|
string message = NULL;
|
||||||
|
if (result)
|
||||||
|
{
|
||||||
|
message = signal.GetMessage("Executed");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
message = signal.GetMessage("Failed due (" + executionMessage + ")");
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
alert.SendAlert(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
if (result)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Create Symbol Info Struct ...
|
||||||
|
XTradeSymbolInfo iSymbolInfo;
|
||||||
|
|
||||||
|
//
|
||||||
|
iSymbolInfo.trades = 1;
|
||||||
|
iSymbolInfo.managedTrades = 1;
|
||||||
|
iSymbolInfo.symbol = signal.symbol;
|
||||||
|
|
||||||
|
//
|
||||||
|
bool isLong = IsLong(signal.type);
|
||||||
|
if (isLong)
|
||||||
|
{
|
||||||
|
iSymbolInfo.longs = 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
iSymbolInfo.shorts = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Fill Balance for Restrications ...
|
||||||
|
bool hasRestrictions = HasRestrictions(restrictionsPeriod);
|
||||||
|
if (hasRestrictions)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Read Balance ...
|
||||||
|
double balance = trader.mAccount.GetBalance();
|
||||||
|
iSymbolInfo.managedBalance = balance;
|
||||||
|
iSymbolInfo.managedStart = TimeCurrent();
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
AddOrUpdateSymbolInfo(iSymbolInfo);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Create Trade Struct ...
|
||||||
|
XTradeInfo iTrade;
|
||||||
|
|
||||||
|
//
|
||||||
|
ulong positionID = trader.GetLastOpenPositionTicket();
|
||||||
|
double commission = trader.GetPositionCommission(positionID);
|
||||||
|
|
||||||
|
//
|
||||||
|
iTrade.signal = signal;
|
||||||
|
iTrade.positionID = positionID;
|
||||||
|
iTrade.commission = commission;
|
||||||
|
iTrade.signaledAt = signal.time;
|
||||||
|
iTrade.executedAt = TimeCurrent();
|
||||||
|
iTrade.conditions = signal.conditions;
|
||||||
|
|
||||||
|
//
|
||||||
|
AddRef(
|
||||||
|
iTrade,
|
||||||
|
trades //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
string forceCloseAt;
|
||||||
|
bool isForceCloseAtTime;
|
||||||
|
|
||||||
|
//
|
||||||
|
int maxAllowedTPs;
|
||||||
|
int maxAllowedSLs;
|
||||||
|
int maxAllowedTrades;
|
||||||
|
ENUM_XTRADE_RESTRICTION_PERIOD restrictionsPeriod;
|
||||||
|
|
||||||
|
XTradeSymbolInfo symbols[];
|
||||||
|
XSymbolSessions sessions[];
|
||||||
|
|
||||||
|
//
|
||||||
|
forceCloseAt = NULL;
|
||||||
|
isForceCloseAtTime = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
maxAllowedTPs = 0;
|
||||||
|
maxAllowedSLs = 0;
|
||||||
|
maxAllowedTrades = 0;
|
||||||
|
restrictionsPeriod = XTRADE_RESTRICATION_NONE;
|
||||||
|
|||||||
@@ -2865,18 +2865,32 @@ struct XSymbolTradeConfig
|
|||||||
ZeroMemory(this);
|
ZeroMemory(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
/**
|
||||||
// Initial ...
|
* Initial ...
|
||||||
|
*
|
||||||
|
* @param _symbol: Trading Symbol
|
||||||
|
* @param _period: Trading Period
|
||||||
|
* @param _sessionsDescriptor: Sessions Description
|
||||||
|
* @param _maxAllowedSpread: Max Allowed Spread for Open Trade
|
||||||
|
* @param _maxAllowedPositions: Max Allowed Same Time Position
|
||||||
|
* @param _closeAllOpenTradesAt: Close All Open Trades
|
||||||
|
* @param _maxAllowedTPs: Max Allowed TPs in Restrictions Period
|
||||||
|
* @param _maxAllowedSLs: Max Allowed SLs in Restrictions Period
|
||||||
|
* @param _restrictionsPeriod: Restrictions Period
|
||||||
|
*
|
||||||
|
* @return ( bool )
|
||||||
|
*/
|
||||||
bool Init(
|
bool Init(
|
||||||
string _symbol = NULL,
|
string _symbol = NULL,
|
||||||
ENUM_TIMEFRAMES _period = NULL,
|
ENUM_TIMEFRAMES _period = NULL,
|
||||||
string _sessionsDescriptor = NULL,
|
string _sessionsDescriptor = NULL,
|
||||||
double _maxAllowedSpread = 25,
|
double _maxAllowedSpread = 25,
|
||||||
int _maxAllowedPositions = 5,
|
int _maxAllowedPositions = 5,
|
||||||
string _closeAllOpenTradesAt = NULL,
|
string _restrictionsDescriptor = NULL //
|
||||||
int _maxAllowedTPs = 0,
|
// string _closeAllOpenTradesAt = NULL,
|
||||||
int _maxAllowedSLs = 0,
|
// int _maxAllowedTPs = 0,
|
||||||
ENUM_XTRADE_RESTRICTION_PERIOD _restrictionsPeriod = XTRADE_RESTRICATION_NONE //
|
// int _maxAllowedSLs = 0,
|
||||||
|
// ENUM_XTRADE_RESTRICTION_PERIOD _restrictionsPeriod = XTRADE_RESTRICATION_NONE //
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
@@ -2890,17 +2904,23 @@ struct XSymbolTradeConfig
|
|||||||
//
|
//
|
||||||
symbol = _symbol;
|
symbol = _symbol;
|
||||||
period = _period;
|
period = _period;
|
||||||
maxAllowedTPs = _maxAllowedTPs;
|
|
||||||
maxAllowedSLs = _maxAllowedSLs;
|
|
||||||
maxAllowedSpread = _maxAllowedSpread;
|
maxAllowedSpread = _maxAllowedSpread;
|
||||||
restrictionsPeriod = _restrictionsPeriod;
|
|
||||||
maxAllowedPositions = _maxAllowedPositions;
|
maxAllowedPositions = _maxAllowedPositions;
|
||||||
closeAllOpenTradesAt = _closeAllOpenTradesAt;
|
|
||||||
|
//
|
||||||
|
// maxAllowedTPs = _maxAllowedTPs;
|
||||||
|
// maxAllowedSLs = _maxAllowedSLs;
|
||||||
|
// restrictionsPeriod = _restrictionsPeriod;
|
||||||
|
// closeAllOpenTradesAt = _closeAllOpenTradesAt;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Parse Sessions ...
|
// Parse Sessions ...
|
||||||
ParseSessions(_sessionsDescriptor);
|
ParseSessions(_sessionsDescriptor);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Parse Restrictions ...
|
||||||
|
ParseRestrictions(_restrictionsDescriptor);
|
||||||
|
|
||||||
//
|
//
|
||||||
result = IsValid();
|
result = IsValid();
|
||||||
|
|
||||||
@@ -2908,6 +2928,24 @@ struct XSymbolTradeConfig
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Check Same ...
|
||||||
|
bool IsSame(XSymbolTradeConfig &dest)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Validate ...
|
||||||
|
result = IsValid() &&
|
||||||
|
dest.IsValid() &&
|
||||||
|
symbol == dest.symbol &&
|
||||||
|
period == dest.period;
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Validate ...
|
// Validate ...
|
||||||
bool IsValid()
|
bool IsValid()
|
||||||
@@ -2916,7 +2954,8 @@ struct XSymbolTradeConfig
|
|||||||
bool result = false;
|
bool result = false;
|
||||||
|
|
||||||
//
|
//
|
||||||
result = IsSpecifiedValid(symbol);
|
result = IsSpecifiedValid(symbol) &&
|
||||||
|
IsSpecifiedValid(period);
|
||||||
|
|
||||||
//
|
//
|
||||||
return result;
|
return result;
|
||||||
@@ -3057,6 +3096,12 @@ struct XSymbolTradeConfig
|
|||||||
SpecifiedClean(_sessions);
|
SpecifiedClean(_sessions);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Parse Restrictions ...
|
||||||
|
void ParseRestrictions(string descriptor) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -525,10 +525,6 @@ class XCXOM1EAExpert : public XCBase
|
|||||||
eaTradeManager.SaveSignals(eaSaveSignals);
|
eaTradeManager.SaveSignals(eaSaveSignals);
|
||||||
eaTradeManager.SaveRestrictions(eaSaveRestrictions);
|
eaTradeManager.SaveRestrictions(eaSaveRestrictions);
|
||||||
|
|
||||||
//
|
|
||||||
// Enable Force Close At ...
|
|
||||||
eaTradeManager.SetForceCloseTradesAt(eaCloseAllOpenTradesAt);
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Setting Trade Reports ...
|
// Setting Trade Reports ...
|
||||||
eaTradeManager
|
eaTradeManager
|
||||||
@@ -550,37 +546,12 @@ class XCXOM1EAExpert : public XCBase
|
|||||||
);
|
);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Setting Trade Restrictions ...
|
// Setting Symbol Configuration ...
|
||||||
eaTradeManager
|
XSymbolTradeConfig symbolConfigurations[];
|
||||||
.SetTradeRestrictions(
|
eaTradeManager.SetSymbolConfigurations(eaSymbolConfiguration);
|
||||||
eaRestrictionsPeriod,
|
count = eaTradeManager.FillSymbolConfigurations(symbolConfigurations);
|
||||||
eaMaxAllowedTPs,
|
has = IsValidSize(count);
|
||||||
eaMaxAllowedSLs,
|
|
||||||
eaMaxAllowedTrades //
|
|
||||||
);
|
|
||||||
|
|
||||||
//
|
|
||||||
// Parse Symbols ...
|
|
||||||
string symbols[];
|
|
||||||
ENUM_TIMEFRAMES periods[];
|
|
||||||
if (!IsSpecifiedValid(eaSymbolConfiguration))
|
|
||||||
{
|
|
||||||
//
|
|
||||||
Add(
|
|
||||||
_Symbol,
|
|
||||||
symbols //
|
|
||||||
);
|
|
||||||
|
|
||||||
//
|
|
||||||
Add(
|
|
||||||
_Period,
|
|
||||||
periods //
|
|
||||||
);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Here we Apply Symbols,Periods and Configs ...
|
// Here we Apply Symbols,Periods and Configs ...
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user