
    Y&j9                         d Z ddlZddlZddlmZ ddlmZmZ ddlZ G d d          Zd Z	e
dk    r e	             dS dS )	z
Track signal performance and accuracy.

For each signal:
1. Record entry time and price
2. Monitor price movement
3. Detect if target/stop was hit
4. Calculate win rate and performance metrics
    N)Path)datetime	timedeltac                   j    e Zd ZdZdefdZd ZdedefdZ	de
d	efd
Zde
dedefdZd ZdefdZdS )SignalTrackerz-Track signal outcomes and calculate accuracy.db_pathc                 <    || _         |                                  d S )N)r   create_database)selfr   s     R/home/ubuntu/.hermes/workspace/projects/ORDER_FLOW_GRAPH/scripts/signal_tracker.py__init__zSignalTracker.__init__   s!        c                    t          j        | j                  }|                                }|                    d           |                    d           |                    d           |                    d           |                    d           |                    d           |                                 |                                 dS )z,Create SQLite database for tracking signals.a  
            CREATE TABLE IF NOT EXISTS signals (
                id INTEGER PRIMARY KEY AUTOINCREMENT,
                asset TEXT NOT NULL,
                signal_type TEXT NOT NULL,
                direction TEXT NOT NULL,
                entry_price REAL NOT NULL,
                target_price REAL NOT NULL,
                stop_price REAL NOT NULL,
                confidence REAL NOT NULL,
                risk_reward REAL NOT NULL,
                entry_time TEXT NOT NULL,
                cfd_entry REAL,
                cfd_target REAL,
                cfd_stop REAL,
                status TEXT DEFAULT 'active',
                outcome_time TEXT,
                outcome_price REAL,
                outcome TEXT,
                profit_loss REAL,
                max_favorable REAL,
                max_adverse REAL,
                bars_held INTEGER,
                created_at TEXT NOT NULL
            )
        aA  
            CREATE TABLE IF NOT EXISTS price_checkpoints (
                id INTEGER PRIMARY KEY AUTOINCREMENT,
                signal_id INTEGER NOT NULL,
                timestamp TEXT NOT NULL,
                price REAL NOT NULL,
                FOREIGN KEY (signal_id) REFERENCES signals(id)
            )
        a  
            CREATE TABLE IF NOT EXISTS performance_summary (
                id INTEGER PRIMARY KEY AUTOINCREMENT,
                asset TEXT NOT NULL,
                signal_type TEXT,
                direction TEXT,
                total_signals INTEGER DEFAULT 0,
                wins INTEGER DEFAULT 0,
                losses INTEGER DEFAULT 0,
                win_rate REAL DEFAULT 0,
                avg_profit REAL,
                avg_loss REAL,
                avg_hold_time INTEGER,
                best_trade REAL,
                worst_trade REAL,
                max_drawdown REAL,
                last_updated TEXT NOT NULL,
                UNIQUE(asset, signal_type, direction)
            )
        zOCREATE INDEX IF NOT EXISTS idx_signals_asset_time ON signals(asset, entry_time)z@CREATE INDEX IF NOT EXISTS idx_signals_status ON signals(status)zQCREATE INDEX IF NOT EXISTS idx_checkpoints_signal ON price_checkpoints(signal_id)N)sqlite3connectr   cursorexecutecommitclose)r   connr   s      r   r
   zSignalTracker.create_database   s    t|,, 	  	 	 	8 	  	 	 	 	  	 	 	, 	hiiiYZZZjkkk

r   signal_dataassetc                 T   t          j        | j                  }|                                }|                    d||d         |d         |d         |d         |d         |d         |d         t          j                                                    |                    d	          |                    d
          |                    d          dt          j                                                    f           |	                                 |
                                 |j        S )zAdd a new signal to track.aZ  
            INSERT INTO signals (
                asset, signal_type, direction,
                entry_price, target_price, stop_price,
                confidence, risk_reward, entry_time,
                cfd_entry, cfd_target, cfd_stop,
                status, created_at
            ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
        type	directionentry_pricetarget_price
stop_price
confidencerisk_reward	cfd_entry
cfd_targetcfd_stopactive)r   r   r   r   r   r   now	isoformatgetr   r   	lastrowid)r   r   r   r   r   s        r   
add_signalzSignalTracker.add_signald   s    t|,,  $&'%%&LNN$$&&OOK((OOL))OOJ''LNN$$&&
	 	 	2 	

r   	signal_idpricec                 (   t          j        | j                  }|                                }|                    d|t          j                                                    |f           |                                 |	                                 dS )z$Add a price checkpoint for a signal.zn
            INSERT INTO price_checkpoints (signal_id, timestamp, price)
            VALUES (?, ?, ?)
        N)
r   r   r   r   r   r   r%   r&   r   r   )r   r*   r+   r   r   s        r   add_price_checkpointz"SignalTracker.add_price_checkpoint   sy    t|,,  1133U;	= 	= 	=
 	

