Проблема: не работает все что ниже этой строки:
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;
}}
}}
}
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;
}}
}}
}