Правка 1 функции МТ5 (1000 руб.)

ivansss

Новичок форума
Проблема: не работает все что ниже этой строки:
if(data.lev == 1 && (PositionGetDouble(POSITION_PROFIT) + PositionGetDouble(POSITION_SWAP) > AccountInfoDouble(ACCOUNT_BALANCE)*(Risk/100)))

Второго частичного закрытия не происходит. Как бы подправить или переписать с сохранением функционала?





//+-----------------------------------------------------------------------------+
//| Частичное закрытие |
//+-----------------------------------------------------------------------------+
void Particle_close_position()
{
ulong ticket;int tickets;
double min_lot=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);
double step_lot=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP);

double lots; double price;
ArrayResize(data.ticket,PositionsTotal());
ArrayResize(data.lev,PositionsTotal());
int step = 1;
for ( int i = PositionsTotal()-1; i>=0; i--)
{
if((ticket = PositionGetTicket(i)) == 0) continue;
if(PositionGetInteger(POSITION_MAGIC)!= MagicNumber) continue;
if(StringCompare(PositionGetString(POSITION_SYMBOL), _Symbol)!=0) continue;
if(HistoryDealGetInteger(ticket,DEAL_ENTRY) != DEAL_ENTRY_OUT)
{
data.ticket = ticket;
data.lev = 0;
}
}


for (int i = PositionsTotal()-1; i >= 0; i--)
{
if(PositionSelectByTicket(data.ticket))
{

tickets = data.ticket;
double Res = FindPosition(tickets);
if(Res == -1)continue;

if(data.lev == 0)
{

if((PositionGetDouble(POSITION_VOLUME)*0.33) < min_lot){lots = min_lot;}
else lots = MathCeil(PositionGetDouble(POSITION_VOLUME)*0.33/step_lot)*step_lot;

double op = PositionGetDouble(POSITION_PRICE_OPEN);
double cp = PositionGetDouble(POSITION_PRICE_CURRENT);

if(MathAbs(op-cp) > Res*_Point)
{
ExtTrade.PositionModify(data.ticket,NormalizeDouble(PositionGetDouble(POSITION_PRICE_OPEN),(int)SymbolInfoInteger(_Symbol,SYMBOL_DIGITS)),PositionGetDouble(POSITION_TP));
PrintFormat("Ордер № %I64d переведен в безубыток",data.ticket);
ExtTrade.PositionClosePartial(data.ticket,lots);
PrintFormat("Ордер № %I64d зафиксирован на 1/3%",data.ticket);
CleanPositions();
}

ticket = ExtTrade.ResultOrder();
if(ticket > 0)
{
data.lev+=step;
data.ticket = ticket;
break;
}
else
{
data.ticket = -1;
data.lev = -1;
}
}
//--------------------------------------------------------+
if(data.lev == 1 && (PositionGetDouble(POSITION_PROFIT) + PositionGetDouble(POSITION_SWAP) > AccountInfoDouble(ACCOUNT_BALANCE)*(Risk/100)))
{

ExtTrade.PositionClosePartial(data.ticket,lots);
PrintFormat("Ордер № %I64d зафиксирован еще на 50%",data.ticket);
ticket = ExtTrade.ResultOrder();
if(ticket > 0)
{
data.lev+=step;
data.ticket = ticket;
break;
}}
}}
}
 

AlexeyVik

Программист mql4 mql5
Должен будешь.
Обрати внимание на магик после закрытия первой части позиции. Будешь удивлён.
 

ivansss

Новичок форума
Должен будешь.
Обрати внимание на магик после закрытия первой части позиции. Будешь удивлён.
Магик ? причем тут магик позиции? Мне тут советовали раньше с Position idintifer работать, чтобы эту проблему решить. Руки так и не дошли. Сейчас мне проще воспользоваться платной услугой помощи..
 

HYDRA6

Активный участник
Выкладывай полностью код а не кусок вырваный )кусок кода, в котором хрен знает что с чем связано по внутренним переменным и внешним.
 

AlexeNP

Гуру форума
Магик ? причем тут магик позиции? Мне тут советовали раньше с Position idintifer работать, чтобы эту проблему решить. Руки так и не дошли. Сейчас мне проще воспользоваться платной услугой помощи..
магик важен и не важен.... с точки зрения МТ5 - все(!!!) открытые ордера по одному символу = одна и та же позиция
 
Верх