Комментарий ордера записывается в момент открытия позиции и не может быть изменён со стороны клиента. Что касается "from" я не очень уверен, что комментарий меняется на стороне сервера в момент частичного закрытия. Ведь тикет позиции при частичном закрытии не меняется. Поэтому смысла в этом комментарии нет никакого, в отличии от mql4. А такое условие говорит о том, что комментарий не имеет текста "from" а не просто наличие комментария. Может тебе лучше проверить вообще отсутствие комментария так if(PositionGetString(POSITION_COMMENT) == "")
//+-----------------------------------------------------------------------------+
//| Частичное закрытие |
//+-----------------------------------------------------------------------------+
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(StringFind(PositionGetString(POSITION_COMMENT),"from") == -1)
{
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/500)))
{
ExtTrade.PositionClosePartial(data.ticket,lots);
PrintFormat("Ордер № %I64d зафиксирован еще на 50%",data.ticket);
ticket = ExtTrade.ResultOrder();
if(ticket > 0)
{
data.lev+=step;
data.ticket = ticket;
break;
}}
}}
}
После того, как data.lev стал равен 1, должен выполнятся последний блок функции. В mql4 все работало прексрасно, в mql5 нет. В начале каждого вызова функции происходит обнуление data.lev для каждого тикета.