
    ii?                     R   d Z ddlmZmZ ddlmZ ddlmZmZmZ ddl	m
Z
mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ ddlmZmZmZmZ ddl m!Z!m"Z"m#Z# ddl$m%Z%m&Z& dd	l'm(Z( dd
l)m*Z*m+Z+m,Z,m-Z-m.Z. e G d d             Z/ G d d      Z0defdZ1de/fdZ2d Z3e4dk(  r e2        yy)z
Backtesting engine for the Auto Hedge-Mart V4 strategy.

Simulates the hedged martingale recovery strategy on historical data
and generates performance metrics.
    )	dataclassfield)datetime)ListOptionalCallable)SYMBOLINITIAL_BALANCECOMMISSION_PERCENTSLIPPAGE_PIPSSAMPLE_DATA_CANDLESSAMPLE_START_PRICESAMPLE_VOLATILITYDATA_FILE_CSVDATA_FILE_JSONCSV_TIMESTAMP_COLCSV_OPEN_COLCSV_HIGH_COLCSV_LOW_COLCSV_CLOSE_COLCSV_VOLUME_COLUSE_TICK_DATATICKS_PER_CANDLE)
DataLoaderOHLCVTickDatacreate_sample_data)
get_spreadnormalize_priceget_pip_size)BacktestOrderEngine	OrderSide)HedgeMartStrategy)setup_logging
get_logger	log_tradelog_balancetimestamp_to_strc                      e Zd ZU dZeed<   eed<   eed<   eed<   eed<   eed<   eed<   eed	<   eed
<   eed<   eed<   eed<   eed<   eed<   eed<   eed<   eed<   eed<   eed<   dZeed<   dZeed<   dZ	eed<   dZ
ee   ed<   dZee   ed<   dZeed<    ee      Zee   ed<    ee      Zee   ed <    ee      Zee   ed!<   d"efd#Zd%d$Zy)&BacktestResultzResults from a backtest run.initial_balancefinal_balancetotal_returntotal_return_percenttotal_tradeswinning_tradeslosing_tradeswin_rategross_profit
gross_loss
net_profittotal_commissionmax_drawdownmax_drawdown_percent
max_equity
min_equitytotal_threadsmax_recovery_leveltotal_recovery_pairs        peak_marginr   peak_positions	peak_lotsN
start_dateend_datetrading_days)default_factoryequity_curvebalance_curve	trade_logreturnc                    i d| j                   d| j                  d| j                  d| j                  d| j                  d| j
                  d| j                  d| j                  d	| j                  d
| j                  d| j                  d| j                  d| j                  d| j                  d| j                  d| j                  d| j                   | j"                  | j$                  | j&                  rt)        | j&                        nd | j*                  rt)        | j*                        nd | j,                  dS )Nr+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   )r<   r=   rB   rC   rD   )r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   rB   r(   rC   rD   )selfs    */var/www/html/crpytotradingbot/backtest.pyto_dictzBacktestResult.to_dictU   s}   
t33
T//
 D--
 #D$=$=	

 D--
 d11
 T//
 
 D--
 $//
 $//
  5 5
 D--
 #D$=$=
 $//
  $//!
" T//#
$ #'"9"9$($=$=?C*4??;TX;?==(7d ---
 	
    c                    t        d       t        d       t        d       t        ddd       t        d| j                  d       t        d	| j                  d       t        d
| j                  d       t        d| j                  dd       t        ddd       t        d| j
                          t        d| j                          t        d| j                          t        d| j                  dd       t        d| j                  d       t        d| j                  d       t        d| j                  d       t        ddd       t        d| j                  d       t        d| j                  dd       t        d| j                  d       t        d| j                  d       t!        | d      r| j"                  dkD  rt        ddd       t        d| j"                  d       t        d | j$                          t        d!| j&                  d"       d#D ]#  }| j"                  |z  }t        d$| d%|d       % t        dd&d       t        d'| j(                          t        d(| j*                          t        d)| j,                          | j.                  ru| j0                  rit        dd*d       t        d+t3        | j.                                t        d,t3        | j0                                t        d-| j4                          t        d       y ).Nz=
============================================================zHEDGE-MART V4 BACKTEST RESULTSz<============================================================
PERFORMANCEz=^40zInitial Balance:     $z,.2fzFinal Balance:       $zNet Profit:          $zTotal Return:        z.2f%zTRADE STATISTICSzTotal Trades:        zWinning Trades:      zLosing Trades:       zWin Rate:            zGross Profit:        $zGross Loss:          $zTotal Commission:    $zRISK METRICSzMax Drawdown:        $zMax Drawdown %:      zMax Equity:          $zMin Equity:          $r?   r   zMARGIN ANALYSISzPeak Notional:       $z,.0fzPeak Positions:      zPeak Lots:           z.3f)2   d      z  Margin @ z	x:      $zRECOVERY STATISTICSzTotal Threads:       zMax Recovery Level:  zTotal Hedge Pairs:   zTIME PERIODzStart Date:          zEnd Date:            zTrading Days:        )printr+   r,   r5   r.   r/   r0   r1   r2   r3   r4   r6   r7   r8   r9   r:   hasattrr?   r@   rA   r;   r<   r=   rB   rC   r(   rD   )rK   levreqs      rL   print_summaryzBacktestResult.print_summaryo   s3   o./h=&'(&t';';D&ABC&t'9'9$&?@A&tt&<=>%d&?&?%DAFG%d+,-%d&7&7%89:%d&9&9%:;<%d&8&8%9:;%dmmC%8:;&t'8'8&>?@&tt&<=>&t'<'<T&BCD>$'()&t'8'8&>?@%d&?&?%DAFG&tt&<=>&tt&<=>4'D,<,<q,@B(./0*4+;+;D*ABC)$*=*=)>?@)$..)=>?% >&&,C5	#d<=> 	(./0%d&8&8%9:;%d&=&=%>?@%d&?&?%@AB??t}}B}T*+,)*:4??*K)LMN)*:4==*I)JKL)$*;*;)<=>orN   rI   N)__name__
__module____qualname____doc__float__annotations__intr?   r@   rA   rB   r   r   rC   rD   r   listrF   r   rG   rH   dictrM   rZ    rN   rL   r*   r*   ,   s
   &O  KNCIu%)J")#'Hhx 'L# %d ;L$u+;!&t!<M4;<!$7ItDz7
 
4.rN   r*   c                       e Zd ZdZeeeefdede	de	de	fdZ
dedd	fd
Zdedd	fdZddZ	 	 	 ddedededeeeegd	f      def
dZdedefdZy	)BacktestEnginez.Backtesting engine for Hedge-Mart V4 strategy.symbolr+   commission_percentslippage_pipsc                 T   || _         || _        t        ||||      | _        t	        || j                        | _        g | _        g | _        || _        || _	        d| _
        || _        d| _        d| _        d| _        d| _        d| _        d| _        d | _        t'               | _        y )Nrh   r+   ri   rj   )rh   order_enginer>   r   )rh   r+   r!   rm   r#   strategyrF   rG   r9   r:   r7   peak_equityr?   r@   rA   total_threads_createdr<   r=   current_timer%   logger)rK   rh   r+   ri   rj   s        rL   __init__zBacktestEngine.__init__   s     . 0+1'	
 ***
 *,*,))*  &'""#$%!04 lrN   candlerI   Nc                 j   |j                   | _        | j                  j                  |j                          |j                  }|j                  dz  }| j                  j                  ||       | j                  j                         }| j                  j                  |       | j                  j                         }||kD  r| xj                  ||z
  z  c_	        |j                  }|j                  dz  }| j                  j                  ||       | j                  j                  |       | j                  j                  D ]_  }|j                  | j                  kD  r|j                  | _        t        | j                   | j                  j#                               | _        a | j%                          y)z2Process a single candle through the trading logic.gqh ?N)	timestamprq   rm   set_timeopenupdate_pricesrn   get_active_thread_count
