7. Entry Orders¶
This section covers entry orders.
In [1]:
import fxcmpy
import pandas as pd
import datetime as dt
con = fxcmpy.fxcmpy(config_file='fxcm.cfg')
7.1. Existing Orders¶
After connecting the FXCM Server, fxcmpy
collects all existing
orders. list
or DataFrame
object of the existing orders is
returned by the con.get_orders()
method.
In [2]:
con.get_orders().T # returns DataFrame by default
Out[2]:
0 | 1 | |
---|---|---|
accountId | 2815291 | 2815291 |
accountName | 02815291 | 02815291 |
amountK | 300 | 30 |
buy | 110 | 0 |
currency | USD/JPY | EUR/USD |
currencyPoint | 26.7011 | 3 |
expireDate | 12012018110000 | 10112018000000 |
isBuy | True | False |
isELSOrder | False | False |
isEntryOrder | True | True |
isLimitOrder | True | False |
isNetQuantity | False | False |
isStopOrder | False | True |
limit | 112 | 1.12 |
limitPegBaseType | -1 | -1 |
limitRate | 112 | 1.12 |
ocoBulkId | 0 | 423235902 |
orderId | 422719537 | 423235903 |
range | 0 | 0 |
ratePrecision | 3 | 5 |
sell | 0 | 1.13 |
status | 1 | 1 |
stop | 0 | 1.15 |
stopMove | 0 | 0 |
stopPegBaseType | -1 | -1 |
stopRate | 0 | 1.15 |
t | 3 | 3 |
time | 07122018091708 | 07122018143856 |
timeInForce | GTD | GTD |
tradeId | 186558353 | 186829211 |
type | LE | SE |
In [3]:
con.get_orders(kind='list') # returns a list
Out[3]:
[{'accountId': '2815291',
'accountName': '02815291',
'amountK': 300,
'buy': 110,
'currency': 'USD/JPY',
'currencyPoint': 26.70156,
'expireDate': '12012018110000',
'isBuy': True,
'isELSOrder': False,
'isEntryOrder': True,
'isLimitOrder': True,
'isNetQuantity': False,
'isStopOrder': False,
'limit': 112,
'limitPegBaseType': -1,
'limitRate': 112,
'ocoBulkId': 0,
'orderId': '422719537',
'range': 0,
'ratePrecision': 3,
'sell': 0,
'status': 1,
'stop': 0,
'stopMove': 0,
'stopPegBaseType': -1,
'stopRate': 0,
't': 3,
'time': '07122018091708',
'timeInForce': 'GTD',
'tradeId': '186558353',
'type': 'LE'},
{'accountId': '2815291',
'accountName': '02815291',
'amountK': 30,
'buy': 0,
'currency': 'EUR/USD',
'currencyPoint': 3,
'expireDate': '10112018000000',
'isBuy': False,
'isELSOrder': False,
'isEntryOrder': True,
'isLimitOrder': False,
'isNetQuantity': False,
'isStopOrder': True,
'limit': 1.12,
'limitPegBaseType': -1,
'limitRate': 1.12,
'ocoBulkId': 423235902,
'orderId': '423235903',
'range': 0,
'ratePrecision': 5,
'sell': 1.13,
'status': 1,
'stop': 1.15,
'stopMove': 0,
'stopPegBaseType': -1,
'stopRate': 1.15,
't': 3,
'time': '07122018143856',
'timeInForce': 'GTD',
'tradeId': '186829211',
'type': 'SE'}]
Each order has a unique order_id
, these ids
are returned by
con.get_order_ids()
.
In [4]:
con.get_order_ids()
Out[4]:
[422719537, 423235903]
7.2. Placing Entry Orders¶
Entry orders are placed via the con.create_entry_order()
method. For
a detailed description of the parameters refer to the FXCM API
documentation.
In [5]:
order = con.create_entry_order(symbol='USD/JPY', is_buy=True,
amount=300, limit=112,
is_in_pips = False,
time_in_force='GTD', expiration='2108-10-01',
rate=110, stop=None, trailing_step=None,
trailing_stop_step=None)
In [6]:
con.get_orders().T
Out[6]:
0 | 1 | 2 | |
---|---|---|---|
accountId | 2815291 | 2815291 | 2815291 |
accountName | 02815291 | 02815291 | 02815291 |
amountK | 300 | 30 | 300 |
buy | 110 | 0 | 110 |
currency | USD/JPY | EUR/USD | USD/JPY |
currencyPoint | 26.7016 | 3 | 26.7016 |
expireDate | 12012018110000 | 10112018000000 | 10012108000000 |
isBuy | True | False | True |
isELSOrder | False | False | False |
isEntryOrder | True | True | True |
isLimitOrder | True | False | True |
isNetQuantity | False | False | False |
isStopOrder | False | True | False |
limit | 112 | 1.12 | 112 |
limitPegBaseType | -1 | -1 | -1 |
limitRate | 112 | 1.12 | 112 |
ocoBulkId | 0 | 423235902 | 0 |
orderId | 422719537 | 423235903 | 424767349 |
range | 0 | 0 | 0 |
ratePrecision | 3 | 5 | 3 |
sell | 0 | 1.13 | 0 |
status | 1 | 1 | 1 |
stop | 0 | 1.15 | 0 |
stopMove | 0 | 0 | 0 |
stopPegBaseType | -1 | -1 | -1 |
stopRate | 0 | 1.15 | 0 |
t | 3 | 3 | 3 |
time | 07122018091708 | 07122018143856 | 07162018145702255 |
timeInForce | GTD | GTD | GTD |
tradeId | 186558353 | 186829211 | 187584382 |
type | LE | SE | LE |
7.3. Changing Orders¶
There are two methods to change entry orders:
change_order_stop_limit()
to change an order’s stop or limit rate.change_order()
to change an order’s amount, rate, order range and/or trailing step.
In [7]:
order_id = con.get_order_ids()[-1]
In [8]:
order_id
Out[8]:
424767349
In [9]:
con.change_order_stop_limit(order_id=order_id, is_stop_in_pips=True,
is_limit_in_pips=True, limit=110, stop=-1)
In [10]:
con.change_order(order_id=order_id, amount=500, rate=112)
The order is changed accordingly.
In [11]:
con.get_orders().T
Out[11]:
0 | 1 | 2 | |
---|---|---|---|
accountId | 2815291 | 2815291 | 2815291 |
accountName | 02815291 | 02815291 | 02815291 |
amountK | 300 | 30 | 500 |
buy | 110 | 0 | 112 |
currency | USD/JPY | EUR/USD | USD/JPY |
currencyPoint | 26.6999 | 3 | 44.4998 |
expireDate | 12012018110000 | 10112018000000 | 10012108000000 |
isBuy | True | False | True |
isELSOrder | False | False | False |
isEntryOrder | True | True | True |
isLimitOrder | True | False | True |
isNetQuantity | False | False | False |
isStopOrder | False | True | False |
limit | 112 | 1.12 | 110 |
limitPegBaseType | -1 | -1 | 0 |
limitRate | 112 | 1.12 | 113.1 |
ocoBulkId | 0 | 423235902 | 0 |
orderId | 422719537 | 423235903 | 424767349 |
range | 0 | 0 | 0 |
ratePrecision | 3 | 5 | 3 |
sell | 0 | 1.13 | 0 |
status | 1 | 1 | 1 |
stop | 0 | 1.15 | -1 |
stopMove | 0 | 0 | 0 |
stopPegBaseType | -1 | -1 | 1 |
stopRate | 0 | 1.15 | 111.968 |
t | 3 | 3 | 3 |
time | 07122018091708 | 07122018143856 | 07162018145707783 |
timeInForce | GTD | GTD | GTD |
tradeId | 186558353 | 186829211 | 187584382 |
type | LE | SE | LE |
7.4. Deleting Orders¶
Orders can be deleted through the method con.delete_orders()
.
In [12]:
order_id = con.get_order_ids()[0]
order_id
Out[12]:
422719537
In [13]:
con.delete_order(order_id)
In [14]:
con.get_orders().T
Out[14]:
0 | 1 | |
---|---|---|
accountId | 2815291 | 2815291 |
accountName | 02815291 | 02815291 |
amountK | 30 | 500 |
buy | 0 | 112 |
currency | EUR/USD | USD/JPY |
currencyPoint | 3 | 44.5 |
expireDate | 10112018000000 | 10012108000000 |
isBuy | False | True |
isELSOrder | False | False |
isEntryOrder | True | True |
isLimitOrder | False | True |
isNetQuantity | False | False |
isStopOrder | True | False |
limit | 1.12 | 110 |
limitPegBaseType | -1 | 0 |
limitRate | 1.12 | 113.1 |
ocoBulkId | 423235902 | 0 |
orderId | 423235903 | 424767349 |
range | 0 | 0 |
ratePrecision | 5 | 3 |
sell | 1.13 | 0 |
status | 1 | 1 |
stop | 1.15 | -1 |
stopMove | 0 | 0 |
stopPegBaseType | -1 | 1 |
stopRate | 1.15 | 111.969 |
t | 3 | 3 |
time | 07122018143856 | 07162018145707783 |
timeInForce | GTD | GTD |
tradeId | 186829211 | 187584382 |
type | SE | LE |
Deleted or executed orders of the current session are stored in the
attribute old_orders
as an fxcm_order
object.
In [15]:
con.old_orders
Out[15]:
{422719537: <fxcmpy.fxcmpy_order.fxcmpy_order at 0x7eff1a3a1ba8>}
In [16]:
con.close()