r   current_pricereturnc                    t          j        | j                  }|                                }|                    d|f           |                                }|s|                                 ddiS |\  }}}}	}
}|dk    r|                                 d|iS d}|}|	dk    r||k    rd}n||k    rd}n||k    rd}n||k    rd}|r}|	dk    r||z
  }n||z
  }|                    d	|t          j                    	                                |||f           |
                                 |                                 d
||dS |                                 ddiS )z#Check if signal hit target or stop.z
            SELECT entry_price, target_price, stop_price, direction, entry_time, status
            FROM signals WHERE id = ?
        status	not_foundr$   Nbullishwinlossz
                UPDATE signals
                SET outcome = ?, outcome_time = ?, outcome_price = ?,
                    profit_loss = ?, status = 'closed'
                WHERE id = ?
            closed)r1   outcomeprofit_loss)r   r   r   r   r   fetchoner   r   r%   r&   r   )r   r*   r.   r   r   rowr   r   r   r   
entry_timer1   r7   outcome_pricer8   s                  r   check_signal_outcomez"SignalTracker.check_signal_outcome   s   t|,,  \	 	 	
 oo 	+JJLLLk**ORL\:y*f XJJLLLf%% %	!!,,*,, ,,*,,  	XI%%+k9)M9 NN 
 8<>>3355}kS\]_ _ _ KKMMMJJLLL&7;WWW

(##r   c                    t          j        | j                  }|                                }|                    d           |                                }|D ]d}|\
  }}}}}	}
}}}}|dk    r|	|z  dz  nd}|                    d|||||	|
|||||t          j                                                    f           e|	                                 |
                                 dS )z#Update performance summary metrics.a  
            SELECT asset, signal_type, direction,
                   COUNT(*) as total,
                   SUM(CASE WHEN outcome = 'win' THEN 1 ELSE 0 END) as wins,
                   SUM(CASE WHEN outcome = 'loss' THEN 1 ELSE 0 END) as losses,
                   AVG(CASE WHEN outcome = 'win' THEN profit_loss END) as avg_profit,
                   AVG(CASE WHEN outcome = 'loss' THEN profit_loss END) as avg_loss,
                   MAX(profit_loss) as best_trade,
                   MIN(profit_loss) as worst_trade
            FROM signals
            WHERE status = 'closed'
            GROUP BY asset, signal_type, direction
        r   d   a)  
                INSERT OR REPLACE INTO performance_summary
                (asset, signal_type, direction, total_signals, wins, losses,
                 win_rate, avg_profit, avg_loss, best_trade, worst_trade, last_updated)
                VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
            N)r   r   r   r   r   fetchallr   r%   r&   r   r   )r   r   r   rowsr:   r   signal_typer   totalwinslosses