on_new_barrp   closeprocess_candlerecovery_threadslevel_countr<   maxr=   get_total_recovery_orders_update_metrics)rK   rt   bidaskthreads_beforethreads_afterts          rL   r}   zBacktestEngine.process_candle   s_   ",,""6#3#34 kkkkF"''S1 >>@  (==?>)&&=>+IJ& llllV#''S1 	$$V, // 	A}}t666*+--'(+))779)D%	 	rN   tickc                 <   |j                   | _        | j                  j                  |j                          | j                  j	                  |j
                  |j                         | j                  j                  |j                  |j
                         | j                  j                  |j
                  |j                         | j                  j                  D ]-  }|j                  | j                  kD  s|j                  | _        / | j                          y)z0Process a single tick through the trading logic.N)rv   rq   rm   rw   ry   r   r   process_tp_slrn   on_tickr~   r   r<   r   )rK   r   r   s      rL   process_tickzBacktestEngine.process_tick   s     NN""4>>2''$((; 	''$((; 	dhh1 // 	8A}}t666*+--'	8 	rN   c                 4   | j                   j                         }| j                   j                  }| j                  j	                  |       | j
                  j	                  |       || j                  kD  r|| _        n%| j                  |z
  }|| j                  kD  r|| _        t        | j                  |      | _	        t        | j                  |      | _        | j                   j                         }t        | j                   j                        }|dkD  r4t        d | j                   j                  j!                         D              nd}|| j"                  kD  r|| _        t        | j$                  |      | _        t        | j&                  |      | _        y)z)Update equity curve and drawdown metrics.r   c              3   4   K   | ]  }|j                     y w)N)lots).0ps     rL   	<genexpr>z1BacktestEngine._update_metrics.<locals>.<genexpr>  s     NANs   N)rm   
get_equitybalancerF   appendrG   ro   r7   r   r9   minr:   get_margin_usedlen	positionssumvaluesr?   r@   rA   )rK   equityr   drawdownmarginn_pos
total_lotss          rL   r   zBacktestEngine._update_metrics	  sH   ""--/##++  (!!'*D$$$%D''&0H$+++$,!doov6doov6 ""224D%%//0RWZ[R[SN):):)D)D)K)K)MNNab
D$$$%D!$"5"5u=T^^Z8rN   data_loader	use_ticksticks_per_candleprogress_callbackc                 H   | j                   j                  dt        |       d       t        |      }d}|rE|j                  |      D ]0  }| j	                  |       |dz  }|s|dz  dk(  s% ||||z         2 nBd}|j                         D ]-  }	| j                  |	       |dz  }|r|dz  dk(  r	 |||       |	}/ | j                  j                         \  }
}t        | j                  j                  j                               D ]l  }|j                  t        j                  k(  r'| j                  j                  |j                   |
       G| j                  j                  |j                   |       n | j                   j                  d       | j#                  |      S )	zRun backtest on loaded data.z#Starting Hedge-Mart V4 backtest on z candlesr      i  NrT   zBacktest complete)rr   infor   iterate_ticksr   iterate_candlesr}   rm   get_current_pricerc   r   r   sider"   BUYclose_positionposition_id_compile_results)rK   r   r   r   r   total_items	processedr   prev_candlert   r   r   positions                rL   runzBacktestEngine.run$  s    	>s;?O>PPXYZ+&	#112BC Q!!$'Q	$T)9Q)>%i?O1OP	Q K%557 %##F+Q	$SA)=%i=$% $$668ST..88??AB 	LH}}	-!!001E1EsK!!001E1EsK		L 	,-$$[11rN   c                    | j                   j                         }| j                   j                  }|| j                  z
  }|| j                  z  dz  }| j                  dkD  r| j
                  | j                  z  dz  nd}|j                         \  }}d}	|r|r||z
  j                  }	| j                   j                  D 
cg c]  }
|
j                  |
j                  |
j                  j                  |
j                  |
j                  |
j                  |
j                   |
j"                  rt%        |
j"                        nd|
j&                  rt%        |
j&                        nd|
j(                  d
 }}
t+        d#i d| j                  d|d|d|d	|d	   d
|d
   d|d   d|d   d|d   |d
   z  dt-        |d   |d   z        d|d|d   d| j
                  d|d| j.                  d| j0                  d| j2                  d| j4                  d| j6                  d| j8                  d| j:                  d| j<                  d|d|d|	d | j>                  d!| j@                  d"|S c c}
w )$zCompile all results.rT   r   N)
order_idrh   r   r   entry_priceclose_priceprofit	open_time
close_timecommentr+   r,   r-   r.   r/   r0   r1   r2   r3   average_winr4   average_lossr5   r6   r7   r8   r9   r:   r?   r@   rA   r;   r<   r=   rB   rC   rD   rF   rG   rH   re   )!rm   get_statisticsr   r+   ro   r7   get_date_rangedaystrade_historyr   rh   r   valuer   pricer   r   r   r(   r   r   r*   absr9   r:   r?   r@   rA   rp   r<   r=   rF   rG   )rK   r   statsr,   r-   r.   max_dd_percentrB   rC   rD   r   rH   s               rL   r   zBacktestEngine._compile_resultsP  s   !!002))11$t';';; ,t/C/C CsJIMIYIY\]I]$++d.>.>>#Ecd*99;
H($z177L &&44
  JJ(( ww }}((>?kk-akk:t@A.q||<RV99
	 
   
 00
'
 &
 "6	

 ~.
 !!12
  0
 :&
 }-6F0GG
 5053IIJ
 $
 ##56
 **
 "0
 
  !
" ((#
$  ..%
& nn'
( 44)
*  $66+
, "&!:!:-
. "/
0 1
2 &3
4 **5
6 ,,7
8  9
 	
!
s   ?B0I0r[   )F   N)r\   r]   r^   r_   r	   r
   r   r   strr`   rs   r   r}   r   r   r   r   boolrb   r   r   r*   r   r   re   rN   rL   rg   rg      s    8 !0$6,+#+# +# "	+#
 +#Z$U $t $L d &9<   !BF*2*2 *2 	*2
 $Hc3Z-=$>?*2 
*2X<
J <
> <
rN   rg   rI   c            	      ~   t        t              } t        rHt        dt                | j	                  t        t
        t        t        t        t        t               | S t        r)t        dt                | j                  t               | S t        dt         d       t        t        t        t        t               S )z*Load data based on settings configuration.zLoading data from CSV: )timestamp_colopen_colhigh_collow_col	close_col
volume_colzLoading data from JSON: zGenerating z candles of sample data...)rh   num_candlesstart_price
volatility)r   r	   r   rV   load_csvr   r   r   r   r   r   r   	load_jsonr   r   r   r   )loaders    rL   load_data_from_settingsr     s    F'78+!!#% 	 	
 ((89:(	K+,,F
GH'&$	 rN   c                  "   t        dd       t               } t        dt        |        dt                t        t        t        t        t              }d }|j                  | t        t        |      }t                |j                          |S )	z-Run backtest using settings from settings.py.TF)consolefilezLoaded z candles for rl   c                 :    | |z  dz  }t        d|dddd       y )NrT   zProgress: z.1frR    T)endflush)rV   )currenttotalpcts      rL   progresszrun_backtest.<locals>.progress  s'    o#SIQ'Rt<rN   )r   r   r   )r$   r   rV   r   r	   rg   r
   r   r   r   r   r   rZ   )dataenginer   results       rL   run_backtestr     s    $U+"$D	GCI;mF8
45'-#	F= ZZ)"	  F 
G
MrN   c                      t               S )zRun a sample backtest (alias).)r   re   rN   rL   run_sample_backtestr     s
    >rN   __main__N)5r_   dataclassesr   r   r   typingr   r   r   configr	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   normalizationr   r   r    rm   r!   r"   hedge_recovery_enginer#   utilsr$   r%   r&   r'   r(   r*   rg   r   r   r   r\   re   rN   rL   <module>r      s    )  + +    & H G C C 7 3  p p pfl
 l
^ >n <
 zN rN   