cleanup workspace ...
This commit is contained in:
@@ -819,452 +819,6 @@ struct XPositionTrack
|
||||
// Type Definitions for XPosition Tracker Events ...
|
||||
typedef void (*TOnPositionState)(const XPositionTrack &track);
|
||||
|
||||
//
|
||||
// an Struct for Holding Event Handled Items for Position Tracker ...
|
||||
struct XPositionTrackerState
|
||||
{
|
||||
//
|
||||
XPositionTrack inProfits[];
|
||||
XPositionTrack inDrawdowns[];
|
||||
|
||||
//
|
||||
XPositionTrack onProfits[];
|
||||
XPositionTrack onDrawdowns[];
|
||||
|
||||
//
|
||||
XPositionTrackerState()
|
||||
{
|
||||
Clean();
|
||||
}
|
||||
|
||||
//
|
||||
// Tools ...
|
||||
|
||||
//
|
||||
// Cleanup ...
|
||||
void Clean()
|
||||
{
|
||||
//
|
||||
Clean(inProfits);
|
||||
Clean(inDrawdowns);
|
||||
|
||||
//
|
||||
Clean(onProfits);
|
||||
Clean(onDrawdowns);
|
||||
}
|
||||
};
|
||||
|
||||
//
|
||||
// Position Tracker Class ...
|
||||
class XSCPositionTracker
|
||||
{
|
||||
//
|
||||
// Public ...
|
||||
public:
|
||||
//
|
||||
// Props ...
|
||||
|
||||
//
|
||||
// Constructor ...
|
||||
void XSCPositionTracker(bool cleanStore = false)
|
||||
{
|
||||
//
|
||||
XSCDataCollector<XPositionTrack> mBase;
|
||||
|
||||
//
|
||||
if (cleanStore)
|
||||
{
|
||||
mBase.Clear();
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Tools ...
|
||||
|
||||
//
|
||||
// Cleaning Store ...
|
||||
void Clear()
|
||||
{
|
||||
//
|
||||
XSCDataCollector<XPositionTrack> mBase;
|
||||
|
||||
//
|
||||
mBase.Clear();
|
||||
}
|
||||
|
||||
//
|
||||
// Collect All Store ...
|
||||
int Collect(XPositionTrack &result[])
|
||||
{
|
||||
//
|
||||
int mResult = 0;
|
||||
|
||||
//
|
||||
XSCDataCollector<XPositionTrack> mBase;
|
||||
|
||||
//
|
||||
mResult = mBase.Collect(result);
|
||||
|
||||
//
|
||||
return mResult;
|
||||
}
|
||||
|
||||
//
|
||||
// Add Item To Store ...
|
||||
bool Add(XPositionTrack &item)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
XSCDataCollector<XPositionTrack> mBase;
|
||||
|
||||
//
|
||||
result = mBase.Add(item);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Add Item(s) To Store ...
|
||||
int Add(XPositionTrack &items[])
|
||||
{
|
||||
//
|
||||
int result = 0;
|
||||
|
||||
//
|
||||
XSCDataCollector<XPositionTrack> mBase;
|
||||
|
||||
//
|
||||
result = mBase.Add(items);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Remove an Item from Store ...
|
||||
bool Remove(XPositionTrack &item)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
XSCDataCollector<XPositionTrack> mBase;
|
||||
|
||||
//
|
||||
result = mBase.Remove(item);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Custom Functions ...
|
||||
|
||||
//
|
||||
// Sync all Content using Specific Trader Class ...
|
||||
int Sync(
|
||||
XPositionTrackerState &state, // Hold all Changes State ...
|
||||
XSCTrade *mTrader // XSCTrade Instance for Synchronize ...
|
||||
)
|
||||
{
|
||||
//
|
||||
int result = 0;
|
||||
|
||||
//
|
||||
XPosition positions[];
|
||||
int positionsCount = mTrader.GetPositions(positions);
|
||||
|
||||
//
|
||||
ulong trackTickets[];
|
||||
XPositionTrack trackers[];
|
||||
int trackersCount = Collect(trackers);
|
||||
|
||||
//
|
||||
// Nothing to Do ...
|
||||
if (positionsCount <= 0 && trackersCount <= 0)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Collect Exists Trackers Ticket's For Managing ...
|
||||
for (int i = 0; i < trackersCount; i++)
|
||||
{
|
||||
//
|
||||
XPositionTrack iTrack = trackers[i];
|
||||
|
||||
//
|
||||
bool isValid = iTrack.IsValid();
|
||||
if (isValid)
|
||||
{
|
||||
//
|
||||
AddSpecific(
|
||||
iTrack.ticket,
|
||||
trackTickets //
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Clear Tracker Store for Update Later ...
|
||||
Clear();
|
||||
|
||||
//
|
||||
// Collect All Required to Add/Update Trackers here ...
|
||||
XPositionTrack syncedTracks[];
|
||||
|
||||
//
|
||||
// a Flag for Synchronization Performance ...
|
||||
bool hasTracker = trackersCount > 0;
|
||||
|
||||
//
|
||||
// Loop through Position for Managing Trackers ...
|
||||
for (int i = 0; i < positionsCount; i++)
|
||||
{
|
||||
//
|
||||
XPosition iPosition = positions[i];
|
||||
|
||||
//
|
||||
// if there isn't any Track before ...
|
||||
if (!hasTracker)
|
||||
{
|
||||
//
|
||||
XPositionTrack iTrack;
|
||||
bool isInited = iTrack.Init(iPosition);
|
||||
if (isInited)
|
||||
{
|
||||
//
|
||||
AddRef(
|
||||
iTrack,
|
||||
syncedTracks //
|
||||
);
|
||||
|
||||
//
|
||||
FillState(
|
||||
iTrack,
|
||||
state //
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
continue;
|
||||
}
|
||||
|
||||
//
|
||||
// if there was some tracks ...
|
||||
|
||||
//
|
||||
// Try to Find Position Ticket in Track Tickets ...
|
||||
int iTicketIdx = FindIndex(
|
||||
iPosition.ticket,
|
||||
trackTickets //
|
||||
);
|
||||
bool isTrackedBefore = iTicketIdx >= 0;
|
||||
|
||||
//
|
||||
// Add new Track ...
|
||||
if (!isTrackedBefore)
|
||||
{
|
||||
//
|
||||
XPositionTrack iTrack;
|
||||
bool isInited = iTrack.Init(iPosition);
|
||||
if (isInited)
|
||||
{
|
||||
//
|
||||
AddRef(
|
||||
iTrack,
|
||||
syncedTracks //
|
||||
);
|
||||
|
||||
//
|
||||
FillState(
|
||||
iTrack,
|
||||
state //
|
||||
);
|
||||
}
|
||||
}
|
||||
//
|
||||
// Update Exists Track ...
|
||||
else
|
||||
{
|
||||
//
|
||||
XPositionTrack iTrack = trackers[iTicketIdx];
|
||||
bool isUpdated = iTrack.Update(iPosition);
|
||||
if (isUpdated)
|
||||
{
|
||||
//
|
||||
AddRef(
|
||||
iTrack,
|
||||
syncedTracks //
|
||||
);
|
||||
|
||||
//
|
||||
FillState(
|
||||
iTrack,
|
||||
state //
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Check Synced Tracks ...
|
||||
int syncedTracksCount = ArraySize(syncedTracks);
|
||||
if (syncedTracksCount <= 0)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
result = Add(syncedTracks);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Event Handlers ...
|
||||
|
||||
//
|
||||
// Add Profit Event Handler ...
|
||||
void AddOnProfitEventHandler(TOnPositionState handler)
|
||||
{
|
||||
//
|
||||
AddSpecific(
|
||||
handler,
|
||||
mOnProfitEventHandlers //
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
// Add Drawdown Event Handler ...
|
||||
void AddOnDrawdownEventHandler(TOnPositionState handler)
|
||||
{
|
||||
//
|
||||
AddSpecific(
|
||||
handler,
|
||||
mOnDrawdownEventHandlers //
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
// Protected ...
|
||||
protected:
|
||||
//
|
||||
// Tools ...
|
||||
|
||||
//
|
||||
// Event Handlers ...
|
||||
|
||||
//
|
||||
// OnProfit ...
|
||||
void NotifyOnProfitEvent(XPositionTrack &track)
|
||||
{
|
||||
//
|
||||
int count = ArraySize(mOnProfitEventHandlers);
|
||||
if (count <= 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
//
|
||||
TOnPositionState iHandler = mOnProfitEventHandlers[i];
|
||||
iHandler(track);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// OnDrawdown ...
|
||||
void NotifyOnDrawdownEvent(XPositionTrack &track)
|
||||
{
|
||||
//
|
||||
int count = ArraySize(mOnDrawdownEventHandlers);
|
||||
if (count <= 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
//
|
||||
TOnPositionState iHandler = mOnDrawdownEventHandlers[i];
|
||||
iHandler(track);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Private ...
|
||||
private:
|
||||
//
|
||||
// Props ...
|
||||
|
||||
//
|
||||
TOnPositionState mOnProfitEventHandlers[];
|
||||
TOnPositionState mOnDrawdownEventHandlers[];
|
||||
|
||||
//
|
||||
void FillState(
|
||||
XPositionTrack &track,
|
||||
XPositionTrackerState &state //
|
||||
)
|
||||
{
|
||||
//
|
||||
// In Profit ...
|
||||
bool isInProfit = track.profit[0] > 0;
|
||||
if (isInProfit)
|
||||
{
|
||||
//
|
||||
AddRef(
|
||||
track,
|
||||
state.inProfits //
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
// In Drawdown ...
|
||||
bool isInDrawdown = track.profit[0] < 0;
|
||||
if (isInDrawdown)
|
||||
{
|
||||
//
|
||||
AddRef(
|
||||
track,
|
||||
state.inDrawdowns //
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
// On Profit ...
|
||||
bool isOnProfit = track.IsCrossedInProfit();
|
||||
if (isOnProfit)
|
||||
{
|
||||
//
|
||||
AddRef(
|
||||
track,
|
||||
state.onProfits //
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
// On Drawdown ...
|
||||
bool isOnDrawdown = track.IsCrossedInDrawdown();
|
||||
if (isOnDrawdown)
|
||||
{
|
||||
//
|
||||
AddRef(
|
||||
track,
|
||||
state.onDrawdowns //
|
||||
);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
//
|
||||
class XSCPositionHolder
|
||||
{
|
||||
@@ -2212,18 +1766,6 @@ public:
|
||||
{
|
||||
mTrader.AddOnTradeStateChangedEventHandler(mOnTradeStateChangedHandler);
|
||||
}
|
||||
|
||||
//
|
||||
// Instantiate XPositionTracker Class ...
|
||||
mPositionTracker = new XSCPositionTracker();
|
||||
|
||||
//
|
||||
// Do Synchronisation after Instantiate everything ...
|
||||
XPositionTrackerState state;
|
||||
mPositionTracker.Sync(
|
||||
state,
|
||||
mTrader //
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
@@ -2232,7 +1774,6 @@ public:
|
||||
{
|
||||
//
|
||||
delete mTrader;
|
||||
delete mPositionTracker;
|
||||
}
|
||||
|
||||
//
|
||||
@@ -2605,7 +2146,6 @@ protected:
|
||||
//
|
||||
// Trade Class Instance ...
|
||||
XSCTrade *mTrader;
|
||||
XSCPositionTracker *mPositionTracker;
|
||||
|
||||
//
|
||||
// Check in Test Mode or not ...
|
||||
@@ -3025,85 +2565,6 @@ protected:
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Synchronize Positions and Position Tracker ...
|
||||
void SyncPositionTracker()
|
||||
{
|
||||
//
|
||||
// Check Syncing Interval ...
|
||||
|
||||
//
|
||||
static datetime lastSyncPositionTracker = NULL;
|
||||
datetime cTime = TimeCurrent();
|
||||
|
||||
//
|
||||
int syncInterval = PeriodSeconds(PERIOD_M5);
|
||||
int lastDiff = (int)cTime - (int)lastSyncPositionTracker;
|
||||
|
||||
//
|
||||
bool canSync =
|
||||
//
|
||||
lastSyncPositionTracker == NULL
|
||||
? true
|
||||
: lastDiff >= syncInterval
|
||||
//
|
||||
;
|
||||
if (!canSync)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
lastSyncPositionTracker = cTime;
|
||||
|
||||
//
|
||||
// Do Sync ...
|
||||
|
||||
//
|
||||
XPositionTrackerState state;
|
||||
int synced = mPositionTracker.Sync(
|
||||
state,
|
||||
mTrader //
|
||||
);
|
||||
if (synced > 0)
|
||||
{
|
||||
//
|
||||
// Check State and Do What we Want ...
|
||||
int onProfitsCount = ArraySize(state.onProfits);
|
||||
int onDrawdownCount = ArraySize(state.onDrawdowns);
|
||||
|
||||
//
|
||||
// Do What we want whe a Position Dropped to Prefit ...
|
||||
if (onProfitsCount > 0)
|
||||
{
|
||||
//
|
||||
for (int i = 0; i < onProfitsCount; i++)
|
||||
{
|
||||
//
|
||||
XPositionTrack iTrack = state.onProfits[i];
|
||||
|
||||
//
|
||||
OnPositionGoingInProfit(iTrack);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Do what we want when a Position Dropped to Drawdown ...
|
||||
if (onDrawdownCount > 0)
|
||||
{
|
||||
//
|
||||
for (int i = 0; i < onDrawdownCount; i++)
|
||||
{
|
||||
//
|
||||
XPositionTrack iTrack = state.onDrawdowns[i];
|
||||
|
||||
//
|
||||
OnPositionGoingToDrawdown(iTrack);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Guards ...
|
||||
|
||||
|
||||
Reference in New Issue
Block a user