avg_profitavg_loss
best_tradeworst_tradewin_rates                   r   update_performance_summaryz(SignalTracker.update_performance_summary   s   t|,, 	  	 	 	    	/ 	/CpsmE;	5$
HV`bm/4qyyus**aHNN 
 ifJ*k,..**,,./ / / / 	

r   c                 b   t          j        | j                  }|                                }|                    d           |                                }|r|d         dk    r|                                 ddiS |\  }}}}}}	|dk    r||z  dz  nd}
|||t          |
d          |rt          |d          nd|rt          |d          nd|	rt          |	d          nd|r"|r t          t          ||z            d          ndd}|                    d           g |d	<   |	                                D ]n}|\  }}}}}|dk    r||z  dz  nd}
|d	         
                    |||t          |
d          |rt          |d          nd|rt          |d          ndd
           o|                    d           g |d<   |	                                D ]F}|\  }}}|dk    r||z  dz  nd}
|d         
                    |||t          |
d          d           G|                                 |S )zGet overall performance report.a  
            SELECT
                COUNT(*) as total_signals,
                SUM(CASE WHEN outcome = 'win' THEN 1 ELSE 0 END) as total_wins,
                SUM(CASE WHEN outcome = 'loss' THEN 1 ELSE 0 END) as total_losses,
                AVG(CASE WHEN outcome = 'win' THEN profit_loss END) as avg_win,
                AVG(CASE WHEN outcome = 'loss' THEN profit_loss END) as avg_loss,
                SUM(profit_loss) as total_profit_loss
            FROM signals
            WHERE status = 'closed'
        r   messagezNo closed signals yetr?      )total_signalsrD   rE   rJ   avg_winrG   total_profit_lossprofit_factora  
            SELECT asset,
                   COUNT(*) as total,
                   SUM(CASE WHEN outcome = 'win' THEN 1 ELSE 0 END) as wins,
                   AVG(CASE WHEN outcome = 'win' THEN profit_loss END) as avg_profit,
                   AVG(CASE WHEN outcome = 'loss' THEN profit_loss END) as avg_loss
            FROM signals
            WHERE status = 'closed'
            GROUP BY asset
        by_asset)r   rC   rD   rJ   rF   rG   z
            SELECT signal_type,
                   COUNT(*) as total,
                   SUM(CASE WHEN outcome = 'win' THEN 1 ELSE 0 END) as wins
            FROM signals
            WHERE status = 'closed'
            GROUP BY signal_type
        by_type)r   rC   rD   rJ   )r   r   r   r   r   r9   r   roundabsr@   append)r   r   r   r:   rO   
total_winstotal_lossesrP   rG   rQ   rJ   reportr   rC   rD   rF   rB   s                    r   get_performance_reportz$SignalTracker.get_performance_report   s   t|,, 	 
 
	 
	 
	 oo 	8c!fkkJJLLL677X[Uz<(DU9F9J9JJ.44PQ +"h**,3:uWa(((.6=h***A@Q!X'8!!<!<!<WXBJ]w]U3w'9#:#:A>>>\]	
 	
 	 	 		 		 		  z??$$ 	 	C7:4E5$
H/4qyyus**aH:%%!(A..6@GeJ222a2:AE(A...' '     	  	 	 	 y??$$ 		 		C'*$K/4qyyus**aH9$$#!(A..	& &     	

r   N)__name__
__module____qualname____doc__r   r   r
   dictstrr)   intfloatr-   r=   rK   r[    r   r   r   r      s        77    H H HT! d ! 3 !  !  !  ! Fc %    :$c :$% :$D :$ :$ :$ :$x% % %NW W W W W W Wr   r   c                     t          d           t          d           t          d           t          d          } t          |           }t          d|             t          d           g d}|D ]}t          d| d          }|                                s+t	          |          5 }t          j        |          }d	d	d	           n# 1 swxY w Y   d
|vrk|d
         }t          j        |           }|	                                }	|	
                    d||d         f           |	                                d         }
|                                 |
dk    r't          d|                                 d           |                    ||          }t          d|                                 d|            t          d|d          d|d                                                     t          d|d         d           t          d|d         d           t          d|d         d           t          d           t          d           t          d           |                                }d|v r)t          d|d                     t          d           n)t          d|d                      t          d!|d"          d#|d$                     t          d%|d&          d'           t          d(|d)         d           |d*         r`t          d+           |d*         D ]H}t          d|d,                                          d-|d&          d.|d"          d/|d0          d1	           I|d2         rNt          d3           |d2         D ]6}t          d|d          d-|d&          d.|d"          d/|d0          d1	           7t          d           t          d4           t          d           t          d5           t          d6           t          d7           t          d8           t          d           d	S )9zDemo signal tracking.zP================================================================================zSIGNAL PERFORMANCE TRACKERzS/home/ubuntu/.hermes/workspace/projects/ORDER_FLOW_GRAPH/data/signal_performance.dbu   
✓ Database: u;   ✓ Tables: signals, price_checkpoints, performance_summary)btcusdtethusdtxautusdtzW/home/ubuntu/.hermes/workspace/projects/ORDER_FLOW_GRAPH/outputs/data/realtime_summary_z.jsonN
best_setupz
            SELECT COUNT(*) FROM signals
            WHERE asset = ? AND entry_price = ? AND status = 'active'
            AND datetime(entry_time) > datetime('now', '-5 minutes')
        r   r   
z: Signal already trackedz: Added signal #z  r   z - r   z
  Entry: $z.2fz  Target: $r   z	  Stop: $r   zQ
================================================================================zPERFORMANCE REPORTrM   u0   
📊 Track new signals to see accuracy metrics!z
Total Signals: rO   zWins: rD   z | Losses: rE   z
Win Rate: rJ   %zTotal P/L: $rQ   rS   z

By Asset:r   z: z% win rate (/rC   )rT   z	
By Type:u    ✓ Signal tracking initialized!z
Next steps:z91. Run signal checker every 1-5 minutes to check outcomesz.2. Update performance summary after each checkz3. Display accuracy in UI)printr   r   existsopenjsonloadr   r   r   r   r9   r   upperr)   r[   )r   trackerassetsr   signal_filefdatasetupr   r   countr*   rZ   sig_types                 r   mainr|   Q  s-    
&MMM	
&'''	&MMMhiiGG$$G	
&W
&
&'''	
GHHH 0//F $5 $5  Buz  B  B  B  C  C!!## 	+ 	 !9Q<<D	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  t##\" w''  U=)*		, 	, 	, !!!$

199>u{{}}>>>??? &&ue44	=5;;====)==>>>A5=AAU;%7%=%=%?%?AABBB55/5556667E.17778883%-3334444 
-	
	&MMM++--FF&6)$&&'''ABBBB;&"9;;<<<Dvf~DD&2BDDEEE06*-000111>V$78>>>???* 	w-   
+ w wu5>//11uuU:5FuuTYZ`Tauudijqdruuuvvvv) 	z,"9- z zx8F+xxx
/CxxQYZ`Qaxxdlmtduxxxyyyy	-	
,---	&MMM	/	
EFFF	
:;;;	
%&&&	&MMMMMs   -CC	C	__main__)r_   rq   r   pathlibr   r   r   
statisticsr   r|   r\   rd   r   r   <module>r      s             ( ( ( ( ( ( ( (    { { { { { { { {|	W W Wt zDFFFFF r   