The bloop-spotters are keeping a wary eye on what is going on. Here is a pm exchange between Jason and myself:
SteveHopwood wrote:theforexedge wrote:Steve
Can you post the code for adding the HedgeLotSize as I can only see it at line 2942 in the excluded code. Not sure if this should be included or not? Just slowly trying to understand the code as you suggested
Anyway thanks for coding such a great EA..and enjoying the ride
Jason
Nice one Jason, thanks.
I added the hedge lot size code to CountOpenTrades() and then thought that it would be a good idea to add all the position picture code from my existing shells, so I commented out the original void CountOpenTrades() so I would not lose anything, and imported the function from my shell ea's forgetting to add back in the HedgeLotSize stuff.
I am about to upload a fixed version, but here is the new function. Do a search for HedgeLotSize and you will see where it is initialised to zero and then set to the lot size of the trade furthest back in time. I coded it that way on the assumption that the trade furthest back would be the original trade, or close to it, and so would have the correct lot size.
Cheers
Code: Select all void CountOpenTrades()
{
//Not all these will be needed. Which ones are depends on the individual EA.
//Market Buy trades
BuyOpen=false;
MarketBuysCount=0;
LatestBuyPrice=0; EarliestBuyPrice=0; HighestBuyPrice=0; LowestBuyPrice=million;
BuyTicketNo=-1; HighestBuyTicketNo=-1; LowestBuyTicketNo=-1; LatestBuyTicketNo=-1; EarliestBuyTicketNo=-1;
BuyPipsUpl=0;
BuyCashUpl=0;
LatestBuyTradeTime=0;
EarliestBuyTradeTime=TimeCurrent();
//Market Sell trades
SellOpen=false;
MarketSellsCount=0;
LatestSellPrice=0; EarliestSellPrice=0; HighestSellPrice=0; LowestSellPrice=million;
SellTicketNo=-1; HighestSellTicketNo=-1; LowestSellTicketNo=-1; LatestSellTicketNo=-1; EarliestSellTicketNo=-1;;
SellPipsUpl=0;
SellCashUpl=0;
LatestSellTradeTime=0;
EarliestSellTradeTime=TimeCurrent();
//BuyStop trades
BuyStopOpen=false;
BuyStopsCount=0;
LatestBuyStopPrice=0; EarliestBuyStopPrice=0; HighestBuyStopPrice=0; LowestBuyStopPrice=million;
BuyStopTicketNo=-1; HighestBuyStopTicketNo=-1; LowestBuyStopTicketNo=-1; LatestBuyStopTicketNo=-1; EarliestBuyStopTicketNo=-1;;
LatestBuyStopTradeTime=0;
EarliestBuyStopTradeTime=TimeCurrent();
//BuyLimit trades
BuyLimitOpen=false;
BuyLimitsCount=0;
LatestBuyLimitPrice=0; EarliestBuyLimitPrice=0; HighestBuyLimitPrice=0; LowestBuyLimitPrice=million;
BuyLimitTicketNo=-1; HighestBuyLimitTicketNo=-1; LowestBuyLimitTicketNo=-1; LatestBuyLimitTicketNo=-1; EarliestBuyLimitTicketNo=-1;;
LatestBuyLimitTradeTime=0;
EarliestBuyLimitTradeTime=TimeCurrent();
/////SellStop trades
SellStopOpen=false;
SellStopsCount=0;
LatestSellStopPrice=0; EarliestSellStopPrice=0; HighestSellStopPrice=0; LowestSellStopPrice=million;
SellStopTicketNo=-1; HighestSellStopTicketNo=-1; LowestSellStopTicketNo=-1; LatestSellStopTicketNo=-1; EarliestSellStopTicketNo=-1;;
LatestSellStopTradeTime=0;
EarliestSellStopTradeTime=TimeCurrent();
//SellLimit trades
SellLimitOpen=false;
SellLimitsCount=0;
LatestSellLimitPrice=0; EarliestSellLimitPrice=0; HighestSellLimitPrice=0; LowestSellLimitPrice=million;
SellLimitTicketNo=-1; HighestSellLimitTicketNo=-1; LowestSellLimitTicketNo=-1; LatestSellLimitTicketNo=-1; EarliestSellLimitTicketNo=-1;;
LatestSellLimitTradeTime=0;
EarliestSellLimitTradeTime=TimeCurrent();
//Not related to specific order types
TicketNo=-1;OpenTrades=0;
LatestTradeTime=0; EarliestTradeTime=million;//More specific times are in each individual section
LatestTradeTicketNo=-1; EarliestTradeTicketNo=-1;
PipsUpl=0;//For keeping track of the pips PipsUpl of multi-trade/hedged positions
CashUpl=0;//For keeping track of the cash PipsUpl of multi-trade/hedged positions
TradeComment = " ";
//For hedging, so ea knows whether tp/sl need removing
TpSet = false;
SlSet = false;
HedgeLotSize=0;
//FIFO ticket resize
ArrayResize(FifoTicket, 0);
int type;//Saves the OrderType() for consulatation later in the function
if (OrdersTotal() == 0) return;
//Iterating backwards through the orders list caters more easily for closed trades than iterating forwards
for (int cc = OrdersTotal() - 1; cc >= 0; cc--)
{
bool TradeWasClosed = false;//See 'check for possible trade closure'
//Ensure the trade is still open
if (!OrderSelect(cc, SELECT_BY_POS, MODE_TRADES) ) continue;
//Ensure the EA 'owns' this trade
if (OrderSymbol() != Symbol() ) continue;
if (OrderMagicNumber() != MagicNumber) continue;
if (OrderCloseTime() > 0) continue;
//All conditions passed, so carry on
//The time of the most recent pending order
if (OrderType() > 1)
if (OrderOpenTime() > LatestTradeTime)
LatestTradeTime = OrderOpenTime();
//Time of the furthest back in time trade
if (OrderOpenTime() < EarliestTradeTime)
EarliestTradeTime = OrderOpenTime();
HedgeLotSize = OrderLots();
type = OrderType();//Store the order type
if (!CloseEnough(OrderTakeProfit(), 0) )
TpSet = true;
if (!CloseEnough(OrderStopLoss(), 0) )
SlSet = true;
TradeComment = OrderComment();//For sending with grid trades
OpenTrades++;
//Store the latest trade sent. Most of my EA's only need this final ticket number as either they are single trade
//bots or the last trade in the sequence is the important one. Adapt this code for your own use.
if (TicketNo == -1) TicketNo = OrderTicket();
//Store ticket numbers for FIFO
ArrayResize(FifoTicket, OpenTrades + 1);
FifoTicket[OpenTrades] = OrderTicket();
//The next line of code calculates the pips upl of an open trade. As yet, I have done nothing with it.
//something = CalculateTradeProfitInPips()
double pips = 0;
//Buile up the position picture of market trades
if (OrderType() < 2)
{
CashUpl+= (OrderProfit() + OrderSwap() + OrderCommission());
MarketTradesTotal++;
pips = CalculateTradeProfitInPips(OrderType());
PipsUpl+= pips;
//Buys
if (OrderType() == OP_BUY)
{
BuyOpen = true;
BuyTicketNo = OrderTicket();
MarketBuysCount++;
BuyPipsUpl+= pips;
BuyCashUpl+= (OrderProfit() + OrderSwap() + OrderCommission());
//Latest trade
if (OrderOpenTime() > LatestBuyTradeTime)
{
LatestBuyTradeTime = OrderOpenTime();
LatestBuyPrice = OrderOpenPrice();
LatestBuyTicketNo = OrderTicket();
}//if (OrderOpenTime() > LatestBuyTradeTime)
//Furthest back in time
if (OrderOpenTime() < EarliestBuyTradeTime)
{
EarliestBuyTradeTime = OrderOpenTime();
EarliestBuyPrice = OrderOpenPrice();
EarliestBuyTicketNo = OrderTicket();
}//if (OrderOpenTime() < EarliestBuyTradeTime)
//Highest trade price
if (OrderOpenPrice() > HighestBuyPrice)
{
HighestBuyPrice = OrderOpenPrice();
HighestBuyTicketNo = OrderTicket();
}//if (OrderOpenPrice() > HighestBuyPrice)
//Lowest trade price
if (OrderOpenPrice() > LowestBuyPrice)
{
LowestBuyPrice = OrderOpenPrice();
LowestBuyTicketNo = OrderTicket();
}//if (OrderOpenPrice() > LowestBuyPrice)
}//if (OrderType() == OP_BUY)
//Sells
if (OrderType() == OP_SELL)
{
SellOpen = true;
SellTicketNo = OrderTicket();
MarketSellsCount++;
SellPipsUpl+= pips;
SellCashUpl+= (OrderProfit() + OrderSwap() + OrderCommission());
//Latest trade
if (OrderOpenTime() > LatestSellTradeTime)
{
LatestSellTradeTime = OrderOpenTime();
LatestSellPrice = OrderOpenPrice();
LatestSellTicketNo = OrderTicket();
}//if (OrderOpenTime() > LatestSellTradeTime)
//Furthest back in time
if (OrderOpenTime() < EarliestSellTradeTime)
{
EarliestSellTradeTime = OrderOpenTime();
EarliestSellPrice = OrderOpenPrice();
EarliestSellTicketNo = OrderTicket();
}//if (OrderOpenTime() < EarliestSellTradeTime)
//Highest trade price
if (OrderOpenPrice() > HighestSellPrice)
{
HighestSellPrice = OrderOpenPrice();
HighestSellTicketNo = OrderTicket();
}//if (OrderOpenPrice() > HighestSellPrice)
//Lowest trade price
if (OrderOpenPrice() > LowestSellPrice)
{
LowestSellPrice = OrderOpenPrice();
LowestSellTicketNo = OrderTicket();
}//if (OrderOpenPrice() > LowestSellPrice)
}//if (OrderType() == OP_SELL)
}//if (OrderType() < 2)
//Build up the position details of stop/limit orders
if (OrderType() > 1)
{
//Buystops
if (OrderType() == OP_BUYSTOP)
{
BuyStopOpen = true;
BuyStopTicketNo = OrderTicket();
BuyStopsCount++;
//Latest trade
if (OrderOpenTime() > LatestBuyStopTradeTime)
{
LatestBuyStopTradeTime = OrderOpenTime();
LatestBuyStopPrice = OrderOpenPrice();
LatestBuyStopTicketNo = OrderTicket();
}//if (OrderOpenTime() > LatestBuyStopTradeTime)
//Furthest back in time
if (OrderOpenTime() < EarliestBuyStopTradeTime)
{
EarliestBuyStopTradeTime = OrderOpenTime();
EarliestBuyStopPrice = OrderOpenPrice();
EarliestBuyStopTicketNo = OrderTicket();
}//if (OrderOpenTime() < EarliestBuyStopTradeTime)
//Highest trade price
if (OrderOpenPrice() > HighestBuyStopPrice)
{
HighestBuyStopPrice = OrderOpenPrice();
HighestBuyStopTicketNo = OrderTicket();
}//if (OrderOpenPrice() > HighestBuyStopPrice)
//Lowest trade price
if (OrderOpenPrice() > LowestBuyStopPrice)
{
LowestBuyStopPrice = OrderOpenPrice();
LowestBuyStopTicketNo = OrderTicket();
}//if (OrderOpenPrice() > LowestBuyStopPrice)
}//if (OrderType() == OP_BUYSTOP)
//Sellstops
if (OrderType() == OP_SELLSTOP)
{
SellStopOpen = true;
SellStopTicketNo = OrderTicket();
SellStopsCount++;
//Latest trade
if (OrderOpenTime() > LatestSellStopTradeTime)
{
LatestSellStopTradeTime = OrderOpenTime();
LatestSellStopPrice = OrderOpenPrice();
LatestSellStopTicketNo = OrderTicket();
}//if (OrderOpenTime() > LatestSellStopTradeTime)
//Furthest back in time
if (OrderOpenTime() < EarliestSellStopTradeTime)
{
EarliestSellStopTradeTime = OrderOpenTime();
EarliestSellStopPrice = OrderOpenPrice();
EarliestSellStopTicketNo = OrderTicket();
}//if (OrderOpenTime() < EarliestSellStopTradeTime)
//Highest trade price
if (OrderOpenPrice() > HighestSellStopPrice)
{
HighestSellStopPrice = OrderOpenPrice();
HighestSellStopTicketNo = OrderTicket();
}//if (OrderOpenPrice() > HighestSellStopPrice)
//Lowest trade price
if (OrderOpenPrice() > LowestSellStopPrice)
{
LowestSellStopPrice = OrderOpenPrice();
LowestSellStopTicketNo = OrderTicket();
}//if (OrderOpenPrice() > LowestSellStopPrice)
}//if (OrderType() == OP_SELLSTOP)
//Buy limits
if (OrderType() == OP_BUYLIMIT)
{
BuyLimitOpen = true;
BuyLimitTicketNo = OrderTicket();
BuyLimitsCount++;
//Latest trade
if (OrderOpenTime() > LatestBuyLimitTradeTime)
{
LatestBuyLimitTradeTime = OrderOpenTime();
LatestBuyLimitPrice = OrderOpenPrice();
LatestBuyLimitTicketNo = OrderTicket();
}//if (OrderOpenTime() > LatestBuyLimitTradeTime)
//Furthest back in time
if (OrderOpenTime() < EarliestBuyLimitTradeTime)
{
EarliestBuyLimitTradeTime = OrderOpenTime();
EarliestBuyLimitPrice = OrderOpenPrice();
EarliestBuyLimitTicketNo = OrderTicket();
}//if (OrderOpenTime() < EarliestBuyLimitTradeTime)
//Highest trade price
if (OrderOpenPrice() > HighestBuyLimitPrice)
{
HighestBuyLimitPrice = OrderOpenPrice();
HighestBuyLimitTicketNo = OrderTicket();
}//if (OrderOpenPrice() > HighestBuyLimitPrice)
//Lowest trade price
if (OrderOpenPrice() > LowestBuyLimitPrice)
{
LowestBuyLimitPrice = OrderOpenPrice();
LowestBuyLimitTicketNo = OrderTicket();
}//if (OrderOpenPrice() > LowestBuyLimitPrice)
}//if (OrderType() == OP_BUYLIMIT)
//Sell limits
if (OrderType() == OP_SELLLIMIT)
{
SellLimitOpen = true;
SellLimitTicketNo = OrderTicket();
SellLimitsCount++;
//Latest trade
if (OrderOpenTime() > LatestSellLimitTradeTime)
{
LatestSellLimitTradeTime = OrderOpenTime();
LatestSellLimitPrice = OrderOpenPrice();
LatestSellLimitTicketNo = OrderTicket();
}//if (OrderOpenTime() > LatestSellLimitTradeTime)
//Furthest back in time
if (OrderOpenTime() < EarliestSellLimitTradeTime)
{
EarliestSellLimitTradeTime = OrderOpenTime();
EarliestSellLimitPrice = OrderOpenPrice();
EarliestSellLimitTicketNo = OrderTicket();
}//if (OrderOpenTime() < EarliestSellLimitTradeTime)
//Highest trade price
if (OrderOpenPrice() > HighestSellLimitPrice)
{
HighestSellLimitPrice = OrderOpenPrice();
HighestSellLimitTicketNo = OrderTicket();
}//if (OrderOpenPrice() > HighestSellLimitPrice)
//Lowest trade price
if (OrderOpenPrice() > LowestSellLimitPrice)
{
LowestSellLimitPrice = OrderOpenPrice();
LowestSellLimitTicketNo = OrderTicket();
}//if (OrderOpenPrice() > LowestSellLimitPrice)
}//if (OrderType() == OP_SELLLIMIT)
}//if (OrderType() > 1)
//Add missing tp/sl in case rapidly moving markets prevent their addition - ECN
if (!Hedged)
{
if (CloseEnough(OrderStopLoss(), 0) && !CloseEnough(StopLoss, 0)) InsertStopLoss(OrderTicket());
if (CloseEnough(OrderTakeProfit(), 0) && !CloseEnough(TakeProfit, 0)) InsertTakeProfit(OrderTicket() );
}//if (!Hedged)
//Replace missing tp and sl lines
if (HiddenPips > 0) ReplaceMissingSlTpLines();
if (!Hedged)
{
TradeWasClosed = LookForTradeClosure(OrderTicket() );
if (TradeWasClosed)
{
if (type == OP_BUY) BuyOpen = false;//Will be reset if subsequent trades are buys that are not closed
if (type == OP_SELL) SellOpen = false;//Will be reset if subsequent trades are sells that are not closed
cc++;
continue;
}//if (TradeWasClosed)
//Profitable trade management
if (OrderProfit() > 0)
{
TradeManagementModule(OrderTicket() );
}//if (OrderProfit() > 0)
}//if (!Hedged)
}//for (int cc = OrdersTotal() - 1; cc <= 0; c`c--)
//Sort ticket numbers for FIFO
if (ArraySize(FifoTicket) > 0)
ArraySort(FifoTicket, WHOLE_ARRAY, 0, MODE_DESCEND);
//Is the position hedged?
Hedged = false;
if (BuyOpen)
if (SellOpen)
Hedged=true;
//Remove stop losses and take profits
if (Hedged)
{
if (TpSet)
RemoveTakeProfits();
if (SlSet)
RemoveStopLosses();
}//if (Hegded)
}//End void CountOpenTrades();
Either download V 1a from post 1, or make the edit yourself - I describe how in post 2. Go on, have a play folks. You can always re-download tomorrow if you muck things up. You really, really, really will benefit from learning a bit of basic code editing.
 |