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

  • Автор темы Автор темы ivansss
  • Дата начала Дата начала

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;
}}
}}
}
 
Должен будешь.
Обрати внимание на магик после закрытия первой части позиции. Будешь удивлён.
 
Должен будешь.
Обрати внимание на магик после закрытия первой части позиции. Будешь удивлён.
Магик ? причем тут магик позиции? Мне тут советовали раньше с Position idintifer работать, чтобы эту проблему решить. Руки так и не дошли. Сейчас мне проще воспользоваться платной услугой помощи..
 
Выкладывай полностью код а не кусок вырваный )кусок кода, в котором хрен знает что с чем связано по внутренним переменным и внешним.
 
Магик ? причем тут магик позиции? Мне тут советовали раньше с Position idintifer работать, чтобы эту проблему решить. Руки так и не дошли. Сейчас мне проще воспользоваться платной услугой помощи..
магик важен и не важен.... с точки зрения МТ5 - все(!!!) открытые ордера по одному символу = одна и та же позиция
 

Посмотрели (2) Посмотреть

Отслеживают (2) Посмотреть

Назад
Верх