o
    ̿SiJW                     @   s&  d Z ddlmZmZmZ ddlZdee defddZdefdd	Zdd
ddede	de	de	de	f
ddZ
dd Zdeeeef  defddZdedeeef defddZ	d!dedeeef dededeeeef  defddZ	d!dedeeef dededeeeef  defdd ZdS )"zPrompt templates and builders for GPT-based trading analysis.

This module is intentionally focused only on prompt construction so
that you can grow and tweak prompts independently of the GPT client
logic in `gpt_engine.py`.
    )DictAnyOptionalNvreturnc                 C   s4   | du rdS t | }d|v r|ddd }| S )zHStrip inline `.env` comments like `value  # comment` or `value#comment`.N #   r   )strsplitstrip)r   s r   9/var/www/html/Trade-python/app/v1/services/gpt_prompts.py_strip_inline_comment   s   r   c                  C   s(   t tddpd } | dv r| S dS )NGPT_PROMPT_MODEcompact>   fullr   r   )r   osgetenvlower)moder   r   r   _env_prompt_mode   s   r   i'  	min_value	max_valuenamedefaultr   r   c                C   sZ   t t| }|dkrt|S zt|}W n ty"   t| Y S w tt|t||S Nr   )r   r   r   int	Exceptionmaxmin)r   r   r   r   rawr   r   r   r   _env_int   s   r$   c                 C   s.   z| d u rW d S t | W S  ty   Y d S w N)floatr    )r   r   r   r   _safe_float'   s   
r'   market_intelligencec                 C   s   t | tr| s	dS i }dD ]}|| v r!| |dvr!| |||< q|s&dS zddl}|j|dd}W n ty@   t|}Y nw d| d	S )
zRender a compact broad-market context block for the prompt.

    This is intentionally best-effort and schema-tolerant because the
    background job may evolve over time.
    r   )
as_ofmarket_biasrisk_regimevolatility_regimenotestop_sectorssector_strengthsymbol_sectorsymbol_industrysymbol_sector_trendr   r   NF)ensure_asciiz-
MARKET INTELLIGENCE (broad market context):

)
isinstancedictgetjsondumpsr    r
   )r(   outkr8   renderedr   r   r   _compact_market_intelligence0   s    r=   symbolmarket_datac           (         s  g }| d|   tddddddk}|dpi }|r\|r\|dp%i }| d|d	 d
|d d|d d|d d|d d|d d|d d|d d tddddddk}|dpli }|rt|tr|r| d | D ]\}}	|	sq|	d pi }
t|	dkr|	d nd}t|
d}t|trt|dnd}d}|dur|r|dkr|| | d  }|
d}|
d}|
d}|
d}|
d}|durd!|d"nd#}| d$| d%| d&| d'| d(| d)| |  q|d*p
i }t|tr|r| d+ | D ]\}}|s&qt|tr4|d,p3i ni  d#}t tro roz fd-d.t 	 d/d0 d1D }W n t
yg   d2d.   D }Y nw d3d4| }| d$| d5|d d6|d7 d8|d9 d:|d; d<|d= d<|d> d|d d?|d@ |  qtdAdddddk}|dBpi }|rt|tr|r| dC | D ]$\}}|sېq| d$| dD|dE dF|dG dH|dI  q|dJpi }t|tr|r|dKpi }|dLpi }| dM t|tr| D ]\}}|s0q'|dNp7i } |dOp?i }!|dPpGi }"|dQpOi }#|dRpWi }$|dSp_i }%|dTpgi }&|dUpoi }'| d$| dV| dW dX| dY dZ|!d[ d\|"d] d^|#d_ d`|#da db|$d] dc|$dd de|%df dc|%dd dg|&dT dh|'di  q'|r| dj|dk  dl|S )ma8  Render a compact, token-efficient market snapshot.

    Intentionally avoids raw candle series. Includes:
    - Quote summary
    - Last candle + last-close change per timeframe (if available)
    - Latest indicator snapshot per timeframe
    - Strategy flags
    - Key levels (pivots / fib zone if present)
    zSYMBOL: GPT_COMPACT_INCLUDE_QUOTEr   r	   r   quoteohlczQUOTE: ltp=
last_pricez o=openz h=highz l=lowz prev_c=closez vol=volumez chg=
net_change (net_change_percentagez%)GPT_COMPACT_INCLUDE_TF_LAST_BARcandleszTF_LAST_BAR:   Ng      Y@z chg%=z.2fr   z- z: O=z H=z L=z C=z V=
indicatorszINDICATORS (latest):emac                    s    g | ]}d | d |  qS EMA=r   ).0p
ema_valuesr   r   
<listcomp>        z+_compact_market_context.<locals>.<listcomp>c                 S   s   t | S r%   r   xr   r   r   <lambda>   s    z)_compact_market_context.<locals>.<lambda>keyc                 S       g | ]\}}d | d| qS rS   r   )rV   r;   r   r   r   r   rZ      r[   z | , z: close=z vwap=vwapz rsi=rsiz macd=macd/macd_signal	macd_histz dvol=volume_deltaGPT_COMPACT_INCLUDE_PIVOTSpivotszPIVOTS:z: P=Pz R1=R1z S1=S1
strategiesper_timeframemulti_timeframezSTRATEGY_FLAGS:trend
volatilityrange_breakouthod_lodmomentum_burstvolume_climaxpatternfib_zonez: trend=	direction(strengthz) vol_regime=regimez rb=statusz
 near_hod=near_hod
 near_lod=near_lodz mom=z vr=volume_ratioz climax=climaxz	 pattern=z
 fib_zone=zonezMTF: trend_alignment=trend_alignmentr4   )appendr$   r7   r5   r6   itemslenr'   sortedkeysr    join)(r>   r?   linesinclude_quoterA   rB   include_last_barrM   tfserieslastprev
