
    iE                        d Z ddlZddlmZmZ ddlmZmZ ddlm	Z	 ddl
mZ ddlmZ erddlmZ  ej                   e      Z G d	 d
e      Z G d de      Z G d de      Z G d de      Z G d de      Z edd       edd       ed       edd       e        edd       edd       edd       ed d!       ed!d"       ed#d$      d%Zd&ed'efd(Zy))a  
Common order templates for simplified trading strategies.

Author: SDK v3.0.0
Date: 2025-08-04

Overview:
    Provides pre-configured order templates for common trading scenarios,
    making it easy to implement standard trading patterns without complex
    order configuration logic.

Key Features:
    - Pre-configured risk/reward ratios
    - ATR-based dynamic stop losses
    - Breakout order templates
    - Scalping configurations
    - Position sizing helpers
    - Risk management integration

Example Usage:
    ```python
    # Use a template for 2:1 risk/reward
    template = RiskRewardTemplate(risk_reward_ratio=2.0)
    order = await template.create_order(
        suite,
        side=OrderSide.BUY,
        risk_amount=100,  # Risk $100
    )

    # ATR-based stops
    atr_template = ATRStopTemplate(atr_multiplier=2.0)
    order = await atr_template.create_order(suite, side=OrderSide.BUY, size=1)
    ```
    N)ABCabstractmethod)TYPE_CHECKINGAny)ATR)BracketOrderResponse)OrderChainBuilder)TradingSuitec                   @    e Zd ZdZe	 d
dddededz  dedef
d	       Zy)OrderTemplatezBase class for order templates.Nsuiter
   sidesizekwargsreturnc                    K   yw)z$Create an order using this template.N )selfr   r   r   r   s        U/home/work/apex_v16/venv/lib/python3.12/site-packages/project_x_py/order_templates.pycreate_orderzOrderTemplate.create_order5   s     s   )N)	__name__
__module____qualname____doc__r   intr   r   r   r       r   r   r   2   sP    )
  	33 3 Dj	3
 3 
3 3r   r   c                   v    e Zd ZdZ	 	 	 ddededz  defdZ	 	 	 	 dddd	ed
edz  dedz  dedz  dedede	fdZ
y)RiskRewardTemplatez
    Template for orders with fixed risk/reward ratios.

    Creates bracket orders with stop loss and take profit levels
    based on a specified risk/reward ratio.
    Nrisk_reward_ratiostop_distanceuse_limit_entryc                 .    || _         || _        || _        y)a  
        Initialize risk/reward template.

        Args:
            risk_reward_ratio: Ratio of potential profit to risk (e.g., 2.0 = 2:1)
            stop_distance: Fixed stop distance in points (optional)
            use_limit_entry: Use limit orders for entry (vs market)
        N)r   r    r!   )r   r   r    r!   s       r   __init__zRiskRewardTemplate.__init__H   s     "3*.r   r   r
   r   r   risk_amountrisk_percententry_offsetr   r   c                   K   |j                   j                          d{   }|st        d      | j                  r|dk(  r||z
  }	n||z   }	n|}	| j                  r| j                  }
n	|r|dz  nd}
||r.|j
                  }|r|j                  nd}t        ||
|z  z        }nv|ri|j                  j                  }|st        d      t        |j                        |z  }|j
                  }|r|j                  nd}t        ||
|z  z        }nt        d      t        |      }|t        d	      | j                  r|j                  ||	|
       n|j                  ||       |
| j                  z  }|j!                  |
       |j#                  |       |j%                          d{   }|j&                  rBt(        j+                  d| j                   d|	dd|j,                  dd|j.                  d       |S 7 7 Ww)a  
        Create an order with fixed risk/reward ratio.

        Args:
            suite: TradingSuite instance
            side: Order side (0=BUY, 1=SELL)
            size: Order size (calculated from risk if not provided)
            risk_amount: Dollar amount to risk
            risk_percent: Percentage of account to risk
            entry_offset: Offset from current price for limit entry

        Returns:
            BracketOrderResponse with order details
        NCannot get current pricer   g{Gz?g        g      ?z No account information availablez/Must provide size, risk_amount, or risk_percentSize is requiredr   pricer   r   r   offsetzCreated z:1 R/R order - Entry: $.2fz	, Stop: $z, Target: $)dataget_current_price
ValueErrorr!   r    
instrument	tickValuer   clientaccount_infofloatbalancer	   limit_ordermarket_orderr   with_stop_losswith_take_profitexecutesuccessloggerinfostop_loss_pricetake_profit_price)r   r   r   r   r$   r%   r&   r   current_priceentry_price	stop_distr3   
tick_valueaccountbuildertarget_distresults                    r   r   zRiskRewardTemplate.create_orderZ   s"    2 $jj::<<788 qy+l:+l:'K **I 1>,3I < #--
5?Z11S
;)j*@AB,,33$%GHH#GOO4|C"--
5?Z11S
;)j*@AB !RSS $E*</00T4H  d 6  $"8"88i0   4 ((>>KK4112 3&s+9V5K5KC4P Q"44S9; I =v )s#   HHFH-H.AHH)       @NT)NNNr   r   r   r   r   r7   boolr#   r   r   r   r   r   r   r   r   r   @   s     $'&* $	/ / t|/ 	/,  $(%)]] ] Dj	]
 T\] dl] ] ] 
]r   r   c                   d    e Zd ZdZ	 	 	 	 ddedededefdZ	 	 	 ddd	d
ededz  dedede	de
fdZy)ATRStopTemplatez
    Template for orders with ATR-based stop losses.

    Uses Average True Range to dynamically set stop distances
    based on current market volatility.
    atr_multiplier
atr_periodtarget_multiplier	timeframec                 <    || _         || _        || _        || _        y)a3  
        Initialize ATR-based template.

        Args:
            atr_multiplier: Multiplier for ATR to set stop distance
            atr_period: Period for ATR calculation
            target_multiplier: Multiplier for target (relative to stop)
            timeframe: Timeframe for ATR calculation
        N)rP   rQ   rR   rS   )r   rP   rQ   rR   rS   s        r   r#   zATRStopTemplate.__init__   s"      -$!2"r   Nr   r
   r   r   r!   r&   r   r   c           	      P  K   |j                   j                  | j                  | j                  dz          d{   }|t	        |      | j                  k  rt        d      |j                  t        | j                        }t        |d| j                      d         }	|j                   j                          d{   }
|
st        d      |	| j                  z  }|| j                  z  }t        j                  d	|	d
d|d
d|d
       t        |      }|t        d      |r%|dk(  r|
|z
  }n|
|z   }|j                  |||       n|j!                  ||       |j#                  |       |j%                  |       |j'                          d{   S 7 e7 7 	w)az  
        Create an order with ATR-based stops.

        Args:
            suite: TradingSuite instance
            side: Order side (0=BUY, 1=SELL)
            size: Order size
            use_limit_entry: Use limit order for entry
            entry_offset: Offset from current price for limit entry

        Returns:
            BracketOrderResponse with order details
           )barsNz%Insufficient data for ATR calculation)periodatr_r(   zATR-based order: ATR=r/   z, Stop distance=z, Target distance=r)   r   r*   r,   r-   )r0   get_datarS   rQ   lenr2   piper   r7   r1   rP   rR   r?   r@   r	   r9   r:   r;   r<   r=   )r   r   r   r   r!   r&   r   r0   data_with_atrcurrent_atrrC   r    target_distancerH   rD   s                  r   r   zATRStopTemplate.create_order   s    . ZZ((dooPQ>Q(RR<3t9t6DEE 		#doo	>MD0A*BCBGH $jj::<<788 $d&9&99'$*@*@@#K#4 5*3/ 0.s35	
 $E*</00qy+l:+l:T4H  d 6m4   8__&&&S S =@ 's5   8F&FBF& F"CF&F$F&"F&$F&)rK            @5min)NFr   )r   r   r   r   r7   r   strr#   rM   r   r   r   r   r   r   rO   rO      s     !$#&## # !	#
 #2   %@'@' @' Dj	@'
 @' @' @' 
@'r   rO   c                   p    e Zd ZdZ	 	 	 ddededefdZ	 	 	 	 dddd	ed
edz  dedz  dedz  dedede	fdZ
y)BreakoutTemplatez
    Template for breakout orders.

    Places stop orders above/below key levels with automatic
    stop loss and take profit based on the breakout range.
    breakout_offsetstop_at_leveltarget_range_multiplierc                 .    || _         || _        || _        y)a  
        Initialize breakout template.

        Args:
            breakout_offset: Points above/below level to place stop order
            stop_at_level: Place stop loss at the breakout level
            target_range_multiplier: Target distance as multiple of range
        N)rg   rh   ri   )r   rg   rh   ri   s       r   r#   zBreakoutTemplate.__init__"  s      /*'>$r   Nr   r
   r   r   breakout_level
range_sizelookback_barsr   r   c                   K   |H|j                   j                  |d       d{   }|st        d      |dk(  r|d   n|d   }||d   }|dk(  rB|| j                  z   }	|t        d	      | j                  r|n||z
  }
|	|| j
                  z  z   }nA|| j                  z
  }	|t        d	      | j                  r|n||z   }
|	|| j
                  z  z
  }t        j                  d
|dd|	dd|
dd|d       |t        d      t        |      j                  ||	|      j                  |
      j                  |      }|j                          d{   S 7 77 w)a  
        Create a breakout order.

        Args:
            suite: TradingSuite instance
            side: Order side (0=BUY for upside breakout, 1=SELL for downside)
            size: Order size
            breakout_level: Specific level to break (auto-detected if None)
            range_size: Size of the range (auto-calculated if None)
            lookback_bars: Bars to look back for range calculation

        Returns:
            BracketOrderResponse with order details
        Nrc   )rW   rS   zCannot calculate price ranger   highlowrangezRange size is requiredzBreakout order: Level=r/   z, Entry=z, Stop=z	, Target=r)   r*   )r+   )r0   get_price_ranger2   rg   rh   ri   r?   r@   r	   
stop_orderr;   r<   r=   )r   r   r   r   rk   rl   rm   r   range_statsrD   
stop_pricetarget_pricerH   s                r   r   zBreakoutTemplate.create_order4  s    2 ! %

 : :"f !; ! K  !?@@ (,qyF#k%6H  !(1
 19(4+?+??K! !9::"&"4"4.::U  '*t7S7S*STL(4+?+??K! !9::"&"4"4.::U  '*t7S7S*STL$^C$8 9 %WZ,< ="3')	
 </00 e$ZT4Z@^*^-L1	 	 __&&&a` 's"   #E!ED1E!EE!E!)rK   T      ?)NNN   rL   r   r   r   rf   rf     s     "%"),	?? ? "'	?,  '+#'J'J' J' Dj	J'
 J' DLJ' J' J' 
J'r   rf   c                   ^    e Zd ZdZ	 	 	 	 ddedededefdZ	 	 ddd	d
ededz  dededefdZ	y)ScalpingTemplatez
    Template for quick scalping trades.

    Optimized for fast entry/exit with tight stops and
    quick profit targets.
    
stop_tickstarget_ticksuse_market_entrymax_spread_ticksc                 <    || _         || _        || _        || _        y)a&  
        Initialize scalping template.

        Args:
            stop_ticks: Stop loss distance in ticks
            target_ticks: Take profit distance in ticks
            use_market_entry: Use market orders for quick entry
            max_spread_ticks: Maximum spread to allow entry
        N)r{   r|   r}   r~   )r   r{   r|   r}   r~   s        r   r#   zScalpingTemplate.__init__  s#      %( 0 0r   Nr   r
   r   r   check_spreadr   r   c                 j  K   |j                   }|st        d      |j                  }|rot        |d      rc|j                  rW|j                  }|j                          d{   }	|	1|	|z  }
|
| j                  kD  rt        d|
dd| j                   d      | j                  |z  }| j                  |z  }t        |      }|t        d      | j                  r|j                  ||	       nC|j                  j                          d{   }|st        d
      |j                  |||       |j                  |       |j!                  |       |j#                          d{   }|j$                  r0t&        j)                  d| j                   d| j                   d       |S 7 K7 7 Gw)a.  
        Create a scalping order.

        Args:
            suite: TradingSuite instance
            side: Order side (0=BUY, 1=SELL)
            size: Order size
            check_spread: Check bid/ask spread before entry

        Returns:
            BracketOrderResponse with order details
        zCannot get instrument details	orderbookNzSpread too wide: z.1fz ticks (max: )r)   r,   r(   r*   r-   zScalp order placed: z tick stop, z tick target)r3   r2   tickSizehasattrr   get_bid_ask_spreadr~   r{   r|   r	   r}   r:   r0   r1   r9   r;   r<   r=   r>   r?   r@   )r   r   r   r   r   r   r3   	tick_sizer   spreadspread_ticksr    r`   rH   rC   rJ   s                   r   r   zScalpingTemplate.create_order  s    , %%
