
    'i2                     H   d dl mZmZmZmZ d dlZd dlmZ d dlmZmZm	Z	 d dl
Z
d dlmZ d dl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 d dlmZ d d	lmZ d d
lm Z  d dl!m"Z" d dl#m$Z$m%Z% d d	lmZ  G d de      Z& G d dejN                        Z( G d d ee(e            Z)y)    )absolute_importdivisionprint_functionunicode_literalsN)copy)datedatetime	timedelta)DataBase)		TimeFramenum2datedate2num
BrokerBaseOrderBuyOrder	SellOrder	OrderBase	OrderData)byteswith_metaclassMAXFLOAT)
MetaParams)CommInfoBase)Position)
oandastore)AutoDictAutoOrderedDictc                       e Zd Zd Zd Zy)OandaCommInfoc                     t        |      |z  S Nabsselfsizeprices      \/var/www/app/trading-bot/venv/lib/python3.12/site-packages/backtrader/brokers/oandabroker.pygetvaluesizezOandaCommInfo.getvaluesize*   s    4y5      c                     t        |      |z  S )z9Returns the needed amount of cash an operation would costr"   r$   s      r(   getoperationcostzOandaCommInfo.getoperationcost.   s     4y5  r*   N)__name__
__module____qualname__r)   r,    r*   r(   r   r   )   s    !!r*   r   c                        e Zd Z fdZ xZS )MetaOandaBrokerc                 Z    t         t        |   |||       | t        j                  _        y)z+Class has already been created ... registerN)superr2   __init__r   
OandaStore	BrokerCls)clsnamebasesdct	__class__s       r(   r5   zMetaOandaBroker.__init__5   s&     	os,T5#>*-
'r*   )r-   r.   r/   r5   __classcell__r<   s   @r(   r2   r2   4   s    . .r*   r2   c                        e Zd ZdZdd edd      ffZ fdZ fdZd	 Z fd
Z	d Z
ddZddZd Zd Zd Zd Zd Zd Zd Zd dZd Zd Z	 	 	 	 d!dZ	 	 	 	 d!dZd Zd Zd Zd Z xZS )"OandaBrokera~  Broker implementation for Oanda.

    This class maps the orders/positions from Oanda to the
    internal API of ``backtrader``.

    Params:

      - ``use_positions`` (default:``True``): When connecting to the broker
        provider use the existing positions to kickstart the broker.

        Set to ``False`` during instantiation to disregard any existing
        position
    )use_positionsT
commissiong      ?F)mult	stocklikec                    t         t        |           t        j                  di || _        t        j                         | _        t        j                         | _
        t        j                  t              | _        t               | _        dx| _        | _        dx| _        | _        t        j                  t(              | _        y )N        r0   )r4   r@   r5   r   r6   ocollectionsOrderedDictordersdequenotifsdefaultdictlistopendingdictbracketsstartingcashcashstartingvaluevaluer   	positions)r%   kwargsr<   s     r(   r5   zOandaBroker.__init__O   s    k4)+&&00!--/!'')#//5(++DI*--TZ$00:r*   c                    t         t        |           | j                  j                  |        | j                  j	                         x| _        x| _        }| j                  j                         x| _        | _	        | j                  j                  rb| j                  j                         D ]D  }t        d|d          |d   dk(  }|d   }|r| }|d   }t        ||      | j                  |d   <   F y y )N)brokerzposition for instrument:
instrumentsidesellunitsavgPrice)r4   r@   startrG   get_cashrR   rS   	get_valuerT   rU   prA   get_positionsprintr   rV   )r%   rS   rb   is_sellr&   r'   r<   s         r(   r_   zOandaBroker.start^   s    k4&(D!/3vv/@@@DI*.&&*:*:*<<TZ66VV))+ H0!L/BF)v-z 5D*2:42Gq/H  r*   c                 n   | j                  |      }|j                  dk  rt        ||j                  |j                  t        j
                  d      }|j                  | j                  |             |j                  d|j                  |j                  ddd|j                  dddd|j                  |j                         |j                          | j                  |       y |j                  dkD  rt        ||j                  |j                  t        j
                  d      }|j                  | j                  |             |j                  d|j                  |j                  ddd|j                  dddd|j                  |j                         |j                          | j                  |       y y )Nr   T)datar&   r'   exectype	simulatedrF   )getpositionr&   r   r'   r   Marketaddcomminfogetcommissioninfoexecute	completednotifyr   )r%   rg   posorders       r(   data_startedzOandaBroker.data_startedn   sU   t$88a<4#&88399',||(,.E
 d44T:;MM!SXXsyyS#((Cs((CII	/ OOKKXX\$"%((#))&+ll'+-E
 d44T:;MM!SXXsyyS#((Cs((CII	/ OOKK r*   c                 ^    t         t        |           | j                  j                          y r!   )r4   r@   stoprG   )r%   r<   s    r(   ru   zOandaBroker.stop   s    k4%'r*   c                 H    | j                   j                         x| _        }|S r!   )rG   r`   rS   )r%   rS   s     r(   getcashzOandaBroker.getcash   s    66??,,	Dr*   c                 X    | j                   j                         | _        | j                  S r!   )rG   ra   rU   )r%   datass     r(   getvaluezOandaBroker.getvalue   s     VV%%'
zzr*   c                 \    | j                   |j                     }|r|j                         }|S r!   )rV   	_datanameclone)r%   rg   r}   rq   s       r(   rj   zOandaBroker.getposition   s'    nnT^^,))+C
r*   c                 L    | j                   |j                     }|j                  S r!   )rJ   refstatusr%   rr   rG   s      r(   orderstatuszOandaBroker.orderstatus   s    KK		"xxr*   c                     | j                   |   }|j                  |        | j                  |       | j                  |      D ]$  }|j                  |        | j                  |       & y r!   )rJ   submitrp   _bracketnotifr%   orefrr   rG   s       r(   _submitzOandaBroker._submit   sX    D!TE##E* 	AHHTNKKN	r*   c                     | j                   |   }|j                  |        | j                  |       | j                  |d       y NT)cancel)rJ   rejectrp   _bracketizer%   r   rr   s      r(   _rejectzOandaBroker._reject   s;    D!TEt,r*   c                     | j                   |   }|j                          | j                  |       | j                  |      D ]$  }|j                  |        | j                  |       & y r!   )rJ   acceptrp   r   r   s       r(   _acceptzOandaBroker._accept   sU    D!E##E* 	AHHTNKKN	r*   c                     | j                   |   }|j                          | j                  |       | j                  |d       y r   )rJ   r   rp   r   r   s      r(   _cancelzOandaBroker._cancel   8    D!Et,r*   c                     | j                   |   }|j                          | j                  |       | j                  |d       y r   )rJ   expirerp   r   r   s      r(   _expirezOandaBroker._expire   r   r*   c                     t        |j                  d|j                        }| j                  j	                  |d       }||dd  S g S )Nr   )getattrparentr   rQ   get)r%   rr   prefbrs       r(   r   zOandaBroker._bracketnotif   sC    u||UEII6]]tT*.r"#w0b0r*   c                    t        |j                  d|j                        }| j                  j	                  |d       }|y |s|t        |      dk(  r,|dd  }|D ]  }|j                           || j                  |<   y t        |      dk(  r3|j                  |      }| j                  |d|z
     j                         y y |D ].  }|j                         s| j                  |j                         0 y )Nr            )
r   r   r   rQ   poplenactivateindexr   alive)r%   rr   r   r   r   rG   oidxs          r(   r   zOandaBroker._bracketize   s    u||UEII6]]tT*:2w!|V !AJJL!&(d#RAxxRD\--. 
  (779LL'(r*   c                    | j                   |   }|j                         st        |j                  d|j                        }|| j
                  vr4d}|j                  |j                  ||       | j                  ||||       y |dk(  r| j
                  |   d   }nL|dk(  r| j
                  |   d   }n4d}|j                  |j                  ||       | j                  ||||       y |j                  }	| j                  |	d	      }
