The code also count if a target is hit as a win and the profits in currency
private Order entryOrder=null;
private Order targetOrder = null;
private Order stopOrder = null;
private Order flattenOrder = null;
private int sumFilledFlatten=0;
private int sumFilledEntry=0;
private int sumFilledTarget = 0;
private int sumFilledStop = 0;
private void OnExecutionUpdate(object sender, ExecutionEventArgs e)
{
if (flattenOrder != null && flattenOrder == e.Execution.Order){
sumFilledFlatten += e.Execution.Quantity;
Log(String.Format("Flatten Order Execution: {0} on Account {1} ({2}/{3})",e.Execution.Quantity, currentAccount.Name, account_index, accountNumber),LogLevel.Information);
if(sumFilledFlatten==c){
Log(String.Format("Flatten Filled: {0} on Account {1} ({2}/{3})",sumFilledFlatten, currentAccount.Name, account_index, accountNumber),LogLevel.Information);
sumFilledFlatten=0;
flattenOrder=null;
}
}
if (entryOrder != null && entryOrder == e.Execution.Order){
sumFilledEntry += e.Execution.Quantity;
Log(String.Format("Entry Order Execution: {0} on Account {1} ({2}/{3})",e.Execution.Quantity, currentAccount.Name, account_index, accountNumber),LogLevel.Information);
if (EntryPrices.IsNullOrEmpty())
EntryPrices = new List<double>();
for (int i = 0; i < e.Execution.Quantity; i++)
EntryPrices.Add(e.Execution.Price);
// Now we can calculate the average entry price, and use it to protect the specifc entry
double averageEntryPrice = 0;
for (int i = 0; i < EntryPrices.Count; i++)
averageEntryPrice += EntryPrices[i];
averageEntryPrice /= EntryPrices.Count;
enterPrice = averageEntryPrice;
if (stopOrder == null && targetOrder == null)
{
if (e.Execution.Order.OrderAction == OrderAction.Buy){
string oco2 = Guid.NewGuid().ToString("N");
targetOrder = currentAccount.CreateOrder(Instrument,OrderAction.Sell,OrderType.Limit,TimeInForce.Day,sumFilledEntry,averageEntryPrice+tp,0,oco2,"Target",null);
stopOrder = currentAccount.CreateOrder(Instrument,OrderAction.Sell,OrderType.StopMarket,TimeInForce.Day,sumFilledEntry,0,averageEntryPrice-sl,oco2,"StopLoss",null);
currentAccount.Submit(new[] {targetOrder, stopOrder});
}
if (e.Execution.Order.OrderAction == OrderAction.Sell){
string oco2 = Guid.NewGuid().ToString("N");
targetOrder = currentAccount.CreateOrder(Instrument,OrderAction.Buy,OrderType.Limit,TimeInForce.Day,sumFilledEntry,averageEntryPrice-tp,0,oco2,"Target",null);
stopOrder = currentAccount.CreateOrder(Instrument,OrderAction.Buy,OrderType.StopMarket,TimeInForce.Day,sumFilledEntry,0,averageEntryPrice+sl,oco2,"StopLoss",null);
currentAccount.Submit(new[] {targetOrder, stopOrder});
}
Log(String.Format("Braket Submitted: {0} on Account {1} ({2}/{3})",sumFilledEntry, currentAccount.Name, account_index, accountNumber),LogLevel.Information);
}
else
{
stopOrder.QuantityChanged = sumFilledEntry;
targetOrder.QuantityChanged = sumFilledEntry;
if (e.Execution.Order.OrderAction == OrderAction.Buy){
stopOrder.StopPriceChanged = averageEntryPrice-sl;
targetOrder.LimitPriceChanged = averageEntryPrice+tp;
}
if (e.Execution.Order.OrderAction == OrderAction.Sell){
stopOrder.StopPriceChanged = averageEntryPrice+sl;
targetOrder.LimitPriceChanged = averageEntryPrice-tp;
}
currentAccount.Change(new[] {stopOrder, targetOrder});
Log(String.Format("Braket Changed: {0} on Account {1} ({2}/{3})",sumFilledEntry, currentAccount.Name, account_index, accountNumber),LogLevel.Information);
}
if (sumFilledEntry == c)
{
// Move to Class?
Log(String.Format("Entry Filled: {0} on Account {1} ({2}/{3})",sumFilledEntry, currentAccount.Name, account_index, accountNumber),LogLevel.Information);
sumFilledEntry = 0;
EntryPrices.Clear();
entryOrder=null;
}
}
if (stopOrder != null && stopOrder == e.Execution.Order)
{
sumFilledStop+= e.Execution.Quantity;
Log(String.Format("StopLoss Order Execution: {0} on Account {1} ({2}/{3})",e.Execution.Quantity, currentAccount.Name, account_index, accountNumber),LogLevel.Information);
if (sumFilledStop == c)
{
Log(String.Format("Trade Profit Counted on Account {0} ({1}/{2})", currentAccount.Name, account_index, accountNumber),LogLevel.Information);
double profits = (e.Execution.Price - enterPrice )*e.Execution.Quantity*Instrument.MasterInstrument.PointValue*enterDir;
dailyDrawDown+=-profits;
dailyProfits+=profits;
StratProfits+=profits;
if(dailyDrawDown<0)dailyDrawDown=0;
enterDir=0;
dailyLosses++;
inTrade=false;
stopOrder=null;
argetOrder=null;
Log(String.Format("StopLoss Filled: {0} on Account {1} ({2}/{3})",sumFilledStop, currentAccount.Name, account_index, accountNumber),LogLevel.Information);
Log(String.Format("Losses: {0} on Account {1} ({2}/{3})",dailyLosses, currentAccount.Name, account_index, accountNumber),LogLevel.Information);
sumFilledStop = 0;
}
}
if (targetOrder != null && targetOrder == e.Execution.Order)
{
sumFilledTarget+= e.Execution.Quantity;
Log(String.Format("Target Order Execution: {0} on Account {1} ({2}/{3})",e.Execution.Quantity, currentAccount.Name, account_index, accountNumber),LogLevel.Information);
if (sumFilledTarget == c)
{
Log(String.Format("Trade Profit Counted on Account {0} ({1}/{2})", currentAccount.Name, account_index, accountNumber),LogLevel.Information);
double profits = (e.Execution.Price - enterPrice )*e.Execution.Quantity*Instrument.MasterInstrument.PointValue*enterDir;
dailyDrawDown+=-profits;
dailyProfits+=profits;
StratProfits+=profits;
if(dailyDrawDown<0)dailyDrawDown=0;
enterDir=0;
dailyWins++;
inTrade=false;
stopOrder=null;
targetOrder=null;
Log(String.Format("Target Filled: {0} on Account {1} ({2}/{3})",sumFilledTarget, currentAccount.Name, account_index, accountNumber),LogLevel.Information);
Log(String.Format("Wins: {0} on Account {1} ({2}/{3})",dailyWins, currentAccount.Name, account_index, accountNumber),LogLevel.Information);
sumFilledTarget=0;
}
}
}

Comment