metaapi-cloud-copyfactory-sdk


Namemetaapi-cloud-copyfactory-sdk JSON
Version 11.1.0 PyPI version JSON
download
home_pageNone
SummaryPython SDK for SDK for CopyFactory trade copying API. Can copy trades both between MetaTrader 5 (MT5) and MetaTrader 4 (MT4). (https://metaapi.cloud)
upload_time2024-12-22 06:41:08
maintainerNone
docs_urlNone
authorNone
requires_python>=3.8
license(c) Copyright 2020-2023 MetaApi DMCC. All rights reserved See https://metaapi.cloud/terms for the license. The client library is provided as an open-source project to all metaapi.cloud users or developers free of charge provided you use it in order to implement applications which use metaapi.cloud API service. Provided the above condition is met and if needed by your project you can create derivative works from this code. However we strongly recommend you to create issues in our github repository instead, so that we can integrate the features you need into this project. The use of this code in competing projects or for implementing products which are not using metaapi.cloud API service is permitted only if you have a written approval from the MetaApi project owners.
keywords metaapi.cloud metatrader metatrader 5 metatrader 4 metatrader5 metatrader4 mt mt4 mt5 forex copy trading api rest client sdk cloud
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            CopyFactory trade copying API for Python (a member of `metaapi.cloud <https://metaapi.cloud>`_ project)
#######################################################################################################

CopyFactory is a powerful trade copying API which makes developing forex
trade copying applications as easy as writing few lines of code.

CopyFactory API is a member of MetaApi project (`https://metaapi.cloud <https://metaapi.cloud>`_),
a powerful cloud forex trading API which supports both MetaTrader 4 and MetaTrader 5 platforms.

MetaApi is a paid service, however we offer a free tier for testing and personal use.

The `MetaApi pricing <https://metaapi.cloud/#pricing>`_ was developed with the intent to make your charges less or equal to what you would have to pay
for hosting your own infrastructure. This is possible because over time we managed to heavily optimize
our MetaTrader infrastructure. And with MetaApi you can save significantly on application development and
maintenance costs and time thanks to high-quality API, open-source SDKs and convenience of a cloud service.

This SDK requires a 3.8+ version of Python to run.

Why do we offer CopyFactory API trade copying API
=================================================

We found that developing reliable and flexible trade copier is a task
which requires lots of effort, because developers have to solve a series
of complex technical tasks to create a product.

We decided to share our product as it allows developers to start with a
powerful solution in almost no time, saving on development and
infrastructure maintenance costs.

Frequently asked questions (FAQ)
================================

FAQ is located here: `https://metaapi.cloud/docs/copyfactory/faq/ <http://metaapi.cloud/docs/copyfactory/faq/>`_

CopyFactory copytrading API features
====================================

Features supported:

- low latency trade copying API
- reliable trade copying API
- suitable for large-scale deployments
- suitable for large number of subscribers
- connect arbitrary number of strategy providers and subscribers
- subscribe accounts to multiple strategies at once
- select arbitrary copy ratio for each subscription
- configure symbol mapping between strategy providers and subscribers
- apply advanced risk filters on strategy provider side
- override risk filters on subscriber side
- provide multiple strategies from a single account based on magic or symbol filters
- supports manual trading on subscriber accounts while copying trades
- synchronize subscriber account with strategy providers
- monitor trading history
- calculate trade copying commissions for account managers
- support portfolio strategies as trading signal source, i.e. the strategies which include signals of several other strategies (also known as combos on some platforms)

Please note that trade copying to MT5 netting accounts is not supported in the current API version

Please check Features section of the `https://metaapi.cloud/docs/copyfactory/ <https://metaapi.cloud/docs/copyfactory/>`_
documentation for detailed description of all settings you can make.

REST API documentation
======================

CopyFactory SDK is built on top of CopyFactory REST API.

CopyFactory REST API docs are available at `https://metaapi.cloud/docs/copyfactory/ <https://metaapi.cloud/docs/copyfactory/>`_

Code examples
=============

We published some code examples in our github repository, namely:

- Python: `https://github.com/metaapi/metaapi-copyfactory-python-sdk/tree/master/examples <https://github.com/metaapi/metaapi-copyfactory-python-sdk/tree/master/examples>`_

Installation
============

.. code-block:: bash

    pip install metaapi-cloud-sdk

Retrieving API token
====================

Please visit `https://app.metaapi.cloud/token <https://app.metaapi.cloud/token>`_ web UI to obtain your API token.

Configuring trade copying
=========================

In order to configure trade copying you need to:

- add MetaApi MetaTrader accounts with CopyFactory as application field value (see above)
- create CopyFactory provider and subscriber accounts and connect them to MetaApi accounts via connectionId field
- create a strategy being copied
- subscribe subscriber CopyFactory accounts to the strategy

.. code-block:: python

    from metaapi_cloud_sdk import MetaApi, CopyFactory

    token = '...'
    metaapi = MetaApi(token=token)
    copy_factory = CopyFactory(token=token)

    # retrieve MetaApi MetaTrader accounts with CopyFactory as application field value
    # provider account must have PROVIDER value in copyFactoryRoles
    provider_metaapi_account = await metaapi.metatrader_account_api.get_account(account_id='providerMetaapiAccountId')
    if (provider_metaapi_account is None) or provider_metaapi_account.copy_factory_roles is None or 'PROVIDER' not \
            in provider_metaapi_account.copy_factory_roles:
        raise Exception('Please specify PROVIDER copyFactoryRoles value in your MetaApi '
                        'account in order to use it in CopyFactory API')
    # subscriber account must have SUBSCRIBER value in copyFactoryRoles
    subscriber_metaapi_account = await metaapi.metatrader_account_api.get_account(account_id='subscriberMetaapiAccountId')
    if (subscriber_metaapi_account is None) or subscriber_metaapi_account.copy_factory_roles is None or 'SUBSCRIBER' not \
            in subscriber_metaapi_account.copy_factory_roles:
        raise Exception('Please specify SUBSCRIBER copyFactoryRoles value in your MetaApi '
                        'account in order to use it in CopyFactory API')

    configuration_api = copy_factory.configuration_api

    # create a strategy being copied
    strategy_id = await configuration_api.generate_strategy_id()
    await configuration_api.update_strategy(id=strategy_id['id'], strategy={
        'name': 'Test strategy',
        'description': 'Some useful description about your strategy',
        'accountId': provider_metaapi_account.id,
        'maxTradeRisk': 0.1,
        'stopOutRisk': {
            'value': 0.4,
            'startTime': '2020-08-24T00:00:00.000Z'
        },
        'timeSettings': {
            'lifetimeInHours': 192,
            'openingIntervalInMinutes': 5
        }
    })

    # subscribe subscriber CopyFactory accounts to the strategy
    await configuration_api.update_subscriber(subscriber_metaapi_account.id, {
        'name': 'Demo account',
        'subscriptions': [
            {
                'strategyId': strategy_id['id'],
                'multiplier': 1
            }
        ]
    })


See in-code documentation for full definition of possible configuration options.

Retrieving paginated lists
==========================

There are two groups of methods to retrieve paginated lists:

- with pagination in infinite scroll style
- with pagination in a classic style which allows you to calculate page count

They are applied to following entities:

- strategies: ``get_strategies_with_infinite_scroll_pagination`` and ``get_strategies_with_classic_pagination``
- provider portfolios: ``get_portfolio_strategies_with_infinite_scroll_pagination`` and ``get_portfolio_strategies_with_classic_pagination``
- subscribers: ``get_subscribers_with_infinite_scroll_pagination`` and ``get_subscribers_with_classic_pagination``

Example of retrieving strategies with pagination in infinite scroll style:

.. code-block:: python

    # paginate strategies, see in-code documentation for full list of filter options available.
    strategies = await api.metatrader_account_api.get_strategies_with_infinite_scroll_pagination(
        {'limit': 10, 'offset': 0}
    )

    # get strategies without filter (returns 1000 strategies max)
    strategies = await api.metatrader_account_api.get_strategies_with_infinite_scroll_pagination()
    strategy = None

    for s in strategies:
        if s['_id'] == 'strategyId':
            strategy = s
            break

Example of retrieving strategies with pagination in classic style:

.. code-block:: python

    # paginate strategies, see in-code documentation for full list of filter options available.
    strategies = await api.metatrader_account_api.get_strategies_with_classic_pagination({'limit': 10, 'offset': 0})
    strategy = None

    for s in strategies:
        if s['_id'] == 'strategyId':
            strategy = s
            break
    # number of all strategies matching filter without pagination options
    print(strategies['count'])

    # get strategies without filter (returns 1000 strategies max)
    strategies = await api.metatrader_account_api.get_strategies_with_classic_pagination()

Retrieving trade copying history
================================

CopyFactory allows you to monitor transactions conducted on trading accounts in real time.

Retrieving trading history on provider side
-------------------------------------------

.. code-block:: python

    history_api = copy_factory.history_api

    # retrieve trading history, please note that this method support pagination and limits number of records
    print(await history_api.get_provided_transactions(time_from=datetime.fromisoformat('2020-08-01'),
        time_till=datetime.fromisoformat('2020-09-01')))


Retrieving trading history on subscriber side
---------------------------------------------

.. code-block:: python

    history_api = copy_factory.history_api

    # retrieve trading history, please note that this method support pagination and limits number of records
    print(await history_api.get_subscription_transactions(time_from=datetime.fromisoformat('2020-08-01'),
        time_till=datetime.fromisoformat('2020-09-01')))

Resynchronizing subscriber accounts to providers
================================================
There is a configurable time limit during which the trades can be opened. Sometimes trades can not open in time due to broker errors or trading session time discrepancy.
You can resynchronize a subscriber account to place such late trades. Please note that positions which were
closed manually on a subscriber account will also be reopened during resynchronization.

.. code-block:: python

    account_id = '...' # CopyFactory account id

    # resynchronize all strategies
    await copy_factory.trading_api.resynchronize(account_id=account_id)

    # resynchronize specific strategy
    await copy_factory.trading_api.resynchronize(account_id=account_id, strategy_ids=['ABCD'])

Sending external trading signals to a strategy
==============================================
You can submit external trading signals to your trading strategy.

.. code-block:: python

    trading_api = copy_factory.trading_api
    signal_id = trading_api.generate_signal_id()

    # get strategy signal client
    strategy_signal_client = await trading_api.get_strategy_signal_client(strategy_id)

    # add trading signal
    await strategy_signal_client.update_external_signal(signal_id=signal_id, signal={
        'symbol': 'EURUSD',
        'type': 'POSITION_TYPE_BUY',
        'time': datetime.now(),
        'volume': 0.01
    })

    # get external signals
    print(await strategy_signal_client.get_external_signals())

    # remove signal
    await strategy_signal_client.remove_external_signal(signal_id=signal_id, signal={
        'time': datetime.now()
    })

Retrieving trading signals
==========================

.. code-block:: python

    subscriber_id = '...' # CopyFactory subscriber id
    subscriber_signal_client = await trading_api.get_subscriber_signal_client(subscriber_id)

    # retrieve trading signals
    print(await subscriber_signal_client.get_trading_signals())

Managing stopouts
=================
A subscription to a strategy can be stopped if the strategy have exceeded allowed risk limit.

.. code-block:: python

    trading_api = copy_factory.trading_api
    account_id = '...' # CopyFactory account id
    strategy_id = '...' # CopyFactory strategy id

    # retrieve list of strategy stopouts
    print(await trading_api.get_stopouts(account_id=account_id))

    # reset a stopout so that subscription can continue
    await trading_api.reset_subscription_stopouts(account_id=account_id, strategy_id=strategy_id, reason='daily-equity')

Managing stopout listeners
==========================
You can subscribe to a stream of stopout events using the stopout listener.

.. code-block:: python

    from metaapi_cloud_sdk import StopoutListener

    trading_api = copy_factory.trading_api

    # create a custom class based on the StopoutListener
    class Listener(StopoutListener):

        # specify the function called on event arrival
        async def on_stopout(self, strategy_stopout_event):
            print('Strategy stopout event', strategy_stopout_event)

        # specify the function called on error event
        async def on_error(self, error):
            print('Error event', error)

    # add listener
    listener = Listener()
    listener_id = trading_api.add_stopout_listener(listener)

    # remove listener
    trading_api.remove_stopout_listener(listener_id)

Retrieving subscriber trading logs
==================================

.. code-block:: python

    trading_api = copy_factory.trading_api
    account_id = '...' # CopyFactory account id

    # retrieve subscriber trading log
    print(await trading_api.get_user_log(account_id))

    # retrieve paginated subscriber trading log by time range
    print(await trading_api.get_user_log(account_id, datetime.fromtimestamp(datetime.now().timestamp() - 24 * 60 * 60), None, 20, 10))

Log streaming
=============
You can subscribe to a stream of strategy or subscriber log events using the user log listener.

Strategy logs
-------------

.. code-block:: python

    from metaapi_cloud_sdk import UserLogListener

    trading_api = copy_factory.trading_api

    # create a custom class based on the UserLogListener
    class Listener(UserLogListener):

        # specify the function called on event arrival
        async def on_user_log(self, log_event):
            print('Strategy user log event', log_event)

        # specify the function called on error event
        async def on_error(self, error):
            print('Error event', error)

    # add listener
    listener = Listener()
    listener_id = trading_api.add_strategy_log_listener(listener, 'ABCD')

    # remove listener
    trading_api.remove_strategy_log_listener(listener_id)

Subscriber logs
---------------

.. code-block:: python

    from metaapi_cloud_sdk import UserLogListener

    trading_api = copy_factory.trading_api

    # create a custom class based on the UserLogListener
    class Listener(UserLogListener):

        # specify the function called on event arrival
        async def on_user_log(self, log_event):
            print('Subscriber user log event', log_event)

        # specify the function called on error event
        async def on_error(self, error):
            print('Error event', error)

    # add listener
    listener = Listener()
    listener_id = trading_api.add_subscriber_log_listener(listener, 'accountId')

    # remove listener
    trading_api.remove_subscriber_log_listener(listener_id)

Transaction streaming
=====================
You can subscribe to a stream of strategy or subscriber transaction events using the transaction listener.

Strategy transactions
---------------------

.. code-block:: python

    from metaapi_cloud_sdk import TransactionListener

    history_api = copy_factory.history_api

    # create a custom class based on the TransactionListener
    class Listener(TransactionListener):

        # specify the function called on event arrival
        async def on_transaction(self, transaction_event):
            print('Strategy transaction event', transaction_event)

        # specify the function called on error event
        async def on_error(self, error):
            print('Error event', error)

    # add listener
    listener = Listener()
    listener_id = history_api.add_strategy_transaction_listener(listener, 'ABCD')

    # remove listener
    history_api.remove_strategy_transaction_listener(listener_id)

Subscriber transactions
-----------------------

.. code-block:: python

    from metaapi_cloud_sdk import TransactionListener

    history_api = copy_factory.history_api

    # create a custom class based on the TransactionListener
    class Listener(TransactionListener):

        # specify the function called on event arrival
        async def on_transaction(transaction_event):
            print('Subscriber transaction event', transaction_event)

        # specify the function called on error event
        async def on_error(self, error):
            print('Error event', error)

    # add listener
    listener = Listener()
    listener_id = history_api.add_strategy_transaction_listener(listener, 'ABCD')

    # remove listener
    history_api.remove_subscriber_transaction_listener(listener_id)

Webhooks
========

Webhooks can be created on specific strategies and their URLs can be provided to external systems to create external trading signals. The URL contains a secret webhook ID, so no extra authorization is required on a REST API invocation to a webhook.

.. code-block:: python

    strategy_id = '...'

    webhook = await copyfactory.configuration_api.create_webhook(strategy_id)
    url = webhook['url']

For example, if ``webhook.url`` is ``https://copyfactory-api-v1.london.agiliumtrade.ai/webhooks/yMLd8aviewgFfS4NBxZETkoVPbWAJ92t`` then a request can be sent to it to create an external signal:

.. code-block:: bash

    curl -X POST --header 'Content-Type: application/json' --header 'Accept: application/json' -d '{
      "symbol": "EURUSD",
      "type": "POSITION_TYPE_BUY",
      "time": "2024-12-19T06:52:19.679Z",
      "volume": 0.1
    }' 'https://copyfactory-api-v1.london.agiliumtrade.ai/webhooks/yMLd8aviewgFfS4NBxZETkoVPbWAJ92t'