|
j                  ||      \  }}}}| j                  |	      }d
x}}d
x}}d
x}}|j                  |	j                  d   ||||||||||||       |j                  j                  r"|j!                          | j#                  |       y |j%                          | j#                  |       | j'                  |       y )Nr   zzOrder fill received for {}, with price {} and size {} but order is no longer alive and is not a bracket. Unknown situationSTOP_LOSS_FILLEDr   TAKE_PROFIT_FILLEDzvOrder fill received for {}, with price {} and size {} but order is no longer alive and is a bracket. Unknown situationF)r}   rF   r   )rJ   r   r   r   r   rQ   formatput_notificationrg   rj   updaterm   rn   r	   executedremsizepartialrp   ro   r   )r%   r   r&   r'   ttyperW   rr   r   msgrg   rq   psizeppriceopenedclosedcomminfoclosedvalue
closedcommopenedvalue
openedcommmarginpnls                         r(   _fillzOandaBroker._fill   s   D!{{}5<<		:D4==(+ 

599eT2%%c5%> **d+B/..d+B/+ 

599eT2%%c5%>zzt51(+

4(?%vvv))$/#&&j#&&jdmmA&ek:k:cV		% >>!!MMOKKOOKKU#r*   c                    |j                   }t        |j                  d|      }|j                  r||k7  rt|}| j                  j                  |      \  }}|||fD ]  }|| j                  |j                   <    |||g| j                  |<   | j                  j                  |||       |S || j                  |j                   <   | j                  j                  |      S | j                  |   j                  |       |S )Nr   )r   r   r   transmitrO   r   rJ   rQ   rG   order_createappend)r%   rr   r   r   takesider   stopsiderG   s           r(   	_transmitzOandaBroker._transmit  s    yyu||UD1>>t| !#'==#4#4T#: 83 +A)*DKK&+ (.x&Bd###FHh? */EII&vv**511 	d""5)r*   c                     t        |||||||||
|||      } |j                  di | |j                  | j                  |             | j	                  |      S N)ownerrg   r&   r'   
pricelimitrh   validtradeidtrailamounttrailpercentr   r   r0   )r   addinforl   rm   r   r%   r   rg   r&   r'   plimitrh   r   r   ocor   r   r   r   rW   rr   s                   r(   buyzOandaBroker.buy2  se     u4"%F"*%%0| &	; 	$0067~~e$$r*   c                     t        |||||||||
|||      } |j                  di | |j                  | j                  |             | j	                  |      S r   )r   r   rl   rm   r   r   s                   r(   r\   zOandaBroker.sellC  se     D#5V#+5'&1!'(	< 	$0067~~e$$r*   c                     | j                   |j                     }|j                  t        j                  k(  ry | j
                  j                  |      S r!   )rJ   r   r   r   	CancelledrG   order_cancelr   s      r(   r   zOandaBroker.cancelT  s<    KK		"<<5??*vv""5))r*   c                 V    | j                   j                  |j                                y r!   )rL   r   r}   )r%   rr   s     r(   rp   zOandaBroker.notify[  s    5;;=)r*   c                 P    | j                   sy | j                   j                         S r!   )rL   popleftr%   s    r(   get_notificationzOandaBroker.get_notification^  s    {{{{""$$r*   c                 :    | j                   j                  d        y r!   )rL   r   r   s    r(   nextzOandaBroker.nextd  s    4 r*   r!   )T)F)
NNNNr   NNNNT)r-   r.   r/   __doc__r   paramsr5   r_   rs   ru   rw   rz   rj   r   r   r   r   r   r   r   r   r   r   r   r\   r   rp   r   r   r=   r>   s   @r(   r@   r@   <   s     	 	}#?@F
;H !F
---1
(,0$d4 &*6:+/"&	%$ '+7;,0#'	%"**%!r*   r@   )*
__future__r   r   r   r   rH   r   r	   r   r
   	threadingbacktrader.feedr   
backtraderr   r   r   r   r   r   r   r   r   backtrader.utils.py3r   r   r   backtrader.metabaser   backtrader.comminfor   backtrader.positionr   backtrader.storesr   backtrader.utilsr   r   r   r<   r2   r@   r0   r*   r(   <module>r      s   ** *   . .  $J J J @ @ * , ( ( 6 ,!L !.j** .i!.*= i!r*   