а вообще вожможно ли сделать чтобы без перезапуска советника настройка MaxEquity работала например 500 раз.
например если написать в счетчике число 500, то пусть будет получаться так: допустим первоначальный эквити 10 000,
то после приращения к первоначальному эквити 10 000 ( указыв. в настройках ) - закрываются большие минуса.
И так 500 раз ( например ) ( ведь все равно не возможно 500 раз умножить первоначальный эквити ).
То есть разница получится с Вашим вариантом - что после приращения 10 000 к превоначальному эквити = 10 000 -
советник не нужно перезапускать, а цикл продолжится - к 20 000 прибавится еще 10 000,к 30 000 + 10 000 и так 500 раз ( например ). Ну
и после каждого приращения = 10 000, будет закрываться убыточный ордер с самым большим минусом ( или нес-ко ордеров - указыв. в настройках ) ?
Не нужно делать никаких перезапусков. Нужно обновлять данные по изначальному эквити после закрытия позиций и ждать приращения эквити уже с нового начального эквити.
artmedia70: Не нужно делать никаких перезапусков. Нужно обновлять данные по изначальному эквити после закрытия позиций и ждать приращения эквити уже с нового начального эквити.
но как я понял это все делается в программном коде. Я то не имею силы программирования )
alex12: но как я понял это все делается в программном коде. Я то не имею силы программирования )
Естественно. Нужна лишь одна ф-ция, которая будет постоянно отслеживать эквити и при превышении заданного значения, отсылать команду на закрытие убыточных позиций. Далее, после успешного закрытия всех этих позиций, запоминать новое состояние эквити и продолжать далее его отслеживать.
artmedia70: Естественно. Нужна лишь одна ф-ция, которая будет постоянно отслеживать эквити и при превышении заданного значения, отсылать команду на закрытие убыточных позиций. Далее, после успешного закрытия всех этих позиций, запоминать новое состояние эквити и продолжать далее его отслеживать.
Предположу, что в моём вопросе не достаточно информации, чтобы мне помочь.)) Дополню свой вопрос. Ниже предоставляю структуру с основными функциями своего эксперта. Может быть так получиться выявить в чём проблема, которую я осветил.
// ПОДКЛЮЧАЕМЫЕ БИБЛИОТЕКИ С ФУНКЦИЯМИ// ВНЕШНИЕ ПАРАМЕТРЫ// ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ
Init()
{
// ПРОВЕРКА: ПРАВИЛЬНО ЛИ ВВЕДЕНЫ ЗНАЧЕНИЯ ТАЙМФРЕЙМОВ ВО ВНЕШНИХ ПАРАМЕТРАХ.
}
Deinit()
{
return(0);
}
Start()
{
// ЛОКАЛЬНЫЕ ПЕРЕМЕННЫЕ// ИНДИКАТОРЫ// УСЛОВИЯ// ФУНКЦИИ ВИЗУАЛИЗАЦИИ// ФУНКЦИЯ УДАЛЕНИЯ ОРДЕРОВ ПРИ ИСПОЛНЕНИИ ОПРЕДЕЛЁННОГО УСЛОВИЯ//--- ВЫЗОВ ФУНКЦИИ УПРАВЛЕНИЯ КАПИТАЛОМ ------------------------------------------------------------------// if (Money_Management_OnOff == TRUE)
{
MM_FxProp(Delta,Start_Lot,Start_Deposit,Step_Lot,Stop_Trade,Symbol());
Lots = NormalizeDouble(GlobalVariableGet("fxprop_lot"),2);
//--- ПРОВЕРКА: ИЗМЕНИЛОСЬ ЛИ ЗНАЧЕНИЕ ЛОТА С ЦЕЛЬЮ ПЕРЕУСТАНОВКИ ОТЛОЖЕННЫХ ОРДЕРОВ ----------------//
Re_Set_All_Orders_by_Lots(dgt, Lots);
}
else Lots = 0.1;
// ФУНКЦИЯ ИНФОРМАЦИОННОЙ ПАНЕЛИ// ПРОВЕРКА НА НОВЫЙ БАР// ПРОВЕРКА НА КОЛ-ВО БАРОВ НА ГРАФИКЕ// ПРОВЕРКА НА КОЛ-ВО ЗНАКОВ В СИМВОЛЕ// УСТАНОВКА ФЛАГОВ, ЕСЛИ ИСПОЛНЯЮТСЯ УСЛОВИЯ ДЛЯ ЗАКРЫТИЯ ОПРЕДЕЛЁННЫХ ПОЗИЦИЙ// ФУНКЦИИ ЗАКРЫТИЯ ПОЗИЦИЙ ПО ОПРЕДЕЛЁННЫМ УСЛОВИЯМ// ФУНКЦИЯ ТРЕЙЛИНГ СТОПА// ФУНКЦИЯ МОДИФИКАЦИИ ОТЛОЖЕННЫХ ОРДЕРОВ// ФУНКЦИЯ УСТАНОВКИ ОТЛОЖЕННЫХ ОРДЕРОВ// ФУНКЦИЯ ОТКРЫТИЯ ПОЗИЦИИ ПО ОПРЕДЕЛЁННЫМ УСЛОВИЯМ// УДАЛЕНИЕ ОТЛОЖЕННЫХ ОРДЕРОВ ПО ОПРЕДЕЛЁННЫМ УСЛОВИЯМ//--- ЗАНОСИТЬ ДАННЫЕ В ОТЧЁТ ТОЛЬКО, ЕСЛИ КОЛ-ВО ЗАКРЫТЫХ ПОЗИЦИЙ ИЗМЕНИЛОСЬ
Amount_Positions = 0;
for(count = 0; count < OrdersHistoryTotal(); count++)
{
OrderSelect(count, SELECT_BY_POS, MODE_HISTORY);
if(OrderType() == OP_BUY || OrderType() == OP_SELL)
{
Amount_Positions++;
}
}
if(Amount_Close_Deals != Amount_Positions)
{
if(Short_Trade_Report == TRUE)
{
// ФУНКЦИЯ ФОРМИРУЮЩАЯ ОТЧЁТ
}
Amount_Close_Deals = Amount_Positions;
}
}
На данный момент приходиться каждый раз компилировать заново эксперта после включения/отключения функции управления капиталом в параметрах эксперта, чтобы отчёт формировался корректно.
Предположу, что в моём вопросе не достаточно информации, чтобы мне помочь.)) Дополню свой вопрос. Ниже предоставляю структуру с основными функциями своего эксперта. Может быть так получиться выявить в чём проблема, которую я осветил.
На данный момент приходиться каждый раз компилировать заново эксперта после включения/отключения функции управления капиталом в параметрах эксперта, чтобы отчёт формировался корректно.
P.S. Может быть это связано с глобальной переменной терминала fxprop_lot ?
Если Вы считаете что этого достаточно, то видимо - да. Осталось дождаться ответа. У меня его нету
Если Вы считаете что этого достаточно, то видимо - да. Осталось дождаться ответа. У меня его нету
Мой опыт пока к сожалению не позволяет мне судить о том, достаточно ли предоставляемой информации для решения того или иного вопроса или не достаточно. Я не специально и прошу прощения, если что.)) Дело в том, что в проблеме, которую я осветил на мой взгляд ключевой момент в том, что при перекомпиляции эксперта всё работает корректно. Но это опять же в силу своего незрелого опыта. Подскажите, пожалуйста, какую информацию нужно предоставить, чтобы решить данный вопрос. В проблеме явно фигурирует функция управления капиталом либо функция формирования отчёта. Поэтому предоставлю функцию управления капиталом:
double MM_FxProp(double Delta, double Start_Lot, double Start_Deposit, double Step_Lot, double Stop_Trade, string fSymbol)
{
if (Delta < Step_Lot || Start_Lot < Step_Lot || // если Delta <, чем 0.01 или Start_Lot <, чем 0.01 или
Start_Deposit <= MarketInfo(fSymbol, MODE_MARGINREQUIRED) / 10.0 || // Start_Depo <=, чем размер свободных средств, ...// ...необходимых для открытия 1 лота на покупку (разделить на 10) илиAccountFreeMarginCheck(fSymbol, OP_BUY, Start_Lot) <= Stop_Trade || // размер свободных средств после BUY <= Stop_Trade илиAccountFreeMarginCheck(fSymbol, OP_SELL, Start_Lot) <= Stop_Trade || // размер свободных средств после SELL <= Stop_Trade или
Start_Lot < MarketInfo(fSymbol, MODE_MINLOT) || // Start_Lot <, чем минимальный возможный или
(fSymbol != "GBPUSD" && fSymbol != "EURUSD" && fSymbol != "USDCHF" && fSymbol != "USDJPY" && // нет ни одного инструмента из ниже перечисленных, то
fSymbol != "AUDUSD" && fSymbol != "USDCAD" && fSymbol != "EURCHF" && fSymbol != "EURGBP" &&
fSymbol != "EURJPY" && fSymbol != "EURCAD" && fSymbol != "EURAUD" && fSymbol != "GBPCHF" &&
fSymbol != "GBPJPY" && fSymbol != "CHFJPY" && fSymbol != "NZDUSD" && fSymbol != "USDSEK" &&
fSymbol != "USDDKK" && fSymbol != "USDNOK" && fSymbol != "USDSGD" && fSymbol != "USDZAR" &&
fSymbol != "EURNZD" && fSymbol != "AUDJPY" && fSymbol != "AUDNZD" && fSymbol != "AUDCAD" &&
fSymbol != "AUDCHF" && fSymbol != "CADCHF" && fSymbol != "CADJPY" && fSymbol != "NZDJPY" && fSymbol != "XAUUSD"))
{
Print("Расчет лота функцией MM_FxProp() невозможен из-за некорректности значений переданных ей аргументов.");
return (0);
}
double S_D = Start_Deposit;
double S_L = Start_Lot;
double Stp_L = Step_Lot;
double stepUP = 0;
double stepDW = 0;
if (AccountBalance() >= Start_Deposit) //если текущий баланс >= значению Start_Depo, то
{
while (AccountBalance() > S_D + Delta * (10.0 * S_L)) //пока текущий баланс >, чем результат формулы
{
S_D += Delta * (10.0 * S_L);
S_L += Stp_L;
}
stepUP = S_D + Delta * (10.0 * S_L);
stepDW = S_D;
}
if (AccountBalance() < Start_Deposit)
{
while (AccountBalance() < S_D)
{
if (S_L > Stp_L) S_L -= Stp_L;
else S_L = Stp_L;
S_D -= Delta * (10.0 * S_L);
}
stepDW = S_D;
stepUP = S_D + Delta * (10.0 * S_L);
}
if (AccountFreeMarginCheck(fSymbol, OP_BUY, S_L) <= Stop_Trade || // если размер свободных средств после BUY <= Stop_Trade илиAccountFreeMarginCheck(fSymbol, OP_SELL, S_L) <= Stop_Trade || // размер свободных средств после SELL <= Stop_Trade илиGetLastError() == 134/* NOT_ENOUGH_MONEY */ || // не хватает средств для операции или
S_L < MarketInfo(fSymbol, MODE_MINLOT)) // расчитанный объём лота <, чем минимальный возможный, то
{
while (AccountFreeMarginCheck(fSymbol, OP_BUY, S_L) <= Stop_Trade || // пока размер свободных средств после BUY <= Stop_Trade илиAccountFreeMarginCheck(fSymbol, OP_SELL, S_L) <= Stop_Trade) // размер свободных средств после SELL <= Stop_Trade, то
{
S_L -= Stp_L; // считаем так.if (S_L < MarketInfo(fSymbol, MODE_MINLOT)) // если же расчитанный объём лота <, чем минимальный возможный, то
{
Print("Объём средств на счете не позволяет открыть позицию минимального объёма.");
return (GlobalVariableSet("fxprop_lot", 0));
}
}
}
else {
GlobalVariableSet("fxprop_lot", S_L);
Comment("Средств на счете: ", DoubleToStr(AccountBalance(),2), ", лот: ", S_L, ", лот + ", Stp_L, "при >=", stepUP, ", лот - ", Stp_L, "при <", stepDW); return;
}
return (0.0);
}
А в следующем посте функцию формирования отчёта...
А как бы я его проверил?
Спасибо.
а вообще вожможно ли сделать чтобы без перезапуска советника настройка MaxEquity работала например 500 раз.
например если написать в счетчике число 500, то пусть будет получаться так: допустим первоначальный эквити 10 000,
то после приращения к первоначальному эквити 10 000 ( указыв. в настройках ) - закрываются большие минуса.
И так 500 раз ( например ) ( ведь все равно не возможно 500 раз умножить первоначальный эквити ).
То есть разница получится с Вашим вариантом - что после приращения 10 000 к превоначальному эквити = 10 000 -
советник не нужно перезапускать, а цикл продолжится - к 20 000 прибавится еще 10 000,к 30 000 + 10 000 и так 500 раз ( например ). Ну
и после каждого приращения = 10 000, будет закрываться убыточный ордер с самым большим минусом ( или нес-ко ордеров - указыв. в настройках ) ?
Спасибо.
а вообще вожможно ли сделать чтобы без перезапуска советника настройка MaxEquity работала например 500 раз.
например если написать в счетчике число 500, то пусть будет получаться так: допустим первоначальный эквити 10 000,
то после приращения к первоначальному эквити 10 000 ( указыв. в настройках ) - закрываются большие минуса.
И так 500 раз ( например ) ( ведь все равно не возможно 500 раз умножить первоначальный эквити ).
То есть разница получится с Вашим вариантом - что после приращения 10 000 к превоначальному эквити = 10 000 -
советник не нужно перезапускать, а цикл продолжится - к 20 000 прибавится еще 10 000,к 30 000 + 10 000 и так 500 раз ( например ). Ну
и после каждого приращения = 10 000, будет закрываться убыточный ордер с самым большим минусом ( или нес-ко ордеров - указыв. в настройках ) ?
Не нужно делать никаких перезапусков. Нужно обновлять данные по изначальному эквити после закрытия позиций и ждать приращения эквити уже с нового начального эквити.
но как я понял это все делается в программном коде. Я то не имею силы программирования )
Естественно. Нужна лишь одна ф-ция, которая будет постоянно отслеживать эквити и при превышении заданного значения, отсылать команду на закрытие убыточных позиций. Далее, после успешного закрытия всех этих позиций, запоминать новое состояние эквити и продолжать далее его отслеживать.
Подскажите в чём может быть проблема?
Предположу, что в моём вопросе не достаточно информации, чтобы мне помочь.)) Дополню свой вопрос. Ниже предоставляю структуру с основными функциями своего эксперта. Может быть так получиться выявить в чём проблема, которую я осветил.
На данный момент приходиться каждый раз компилировать заново эксперта после включения/отключения функции управления капиталом в параметрах эксперта, чтобы отчёт формировался корректно.
P.S. Может быть это связано с глобальной переменной терминала fxprop_lot ?
Предположу, что в моём вопросе не достаточно информации, чтобы мне помочь.)) Дополню свой вопрос. Ниже предоставляю структуру с основными функциями своего эксперта. Может быть так получиться выявить в чём проблема, которую я осветил.
На данный момент приходиться каждый раз компилировать заново эксперта после включения/отключения функции управления капиталом в параметрах эксперта, чтобы отчёт формировался корректно.
P.S. Может быть это связано с глобальной переменной терминала fxprop_lot ?
Если Вы считаете что этого достаточно, то видимо - да. Осталось дождаться ответа. У меня его нету
Если Вы считаете что этого достаточно, то видимо - да. Осталось дождаться ответа. У меня его нету
А в следующем посте функцию формирования отчёта...Мой опыт пока к сожалению не позволяет мне судить о том, достаточно ли предоставляемой информации для решения того или иного вопроса или не достаточно. Я не специально и прошу прощения, если что.)) Дело в том, что в проблеме, которую я осветил на мой взгляд ключевой момент в том, что при перекомпиляции эксперта всё работает корректно. Но это опять же в силу своего незрелого опыта. Подскажите, пожалуйста, какую информацию нужно предоставить, чтобы решить данный вопрос. В проблеме явно фигурирует функция управления капиталом либо функция формирования отчёта. Поэтому предоставлю функцию управления капиталом:
void Short_Trade_Report(int Mgc_Src_LP_TS№1,int Mgc_LP01_TS№1,int Mgc_LP02_TS№1,int Mgc_LP03_TS№1,int Mgc_LP04_TS№1,int Mgc_LP05_TS№1,int Mgc_LP06_TS№1, int Mgc_Src_SP_TS№1,int Mgc_SP01_TS№1,int Mgc_SP02_TS№1,int Mgc_SP03_TS№1,int Mgc_SP04_TS№1,int Mgc_SP05_TS№1,int Mgc_SP06_TS№1, int Mgc_Src_LP_TS№2,int Mgc_LP01_TS№2,int Mgc_LP02_TS№2,int Mgc_LP03_TS№2,int Mgc_LP04_TS№2,int Mgc_LP05_TS№2,int Mgc_LP06_TS№2, int Mgc_Src_SP_TS№2,int Mgc_SP01_TS№2,int Mgc_SP02_TS№2,int Mgc_SP03_TS№2,int Mgc_SP04_TS№2,int Mgc_SP05_TS№2,int Mgc_SP06_TS№2, int Mgc_Src_LP_TS№3,int Mgc_LP01_TS№3,int Mgc_LP02_TS№3,int Mgc_LP03_TS№3,int Mgc_LP04_TS№3,int Mgc_LP05_TS№3,int Mgc_LP06_TS№3, int Mgc_Src_SP_TS№3,int Mgc_SP01_TS№3,int Mgc_SP02_TS№3,int Mgc_SP03_TS№3,int Mgc_SP04_TS№3,int Mgc_SP05_TS№3,int Mgc_SP06_TS№3) { #define RA 10000 // Range Array - Размер массива для отчёта double Acc_Bal_Close[RA]; // Массив для баланса на закрытии сделки(-ок) double Acc_Bal_Open[RA]; // Массив для баланса на открытии сделки(-ок) double Price_Open_Pos[RA]; double Price_Stop_Loss[RA]; double TS№1_DS[RA], TS№2_TA[RA], TS№3_SBH[RA]; int pos, handle, dgt, Magic, sign, index; double Swap_P; double Profit_P; double Commission; double Open_Price; double Stop_Loss; string Type_Pos; string comment; string Str_Stop_Loss; //--- ПРОВЕРКА НА КОЛ-ВО ЗНАКОВ В СИМВОЛЕ ДЛЯ РАСЧЁТА ОТСТУПА В СТРОКАХ КОММЕНТАРИЕВ --------------------------------// int digit_string; int digit = MarketInfo(Symbol(),MODE_DIGITS); switch(digit) { case 2 : digit_string = 4; dgt = 100; break; case 3 : digit_string = 5; dgt = 100; break; case 4 : digit_string = 6; dgt = 10000; break; case 5 : digit_string = 7; dgt = 10000; break; default: Print("Неизвестный символ! Количество знаков = ",digit); return(0); } handle = FileOpen("ShortReport.csv",FILE_CSV|FILE_WRITE); if(handle > 0) //1 { FileWrite(handle,"Time Close"+","+"Symbol"+","+"Type"+","+"Lots"+","+"Balance($)"+","+"Stop Loss(p)"+","+"Profit(p)"+","+"TS#1_DS(p)"+","+"TS#2_TA(p)"+","+"TS#3_SBH(p)"); for(pos = 0; pos < OrdersHistoryTotal(); pos++) // 2 { OrderSelect(pos,SELECT_BY_POS,MODE_HISTORY); Commission = OrderCommission(); Swap_P = (OrderSwap()/10)/OrderLots(); Profit_P = (OrderProfit()/10)/OrderLots()+(OrderSwap()/10)/OrderLots(); Open_Price = NormalizeDouble(OrderOpenPrice(),Digits); index = StringFind(OrderComment(),"[sl]",0); if(index != -1) { comment = StringSubstr(OrderComment(),0,StringLen(OrderComment())-4); } else { comment = StringSubstr(OrderComment(),0,StringLen(OrderComment())); } if(OrderType() < 2 && OrderCloseTime() == TimeCurrent() && (OrderMagicNumber() == Mgc_Src_LP_TS№1 || OrderMagicNumber() == Mgc_Src_SP_TS№1 || OrderMagicNumber() == Mgc_LP01_TS№1 || OrderMagicNumber() == Mgc_LP02_TS№1 || OrderMagicNumber() == Mgc_LP03_TS№1 || OrderMagicNumber() == Mgc_LP04_TS№1 || OrderMagicNumber() == Mgc_LP05_TS№1 || OrderMagicNumber() == Mgc_LP06_TS№1 || OrderMagicNumber() == Mgc_SP01_TS№1 || OrderMagicNumber() == Mgc_SP02_TS№1 || OrderMagicNumber() == Mgc_SP03_TS№1 || OrderMagicNumber() == Mgc_SP04_TS№1 || OrderMagicNumber() == Mgc_SP05_TS№1 || OrderMagicNumber() == Mgc_SP06_TS№1)) { TS№1_DS[pos] = Profit_P + Swap_P + Commission; Acc_Bal_Close[pos] = AccountBalance(); Str_Stop_Loss = StringSubstr(comment,StringLen(comment)-digit_string,digit_string); Price_Stop_Loss[pos] = MathAbs((StrToDouble(Str_Stop_Loss)-Open_Price)*dgt); } if(OrderType() < 2 && OrderCloseTime() == TimeCurrent() && (OrderMagicNumber() == Mgc_Src_LP_TS№2 || OrderMagicNumber() == Mgc_Src_SP_TS№2 || OrderMagicNumber() == Mgc_LP01_TS№2 || OrderMagicNumber() == Mgc_LP02_TS№2 || OrderMagicNumber() == Mgc_LP03_TS№2 || OrderMagicNumber() == Mgc_LP04_TS№2 || OrderMagicNumber() == Mgc_LP05_TS№2 || OrderMagicNumber() == Mgc_LP06_TS№2 || OrderMagicNumber() == Mgc_SP01_TS№2 || OrderMagicNumber() == Mgc_SP02_TS№2 || OrderMagicNumber() == Mgc_SP03_TS№2 || OrderMagicNumber() == Mgc_SP04_TS№2 || OrderMagicNumber() == Mgc_SP05_TS№2 || OrderMagicNumber() == Mgc_SP06_TS№2)) { TS№2_TA[pos] = Profit_P + Swap_P + Commission; Acc_Bal_Close[pos] = AccountBalance(); Str_Stop_Loss = StringSubstr(comment,StringLen(comment)-digit_string,digit_string); Price_Stop_Loss[pos] = MathAbs((StrToDouble(Str_Stop_Loss)-Open_Price)*dgt); } if(OrderType() < 2 && OrderCloseTime() == TimeCurrent() && (OrderMagicNumber() == Mgc_Src_LP_TS№3 || OrderMagicNumber() == Mgc_Src_SP_TS№3 || OrderMagicNumber() == Mgc_LP01_TS№3 || OrderMagicNumber() == Mgc_LP02_TS№3 || OrderMagicNumber() == Mgc_LP03_TS№3 || OrderMagicNumber() == Mgc_LP04_TS№3 || OrderMagicNumber() == Mgc_LP05_TS№3 || OrderMagicNumber() == Mgc_LP06_TS№3 || OrderMagicNumber() == Mgc_SP01_TS№3 || OrderMagicNumber() == Mgc_SP02_TS№3 || OrderMagicNumber() == Mgc_SP03_TS№3 || OrderMagicNumber() == Mgc_SP04_TS№3 || OrderMagicNumber() == Mgc_SP05_TS№3 || OrderMagicNumber() == Mgc_SP06_TS№3)) { TS№3_SBH[pos] = Profit_P + Swap_P + Commission; Acc_Bal_Close[pos] = AccountBalance(); Str_Stop_Loss = StringSubstr(comment,StringLen(comment)-digit_string,digit_string); Price_Stop_Loss[pos] = MathAbs((StrToDouble(Str_Stop_Loss)-Open_Price)*dgt); } if(OrderType() == OP_BUY) { Type_Pos = "buy"; } if(OrderType() == OP_SELL) { Type_Pos = "sell"; } if(OrderType() < 2) { FileWrite(handle,TimeToStr(OrderCloseTime(),TIME_DATE|TIME_MINUTES)+","+Symbol()+","+Type_Pos+"," +DoubleToStr(OrderLots(),2)+","+DoubleToStr(Acc_Bal_Close[pos],2)+","+DoubleToStr(Price_Stop_Loss[pos],2)+"," +DoubleToStr(Profit_P+Swap_P+Commission,2)+","+DoubleToStr(TS№1_DS[pos],2)+","+DoubleToStr(TS№2_TA[pos],2)+","+DoubleToStr(TS№3_SBH[pos],2)); } } FileClose(handle); // 2\ } //1 }Прошу помочь в решении вопроса.Попробовал вызывать функцию управления капиталом при инициализации:
Но это не решает проблему...