last_close
prev_closechg_pctohlcr   chgrQ   summary	ema_block	ema_itemsinclude_pivotsrl   levelsrp   per_tfmtfeatsrs   volrbhodmbvcpatrz   r   rX   r   _compact_market_contextZ   s  





4
 &,
,
 
r   questioncontextc                 C   sR   |pd  }|p	d   pd}d| d|  d| dt| | dt| d}|S )	N!Provide intraday trading analysisNEUTRALz  SYSTEM ROLE:
You are an expert institutional intraday trader and risk manager.
You do NOT follow fixed strategies.
You infer the best intraday decision purely from the data provided.

Priority:
1) Capital protection
2) Trade only when edge is clear
3) Precision over frequency

If no clear edge exists, you MUST choose HOLD.

EXECUTION CONTEXT (informational only, NOT a rule):
P

You MUST ignore this context if price action or data contradicts it.

SYMBOL: 
USER QUESTION: z

MARKET SNAPSHOT:
r4   aJ  

ANALYZE (full depth):
1) Determine intraday regime (trending/ranging/transitioning/volatile-uncertain)
2) Assess direction bias (bullish/bearish/neutral)
3) Decide if there is REAL intraday edge; if weak/unclear => HOLD
4) If edge exists: define entry zone, stop-loss ZONE, and TWO intraday targets
5) Identify early_breakout only if range/key level break + strong momentum/volume

DATA DISCIPLINE:
- Use ONLY data provided. NEVER invent missing candles/levels/indicators.
- If raw candles are absent, rely ONLY on computed indicators/flags.

SCORING (0-100):
0-40 HOLD/no-trade; 41-59 weak; 60-74 acceptable; 75-84 strong; 85-100 exceptional.

CONVICTION MAPPING (mandatory):
- VERY_STRONG => score >= 85
- HIGH        => score 75-84
- MEDIUM      => score 60-74
- LOW         => score < 60

HOLD can NEVER be VERY_STRONG or HIGH.

STOP-LOSS AS A ZONE (mandatory):
BUY: stop_loss_zone.upper near invalidation, stop_loss_zone.lower hard invalidation
SELL: stop_loss_zone.lower near invalidation, stop_loss_zone.upper hard invalidation

OUTPUT FORMAT (STRICT JSON ONLY):
Return ONE valid JSON object with EXACTLY these keys:
{
    "decision": "BUY"|"SELL"|"HOLD",
    "conviction": "VERY_STRONG"|"HIGH"|"MEDIUM"|"LOW",
    "trend_label": "",
    "entry_price": null,
    "entry_zone": null,
    "stop_loss": null,
    "stop_loss_zone": null,
    "targets": [],
    "score": 0,
    "risk_profile": "aggressive"|"conservative",
    "early_breakout": false,
    "early_breakout_comment": "",
    "rationale": ["..."],
    "technical_indicators": {
        "trend": "bullish"|"bearish"|"sideways",
        "momentum": "strong"|"weak"|"neutral",
        "volume": "high"|"normal"|"low",
        "support": 0.0,
        "resistance": 0.0,
        "accumulation_distribution": "accumulation"|"distribution"|"neutral",
        "pattern_summary": ""
    },
    "risk_reward_ratio": 0.0,
    "time_horizon": "intraday",
    "notes": ""
}

