please, look into this code

 

hi pros,

what can i do to this ea code to put an end to ''trade context busy'' error,which i always get anytime i try to use it on 2 different pairs at a time?

the code is stated below,thanks

//+------------------------------------------------------------------+
//| TrueScalperProfitLock.mq4 |
//| Copyright © 2005, International Federation of Red Cross. |
//| http://www.ifrc.org/ |
//| Please donate some pips |
//+------------------------------------------------------------------+
//+-----------------------------------------------------------------------------------------+
//| Modifications |
//| ------------- |
//| 1) Jacob Yego and Ron Thompson: Original version |
//| |
//| 2) Reworked by Roger. This MT4 version is now identical to |
//| Roger's earlier MT3 version TrueScalperProfitLock.mql. |
//| Both these versions now include optional RSI validation, optional |
//| Abandon method, MoneyManagement and ProfitLock system. |
//| |
//| Original Theory of operation (See TrueScalperProfitLock.mql MT3 version for more UPDATED|
//| and DETAILED descriptions) |
//+-----------------------------------------------------------------------------------------+
#property copyright "Copyright © 2005, International Federation of Red Cross."
#property link "http://www.ifrc.org/"
// generic user input
extern double Lots=1.0;
extern int TakeProfit=44;
extern int StopLoss=90;
extern bool RSIMethodA=false;
extern bool RSIMethodB=true;
extern int RSIValue=50;
extern bool AbandonMethodA=false;
extern bool AbandonMethodB=true;
extern int Abandon=101;
extern bool MoneyManagement=true;
extern int Risk=2;
extern int Slippage=3;
extern bool UseProfitLock=true;
extern int BreakEvenTrigger=25;
extern int BreakEven=3;
extern bool LiveTrading=false;
extern bool AccountIsMini=false;
extern int maxTradesPerPair=1;
extern int MagicNumber=5432;
//----
double lotMM;
bool BuySignal=false;
bool SetBuy=false;
bool SellSignal=false;
bool SetSell=false;
// Bar handling
datetime bartime=0;
int bartick=0;
int TradeBars=0;
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
//----
if (UseProfitLock) ProfitLockStop();
if (AbandonMethodA || AbandonMethodB)
{
RunAbandonCheck();
RunAbandonMethods();
}
if (!SetLotsMM()) return(0);
RunOrderTriggerCalculations();
RunPairSpesificSettings();
RunNewOrderManagement();
//----
return(0);
}
// SetLotsMM - By Robert Cochran http://autoforex.biz
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
bool SetLotsMM()
{
double MarginCutoff;
//----
if(!AccountIsMini) MarginCutoff=1000;
if(AccountIsMini) MarginCutoff=100;
if(AccountFreeMargin() < MarginCutoff) return(false);
if(MoneyManagement)
{
lotMM=MathCeil(AccountBalance() * Risk/10000)/10;
//----
if(lotMM < 0.1) lotMM=Lots;
if(lotMM > 1.0) lotMM=MathCeil(lotMM);
// Enforce lot size boundaries
if(LiveTrading)
{
if(AccountIsMini) lotMM=lotMM * 10;
if(!AccountIsMini && lotMM < 1.0) lotMM=1.0;
}
if(lotMM > 100) lotMM=100;
}
else
{
lotMM=Lots; // Change MoneyManagement to 0 if you want the Lots parameter to be in effect
}
return(true);
}
//+------------------------------------------------------------------+
//| RunOrderTriggerCalculations |
//+------------------------------------------------------------------+
bool RunOrderTriggerCalculations()
{
bool RSIPOS=false;
bool RSINEG=false;
// 3-period moving average on Bar[1]
double bullMA1=iMA(Symbol(),0,1,0,MODE_EMA,PRICE_CLOSE,1);
// 7-period moving average on Bar[1]
double bearMA4=iMA(Symbol(),0,4,0,MODE_EMA,PRICE_CLOSE,1);
// 2-period moving average on Bar[2]
double RSI=iRSI(Symbol(),0,2,PRICE_CLOSE,2);
double RSI2=iRSI(Symbol(),0,2,PRICE_CLOSE,1);
// Determine what polarity RSI is in
if (RSIMethodA)
{
if(RSI>RSIValue && RSI2<RSIValue)
{
RSIPOS=true;
RSINEG=false;
}
else RSIPOS=false;
if(RSI<RSIValue && RSI2>RSIValue)
{
RSIPOS=false;
RSINEG=true;
}
else RSINEG=false;
}
if (RSIMethodB)
{
if(RSI>RSIValue)
{
RSIPOS=true;
RSINEG=false;
}
if(RSI<RSIValue)
{
RSIPOS=false;
RSINEG=true;
}
}
if ((bullMA1 > (bearMA4+Point)) && RSINEG)
{
BuySignal=true;
}
else BuySignal=false;
if ((bullMA1 < (bearMA4-Point)) && RSIPOS)
{
SellSignal=true;
}
else SellSignal=false;
return(true);
}
// OpenOrdersBySymbolAndComment
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int OpenOrdersForThisEA()
{
int ofts=0;
for(int x=0;x<OrdersTotal();x++)
{
OrderSelect(x, SELECT_BY_POS, MODE_TRADES);
if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)
{
ofts++;
}
}
return(ofts);
}
// PROFIT LOCK - By Robert Cochran - http://autoforex.biz
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
bool ProfitLockStop()
{
if(OpenOrdersForThisEA() > 0 )
{
for( int i=0; i < OrdersTotal(); i++){
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
//--- LONG TRADES
if(OrderType()==OP_BUY && OrderSymbol()==Symbol() && OrderMagicNumber()== MagicNumber)
{
if (Bid>=OrderOpenPrice() + BreakEvenTrigger*Point &&
OrderOpenPrice() > OrderStopLoss())
{
OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice() + BreakEven * Point, OrderTakeProfit(), Green);
}
}
//--- SHORT TRADES
if(OrderType()==OP_SELL && OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)
{
if (Ask <=OrderOpenPrice() - BreakEvenTrigger*Point &&
OrderOpenPrice() < OrderStopLoss())
{
OrderModify(OrderTicket(), OrderOpenPrice(),OrderOpenPrice() - BreakEven * Point, OrderTakeProfit(), Blue);
}
}
}
}
}
// ABANDON CHECK
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
bool RunAbandonCheck()
{
if(OpenOrdersForThisEA() > 0 )
{
if (TradeBars==0 && bartick==0)
{
for(int i=0; i < OrdersTotal(); i++)
{
if (OrderSymbol()==Symbol())
{
TradeBars=MathFloor(CurTime() - OrderOpenTime())/60/Period();
bartime=Time[0];
bartick=TradeBars;
}
}
}
if(bartime!=Time[0])
{
bartime=Time[0];
bartick++;
}
}
return(true);
}
// RunAbandonMethods
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
bool RunAbandonMethods()
{
if(OpenOrdersForThisEA() > 0 )
{
for(int i=0; i < OrdersTotal(); i++)
{
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if (AbandonMethodA && bartick==Abandon)//Force "HEDGE" after abandon
{
// LONG TRADES
if (OrderType()==OP_BUY && OrderSymbol()==Symbol() &&
OrderMagicNumber()==MagicNumber)
{
OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Blue);
SetSell=true;
continue;
}
// SHORT TRADES
if (OrderType()==OP_SELL && OrderSymbol()==Symbol() &&
OrderMagicNumber()==MagicNumber)
{
OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,Blue);
SetBuy=true;
continue;
}
}
if (AbandonMethodB && bartick==Abandon)//Indicators decide direction after abandon
{
// LONG TRADES
if (OrderType()==OP_BUY && OrderSymbol()==Symbol() &&
OrderMagicNumber()==MagicNumber)
{
OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,White);
continue;
}
// SHORT TRADES
if (OrderType()==OP_SELL && OrderSymbol()==Symbol() &&
OrderMagicNumber()==MagicNumber)
{
OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,White);
continue;
}
}
}
}
return(true);
}
// RunPairSpesificSettings
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
bool RunPairSpesificSettings()
{
// set up the symbol optimizations
if (Symbol()=="GBPUSD")
{
TakeProfit=55; StopLoss=100; Abandon=69;
}
return(true);
}
// RunNewOrderManagement
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
bool RunNewOrderManagement()
{
double TP,SL;
//----
if(OpenOrdersForThisEA() < maxTradesPerPair )
{
//ENTRY Ask(buy, long)
if (BuySignal || SetBuy)
{
SL=Ask - StopLoss*Point;
TP=Ask + TakeProfit*Point;
OrderSend(Symbol(),OP_BUY,lotMM,Ask,Slippage,SL,TP,"TS-ProfitLock - "+Symbol()+" - Long",MagicNumber,0,White);
bartick=0;
if (SetBuy) SetBuy=false;
return(true);
}
//ENTRY Bid (sell, short)
if (SellSignal || SetSell)
{
SL=Bid + StopLoss*Point;
TP=Bid - TakeProfit*Point;
OrderSend(Symbol(),OP_SELL,lotMM,Bid,Slippage,SL,TP,"TS-ProfitLock - "+Symbol()+" - Short",MagicNumber,0,Red);
bartick=0;
if (SetSell) SetSell=false;
return(true);
}
}
return(true);
}
//+------------------------------------------------------------------+

 

Look at the function OpenAtMarket on this thread '2 EAs, 2 same charts 1 account'

Replace your OrderSend with this function, adding values for number of retries and number of milliseconds between retries.

I use values between 5-10 and 500-1000

Good luck

-BB-

Reason: