Need Help With Figuring Out Proper CloseOrder Syntax In This EA

 
Hey folks

I can't get this EA to send the OrderClose. Can you help me get the code right? I get error 4051. Buy and sell work fine but close is MIA.

//+------------------------------------------------------------------+
//| франк_уд.mq4 |
//| Copyright © 2006, Рамиль Сафиуллович Иргизов |
//| popcorn@aaanet.ru |
//+------------------------------------------------------------------+
#define m 20050611
//----
extern int tp = 65;
extern int sh = 41;
//----
datetime lastt;
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int kol_buy()
{
int kol_ob = 0;
//----
for(int i = 0; i < OrdersTotal(); i++)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false)
break;
//----
if(OrderType() == OP_BUY)
kol_ob++;
}
return(kol_ob);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int kol_sell()
{
int kol_os = 0;
//----
for(int i = 0; i < OrdersTotal(); i++)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false)
break;
//----
if(OrderType() == OP_SELL)
kol_os++;
}
return(kol_os);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start()
{
int slip, i, ii, tic, total, kk, gle;
double lotsi = 0.0;
bool sob = false, sos = false, scb = false, scs = false;
int kb, kb_max = 0;
kb = kol_buy() + 1;
double M_ob[11][8];
ArrayResize(M_ob,kb);
int ks = 0, ks_max = 0;
ks = kol_sell() + 1;
double M_os[11][8];
ArrayResize(M_os,ks);
ArrayInitialize(M_ob, 0.0);
int kbi = 0;
//----
for(i = 0; i < OrdersTotal(); i++)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false)
break;
//----
if(OrderSymbol() == Symbol() && OrderType() == OP_BUY)
{
kbi++;
M_ob[kbi][0] = OrderTicket();
M_ob[kbi][1] = OrderOpenPrice();
M_ob[kbi][2] = OrderLots();
M_ob[kbi][3] = OrderType();
M_ob[kbi][4] = OrderMagicNumber();
M_ob[kbi][5] = OrderStopLoss();
M_ob[kbi][6] = OrderTakeProfit();
M_ob[kbi][7] = OrderProfit();
}
}
M_ob[0][0] = kb;
double max_lot_b = 0.0;
//----
for(i = 1; i < kb; i++)
if(M_ob[i][2] > max_lot_b)
{
max_lot_b = M_ob[i][2];
kb_max = i;
}
double buy_lev_min = M_ob[kb_max][1];
ArrayInitialize(M_os,0.0);
int ksi = 0;
//----
for(i = 0; i < OrdersTotal(); i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)
break;
//----
if(OrderSymbol()==Symbol() && OrderType()==OP_SELL)
{
ksi++;
M_os[ksi][0] = OrderTicket();
M_os[ksi][1] = OrderOpenPrice();
M_os[ksi][2] = OrderLots();
M_os[ksi][3] = OrderType();
M_os[ksi][4] = OrderMagicNumber();
M_os[ksi][5] = OrderStopLoss();
M_os[ksi][6] = OrderTakeProfit();
M_os[ksi][7] = OrderProfit();
}
}
M_os[0][0] = ks;
double max_lot_s = 0.0;
//----
for(i = 1;i < ks; i++)
if(M_os[i][2] > max_lot_s)
{
max_lot_s = M_os[i][2];
ks_max = i;
}
double sell_lev_max = M_os[ks_max][1];
//----
if(Bars < 100 || IsTradeAllowed() == false)
return(0);
sob = (kol_buy() < 1 || buy_lev_min - sh*Point > Ask) &&
AccountFreeMargin() > AccountBalance()*0.5;
sos = (kol_sell() < 1 || sell_lev_max + sh*Point < Bid) &&
AccountFreeMargin() > AccountBalance()*0.5;
//----
if(M_ob[kb_max][2] > 0.0)
scb = M_ob[kb_max][7] / (M_ob[kb_max][2]*10) > tp;
//----
if(M_os[ks_max][2] > 0.0)
scs = M_os[ks_max][7] / (M_os[ks_max][2]*10) > tp;
kk = 0;
ii = 0;
//----
if(scb)
{
while(kol_buy() > 0 && kk < 3)
{
for(i = 1; i <= kb; i++)
{
ii = M_ob[i][0];
//----
if(!OrderClose(ii,M_ob[i][2],Bid,slip,White))
{
gle = GetLastError();
kk++;
Print("With №", gle, " with close buy ", kk);
Sleep(6000);
RefreshRates();

}
}
kk++;
}
}
kk = 0;
ii = 0;
//----
if(scs)
{
while(kol_sell() > 0 && kk < 3)
{
for(i = 1; i <= ks; i++)
{
ii = M_os[i][0];
//----
if(!OrderClose(ii,M_os[i][2], Ask, slip, White))
{
gle = GetLastError();
kk++;
Print("Error №", gle, " with close sell ", kk);
Sleep(6000);
RefreshRates();
}
}
kk++;
}
}
kk = 0;
tic = -1;
//----
if(sob)
{
if(max_lot_b == 0.0)
lotsi = 0.1;
else
lotsi = 2.0*max_lot_b;
//----
while(tic == -1 && kk < 3)
{
tic = OrderSend(Symbol(), OP_BUY, lotsi, Ask, slip, 0, Ask + (tp + 25)*Point,
" ", m, 0, Yellow);
Print("tic_buy=", tic);
//----
if(tic==-1)
{
gle = GetLastError();
kk++;
Print("Error №", gle, " with buy ", kk);
Sleep(6000);
RefreshRates();
}
}
lastt = CurTime();
return;
}
tic = -1;
kk = 0;
//----
if(sos)
{
if(max_lot_s == 0.0)
lotsi = 0.1;
else
lotsi = 2.0*max_lot_s;
//----
while(tic == -1 && kk < 3)
{
tic = OrderSend(Symbol(), OP_SELL, lotsi, Bid, slip, 0, Bid - (tp + 25)*Point,
" ", m, 0, Red);
Print("tic_sell=", tic);
//----
if(tic == -1)
{
gle = GetLastError();
kk++;
Print("Error №", gle, " with sell ", kk);
Sleep(6000);
RefreshRates();
}
}
lastt = CurTime();
return;
}
}
//+------------------------------------------------------------------+
 
Reference:
OrderClose( int ticket, double lots, double price, int slippage, color Color=CLR_NONE)
ERR_INVALID_FUNCTION_PARAMVALUE 4051

Your Code:
OrderClose(ii,M_ob[i][2],Bid,slip,White))

Insert a print statement to verify the values of ii, M_ob[i][2], slip, and Bid
Find what is invalid.
Reason: