PORTFOLIO MARGIN_FKCB;
DESCRIPTION Расчет нормативов ФКЦБ;
CLIENTS_LIST ALL_CLIENTS;
FIRMS_LIST NC0038900000;


PROGRAM

' Данный портфель рассчитывает (или формирует) для каждого клиента следующие параметры -
'
' 1. "Задолженность брокеру" - сумма задолженности по деньгам и бумагам клиента брокеру в деньгах
' 2. "Только деньги клиента" - сумма текущих положительных денежных остатков на
'                              корпоративном рынке и рынке ГКО ММВБ
' 3. "Средства в бумагах"    - сумма в деньгах всех текущих положительных остатков
'                              по бумагам клиента
' 4. "Средства в рублях"     - доступные собственные денежные средства клиента на
'                              корпоративном рынке и рынке ГКО ММВБ
' 5. "Все средства"          - сумма параметров "Средства в рублях" и "Средства в бумагах"
'
' 6. "Уровень маржи"         - уровень маржи в прочентах по ФКЦБ
' 7. "Состояние"             - символьная строка, идентифицирующая, для наглядности
'                              состояние клиента по марже
'
' Описания самих параметров находятся в конце файла, после кода программы (после_END_PROGRAM)


' Функция dealer() - в качестве параметра принимается числовое значение,
' если его значение больше нуля, то функция возвращает ноль, если менее
' нуля - возвращается входящее значение со знаком плюс. Эта функция
' служит для определения задолженности клиента брокеру, если таковая существует.
'
FUNC dealer(x)
 If x > 0
	RESULT = 0
 Else
	RESULT = ABS(x)
 End If
END FUNC


' Функция ignore_negative() - в качестве параметра принимается числовое значение,
' если его значение больше нуля, то функция возвращает его же, если менее или
' равно нулю - возвращается ноль. Функция нужна для исключения отрицательных значений.
'
FUNC ignore_negative(x)
 If x > 0
	RESULT = x
 Else
	RESULT = 0
 End If
END FUNC


DepoPos = 0

' Описание основных параметров, необходимых для расчета портфеля, их
' значения передаются в качестве параметров используемым примитивам

ClassCode    = "EQBR,EQBS,EQNL"
FirmList     = "NC0038900000"
DefCurCode   = "SUR"
DefDepoAcc   = "L01-00000F00"
FkcbSecsList = GET_CLASS_SECURITIES("EQBR") & "," & GET_CLASS_SECURITIES("EQNL") & "," & GET_CLASS_SECURITIES("EQNE")

' Определение параметра "Текущий остаток" из таблицы лимитов по деньгам
' для клиента на корпоративном рынке ММВБ.

EQTV_MoneyCurBalance = MONEY_CURRENT_BALANCE(ROWNAME, FirmList, "EQTV", DefCurCode)

' Расчет доступных собственных денежных средств клиента на корпоративном рынке ММВБ.
' Рассчитывается по формуле "Текущий остаток" + "Текущий лимит" - "Входящий лимит"
' таблицы лимитов по деньгам для тэга расчетов EQTV.

EQTV_MoneyPos = EQTV_MoneyCurBalance + MONEY_CURRENT_LIMIT(ROWNAME, FirmList, "EQTV", DefCurCode) - MONEY_OPEN_LIMIT(ROWNAME, FirmList, "EQTV", DefCurCode)


' Определение параметра "Текущий остаток" из таблицы лимитов по деньгам
' для клиента на рынке ГКО ММВБ.

BILL_MoneyCurBalance = MONEY_CURRENT_BALANCE(ROWNAME, FirmList, "BILL", DefCurCode)


' Расчет доступных собственных денежных средств клиента на рынке ГКО ММВБ.
' Рассчитывается по формуле "Текущий остаток" + "Текущий лимит" - "Входящий лимит"
' таблицы лимитов по деньгам для тэга расчетов BILL.

BILL_MoneyPos = BILL_MoneyCurBalance + MONEY_CURRENT_LIMIT(ROWNAME, FirmList, "BILL", DefCurCode) - MONEY_OPEN_LIMIT(ROWNAME, FirmList, "BILL", DefCurCode)


' Вычисление параметра портфеля "Средства в рублях" - доступные собственные
' денежные средства клиента на обоих рынках

AllClientMoney = EQTV_MoneyPos + BILL_MoneyPos


' Вычисление параметра портфеля "Только деньги клиента" - рассчитывается как сумма
' текущих положительных денежных остатков на корпоративном рынке и рынке ГКО ММВБ

MoneyCurBalance = EQTV_MoneyCurBalance + BILL_MoneyCurBalance
OnlyClientMoney = ignore_negative(MoneyCurBalance)


' Если параметр "Только деньги клиента" меньше нуля, значит клиент имеет
' задолженность и DealerMoney устанавливается в положительный размер этой
' задолженности, возвращаемый функцией dealer()

DealerMoney = dealer(AllClientMoney)


' Данный цикл перебирает все бумаги их списка бумаг FkcbSecsList,
' определенного в заголовке портфеля, и по каждой бумаге обрабатывается
' лимит по этой бумаге на текущего рассчитываемого клиента

FOR Sec IN FkcbSecsList

   ' Переменной DCPos присваивается значение текущего остатка из таблицы лимитов 
   ' по бумагам по бумаге Sec и счету депо L01-00000F00 для рассчитываемого клиента

   DCPos =  DEPO_CURRENT_BALANCE(ROWNAME, FirmList, Sec, DefDepoAcc)


   ' Переменной DCLim присваивается значение текущего лимита из таблицы лимитов 
   ' по бумагам по бумаге Sec и счету депо L01-00000F00 для рассчитываемого клиента

   DCLim =  DEPO_CURRENT_LIMIT(ROWNAME, FirmList, Sec, DefDepoAcc)


   ' Переменной DOLim присваивается значение входящего лимита из таблицы лимитов 
   ' по бумагам по бумаге Sec и счету депо L01-00000F00 для рассчитываемого клиента

   DOLim =  DEPO_OPEN_LIMIT(ROWNAME, FirmList, Sec, DefDepoAcc)


   ' Расчет доступных собственных средств по бумаге Sec для клиента.
   ' Переменной SecPos присваивается значение, которое рассчитывается
   ' по формуле "Текущий остаток" + "Текущий лимит" - "Входящий лимит"
   ' таблицы лимитов по бумагам.

   SecPos = DCPos + DCLim - DOLim


   ' Расчет оценки в деньгах (собственные средства) по бумаге Sec для клиента.
   ' Переменной SecPos присваивается значение, которое рассчитывается
   ' по формуле "Количество собственных бумаг" * "Цена последней сделки" * "Размер лота"
   ' Параметры "Цена последней сделки" и "Размер лота" получаются с помощью примитива GET_PARAM()

   SecPos = SecPos * GET_PARAM(ClassCode, Sec, "LAST") * GET_PARAM(ClassCode, Sec, "LOTSIZE")


   ' Вычисление параметра портфеля "Средства в бумагах" В переменной DepoPos
   ' накапливается значение, которое рассчитывается как сумма
   ' в деньгах всех текущих положительных остатков клиента по бумагам

   DepoPos = DepoPos + ignore_negative(SecPos)


   ' Вычисление параметра портфеля "Задолженность брокеру" - рассчитывается как сумма
   ' в деньгах всех задолженностей (шортов) клиента по бумагам

   DealerMoney = DealerMoney + dealer(SecPos)

' Конец цикла обработки бумаг из списка заданных
END FOR


' Вычисление параметра портфеля "Все средства" - рассчитывается как
' сумма параметров "Средства в рублях" и "Средства в бумагах"

OwnMoney = AllClientMoney + DepoPos


'
'

