o
    8&j                     @  s   d Z ddlmZ ddlZddlZddlZejej	e
ZejedZejedZejedZejedZejedZd	Zh d
ZdddZdddZdddZedkr_ee dS )u  유동 목표 적용기 (Mac 디스패처용).

분석 예약작업이 시장 상황에 맞춰 산출한 종목별 목표(T1/T2/손절 등)를
outputs/proposed_targets.json 에 남기면, 이 스크립트가 live_account_state.json/.js 의
orders[] 에 '목표 레벨만' 병합한다. (수량·평단·평가액은 건드리지 않음 — 그건 매매/시세 갱신 담당)

proposed_targets.json 형식(예):
{
  "generated_at": "...", "basis": "직전고점·VWAP·ATR·지지/저항",
  "targets": {
    "NASA": {"t1":35.0,"t2":37.5,"invalid":31.0,"hold_until":37.5,"prior_high":42.87,
             "action":"HOLD_TO_REBOUND_TRIM","action_ko":"T1 25-35% 축소","target_basis":"...","note":"..."},
    ...
  }
}

규칙: 목표는 분석(전략)의 산출물이므로 정식 파일(proposed_targets.json)을 통해서만 반영.
임의 수정 금지. 적용 후 입력 파일은 targets_applied/ 로 이동.
    )annotationsNzlive_account_state.jsonzlive_account_state.jszproposed_targets.jsontargets_appliedztargets_apply_log.jsonlzwindow.LIVE_ACCOUNT_STATE = >	   t1t2noteactioninvalid	action_ko
hold_until
prior_hightarget_basisrecdictreturnNonec                 C  s~   t jt jj | d< z(ttddd}|t	j
| ddd  W d    W d S 1 s-w   Y  W d S  ty>   Y d S w )Ntsautf-8encodingF)ensure_ascii
)dtdatetimenowtimezoneutc	isoformatopenLOG_PATHwritejsondumps	Exception)r   f r%   apply_targets.pylog(   s   &r'   pathstrtextc                 C  sP   | d }t |ddd}|| W d    n1 sw   Y  t||  d S )Nz.tmpwr   r   )r   r    osreplace)r(   r*   tmpr$   r%   r%   r&   atomic_write1   s
   r/   intc               
     s(  t jtrt jtsdS ztttdd} W n  ty9 } zt	dt
|d d d W Y d }~dS d }~ww | dp@i }|sEdS tttdd}g }|dg D ]Q | d	}|scqV fd
ddD }| D ]\}}|tv r|dvr| |< qp| dptjtjj   d< | fdddD kr| d	 qV| dd|d< | dptjtjj  |d< tj|ddd}	tt|	 ttt|	 d  t jtdd tj d}
t tt jt|
 d t	d|t|  d t!dt"| d |pd! d" dS )#Nr   r   r   bad_proposed   )eventerrtargetsorderstickerc                      i | ]}|  |qS r%   get.0kor%   r&   
<dictcomp>J       zmain.<locals>.<dictcomp>)r   r   r   )N generated_attarget_updated_atc                   r8   r%   r9   r;   r>   r%   r&   r@   O   rA   basisrB   targets_basistargets_updated_atF   )r   indentz;
T)exist_okz%Y%m%d_%H%M%Sz_proposed_targets.jsonapplied)r3   changedtickersu   목표 반영: u   종목 (변경 u   없음))#r,   r(   existsPROPOSED	JSON_PATHr!   loadr   r#   r'   r)   r:   itemsALLOWEDr   r   r   r   r   
astimezoner   appendr"   r/   JS_PATH	JS_PREFIXmakedirsAPPLIED_DIRstrftimer-   joinlistkeysprintlen)proper5   staterL   tbeforer=   vr*   stampr%   r>   r&   main8   sL   &&
 rh   __main__)r   r   r   r   )r(   r)   r*   r)   r   r   )r   r0   )__doc__
__future__r   r   r   r!   r,   r(   dirnameabspath__file__BASEr\   rQ   rW   rP   rZ   r   rX   rT   r'   r/   rh   __name__
SystemExitr%   r%   r%   r&   <module>   s&   

	
)
