├── AttachStopLimitToPosition.py
├── AvailableSymbols.md
├── ChangeOrder.py
├── ChangePositionStopLimit.7z
├── CreateOCOOrder.py
├── EditOrder.7z
├── FXCM-MATLAB-master.zip
├── README.md
├── Unsubscribe.zip
├── fc_login_test.7z
└── fc_matlab_dll.zip
/AttachStopLimitToPosition.py:
--------------------------------------------------------------------------------
1 | # example code how to attach Stop or Limit to open position, each create_order_request() can attach one order, to attach stop and limit need to call this function 2 times
2 | # this code shows how to attach Limit, for a Stop replace order_type='S'
3 |
4 |
5 | import argparse
6 | from time import sleep
7 | from threading import Event
8 |
9 | from forexconnect import fxcorepy, ForexConnect, Common
10 |
11 | import common_samples
12 |
13 |
14 | def parse_args():
15 | parser = argparse.ArgumentParser(description='Process command parameters.')
16 | common_samples.add_main_arguments(parser)
17 | common_samples.add_instrument_timeframe_arguments(parser, timeframe=False)
18 | common_samples.add_direction_rate_lots_arguments(parser)
19 | common_samples.add_account_arguments(parser)
20 | args = parser.parse_args()
21 |
22 | return args
23 |
24 |
25 | class OrdersMonitor:
26 | def __init__(self):
27 | self.__order_id = None
28 | self.__orders = {}
29 | self.__event = Event()
30 |
31 | def on_added_order(self, _, __, order_row):
32 | order_id = order_row.order_id
33 | self.__orders[order_id] = order_row
34 | if self.__order_id == order_id:
35 | self.__event.set()
36 |
37 | def wait(self, time, order_id):
38 | self.__order_id = order_id
39 |
40 | order_row = self.find_order(order_id)
41 | if order_row is not None:
42 | return order_row
43 |
44 | self.__event.wait(time)
45 |
46 | return self.find_order(order_id)
47 |
48 | def find_order(self, order_id):
49 | if order_id in self.__orders:
50 | return self.__orders[order_id]
51 | else:
52 | return None
53 |
54 | def reset(self):
55 | self.__order_id = None
56 | self.__orders.clear()
57 | self.__event.clear()
58 |
59 |
60 | def main():
61 | str_user_id = 'username'
62 | str_password = 'password'
63 | str_url = 'www.fxcorporate.com/Hosts.jsp'
64 | str_connection = 'Demo'
65 | str_session_id = None
66 | str_pin = None
67 | str_instrument = 'CAD/JPY'
68 | str_buy_sell = 'B' # should be oposite direction than open position
69 | str_rate = 104.610
70 | str_lots = 10 # Quantity should be the same as open position
71 | str_account = 'account_id'
72 | trade_id = 'trade_id'
73 | stop_ord = 'S'
74 | limit_ord = 'L'
75 |
76 |
77 | with ForexConnect() as fx:
78 | fx.login(str_user_id, str_password, str_url, str_connection, str_session_id, str_pin, common_samples.session_status_changed)
79 |
80 | try:
81 | account = Common.get_account(fx, str_account)
82 | if not account:
83 | raise Exception("The account '{0}' is not valid".format(str_account))
84 |
85 | else:
86 | str_account = account.account_id
87 | print("AccountID='{0}'".format(str_account))
88 |
89 | offer = Common.get_offer(fx, str_instrument)
90 |
91 | if offer is None:
92 | raise Exception("The instrument '{0}' is not valid".format(str_instrument))
93 |
94 | login_rules = fx.login_rules
95 | trading_settings_provider = login_rules.trading_settings_provider
96 | base_unit_size = trading_settings_provider.get_base_unit_size(str_instrument, account)
97 | amount = base_unit_size * str_lots
98 |
99 | request = fx.create_order_request(
100 | order_type=limit_ord,
101 | OFFER_ID=offer.offer_id,
102 | ACCOUNT_ID=str_account,
103 | BUY_SELL=str_buy_sell,
104 | AMOUNT=amount,
105 | RATE=str_rate,
106 | TRADE_ID=trade_id,
107 | )
108 |
109 | orders_monitor = OrdersMonitor()
110 |
111 | orders_table = fx.get_table(ForexConnect.ORDERS)
112 | orders_listener = Common.subscribe_table_updates(orders_table, on_add_callback=orders_monitor.on_added_order)
113 |
114 | try:
115 | resp = fx.send_request(request)
116 | order_id = resp.order_id
117 |
118 | except Exception as e:
119 | common_samples.print_exception(e)
120 | orders_listener.unsubscribe()
121 |
122 | else:
123 | # Waiting for an order to appear or timeout (default 30)
124 | order_row = orders_monitor.wait(30, order_id)
125 | if order_row is None:
126 | print("Response waiting timeout expired.\n")
127 | else:
128 | print("The order has been added. OrderID={0:s}, "
129 | "Type={1:s}, BuySell={2:s}, Rate={3:.5f}, TimeInForce={4:s}".format(
130 | order_row.order_id, order_row.type, order_row.buy_sell, order_row.rate,
131 | order_row.time_in_force))
132 | sleep(1)
133 | orders_listener.unsubscribe()
134 |
135 | except Exception as e:
136 | common_samples.print_exception(e)
137 | try:
138 | fx.logout()
139 | except Exception as e:
140 | common_samples.print_exception(e)
141 |
142 |
143 | if __name__ == "__main__":
144 | main()
145 | input("Done! Press enter key to exit\n")
146 |
--------------------------------------------------------------------------------
/AvailableSymbols.md:
--------------------------------------------------------------------------------
1 | #Symbols and timeframes available from FXCM
2 |
3 | Below we have listed a small portion of most popular symbols and timeframes available for resolutions: 1minute, 1hour and 1day
4 | For a complete listing of available data please contact your FXCM representantive.
5 |
6 | |Symbol|m1 From|H1 From|D1 From
7 | |:---:|---|---|---
8 | |**EUR/USD**|2001-11-27T23:09:00Z|2001-10-21T18:00:00Z|1993-05-10T17:00:00Z
9 | |**USD/JPY**|2001-11-27T23:10:00Z|2001-10-21T18:00:00Z|1993-05-10T17:00:00Z
10 | |**GER30**|2008-09-10T05:01:00Z|2008-08-19T00:00:00Z|1970-02-10T17:00:00Z
11 | |**GBP/USD**|2001-11-27T23:09:00Z|2001-10-21T18:00:00Z|1993-05-10T17:00:00Z
12 | |**XAU/USD**|2009-02-24T16:00:00Z|2009-02-24T16:00:00Z|1920-01-29T17:00:00Z
13 | |**USD/CAD**|2001-11-27T23:13:00Z|2001-10-21T18:00:00Z|1993-05-10T17:00:00Z
14 | |**GBP/JPY**|2001-11-27T23:09:00Z|2001-10-21T18:00:00Z|1993-05-10T17:00:00Z
15 | |**AUD/USD**|2001-11-27T23:10:00Z|2001-10-21T18:00:00Z|1993-05-10T17:00:00Z
16 | |**US30**|2009-03-10T20:00:00Z|2008-08-19T06:00:00Z|1981-01-28T17:00:00Z
17 | |**EUR/JPY**|2001-11-27T23:09:00Z|2001-10-21T18:00:00Z|1993-05-10T17:00:00Z
18 | |**AUD/JPY**|2001-11-27T23:10:00Z|2001-10-21T18:00:00Z|1993-05-10T17:00:00Z
19 | |**NZD/USD**|2001-11-27T23:12:00Z|2001-10-21T18:00:00Z|1993-05-10T17:00:00Z
20 | |**EUR/GBP**|2001-11-27T23:09:00Z|2001-10-21T18:00:00Z|1993-05-10T17:00:00Z
21 | |**EUR/AUD**|2001-11-27T23:09:00Z|2001-10-21T18:00:00Z|1993-05-10T17:00:00Z
22 | |**UK100**|2008-09-10T05:01:00Z|2008-08-19T00:00:00Z|1986-04-01T17:00:00Z
23 |
--------------------------------------------------------------------------------
/ChangeOrder.py:
--------------------------------------------------------------------------------
1 | # example code how to change order, it can be used for any waiting order, attached stop or limit
2 | #the AMOUNT field is optional,
3 |
4 |
5 | import argparse
6 | from time import sleep
7 | from threading import Event
8 |
9 | from forexconnect import fxcorepy, ForexConnect, Common
10 |
11 | import common_samples
12 |
13 |
14 | def parse_args():
15 | parser = argparse.ArgumentParser(description='Process command parameters.')
16 | common_samples.add_main_arguments(parser)
17 | common_samples.add_instrument_timeframe_arguments(parser, timeframe=False)
18 | common_samples.add_direction_rate_lots_arguments(parser)
19 | common_samples.add_account_arguments(parser)
20 | args = parser.parse_args()
21 |
22 | return args
23 |
24 |
25 | class OrdersMonitor:
26 | def __init__(self):
27 | self.__order_id = None
28 | self.__orders = {}
29 | self.__event = Event()
30 |
31 | def on_added_order(self, _, __, order_row):
32 | order_id = order_row.order_id
33 | self.__orders[order_id] = order_row
34 | if self.__order_id == order_id:
35 | self.__event.set()
36 |
37 | def wait(self, time, order_id):
38 | self.__order_id = order_id
39 |
40 | order_row = self.find_order(order_id)
41 | if order_row is not None:
42 | return order_row
43 |
44 | self.__event.wait(time)
45 |
46 | return self.find_order(order_id)
47 |
48 | def find_order(self, order_id):
49 | if order_id in self.__orders:
50 | return self.__orders[order_id]
51 | else:
52 | return None
53 |
54 | def reset(self):
55 | self.__order_id = None
56 | self.__orders.clear()
57 | self.__event.clear()
58 |
59 |
60 | class Args:
61 | l = "username"
62 | p = "password"
63 | u = "http://www.fxcorporate.com/Hosts.jsp"
64 | c = "Demo"
65 | i = 'CAD/JPY'
66 | session = None
67 | pin = None
68 | lots = 10
69 | r = 104.568
70 | stop_ord = 'S'
71 | limit_ord = 'L'
72 | account = 'account id'
73 | order_id = 'order_id'
74 |
75 |
76 | def main():
77 | args = Args
78 | str_user_id = args.l
79 | str_password = args.p
80 | str_url = args.u
81 | str_connection = args.c
82 | str_session_id = args.session
83 | str_pin = args.pin
84 | str_instrument = args.i
85 | str_rate = args.r
86 | lots = args.lots
87 | str_account = args.account
88 | str_order_type = args.limit_ord
89 | order_id = args.order_id
90 |
91 |
92 | with ForexConnect() as fx:
93 | fx.login(str_user_id, str_password, str_url, str_connection, str_session_id, str_pin, common_samples.session_status_changed)
94 |
95 | try:
96 | account = Common.get_account(fx, str_account)
97 | if not account:
98 | raise Exception("The account '{0}' is not valid".format(str_account))
99 |
100 | else:
101 | str_account = account.account_id
102 | print("AccountID='{0}'".format(str_account))
103 |
104 | offer = Common.get_offer(fx, str_instrument)
105 |
106 | if offer is None:
107 | raise Exception("The instrument '{0}' is not valid".format(str_instrument))
108 |
109 | login_rules = fx.login_rules
110 | trading_settings_provider = login_rules.trading_settings_provider
111 | base_unit_size = trading_settings_provider.get_base_unit_size(str_instrument, account)
112 | amount = base_unit_size * lots
113 |
114 | request = fx.create_order_request(
115 | command=fxcorepy.Constants.Commands.EDIT_ORDER,
116 | order_type=str_order_type,
117 | OFFER_ID=offer.offer_id,
118 | ACCOUNT_ID=str_account,
119 | RATE=str_rate,
120 | AMOUNT=lots,
121 | ORDER_ID=order_id,
122 | )
123 |
124 | orders_monitor = OrdersMonitor()
125 |
126 | orders_table = fx.get_table(ForexConnect.ORDERS)
127 | orders_listener = Common.subscribe_table_updates(orders_table, on_add_callback=orders_monitor.on_added_order)
128 |
129 | try:
130 | resp = fx.send_request(request)
131 |
132 | except Exception as e:
133 | common_samples.print_exception(e)
134 | orders_listener.unsubscribe()
135 |
136 | except Exception as e:
137 | common_samples.print_exception(e)
138 | try:
139 | fx.logout()
140 | except Exception as e:
141 | common_samples.print_exception(e)
142 |
143 |
144 | if __name__ == "__main__":
145 | main()
146 | input("Done! Press enter key to exit\n")
147 |
--------------------------------------------------------------------------------
/ChangePositionStopLimit.7z:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fxcm/ForexConnectAPI/39158529b066e4149d75be78be72f9f3baf9593e/ChangePositionStopLimit.7z
--------------------------------------------------------------------------------
/CreateOCOOrder.py:
--------------------------------------------------------------------------------
1 | import argparse
2 | from distutils.cmd import Command
3 | from time import sleep
4 | from threading import Event
5 | from tkinter import COMMAND
6 |
7 | from forexconnect import fxcorepy, ForexConnect, Common
8 |
9 | import common_samples
10 |
11 |
12 | class OrdersMonitor:
13 | def __init__(self):
14 | self.__order_id = None
15 | self.__orders = {}
16 | self.__event = Event()
17 |
18 | def on_added_order(self, _, __, order_row):
19 | order_id = order_row.order_id
20 | self.__orders[order_id] = order_row
21 | if self.__order_id == order_id:
22 | self.__event.set()
23 |
24 | def wait(self, time, order_id):
25 | self.__order_id = order_id
26 |
27 | order_row = self.find_order(order_id)
28 | if order_row is not None:
29 | return order_row
30 |
31 | self.__event.wait(time)
32 |
33 | return self.find_order(order_id)
34 |
35 | def find_order(self, order_id):
36 | if order_id in self.__orders:
37 | return self.__orders[order_id]
38 | else:
39 | return None
40 |
41 | def reset(self):
42 | self.__order_id = None
43 | self.__orders.clear()
44 | self.__event.clear()
45 |
46 | class Args:
47 | l = "YOUR USERNAME / LOGIN"
48 | p = "PASSWORD"
49 | u = "http://www.fxcorporate.com/Hosts.jsp"
50 | c = "Demo"
51 | i = 'EUR/USD'
52 | session = None
53 | pin = None
54 | amount = 10000
55 | r_up = 1.059
56 | r_dn = 1.051
57 | account = 'ACCOUNT ID'
58 |
59 |
60 | def main():
61 | args = Args
62 |
63 | str_user_id = args.l
64 | str_password = args.p
65 | str_url = args.u
66 | str_connection = args.c
67 | str_session_id = args.session
68 | str_pin = args.pin
69 | str_instrument = args.i
70 | rate_up = args.r_up
71 | rate_dn = args.r_dn
72 | str_amount = args.amount
73 | str_account = args.account
74 |
75 | with ForexConnect() as fx:
76 | fx.login(str_user_id, str_password, str_url, str_connection, str_session_id, str_pin, common_samples.session_status_changed)
77 |
78 | try:
79 | account = Common.get_account(fx, str_account)
80 | if not account:
81 | raise Exception(
82 | "The account '{0}' is not valid".format(str_account))
83 |
84 | else:
85 | str_account = account.account_id
86 | print("AccountID='{0}'".format(str_account))
87 |
88 | offer = Common.get_offer(fx, str_instrument)
89 |
90 | if offer is None:
91 | raise Exception(
92 | "The instrument '{0}' is not valid".format(str_instrument))
93 |
94 | login_rules = fx.login_rules
95 |
96 | trading_settings_provider = login_rules.trading_settings_provider
97 |
98 | base_unit_size = trading_settings_provider.get_base_unit_size(
99 | str_instrument, account)
100 |
101 | valuemap_oco = fx.session.request_factory.create_value_map()
102 | valuemap_oco.set_string(fxcorepy.O2GRequestParamsEnum.COMMAND, fxcorepy.Constants.Commands.CREATE_OCO)
103 |
104 | valuemap_up = fx.session.request_factory.create_value_map()
105 | valuemap_up.set_string(fxcorepy.O2GRequestParamsEnum.COMMAND, fxcorepy.Constants.Commands.CREATE_ORDER)
106 | valuemap_up.set_string(fxcorepy.O2GRequestParamsEnum.ORDER_TYPE, fxcorepy.Constants.Orders.STOP_ENTRY)
107 | valuemap_up.set_string(fxcorepy.O2GRequestParamsEnum.ACCOUNT_ID, str_account)
108 | valuemap_up.set_string(fxcorepy.O2GRequestParamsEnum.OFFER_ID, offer.offer_id)
109 | valuemap_up.set_string(fxcorepy.O2GRequestParamsEnum.BUY_SELL, fxcorepy.Constants.BUY)
110 | valuemap_up.set_int(fxcorepy.O2GRequestParamsEnum.AMOUNT, str_amount)
111 | valuemap_up.set_double(fxcorepy.O2GRequestParamsEnum.RATE, rate_up)
112 | valuemap_oco.append_child(valuemap_up)
113 |
114 | valuemap_down = fx.session.request_factory.create_value_map()
115 | valuemap_down.set_string(fxcorepy.O2GRequestParamsEnum.COMMAND, fxcorepy.Constants.Commands.CREATE_ORDER)
116 | valuemap_down.set_string(fxcorepy.O2GRequestParamsEnum.ORDER_TYPE, fxcorepy.Constants.Orders.STOP_ENTRY)
117 | valuemap_down.set_string(fxcorepy.O2GRequestParamsEnum.ACCOUNT_ID, str_account)
118 | valuemap_down.set_string(fxcorepy.O2GRequestParamsEnum.OFFER_ID, offer.offer_id)
119 | valuemap_down.set_string(fxcorepy.O2GRequestParamsEnum.BUY_SELL, fxcorepy.Constants.SELL)
120 | valuemap_down.set_int(fxcorepy.O2GRequestParamsEnum.AMOUNT, str_amount)
121 | valuemap_down.set_double(fxcorepy.O2GRequestParamsEnum.RATE, rate_dn)
122 | valuemap_oco.append_child(valuemap_down)
123 |
124 | request = fx.session.request_factory.create_order_request(valuemap_oco)
125 |
126 | orders_monitor = OrdersMonitor()
127 |
128 | orders_table = fx.get_table(ForexConnect.ORDERS)
129 | orders_listener = Common.subscribe_table_updates(orders_table, on_add_callback=orders_monitor.on_added_order)
130 |
131 | try:
132 | resp = fx.send_request(request)
133 | order_id = resp.order_id
134 |
135 | except Exception as e:
136 | common_samples.print_exception(e)
137 | orders_listener.unsubscribe()
138 |
139 | else:
140 | # Waiting for an order to appear or timeout (default 30)
141 | order_row = orders_monitor.wait(30, order_id)
142 | if order_row is None:
143 | print("Response waiting timeout expired.\n")
144 | else:
145 | print("The order has been added. OrderID={0:s}, "
146 | "Type={1:s}, BuySell={2:s}, Rate={3:.5f}, TimeInForce={4:s}".format(
147 | order_row.order_id, order_row.type, order_row.buy_sell, order_row.rate,
148 | order_row.time_in_force))
149 | sleep(1)
150 | orders_listener.unsubscribe()
151 |
152 | except Exception as e:
153 | common_samples.print_exception(e)
154 | try:
155 | fx.logout()
156 | except Exception as e:
157 | common_samples.print_exception(e)
158 |
159 |
160 | if __name__ == "__main__":
161 | main()
162 | input("Done! Press enter key to exit\n")
163 |
--------------------------------------------------------------------------------
/EditOrder.7z:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fxcm/ForexConnectAPI/39158529b066e4149d75be78be72f9f3baf9593e/EditOrder.7z
--------------------------------------------------------------------------------
/FXCM-MATLAB-master.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fxcm/ForexConnectAPI/39158529b066e4149d75be78be72f9f3baf9593e/FXCM-MATLAB-master.zip
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # ForexConnectAPI
2 |
3 | This SDK is designed to get trading data, trade, load price histories and subscribe for the most recent prices.
4 | It is intended to be used by FXCM clients on auto-trading robots and systems,
5 | chart and market analysis application, custom trading application on FXCM accounts.
6 |
7 | Forex Connect supports C++, C#, Java, VB, VBA, Windows, Linux and smart phones. And it is free.
8 |
9 | You can use ForexConnect on Trading station account, no extra setup required.
10 |
11 | If using O2G2 namespace, keep in mind that it is currently deprecated as it has not been updated since the beginning of 2015.
12 | It may give the users errors or not be compatible in certain cases.
13 |
14 | ## How to start:
15 | 1) You need sign the [EULA](https://www.fxcm.com/uk/forms/eula/) form first.
16 | 2) A FXCM TSII account. You can apply for a demo account [here](https://www.fxcm.com/uk/algorithmic-trading/api-trading/).
17 | 3) Download [**ForexConnect SDK**](http://www.fxcodebase.com/wiki/index.php/Download)
18 | 4) Examples codes and documents are at ForexConnectAPI packages after installed.
19 | 5) Online documents: [**Getting Started**](https://apiwiki.fxcorporate.com/api/Getting%20Started.pdf)
20 | 6) ForexConnect with Matlab, at [here](https://apiwiki.fxcorporate.com/api/StrategyRealCaseStudy/ForexConnectAPI/FXCM-MATLAB-master.zip).
21 | 7) ForexConnect sample code for Android/iOS/macOS/Python/Linux/Windows, at [here](https://github.com/gehtsoft/forex-connect/tree/master/samples).
22 | 8) ForexConnect on Python at [here](http://fxcodebase.com/code/viewforum.php?f=51)
23 |
24 | ## Connect parameters:
25 | 1) URL="www.fxcorporate.com/Hosts.jsp"
26 | 2) Username="you username"
27 | 3) Password="your password"
28 | 4) Connection="demo"
29 | 5) You can ignore SessionID and PIN
30 |
31 | ## Suggested Popular Development Platform IDE:
32 | [**Windows 32bit and 64bit – Visual Studio 2005 and up**](https://www.visualstudio.com/en-us/downloads/download-visual-studio-vs.aspx)
33 |
34 | [**Linux 32bit and 64bit – Eclipse**](https://eclipse.org/)
35 |
36 | [**iOS – Xcode**](https://developer.apple.com/xcode/ide/)
37 |
38 | [**Android - Android Studio**](https://developer.android.com/studio/intro/index.html)
39 |
40 | ## Table manager vs Non-table manager:
41 | Table manager preload all tables to your local memoery, it is an in-memory representation of API tables. The table manager allows you to subscribe to table change events such as updates, adding rows, or removing rows. It is important to note that the
42 | SummaryTable is only accessible through the table manager.
43 | Table manager presents a performance decrease because it is constantly recalculating fields.
44 | Non-table manager allow you to capture table updates adhoc via the use of a class that implements theIO2GResponseListener interface. It give performance advantage but you need to calculate some fields such as PipCost or P/L.
45 |
46 | ## How to get current balance?
47 | You need to request the table from server. please refer to NonTableManagerSamples/PrintTable example program.
48 |
49 | private static O2GAccountRow GetAccount(O2GSession session)
50 | {
51 | O2GResponseReaderFactory readerFactory = session.getResponseReaderFactory();
52 | if (readerFactory == null)
53 | {
54 | throw new Exception("Cannot create response reader factory");
55 | }
56 | O2GLoginRules loginRules = session.getLoginRules();
57 | O2GResponse response = loginRules.getTableRefreshResponse(O2GTableType.Accounts);
58 | O2GAccountsTableResponseReader accountsResponseReader = readerFactory.createAccountsTableReader(response);
59 | for (int i = 0; i < accountsResponseReader.Count; i++)
60 | {
61 | O2GAccountRow accountRow = accountsResponseReader.getRow(i);
62 | Console.WriteLine("AccountID: {0}, Balance: {1}", accountRow.AccountID, accountRow.Balance);
63 | }
64 | return accountsResponseReader.getRow(0);
65 | }
66 |
67 | ## How to get price history:
68 | For pricehistory, you need to use non-table manage.
69 | You can see examples under NonTableManagerSamples/GetHistPrices
70 |
71 |
72 | ## Real Case Study:
73 | 1. Learn how to build and backtest Rsi signals using ForexConnect API at here.
74 | 2. Learn how to build and backtest CCI Oscillator strategy using ForexConnect API at here.
75 | 3. Learn how to build and backtest Breakout strategy using ForexConnect API at here.
76 | 4. Learn how to build and backtest Range Stochastic Strategy using ForexConnect API at here.
77 | 5. Learn how to build and backtest Mean Reversion Strategy using ForexConnect API at here.
78 | 6. Some examples like attached stop limit to position, create if-then ELS order, get rollover at here.
79 | 7. ForexConnect with Matlab, is coming....
80 | 8. Using ForexConnect downloading historical data at here.
81 |
82 | ## Note:
83 | o This is for personal use and abides by our [EULA](https://www.fxcm.com//forms/eula/)
84 |
85 | o For more information, you may contact us: api@fxcm.com
86 |
87 | ## Release Note:
88 | Our price streams are moving from http to https using TLSv1.2 since 6/16/2019, to increase security on our price servers.
89 | Please make sure client side software is compatible with TLSv1.2.
90 | Clients use ForexConnect API, Java API will be affected.
91 | The error you will get: ‘Can't connect to price server.’
92 | if you have any questions, please reach out to api@fxcm.com.
93 |
94 | ### Due to security enhancement on our server side, http request by ForexConnect API users need switch to https.
95 | End user need to upgrade their FC API package on their side.
96 | First round release will target to demo environments this coming weekend. 5/1/2021
97 | This release to demo target at 7/9/2021
98 |
99 | ### the above release to live will target in mid-end August/2021.
100 | Please make sure you are ready.
101 | Please send mail to api@fxcm.com if you have any questions.
102 |
103 | please upgrade the latest version at
104 |
105 | https://pypi.org/project/forexconnect/
106 |
107 | https://fxcodebase.com/wiki/index.php/Download
108 |
109 | ### Performance improvment release
110 | We did some performance improvement and released to Demo. It should transparent to API users.
111 |
112 | However, you are welcome to test your current setting on Demo and contact api@fxcm.com if you experience any issues.
113 |
114 | If everything goes well, we plan to release to Production by the end of next week. Dec 17 2022.
115 |
116 |
117 | ## Disclaimer:
118 |
119 | Stratos Group is a holding company of Stratos Markets Limited, Stratos Europe Limited, Stratos Trading Pty. Limited, Stratos South Africa (Pty) Ltd, Stratos Global LLC and all affiliates of aforementioned firms, or other firms under the Stratos Group of companies (collectively "Stratos Group").
120 | The Stratos Group is headquartered at 20 Gresham Street, 4th Floor, London EC2V 7JE, United Kingdom. Stratos Markets Limited is authorised and regulated in the UK by the Financial Conduct Authority. Registration number 217689. Registered in England and Wales with Companies House company number 04072877. Stratos Europe Limited (trading as "FXCM"), is a Cyprus Investment Firm ("CIF") registered with the Cyprus Department of Registrar of Companies (HE 405643) and authorised and regulated by the Cyprus Securities and Exchange Commission ("CySEC") under license number 392/20. Stratos Trading Pty. Limited (trading as "FXCM") (AFSL 309763, ABN 31 121 934 432) is regulated by the Australian Securities and Investments Commission. The information provided by FXCM is intended for residents of Australia and is not directed at any person in any country or jurisdiction where such distribution or use would be contrary to local law or regulation. Please read the full Terms and Conditions. Stratos South Africa (Pty) Ltd is an authorized Financial Services Provider and is regulated by the Financial Sector Conduct Authority under registration number 46534. Stratos Global LLC ("FXCM") is incorporated in St Vincent and the Grenadines with company registration No. 1776 LLC 2022 and is an operating subsidiary within the Stratos Group. FXCM is not required to hold any financial services license or authorization in St Vincent and the Grenadines to offer its products and services. Stratos Global Services, LLC is an operating subsidiary within the Stratos Group. Stratos Global Services, LLC is not regulated and not subject to regulatory oversight.
121 | Stratos Markets Limited: CFDs are complex instruments and come with a high risk of losing money rapidly due to leverage. 62% of retail investor accounts lose money when trading CFDs with this provider. You should consider whether you understand how CFDs work and whether you can afford to take the high risk of losing your money.
122 | Stratos Europe Limited: CFDs are complex instruments and come with a high risk of losing money rapidly due to leverage. 65% of retail investor accounts lose money when trading CFDs with this provider. You should consider whether you understand how CFDs work and whether you can afford to take the high risk of losing your money.
123 | Stratos Trading Pty. Limited: Trading CFDs on margin and margin FX carries a high level of risk, and may not be suitable for all investors. Retail clients could sustain a total loss of the deposited funds, but wholesale clients could sustain losses in excess of deposits. Trading CFDs on margin and margin FX does not give you any entitlements or rights to the underlying instruments.
124 | Stratos Global LLC: Our products are traded on leverage which means they carry a high level of risk and you could lose more than your deposits. These products are not suitable for all investors. Please ensure you fully understand the risks and carefully consider your financial situation and trading experience before trading. Seek independent advice if necessary.
125 | Past Performance: Past Performance is not an indicator of future results.
126 |
--------------------------------------------------------------------------------
/Unsubscribe.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fxcm/ForexConnectAPI/39158529b066e4149d75be78be72f9f3baf9593e/Unsubscribe.zip
--------------------------------------------------------------------------------
/fc_login_test.7z:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fxcm/ForexConnectAPI/39158529b066e4149d75be78be72f9f3baf9593e/fc_login_test.7z
--------------------------------------------------------------------------------
/fc_matlab_dll.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fxcm/ForexConnectAPI/39158529b066e4149d75be78be72f9f3baf9593e/fc_matlab_dll.zip
--------------------------------------------------------------------------------