Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Опубликуй статью и заслужи признание тысячи трейдеров!
safarov
8
safarov 2013.10.24 08:03 

Добрый день. Подскажите пожайлуста, взял чужую процедуру закрытия самого большого Лося и попытался немного переделать ее под себя, так чтоб прибыльная сделка частично перекрывала своим закрытием убыточную сделку с учетом профита (в функции это переменная Plus). Вот функция:

void ureg()
{
if(OrdersTotal()<2)return;
double lossprofit;
int lossticket;
string Symb=Symbol();
double minlots = MarketInfo( Symb, MODE_MINLOT);
double profit[50][3],loss[50][3],prom[50][3];
double pr,MinProfitLoss=0,countordloss=0,CloseLotLoss=0;
int countprofit=0,countloss=0;
for(int n=OrdersTotal()+1;n>=0;n--)
{
if(OrderSelect(n,SELECT_BY_POS))
{

if (OrderSymbol()== Symb)
{
if(OrderProfit()<0)
{

loss[countloss][0]=OrderProfit();
loss[countloss][1]=OrderTicket();
loss[countloss][2]=OrderLots();
countloss++;
}
if(OrderProfit()>0)
{

profit[countprofit][0]=OrderProfit();
profit[countprofit][1]=OrderTicket();
profit[countprofit][2]=OrderLots();
countprofit++;
}

}
}
}

if(countprofit<1)return;
if(countloss<1)return;

//--Сортировка массива профитных ордеров в порядке возрастания
ArrayResize(profit,countprofit);
ArrayResize(prom,countprofit);
for(n=0;n<countloss;n++)
{
prom[n][0]=0;
prom[n][1]=0;
prom[n][2]=0;
}
for(n=0;n<countprofit;n++)
{
int index=ArrayMaximum(profit);
prom[n][0]=profit[index][0];
prom[n][1]=profit[index][1];
prom[n][2]=profit[index][2];

profit[index][0]=0;
profit[index][1]=0;
profit[index][2]=0;

}
for(n=0;n<countloss;n++){
profit[n][0]=0;
profit[n][1]=0;
profit[n][2]=0;
}
for(n=0;n<countprofit;n++){
profit[n][0]=prom[n][0];
profit[n][1]=prom[n][1];
profit[n][1]=prom[n][2];
}

//--Сортировка лосевых ордеров в порядке убывания
index=0;
ArrayResize(prom,countloss);
ArrayResize(loss,countloss);
for(n=0;n<countloss;n++){
prom[n][0]=0;
prom[n][1]=0;
prom[n][2]=0;
}
for(n=0;n<countloss;n++){
index=ArrayMinimum(loss);
prom[n][0]=loss[index][0];
prom[n][1]=loss[index][1];
prom[n][2]=loss[index][2];
loss[index][0]=0;
loss[index][1]=0;
loss[index][2]=0;
}
for(n=0;n<countloss;n++){
loss[n][0]=0;
loss[n][1]=0;
loss[n][2]=0;
}
for(n=0;n<countloss;n++){
loss[n][0]=prom[n][0];
loss[n][1]=prom[n][1];
loss[n][2]=prom[n][2];
}
//-----Нахождение подходящей комбинации----------------------------------------+
int count;double prpr;bool close=false;
for(int x=0;x<countloss;x++)
{
if(loss[x][0]<0)
{
lossprofit=loss[x][0];
lossticket=loss[x][1];
countordloss=loss[x][2];

}
for(n=0;n<countprofit;n++)
{
prpr=prpr+profit[n][0];
if (countordloss>0)
{
MinProfitLoss = MathAbs(lossprofit/(countordloss/minlots));
}
prpr=prpr-Plus;
if (MinProfitLoss>0)
{
CloseLotLoss = MathRound(prpr/MinProfitLoss)*minlots;
}

count++;
if(CloseLotLoss>=minlots)
{close=true;
break;}
}
}

if(close)
{

del(lossticket,CloseLotLoss);

for(n=0;n<count;n++)

int tick=profit[n][1];
int ll=profit[n][2];
{
del(tick,ll);}

}


return;
}

void del(int ticket,double Lots)
{
int err;
for(int i=0;i<1;i++)
{
GetLastError();//обнуляем ошику
if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES)==true)
{
string symbol = OrderSymbol();

if(OrderType()==OP_BUY){RefreshRates();
double prise = MarketInfo(symbol,MODE_BID);
if(!OrderClose(ticket,Lots, OrderClosePrice(),3,Green)){err = GetLastError();}}
if(OrderType()==OP_SELL){RefreshRates();
prise = MarketInfo(symbol,MODE_ASK);
if(!OrderClose(ticket,Lots, OrderClosePrice(),3,Green)){err = GetLastError();}}

}
while(!IsTradeAllowed()){Sleep(5000);}// если рынок занят то подождем 5 сек
if (err==146) while (IsTradeContextBusy()) Sleep(1000*11);
}
}

Но почемуто закрытия положительных сделок не происходит.


/
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий