int OpenBuy(bool lock=FALSE)
{
int ticket;
double lot;
bool opened=TRUE;
if(TimeCurrent() - TimeOpen <= TimeWait) return (0);
if(lock && (!gobuy)) return (0);
if(!GlobalVariableCheck("Waiting"))
{
GlobalVariableSet("Waiting",TimeCurrent());
lot=NormalizeDouble(BaseLotSize,2);
if(AutoMM>0)
{
lot=NormalizeDouble(BaseLotSize+BaseLotMult*MathFloor((AccountFreeMargin()-BaseLotEquity)/AutoMM),Dig());
}
if(LastLotBuy()>0.0)
{
lot=LastLotBuy();
if(!AutoStepLot) lot=NormalizeDouble(lot*mult+lot/100*StepLot,2);
double autosteplot=0;
if(Step>0) autosteplot=((LastPrice(OP_BUY)-Ask)/_Point-Step)/(Step*0.01);
if(AutoStepLotMax>0 && autosteplot+StepLot>AutoStepLotMax) autosteplot=AutoStepLotMax-StepLot;
if(AutoStepLot) lot=NormalizeDouble(lot*mult+lot/100*(StepLot+autosteplot),2);
if(lot<=LastLotBuy()+MarketInfo(_Symbol,MODE_MINLOT)) lot=NormalizeDouble(LastLotBuy()+MarketInfo(_Symbol,MODE_MINLOT),2);
}
if(lot<MarketInfo(Symbol(),MODE_MINLOT)) lot=MarketInfo(_Symbol,MODE_MINLOT);
if(lot>MarketInfo(Symbol(),MODE_MAXLOT)) lot=MarketInfo(_Symbol,MODE_MAXLOT);
if(!MarginEnoughCheck(lot)) {Sleep(1000); return(false);}// No money check
for(int tmp=0; tmp<6; tmp++)
{
if(IsTradeContextBusy())
{
Sleep(3000);
//Print("OpenBuy on "+Symbol()+" waiting to trade contest "+DoubleToStr(tmp,2)+" attempt(s)");
}
else break;
}
if(!IsTradeAllowed()) {GlobalVariableDel("Waiting"); return(false);}
RefreshRates(); //Need b'cose possible waiting to trade contest fix 0.5
ticket=OrderSend(Symbol(),OP_BUY,lot,NormalizeDouble(Ask,Digits),slippage,0,0,Name+OrdersComment,MagicNumber,0,Green);
//Sleep(1000);
TimeOpen=TimeCurrent();
if(ticket!=-1)
{
if(lock)
{
//Print("BUY hedgedTicket="+DoubleToStr(ticket,0));
} else {
//Print("BUY ticket="+DoubleToStr(ticket,2));
}
} else {
//Print("failed buy");
opened=FALSE;
}
}
GlobalVariableDel("Waiting");
return (opened);
}