NON-NEGOTIABLE:
- Output ONLY valid JSON. No code blocks.
- If decision=HOLD: entry_price=null, entry_zone=null, stop_loss=null, stop_loss_zone=null, targets=[], score<40, conviction=LOW.
    )r   upperr   r=   )r>   r?   r   r   r(   user_questionexecution_contextpromptr   r   r   #_prepare_market_data_prompt_compact   s   Tr   c           0      C   s  t  dkrt| ||||S |pd }|pd  pd}d| d|  d| dt| d	}|d	i }|r|d
|dd d|di dd d|di dd d|di dd d|di dd d|dd d|dd d|dd d7 }tdddd d!}	|d"i }
|
 D ]b\}}|rt|dkr|	dkr||	 d# }|d$|  d%t| d&7 }t	|D ]7\}}|d}|d}|d}|d}|dd}|d'|d(  d)| d*| d*| d*| d*| d+7 }qq|d,i }|rn|d-7 }| D ]d\}}d.}|d/i pi }|r/d0d1 t
| d2d3 d4D }d*|}|d$|  d5|d d6|d7 d8|d9 d:|d; d<|d= d>|d? d|d d@|dA dB| d+7 }q	|dCi }|r|dD7 }| D ]>\}}|sq|d$|  dE|dF dG|dH d*|dI d*|dJ dK|dL d*|dM d*|dN d+7 }q|dOpi }t|tr|r|dP7 }|dQpi }|dRpi }t|tr| D ]\}} | sq|d$t|  dS|  d+7 }q|r|dT| d+7 }|dUi }!|!r`|dV7 }|! D ]<\}}"|"s,q#|"dW}#|"dX}$|"dYi p>i }%|"dZi pGi }&|d$|  d[|# d\|$ d]|% d^|& d+7 }q#|dOi }|rp|dQi pqi }|dRi pzi }|d_7 }| D ]\}} | d`i pi }'| dai pi }(| dbi pi })| dci pi }*| ddi pi }+| dei pi },| dfi pi }-| dgi pi }.| dhi pi }/|d.g d$|  di|'dj dk|'dl dm|(dn do|)dp dq|)dr ds|)dt du|*dp dv|+dw dx|+dy dz|,dp d{|,d| d}|-d~ d{|-d| d|.dg d|/d d+7 }q|rp|d|d d+7 }|d7 }|S )a  Build a rich, strictly-structured prompt for intraday analysis.

    We push *all* heavy lifting to GPT here: trend reading, early
    breakouts, pseudo-indicators, scoring and the final
    BUY/SELL/HOLD decision. Downstream code just consumes the JSON.

    The "context" parameter selects the ACTIVE STRATEGY for this
    request. For now we primarily support intraday SHORT_SELL and
    LONG_BUY daily trades, but the structure is future-proof for
    additional strategies.
    r   r   r   r   r   r   z

a0  

IMPORTANT:
- If raw candle data is present below, you MUST use it.
- If raw candle data is NOT present, rely ONLY on computed indicators/flags.
- NEVER invent missing data.

ANALYZE (full depth):
1) Determine intraday regime (trending/ranging/transitioning/volatile-uncertain)
2) Assess direction bias (bullish/bearish/neutral)
3) Decide if there is REAL intraday edge; if weak/unclear => HOLD
4) If edge exists: define entry zone, stop-loss ZONE, and TWO intraday targets
5) Identify early_breakout only if range/key level break + strong momentum/volume

STOP-LOSS AS A ZONE (mandatory):
BUY: stop_loss_zone.upper near invalidation, stop_loss_zone.lower hard invalidation
SELL: stop_loss_zone.lower near invalidation, stop_loss_zone.upper hard invalidation

