@@ -104,12 +104,14 @@ def _refine_signals(df_signals, portfolio) -> Dict[str, Dict[str, Any]]:
104104 temp_available_cash = new_temp_available_cash
105105
106106 elif signal == "BUY" :
107- _process_buy (ticker , portfolio , dict_enriched ,
107+ new_temp_positions_count , new_temp_available_cash = _process_buy (ticker , portfolio , dict_enriched ,
108108 max_positions = max_positions ,
109109 risk_per_trade = risk_per_trade ,
110110 atr_factor = atr_factor ,
111111 temp_positions_count = temp_positions_count ,
112112 temp_available_cash = temp_available_cash )
113+ temp_positions_count = new_temp_positions_count
114+ temp_available_cash = new_temp_available_cash
113115
114116 # aggiorna valori temporanei
115117 if ticker in dict_enriched ["BUY" ]:
@@ -201,14 +203,14 @@ def _calculate_atr(portfolio, ticker, period: int = 14) -> float:
201203 return float (atr ) if pd .notna (atr ) else 0.0
202204
203205
204- def _process_buy (ticker , portfolio , dict_enriched , max_positions , risk_per_trade , atr_factor ):
206+ def _process_buy (ticker , portfolio , dict_enriched , max_positions , risk_per_trade , atr_factor , temp_positions_count , temp_available_cash ):
205207 #logger.info(f"Processing BUY for ticker {ticker}")
206208
207209 positions_count = portfolio .get_positions_count ()
208210 #logger.info(f"Current positions count: {positions_count} / Max allowed: {max_positions}")
209211 if positions_count >= max_positions :
210212 logger .info (f"Max positions reached, skipping BUY for { ticker } " )
211- return
213+ return temp_positions_count , temp_available_cash
212214
213215 available_cash = portfolio .get_available_cash ()
214216 #logger.info(f"Available cash: {available_cash}")
@@ -221,13 +223,13 @@ def _process_buy(ticker, portfolio, dict_enriched, max_positions, risk_per_trade
221223 #logger.info(f"ATR for {ticker}: {atr}")
222224 if atr == 0 :
223225 logger .warning (f"ATR is zero for { ticker } , cannot calculate position size" )
224- return
226+ return temp_positions_count , temp_available_cash
225227
226228 risk_distance = atr * atr_factor
227229 #logger.info(f"Risk distance (ATR * factor {atr_factor}): {risk_distance}")
228230 if risk_distance == 0 :
229231 logger .warning (f"Risk distance is zero for { ticker } , skipping BUY" )
230- return
232+ return temp_positions_count , temp_available_cash
231233
232234 price = float (get_last_close (ticker ))
233235 #logger.info(f"Last close price for {ticker}: {price}")
@@ -238,7 +240,7 @@ def _process_buy(ticker, portfolio, dict_enriched, max_positions, risk_per_trade
238240 # Controllo cash disponibile
239241 if position_size < 1 or position_size * price > available_cash :
240242 logger .info (f"Position size too small or exceeds available cash, skipping BUY for { ticker } " )
241- return
243+ return temp_positions_count , temp_available_cash
242244
243245 stop = price - risk_distance
244246 dict_enriched ["BUY" ][ticker ] = {
@@ -249,3 +251,8 @@ def _process_buy(ticker, portfolio, dict_enriched, max_positions, risk_per_trade
249251 }
250252
251253 logger .info (f"BUY signal prepared for { ticker } : { dict_enriched ['BUY' ][ticker ]} " )
254+
255+ temp_positions_count += 1
256+ temp_available_cash += int (position_size ) * price
257+
258+ return temp_positions_count , temp_available_cash
0 commit comments