@@ -241,7 +241,7 @@ pub struct PerpMarket {
241241 pub padding : [ u8 ; 24 ] ,
242242}
243243
244- pub fn _get_high_leverage_mode_margin_ratio (
244+ pub fn _calc_high_leverage_mode_initial_margin_ratio_from_size (
245245 pre_size_adj_margin_ratio : u32 ,
246246 size_adj_margin_ratio : u32 ,
247247 default_margin_ratio : u32 ,
@@ -494,38 +494,43 @@ impl PerpMarket {
494494 MarginRequirementType :: Maintenance => margin_ratio_maintenance,
495495 } ;
496496
497- let pre_size_adj_margin_ratio = if is_high_leverage_user {
498- match margin_type {
497+ let margin_ratio = if is_high_leverage_user {
498+ // use HLM maintenance margin but ordinary mode initial/fill margin for size adj calculation
499+ let pre_size_adj_margin_ratio = match margin_type {
499500 MarginRequirementType :: Initial => self . margin_ratio_initial ,
500501 MarginRequirementType :: Fill => {
501502 self . margin_ratio_initial
502503 . safe_add ( self . margin_ratio_maintenance ) ?
503504 / 2
504505 }
505- MarginRequirementType :: Maintenance => margin_ratio_maintenance, // use hlm maintenance to avoid changing liq prices
506- }
507- } else {
508- default_margin_ratio
509- } ;
506+ MarginRequirementType :: Maintenance => margin_ratio_maintenance,
507+ } ;
510508
511- let cap_size_premium =
512- !is_high_leverage_user || margin_type == MarginRequirementType :: Maintenance ;
513- let size_adj_margin_ratio = calculate_size_premium_liability_weight (
514- size,
515- self . imf_factor ,
516- pre_size_adj_margin_ratio,
517- MARGIN_PRECISION_U128 ,
518- cap_size_premium,
519- ) ?;
509+ let cap_size_premium = margin_type == MarginRequirementType :: Maintenance ;
520510
521- let margin_ratio = if cap_size_premium {
522- default_margin_ratio. max ( size_adj_margin_ratio)
523- } else {
524- _get_high_leverage_mode_margin_ratio (
511+ let size_adj_margin_ratio = calculate_size_premium_liability_weight (
512+ size,
513+ self . imf_factor ,
514+ pre_size_adj_margin_ratio,
515+ MARGIN_PRECISION_U128 ,
516+ cap_size_premium,
517+ ) ?;
518+
519+ _calc_high_leverage_mode_initial_margin_ratio_from_size (
525520 pre_size_adj_margin_ratio,
526521 size_adj_margin_ratio,
527522 default_margin_ratio,
528- ) ?
523+ )
524+ } else {
525+ let size_adj_margin_ratio = calculate_size_premium_liability_weight (
526+ size,
527+ self . imf_factor ,
528+ default_margin_ratio,
529+ MARGIN_PRECISION_U128 ,
530+ true ,
531+ ) ?;
532+
533+ Ok ( default_margin_ratio. max ( size_adj_margin_ratio) )
529534 } ;
530535
531536 Ok ( margin_ratio)
0 commit comments