RAW MARKET SNAPSHOT (may include quote + raw candles):
rA   u;   
CURRENT QUOTE (may be delayed slightly):
- Last Price: ₹rC   zN/Au   
- Open: ₹rB   rD   u   
- High: ₹rE   u   
- Low: ₹rF   u   
- Close (prev): ₹rG   z
- Volume: rH   z
- Change: rI   rJ   rK   z%)
GPT_CANDLES_PER_TF   r   2   r   rM   Nz
TIMEFRAME: z  (Last z. candles)
Format per line: index: O,H,L,C,Vol
z  r	   z: rc   r4   rQ   z4
---
INDICATOR SNAPSHOT (per timeframe, latest bar)
r   rR   c                 S   rb   rS   r   )rV   rW   r   r   r   r   rZ     r[   z.prepare_market_data_prompt.<locals>.<listcomp>c                 S   s   t | d S )Nr   r\   r]   r   r   r   r_     s    z,prepare_market_data_prompt.<locals>.<lambda>r`   z INDICATORS
- Close: z	
- VWAP: rd   z
- RSI: re   z	
- MACD: rf   z / Signal: rh   z	 / Hist: ri   u    (Δ rj   z
)
- EMAs: rl   z?
---
PIVOT LEVELS (supports/resistances from higher timeframe)
z PIVOTS
- P: rm   z
- R1/R2/R3: rn   R2R3z
- S1/S2/S3: ro   S2S3rp   z+
---
ALGORITHMIC FLAGS / STRATEGY FEATURES
rq   rr   z FLAGS
z
MULTI_TIMEFRAME:
fibzF
---
FIBONACCI LEVELS (retracements and extensions from recent swing)

swing_high	swing_lowretracements
extensionsz FIBONACCI
- Swing High: z
- Swing Low: z
- Retracements: z
- Extensions: zp
---
STRATEGY FEATURES (pre-computed, per timeframe)
These are numeric/enum flags only; do NOT invent new ones.
rs   rt   ru   opening_rangerv   rw   rx   ry   rz   z STRATEGY FLAGS
- Trend: dir=r{   z
 strength=r}   z
- Volatility regime: r~   z
- Range breakout: status=r   z high=
range_highz low=	range_lowz
- Opening range: status=z
- HOD/LOD proximity: near_hod=r   r   r   z
- Momentum burst: status=z volume_ratio=r   z
- Volume climax: climax=r   z
- Candle pattern: z
- Fib zone (daily): r   z,
MULTI-TIMEFRAME SUMMARY
- Trend alignment: r   a  
---
HOW TO THINK ABOUT THIS DATA (GUIDELINES):
- Use the candle sequences to approximate:
    * Trend direction (up / down / sideways) and strength.
    * Momentum (accelerating, slowing, reversing).
    * Support and resistance zones.
    * Volume expansion / exhaustion.
    * Early breakout or fake breakout attempts.
- Use shorter timeframes for fine entry/exit; longer ones for context
    if available.

SCORING & RANKING (VERY IMPORTANT):
- Create a numeric "score" from 0 to 100 where:
    * 0-30  = very weak / avoid trade.
    * 31-60 = medium quality / only trade with tight risk.
    * 61-80 = good quality setup.
    * 81-100 = exceptional / high-conviction setup.
- Score MUST be consistent with your BUY/SELL/HOLD decision.
    Example: HOLD should almost never have score > 40.

STOP LOSS AS A ZONE (CRITICAL):
- Always think of stop loss as a **zone**, not a single tick.
- You MUST output:
    * A single representative numeric `stop_loss` level, AND
    * A `stop_loss_zone` object with `upper` and `lower` bounds.
- For a BUY decision:
    * `stop_loss_zone.upper` should be closer to current/entry price.
    * `stop_loss_zone.lower` should be slightly further away (hard
      invalidation level).
- For a SELL decision (short):
    * `stop_loss_zone.lower` should be closer to current/entry price.
    * `stop_loss_zone.upper` should be slightly further away.
- "Wick only" breaches into the zone **do NOT** automatically
  invalidate the idea; design the zone so that only decisive closes
  beyond the far side of the zone would be true invalidation.

EARLY BREAKOUT & ACCUMULATION/DISTRIBUTION (APPROXIMATE):
- "early_breakout" should be TRUE only if:
    * Price is breaking a recent tight range or key level with
        expanding volume AND strong candles in one direction.
- "accumulation_distribution" summary should describe whether price
    action and volume look like accumulation, distribution or neither.

OUTPUT FORMAT (STRICT JSON ONLY):
Return ONE valid JSON object with EXACTLY these keys:
{
    "decision": "BUY"|"SELL"|"HOLD",
    "conviction": "VERY_STRONG"|"HIGH"|"MEDIUM"|"LOW",
    "trend_label": "",
    "entry_price": null,
    "entry_zone": null,
    "stop_loss": null,
    "stop_loss_zone": null,
    "targets": [],
    "score": 0,
    "risk_profile": "aggressive"|"conservative",
    "early_breakout": false,
    "early_breakout_comment": "",
    "rationale": ["..."],
    "technical_indicators": {
        "trend": "bullish"|"bearish"|"sideways",
        "momentum": "strong"|"weak"|"neutral",
        "volume": "high"|"normal"|"low",
        "support": 0.0,
        "resistance": 0.0,
        "accumulation_distribution": "accumulation"|"distribution"|"neutral",
        "pattern_summary": ""
    },
    "risk_reward_ratio": 0.0,
    "time_horizon": "intraday",
    "notes": ""
}

NON-NEGOTIABLE:
- Output ONLY valid JSON. No code blocks.
- If decision=HOLD: entry_price=null, entry_zone=null, stop_loss=null, stop_loss_zone=null, targets=[], score<40, conviction=LOW.
    )r   r   r   r   r=   r7   r$   r   r   	enumerater   r   r5   r6   r
   )0r>   r?   r   r   r(   r   r   r   rA   candles_per_tfrM   	timeframecandle_datarecent_candlesicandler   r   r   r   r   rQ   r   r   rY   r   rl   r   r   rp   r   r   r   fib_datar   r   r   retrextrs   r   r   orbr   r   r   r   rz   r   r   r   prepare_market_data_prompt,  s|  
*









4
"

		

Or   r%   )__doc__typingr   r   r   r   r
   r   r   r   r$   r'   r=   r   r   r   r   r   r   r   <module>   sJ   
&	*v

f