AllClientMoney = ignore_negative(AllClientMoney)


' Определение собственно уровня маржи по формуле ФКЦБ. Здесь если сумма параметров
' "Только деньги клиента" и "Средства в бумагах" больше 0, то рассчитывается уровень
' маржи, в противном случае проверяется наличие задолженности у клиента перед брокером
' (DealerMoney==0). Если задолженности нет, то уровень маржи равен 100%

If OnlyClientMoney + DepoPos > 0
  Margin = ((OnlyClientMoney + DepoPos - DealerMoney) / (OnlyClientMoney + DepoPos)) * 100
Else
   If DealerMoney == 0
     Margin = 100
   Else
      Margin = 0
   End If
End If


' Установка параметра "Статус" и цвета подсветки клиента по умолчанию
Status = "Ok"
SET_ROW_COLOR(ROWNAME, "DEFAULT_COLOR", "DEFAULT_COLOR")


' Если уровень маржи клиента менее 30% строка, идентифицирующая в
' портфеле этого клиента, подсвечивается красным цветом

If Margin < 30
	SET_ROW_COLOR(ROWNAME, "RGB(255,138,138)", "DEFAULT_COLOR")
	Status = "Требуется принудительное закрытие"
End If


' Если уровень маржи клиента больше либо равен 30%, но менее 40%, строка,
' идентифицирующая в портфеле этого клиента, подсвечивается зеленым цветом

If Margin >= 30 And Margin < 40 
	SET_ROW_COLOR(ROWNAME, "RGB(255,255,174)", "DEFAULT_COLOR")
	Status = "Необходимо довнесение средств"
End If


' Если уровень маржи клиента больше либо равен 40%, но менее 60%, строка,
' идентифицирующая в портфеле этого клиента, подсвечивается бирюзовым цветом

If Margin >= 40 And Margin < 60
	SET_ROW_COLOR(ROWNAME, "RGB(193,255,193)", "DEFAULT_COLOR")
	Status = "Необх. запрет ухудшающих операций"
End If


' Конец кода расчета параметров портфеля для клиента
'
END_PROGRAM



PARAMETER DealerMoney;
PARAMETER_TITLE Задолженность брокеру;
PARAMETER_DESCRIPTION Сумма задолженности по деньгам и бумагам клиента брокеру в деньгах;
PARAMETER_TYPE NUMERIC(10,2);
END

PARAMETER OnlyClientMoney;
PARAMETER_TITLE Только деньги клиента;
PARAMETER_DESCRIPTION Сумма текущих положительных денежных остатков на корпоративном рынке и рынке ГКО ММВБ;
PARAMETER_TYPE NUMERIC(10,2);
END

PARAMETER DepoPos;
PARAMETER_TITLE Оценка;
PARAMETER_DESCRIPTION Сумма в деньгах всех текущих положительных остатков по бумагам клиента;
PARAMETER_TYPE NUMERIC(10,2);
END

PARAMETER AllClientMoney;
PARAMETER_TITLE Средства в рублях;
PARAMETER_DESCRIPTION Доступные собственные денежные средства клиента на корпоративном рынке и рынке ГКО ММВБ;
PARAMETER_TYPE NUMERIC(10,2);
END

PARAMETER OwnMoney;
PARAMETER_TITLE Все средства;
PARAMETER_DESCRIPTION Сумма параметров "Средства в рублях" и "Средства в бумагах";
PARAMETER_TYPE NUMERIC(10,2);
END

PARAMETER Margin;
PARAMETER_TITLE Уровень маржи;
PARAMETER_DESCRIPTION Уровень маржи в прочентах по ФКЦБ;
PARAMETER_TYPE NUMERIC(10,2);
END

PARAMETER Status;
PARAMETER_TITLE Состояние;
PARAMETER_DESCRIPTION Состояние клиента по марже;
PARAMETER_TYPE STRING(40);
END


END_PORTFOLIO