Related projects:
=================

See our website for the full list of APIs and features supported `https://metaapi.cloud/#features <https://metaapi.cloud/#features>`_

Some of the APIs you might decide to use together with this module:

1. MetaApi cloud forex trading API `https://metaapi.cloud/docs/client/ <https://metaapi.cloud/docs/client/>`_
2. MetaTrader account management API `https://metaapi.cloud/docs/provisioning/ <https://metaapi.cloud/docs/provisioning/>`_
3. MetaStats cloud forex trading statistics API `https://metaapi.cloud/docs/metastats/ <https://metaapi.cloud/docs/metastats/>`_
4. MetaApi MT manager API `https://metaapi.cloud/docs/manager/ <https://metaapi.cloud/docs/manager/>`_
5. MetaApi risk management API `https://metaapi.cloud/docs/risk-management/ <https://metaapi.cloud/docs/risk-management/>`_

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "metaapi-cloud-copyfactory-sdk",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.8",
    "maintainer_email": null,
    "keywords": "metaapi.cloud, MetaTrader, MetaTrader 5, MetaTrader 4, MetaTrader5, MetaTrader4, MT, MT4, MT5, forex, copy trading, API, REST, client, sdk, cloud",
    "author": null,
    "author_email": "MetaApi <support@metaapi.cloud>",
    "download_url": "https://files.pythonhosted.org/packages/72/37/18db445d4ccffe31f36bfb0b946191836cc7f26e3106bd9d65ee8042a51d/metaapi_cloud_copyfactory_sdk-11.1.0.tar.gz",
    "platform": null,
    "description": "CopyFactory trade copying API for Python (a member of `metaapi.cloud <https://metaapi.cloud>`_ project)\n#######################################################################################################\n\nCopyFactory is a powerful trade copying API which makes developing forex\ntrade copying applications as easy as writing few lines of code.\n\nCopyFactory API is a member of MetaApi project (`https://metaapi.cloud <https://metaapi.cloud>`_),\na powerful cloud forex trading API which supports both MetaTrader 4 and MetaTrader 5 platforms.\n\nMetaApi is a paid service, however we offer a free tier for testing and personal use.\n\nThe `MetaApi pricing <https://metaapi.cloud/#pricing>`_ was developed with the intent to make your charges less or equal to what you would have to pay\nfor hosting your own infrastructure. This is possible because over time we managed to heavily optimize\nour MetaTrader infrastructure. And with MetaApi you can save significantly on application development and\nmaintenance costs and time thanks to high-quality API, open-source SDKs and convenience of a cloud service.\n\nThis SDK requires a 3.8+ version of Python to run.\n\nWhy do we offer CopyFactory API trade copying API\n=================================================\n\nWe found that developing reliable and flexible trade copier is a task\nwhich requires lots of effort, because developers have to solve a series\nof complex technical tasks to create a product.\n\nWe decided to share our product as it allows developers to start with a\npowerful solution in almost no time, saving on development and\ninfrastructure maintenance costs.\n\nFrequently asked questions (FAQ)\n================================\n\nFAQ is located here: `https://metaapi.cloud/docs/copyfactory/faq/ <http://metaapi.cloud/docs/copyfactory/faq/>`_\n\nCopyFactory copytrading API features\n====================================\n\nFeatures supported:\n\n- low latency trade copying API\n- reliable trade copying API\n- suitable for large-scale deployments\n- suitable for large number of subscribers\n- connect arbitrary number of strategy providers and subscribers\n- subscribe accounts to multiple strategies at once\n- select arbitrary copy ratio for each subscription\n- configure symbol mapping between strategy providers and subscribers\n- apply advanced risk filters on strategy provider side\n- override risk filters on subscriber side\n- provide multiple strategies from a single account based on magic or symbol filters\n- supports manual trading on subscriber accounts while copying trades\n- synchronize subscriber account with strategy providers\n- monitor trading history\n- calculate trade copying commissions for account managers\n- support portfolio strategies as trading signal source, i.e. the strategies which include signals of several other strategies (also known as combos on some platforms)\n\nPlease note that trade copying to MT5 netting accounts is not supported in the current API version\n\nPlease check Features section of the `https://metaapi.cloud/docs/copyfactory/ <https://metaapi.cloud/docs/copyfactory/>`_\ndocumentation for detailed description of all settings you can make.\n\nREST API documentation\n======================\n\nCopyFactory SDK is built on top of CopyFactory REST API.\n\nCopyFactory REST API docs are available at `https://metaapi.cloud/docs/copyfactory/ <https://metaapi.cloud/docs/copyfactory/>`_\n\nCode examples\n=============\n\nWe published some code examples in our github repository, namely:\n\n- Python: `https://github.com/metaapi/metaapi-copyfactory-python-sdk/tree/master/examples <https://github.com/metaapi/metaapi-copyfactory-python-sdk/tree/master/examples>`_\n\nInstallation\n============\n\n.. code-block:: bash\n\n    pip install metaapi-cloud-sdk\n\nRetrieving API token\n====================\n\nPlease visit `https://app.metaapi.cloud/token <https://app.metaapi.cloud/token>`_ web UI to obtain your API token.\n\nConfiguring trade copying\n=========================\n\nIn order to configure trade copying you need to:\n\n- add MetaApi MetaTrader accounts with CopyFactory as application field value (see above)\n- create CopyFactory provider and subscriber accounts and connect them to MetaApi accounts via connectionId field\n- create a strategy being copied\n- subscribe subscriber CopyFactory accounts to the strategy\n\n.. code-block:: python\n\n    from metaapi_cloud_sdk import MetaApi, CopyFactory\n\n    token = '...'\n    metaapi = MetaApi(token=token)\n    copy_factory = CopyFactory(token=token)\n\n    # retrieve MetaApi MetaTrader accounts with CopyFactory as application field value\n    # provider account must have PROVIDER value in copyFactoryRoles\n    provider_metaapi_account = await metaapi.metatrader_account_api.get_account(account_id='providerMetaapiAccountId')\n    if (provider_metaapi_account is None) or provider_metaapi_account.copy_factory_roles is None or 'PROVIDER' not \\\n            in provider_metaapi_account.copy_factory_roles:\n        raise Exception('Please specify PROVIDER copyFactoryRoles value in your MetaApi '\n                        'account in order to use it in CopyFactory API')\n    # subscriber account must have SUBSCRIBER value in copyFactoryRoles\n    subscriber_metaapi_account = await metaapi.metatrader_account_api.get_account(account_id='subscriberMetaapiAccountId')\n    if (subscriber_metaapi_account is None) or subscriber_metaapi_account.copy_factory_roles is None or 'SUBSCRIBER' not \\\n            in subscriber_metaapi_account.copy_factory_roles:\n        raise Exception('Please specify SUBSCRIBER copyFactoryRoles value in your MetaApi '\n                        'account in order to use it in CopyFactory API')\n\n    configuration_api = copy_factory.configuration_api\n\n    # create a strategy being copied\n    strategy_id = await configuration_api.generate_strategy_id()\n    await configuration_api.update_strategy(id=strategy_id['id'], strategy={\n        'name': 'Test strategy',\n        'description': 'Some useful description about your strategy',\n        'accountId': provider_metaapi_account.id,\n        'maxTradeRisk': 0.1,\n        'stopOutRisk': {\n            'value': 0.4,\n            'startTime': '2020-08-24T00:00:00.000Z'\n        },\n        'timeSettings': {\n            'lifetimeInHours': 192,\n            'openingIntervalInMinutes': 5\n        }\n    })\n\n    # subscribe subscriber CopyFactory accounts to the strategy\n    await configuration_api.update_subscriber(subscriber_metaapi_account.id, {\n        'name': 'Demo account',\n        'subscriptions': [\n            {\n                'strategyId': strategy_id['id'],\n                'multiplier': 1\n            }\n        ]\n    })\n\n\nSee in-code documentation for full definition of possible configuration options.\n\nRetrieving paginated lists\n==========================\n\nThere are two groups of methods to retrieve paginated lists:\n\n- with pagination in infinite scroll style\n- with pagination in a classic style which allows you to calculate page count\n\nThey are applied to following entities:\n\n- strategies: ``get_strategies_with_infinite_scroll_pagination`` and ``get_strategies_with_classic_pagination``\n- provider portfolios: ``get_portfolio_strategies_with_infinite_scroll_pagination`` and ``get_portfolio_strategies_with_classic_pagination``\n- subscribers: ``get_subscribers_with_infinite_scroll_pagination`` and ``get_subscribers_with_classic_pagination``\n\nExample of retrieving strategies with pagination in infinite scroll style:\n\n.. code-block:: python\n\n    # paginate strategies, see in-code documentation for full list of filter options available.\n    strategies = await api.metatrader_account_api.get_strategies_with_infinite_scroll_pagination(\n        {'limit': 10, 'offset': 0}\n    )\n\n    # get strategies without filter (returns 1000 strategies max)\n    strategies = await api.metatrader_account_api.get_strategies_with_infinite_scroll_pagination()\n    strategy = None\n\n    for s in strategies:\n        if s['_id'] == 'strategyId':\n            strategy = s\n            break\n\nExample of retrieving strategies with pagination in classic style:\n\n.. code-block:: python\n\n    # paginate strategies, see in-code documentation for full list of filter options available.\n    strategies = await api.metatrader_account_api.get_strategies_with_classic_pagination({'limit': 10, 'offset': 0})\n    strategy = None\n\n    for s in strategies:\n        if s['_id'] == 'strategyId':\n            strategy = s\n            break\n    # number of all strategies matching filter without pagination options\n    print(strategies['count'])\n\n    # get strategies without filter (returns 1000 strategies max)\n    strategies = await api.metatrader_account_api.get_strategies_with_classic_pagination()\n\nRetrieving trade copying history\n================================\n\nCopyFactory allows you to monitor transactions conducted on trading accounts in real time.\n\nRetrieving trading history on provider side\n-------------------------------------------\n\n.. code-block:: python\n\n    history_api = copy_factory.history_api\n\n    # retrieve trading history, please note that this method support pagination and limits number of records\n    print(await history_api.get_provided_transactions(time_from=datetime.fromisoformat('2020-08-01'),\n        time_till=datetime.fromisoformat('2020-09-01')))\n\n\nRetrieving trading history on subscriber side\n---------------------------------------------\n\n.. code-block:: python\n\n    history_api = copy_factory.history_api\n\n    # retrieve trading history, please note that this method support pagination and limits number of records\n    print(await history_api.get_subscription_transactions(time_from=datetime.fromisoformat('2020-08-01'),\n        time_till=datetime.fromisoformat('2020-09-01')))\n\nResynchronizing subscriber accounts to providers\n================================================\nThere is a configurable time limit during which the trades can be opened. Sometimes trades can not open in time due to broker errors or trading session time discrepancy.\nYou can resynchronize a subscriber account to place such late trades. Please note that positions which were\nclosed manually on a subscriber account will also be reopened during resynchronization.\n\n.. code-block:: python\n\n    account_id = '...' # CopyFactory account id\n\n    # resynchronize all strategies\n    await copy_factory.trading_api.resynchronize(account_id=account_id)\n\n    # resynchronize specific strategy\n    await copy_factory.trading_api.resynchronize(account_id=account_id, strategy_ids=['ABCD'])\n\nSending external trading signals to a strategy\n==============================================\nYou can submit external trading signals to your trading strategy.\n\n.. code-block:: python\n\n    trading_api = copy_factory.trading_api\n    signal_id = trading_api.generate_signal_id()\n\n    # get strategy signal client\n    strategy_signal_client = await trading_api.get_strategy_signal_client(strategy_id)\n\n    # add trading signal\n    await strategy_signal_client.update_external_signal(signal_id=signal_id, signal={\n        'symbol': 'EURUSD',\n        'type': 'POSITION_TYPE_BUY',\n        'time': datetime.now(),\n        'volume': 0.01\n    })\n\n    # get external signals\n    print(await strategy_signal_client.get_external_signals())\n\n    # remove signal\n    await strategy_signal_client.remove_external_signal(signal_id=signal_id, signal={\n        'time': datetime.now()\n    })\n\nRetrieving trading signals\n==========================\n\n.. code-block:: python\n\n    subscriber_id = '...' # CopyFactory subscriber id\n    subscriber_signal_client = await trading_api.get_subscriber_signal_client(subscriber_id)\n\n    # retrieve trading signals\n    print(await subscriber_signal_client.get_trading_signals())\n\nManaging stopouts\n=================\nA subscription to a strategy can be stopped if the strategy have exceeded allowed risk limit.\n\n.. code-block:: python\n\n    trading_api = copy_factory.trading_api\n    account_id = '...' # CopyFactory account id\n    strategy_id = '...' # CopyFactory strategy id\n\n    # retrieve list of strategy stopouts\n    print(await trading_api.get_stopouts(account_id=account_id))\n\n    # reset a stopout so that subscription can continue\n    await trading_api.reset_subscription_stopouts(account_id=account_id, strategy_id=strategy_id, reason='daily-equity')\n\nManaging stopout listeners\n==========================\nYou can subscribe to a stream of stopout events using the stopout listener.\n\n.. code-block:: python\n\n    from metaapi_cloud_sdk import StopoutListener\n\n    trading_api = copy_factory.trading_api\n\n    # create a custom class based on the StopoutListener\n    class Listener(StopoutListener):\n\n        # specify the function called on event arrival\n        async def on_stopout(self, strategy_stopout_event):\n            print('Strategy stopout event', strategy_stopout_event)\n\n        # specify the function called on error event\n        async def on_error(self, error):\n            print('Error event', error)\n\n    # add listener\n    listener = Listener()\n    listener_id = trading_api.add_stopout_listener(listener)\n\n    # remove listener\n    trading_api.remove_stopout_listener(listener_id)\n\nRetrieving subscriber trading logs\n==================================\n\n.. code-block:: python\n\n    trading_api = copy_factory.trading_api\n    account_id = '...' # CopyFactory account id\n\n    # retrieve subscriber trading log\n    print(await trading_api.get_user_log(account_id))\n\n    # retrieve paginated subscriber trading log by time range\n    print(await trading_api.get_user_log(account_id, datetime.fromtimestamp(datetime.now().timestamp() - 24 * 60 * 60), None, 20, 10))\n\nLog streaming\n=============\nYou can subscribe to a stream of strategy or subscriber log events using the user log listener.\n\nStrategy logs\n-------------\n\n.. code-block:: python\n\n    from metaapi_cloud_sdk import UserLogListener\n\n    trading_api = copy_factory.trading_api\n\n    # create a custom class based on the UserLogListener\n    class Listener(UserLogListener):\n\n        # specify the function called on event arrival\n        async def on_user_log(self, log_event):\n            print('Strategy user log event', log_event)\n\n        # specify the function called on error event\n        async def on_error(self, error):\n            print('Error event', error)\n\n    # add listener\n    listener = Listener()\n    listener_id = trading_api.add_strategy_log_listener(listener, 'ABCD')\n\n    # remove listener\n    trading_api.remove_strategy_log_listener(listener_id)\n\nSubscriber logs\n---------------\n\n.. code-block:: python\n\n    from metaapi_cloud_sdk import UserLogListener\n\n    trading_api = copy_factory.trading_api\n\n    # create a custom class based on the UserLogListener\n    class Listener(UserLogListener):\n\n        # specify the function called on event arrival\n        async def on_user_log(self, log_event):\n            print('Subscriber user log event', log_event)\n\n        # specify the function called on error event\n        async def on_error(self, error):\n            print('Error event', error)\n\n    # add listener\n    listener = Listener()\n    listener_id = trading_api.add_subscriber_log_listener(listener, 'accountId')\n\n    # remove listener\n    trading_api.remove_subscriber_log_listener(listener_id)\n\nTransaction streaming\n=====================\nYou can subscribe to a stream of strategy or subscriber transaction events using the transaction listener.\n\nStrategy transactions\n---------------------\n\n.. code-block:: python\n\n    from metaapi_cloud_sdk import TransactionListener\n\n    history_api = copy_factory.history_api\n\n    # create a custom class based on the TransactionListener\n    class Listener(TransactionListener):\n\n        # specify the function called on event arrival\n        async def on_transaction(self, transaction_event):\n            print('Strategy transaction event', transaction_event)\n\n        # specify the function called on error event\n        async def on_error(self, error):\n            print('Error event', error)\n\n    # add listener\n    listener = Listener()\n    listener_id = history_api.add_strategy_transaction_listener(listener, 'ABCD')\n\n    # remove listener\n    history_api.remove_strategy_transaction_listener(listener_id)\n\nSubscriber transactions\n-----------------------\n\n.. code-block:: python\n\n    from metaapi_cloud_sdk import TransactionListener\n\n    history_api = copy_factory.history_api\n\n    # create a custom class based on the TransactionListener\n    class Listener(TransactionListener):\n\n        # specify the function called on event arrival\n        async def on_transaction(transaction_event):\n            print('Subscriber transaction event', transaction_event)\n\n        # specify the function called on error event\n        async def on_error(self, error):\n            print('Error event', error)\n\n    # add listener\n    listener = Listener()\n    listener_id = history_api.add_strategy_transaction_listener(listener, 'ABCD')\n\n    # remove listener\n    history_api.remove_subscriber_transaction_listener(listener_id)\n\nWebhooks\n========\n\nWebhooks can be created on specific strategies and their URLs can be provided to external systems to create external trading signals. The URL contains a secret webhook ID, so no extra authorization is required on a REST API invocation to a webhook.\n\n.. code-block:: python\n\n    strategy_id = '...'\n\n    webhook = await copyfactory.configuration_api.create_webhook(strategy_id)\n    url = webhook['url']\n\nFor example, if ``webhook.url`` is ``https://copyfactory-api-v1.london.agiliumtrade.ai/webhooks/yMLd8aviewgFfS4NBxZETkoVPbWAJ92t`` then a request can be sent to it to create an external signal:\n\n.. code-block:: bash\n\n    curl -X POST --header 'Content-Type: application/json' --header 'Accept: application/json' -d '{\n      \"symbol\": \"EURUSD\",\n      \"type\": \"POSITION_TYPE_BUY\",\n      \"time\": \"2024-12-19T06:52:19.679Z\",\n      \"volume\": 0.1\n    }' 'https://copyfactory-api-v1.london.agiliumtrade.ai/webhooks/yMLd8aviewgFfS4NBxZETkoVPbWAJ92t'\n\n\nRelated projects:\n=================\n\nSee our website for the full list of APIs and features supported `https://metaapi.cloud/#features <https://metaapi.cloud/#features>`_\n\nSome of the APIs you might decide to use together with this module:\n\n1. MetaApi cloud forex trading API `https://metaapi.cloud/docs/client/ <https://metaapi.cloud/docs/client/>`_\n2. MetaTrader account management API `https://metaapi.cloud/docs/provisioning/ <https://metaapi.cloud/docs/provisioning/>`_\n3. MetaStats cloud forex trading statistics API `https://metaapi.cloud/docs/metastats/ <https://metaapi.cloud/docs/metastats/>`_\n4. MetaApi MT manager API `https://metaapi.cloud/docs/manager/ <https://metaapi.cloud/docs/manager/>`_\n5. MetaApi risk management API `https://metaapi.cloud/docs/risk-management/ <https://metaapi.cloud/docs/risk-management/>`_\n",
    "bugtrack_url": null,
    "license": "(c) Copyright 2020-2023 MetaApi DMCC. All rights reserved  See https://metaapi.cloud/terms for the license.  The client library is provided as an open-source project to all metaapi.cloud users or developers free of charge provided you use it in order to implement applications which use metaapi.cloud API service.  Provided the above condition is met and if needed by your project you can create derivative works from this code. However we strongly recommend you to create issues in our github repository instead, so that we can integrate the features you need into this project.  The use of this code in competing projects or for implementing products which are not using metaapi.cloud API service is permitted only if you have a written approval from the MetaApi project owners. ",
    "summary": "Python SDK for SDK for CopyFactory trade copying API. Can copy trades both between MetaTrader 5 (MT5) and MetaTrader 4 (MT4). (https://metaapi.cloud)",
    "version": "11.1.0",
    "project_urls": {
        "Homepage": "https://github.com/metaapi/metaapi-copyfactory-python-sdk"
    },
    "split_keywords": [
        "metaapi.cloud",
        " metatrader",
        " metatrader 5",
        " metatrader 4",
        " metatrader5",
        " metatrader4",
        " mt",
        " mt4",
        " mt5",
        " forex",
        " copy trading",
        " api",
        " rest",
        " client",
        " sdk",
        " cloud"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "e5e2b87962e4005511492e8417c0486d5e7884bad285c3538bb4c41644ae65f0",
                "md5": "36630ccf142883405991912264f477bd",
                "sha256": "7dcaecec3ea111d8f2a92834cae97397c6d4362edce02951ec664ceb2f67aa49"
            },
            "downloads": -1,
            "filename": "metaapi_cloud_copyfactory_sdk-11.1.0-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "36630ccf142883405991912264f477bd",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.8",
            "size": 61596,
            "upload_time": "2024-12-22T06:41:05",
            "upload_time_iso_8601": "2024-12-22T06:41:05.521565Z",
            "url": "https://files.pythonhosted.org/packages/e5/e2/b87962e4005511492e8417c0486d5e7884bad285c3538bb4c41644ae65f0/metaapi_cloud_copyfactory_sdk-11.1.0-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "723718db445d4ccffe31f36bfb0b946191836cc7f26e3106bd9d65ee8042a51d",
                "md5": "66af9e9719eeca37b6b24f357bb12832",
                "sha256": "d9c9996affef8b5f8f4bcecb055746cbd93691198e5f13e3da19c77a623d5d6d"
            },
            "downloads": -1,
            "filename": "metaapi_cloud_copyfactory_sdk-11.1.0.tar.gz",
            "has_sig": false,
            "md5_digest": "66af9e9719eeca37b6b24f357bb12832",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.8",
            "size": 52053,
            "upload_time": "2024-12-22T06:41:08",
            "upload_time_iso_8601": "2024-12-22T06:41:08.419447Z",
            "url": "https://files.pythonhosted.org/packages/72/37/18db445d4ccffe31f36bfb0b946191836cc7f26e3106bd9d65ee8042a51d/metaapi_cloud_copyfactory_sdk-11.1.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-12-22 06:41:08",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "metaapi",
    "github_project": "metaapi-copyfactory-python-sdk",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": false,
    "lcname": "metaapi-cloud-copyfactory-sdk"
}
        
Elapsed time: 0.40949s