<==''	 GE;7EOOI$7799F!%	1$"7"77$+L+= >!!%!6!6 7q:  )3++i7 $E*</00    d 6 #(**">">"@@M  !;<<TTJm4   8((>>KK&t&7|$$%\3
 Q :0 A )s9   AF3!F,"B*F3F/AF3)F1*AF3/F31F3)      T   )NT)
r   r   r   r   r   rM   r#   r   r   r   r   r   r   rz   rz     s     !% !11 1 	1
 12  !GG G Dj	G
 G G 
Gr   rz   rw   T)r   r!   rK   )rP   rR   )r   rb   Fg      @g      @   	   )r{   r|   r   r   r         )conservative_rrconservative_atrstandard_rrstandard_atrstandard_breakoutaggressive_rraggressive_atraggressive_scalptight_scalpnormal_scalp
wide_scalpnamer   c           	          | t         vr2t        d|  ddj                  t         j                                      t         |    S )a  
    Get a pre-configured order template by name.

    Available templates:
        - conservative_rr: 1.5:1 risk/reward with limit entry
        - conservative_atr: 1.5x ATR stop, 2x target
        - standard_rr: 2:1 risk/reward
        - standard_atr: 2x ATR stop, 3x target
        - standard_breakout: Breakout with stop at level
        - aggressive_rr: 3:1 risk/reward with market entry
        - aggressive_atr: 2.5x ATR stop, 4x target
        - aggressive_scalp: 3 tick stop, 9 tick target
        - tight_scalp: 2 tick stop, 4 tick target
        - normal_scalp: 4 tick stop, 8 tick target
        - wide_scalp: 6 tick stop, 12 tick target

    Args:
        name: Template name

    Returns:
        OrderTemplate instance

    Example:
        ```python
        template = get_template("standard_rr")
        order = await template.create_order(suite, side=0, risk_amount=100)
        ```
    zUnknown template: z. Available: z, )	TEMPLATESr2   joinkeys)r   s    r   get_templater     sF    : 9 mDIIinn>N4O3PQ
 	
 T?r   )r   loggingabcr   r   typingr   r   project_x_py.indicatorsr   project_x_py.modelsr   project_x_py.order_trackerr	   project_x_py.trading_suiter
   	getLoggerr   r?   r   r   rO   rf   rz   r   rd   r   r   r   r   <module>r      s  !F  # % ' 4 87			8	$3C 3w wt]'m ]'@d'} d'Nd} dT *CQUV'scR%<#3#N)+'#uU%SCP(AAF#qqA$B"abA	&!s !} !r   