{"id":7029,"date":"2025-08-28T22:11:59","date_gmt":"2025-08-29T03:11:59","guid":{"rendered":"https:\/\/librarytestdev.wpenginepowered.com\/?post_type=doc&#038;p=7029"},"modified":"2026-06-29T13:32:37","modified_gmt":"2026-06-29T18:32:37","slug":"processing-external-algo-requests","status":"publish","type":"doc","link":"https:\/\/library-staging.tradingtechnologies.com\/apis\/tt-core-sdk\/creating-a-tt-application-server\/processing-external-algo-requests\/","title":{"rendered":"Processing External Algo Requests"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">OnStartRequest()<a href=\"https:\/\/d2a60r40jam9et.cloudfront.net\/tt-core-sdk\/cs-processing-external-algo-requests.html#onstartrequest\"><\/a><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">There are several ways to design a mechanism to launch algos within your process. One such approach is to first create a pure virtual base class that defines the semantics for managing the algo. For example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\n#pragma once\n#include &lt;sdkalgo.h&gt;\nclass BaseStrategy\n{\n  public:\n    BaseStrategy() {};\n    virtual ~BaseStrategy() {};\n\n    \/\/ handle the requests from the TT SDK\n    virtual bool Start(ttsdk::SDKAlgoPtr algoOrder, ttsdk::SDKAlgoRequestPtr req) = 0;\n    virtual void Update(ttsdk::SDKAlgoRequestPtr req) = 0;\n    virtual void Stop(ttsdk::SDKAlgoRequestPtr req) = 0;\n    virtual void Pause(ttsdk::SDKAlgoRequestPtr req) = 0;\n    virtual void Resume(ttsdk::SDKAlgoRequestPtr req) = 0;\n};\n\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Each algo would then be defined by a class which derives from and provides implementation for:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>BaseStrategy\n<ul class=\"wp-block-list\">\n<li>virtual bool Start(ttsdk::SDKAlgoPtr algoOrder, ttsdk::SDKAlgoRequestPtr req) = 0;<\/li>\n\n\n\n<li>virtual void Update(ttsdk::SDKAlgoRequestPtr req) = 0;<\/li>\n\n\n\n<li>virtual void Stop(ttsdk::SDKAlgoRequestPtr req) = 0;<\/li>\n\n\n\n<li>virtual void Pause(ttsdk::SDKAlgoRequestPtr req) = 0;<\/li>\n\n\n\n<li>virtual void Resume(ttsdk::SDKAlgoRequestPtr req) = 0;<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>ttsdk::IPriceEventHandler\n<ul class=\"wp-block-list\">\n<li>virtual void OnUnsubscribed(const uint64_t subId);<\/li>\n\n\n\n<li>virtual void OnDisconnect(const uint64_t subId, const ttsdk::InstrumentPtr&amp;, const ttsdk::PriceEventType);<\/li>\n\n\n\n<li>virtual void OnPriceUpdate(const uint64_t, const ttsdk::InstrumentPtr&amp;, const ttsdk::PriceSnap&amp; snap);<\/li>\n\n\n\n<li>virtual void OnError(const uint64_t subId, const ttsdk::InstrumentPtr&amp; instrument, const ttsdk::SubscriptionError code, const char* error);<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>ttsdk::IOrderEventHandler\n<ul class=\"wp-block-list\">\n<li>virtual void OnUnsubscribed(const char*);<\/li>\n\n\n\n<li>virtual void OnExecutionReport(ttsdk::OrderPtr order, ttsdk::ExecutionReportPtr execRpt);<\/li>\n\n\n\n<li>virtual void OnReject(ttsdk::OrderPtr order, ttsdk::RejectResponsePtr rejResp);<\/li>\n\n\n\n<li>virtual void OnSendFailed(ttsdk::OrderPtr order, const ttsdk::OrderProfile&amp; profile, const ttsdk::IOrderEventHandler::SendCode code);<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">For Example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\nclass TrailingCrossStrategy : public BaseStrategy, \n    public ttsdk::IOrderEventHandler,\n    public ttsdk::IPriceEventHandler\n    {\n    public:\n    TrailingCrossStrategy(SDKAlgoManager&amp; mgr)\n        {   \/\/  \u2026  }\n    virtual ~TrailingCrossStrategy()\n        {   \/\/  \u2026  }\n\n    \/\/  from BaseStrategy\n    virtual bool Start(ttsdk::SDKAlgoPtr algoOrder, ttsdk::SDKAlgoRequestPtr req)\n        {   \/\/  \u2026  }\n    virtual void Update(ttsdk::SDKAlgoRequestPtr req)\n        {   \/\/  \u2026  }\n    virtual void Stop(ttsdk::SDKAlgoRequestPtr req)\n        {   \/\/  \u2026  }\n    virtual void Pause(ttsdk::SDKAlgoRequestPtr req)\n        {   \/\/  \u2026  }\n    virtual void Resume(ttsdk::SDKAlgoRequestPtr req)\n        {   \/\/  \u2026  }\n\n    \/\/ from ttsdk::IPriceEventHandler\n    virtual void OnUnsubscribed(const uint64_t subId)\n        {   \/\/  \u2026  }\n    virtual void OnDisconnect(const uint64_t subId, const ttsdk::InstrumentPtr&amp;, const ttsdk::PriceEventType)\n        {   \/\/  \u2026  }\n    virtual void OnPriceUpdate(const uint64_t, const ttsdk::InstrumentPtr&amp;, const ttsdk::PriceSnap&amp; snap)\n        {   \/\/  \u2026  }\n    virtual void OnError(const uint64_t subId, const ttsdk::InstrumentPtr&amp; instrument, const ttsdk::SubscriptionError code, const char* error)\n        {   \/\/  \u2026  }\n\n    \/\/ from ttsdk::IOrderEventHandler\n    virtual void OnUnsubscribed(const char*)\n        {   \/\/  \u2026  }\n    virtual void OnExecutionReport(ttsdk::OrderPtr order, ttsdk::ExecutionReportPtr execRpt)\n        {   \/\/  \u2026  }\n    virtual void OnReject(ttsdk::OrderPtr order, ttsdk::RejectResponsePtr rejResp)\n        {   \/\/  \u2026  }\n    virtual void OnSendFailed(ttsdk::OrderPtr order, const ttsdk::OrderProfile&amp; profile, const ttsdk::IOrderEventHandler::SendCode code)\n        {   \/\/  \u2026  }\n    };\n\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">We can then add a collection to store instances of the algos being launched to the SDKAlgoManager class.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\n\nclass SDKAlgoManager : public ttsdk::ISDKAlgoManager\n    {\n    \/\/  \u2026\n\n    protected:\n    mutable std::mutex mutexStrategies_;\n    std::map&lt; std::string, std::shared_ptr &gt; strategies_;\n    };\n\nThe SDKAlgoManager::OnStartRequest() method would then be written as follows.\n\nvoid SDKAlgoManager::OnStartRequest(ttsdk::SDKAlgoPtr algoOrder, \nttsdk::SDKAlgoRequestPtr req)\n    {\n    auto algo = algoOrder-&gt;GetAlgoDefinition();\n\n    if (strncmp(algo-&gt;GetName(), \"TrailingXSDKAlgo\", sizeof(algo-&gt;GetName())) == 0)\n        {\n        std::shared_ptr strategy(new TrailingCrossStrategy(*this));\n        if (strategy-&gt;Start(algoOrder, req))\n            {\n            std::unique_lock lock(mutexStrategies_);\n            strategies_.insert(std::make_pair(req-&gt;GetOrderId(), strategy));\n            }\n        }\n    else if (strncmp(algo-&gt;GetName(), \"StrikerAlgo\", sizeof(algo-&gt;GetName())) == 0)\n        {\n        std::shared_ptr strategy(new StrikerAlgo(*this));\n        if (strategy&gt;Start(algoOrder, req))\n            {\n            std::unique_lock lock(mutexStrategies_);\n            strategies_.insert(std::make_pair(req-&gt;GetOrderId(), strategy));\n            }\n        }\n    else\n        {\n        \/\/  \u2026\n        }\n    }\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">OnUpdateRequest()<a href=\"https:\/\/d2a60r40jam9et.cloudfront.net\/tt-core-sdk\/cs-processing-external-algo-requests.html#onupdaterequest\"><\/a><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Once an algo has been started, external update messages are forwarded to it from the TT UI as follows:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\nvoid SDKAlgoManager::OnUpdateRequest(ttsdk::SDKAlgoPtr algoOrder, \nttsdk::SDKAlgoRequestPtr req)\n{\n    std::shared_ptr strategy(nullptr);\n    {\n        std::unique_lock lock(this-&gt;mutexStrategies_);\n        auto iter = strategies_.find(algoOrder-&gt;GetOrderId());\n        if (iter != strategies_.end())\n        {\n            strategy = iter-&gt;second;\n        }\n    }\n    if (strategy)\n    {\n        return strategy-&gt;Update(req);\n    }\n}\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">OnStopRequest()<a href=\"https:\/\/d2a60r40jam9et.cloudfront.net\/tt-core-sdk\/cs-processing-external-algo-requests.html#onstoprequest\"><\/a><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Once an algo has been started, external stop messages are forwarded to it from the TT UI as follows:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\nvoid SDKAlgoManager::OnStopRequest(ttsdk::SDKAlgoPtr algoOrder, \nttsdk::SDKAlgoRequestPtr req)\n{\n    std::shared_ptr strategy(nullptr);\n    {\n        std::unique_lock lock(this-&gt;mutexStrategies_);\n        auto iter = strategies_.find(algoOrder-&gt;GetOrderId());\n        if (iter != strategies_.end())\n        {\n            strategy = iter-&gt;second;\n        }\n    }\n    if (strategy)\n    {\n        return strategy-&gt;Stop(req);\n    }\n}\n <\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">OnPauseRequest()<a href=\"https:\/\/d2a60r40jam9et.cloudfront.net\/tt-core-sdk\/cs-processing-external-algo-requests.html#onpauserequest\"><\/a><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Once an algo has been started, external pause messages are forwarded to it from the TT UI as follows:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\nvoid SDKAlgoManager::OnPauseRequest(ttsdk::SDKAlgoPtr algoOrder, \nttsdk::SDKAlgoRequestPtr req)\n{\n    std::shared_ptr strategy(nullptr);\n    {\n        std::unique_lock lock(this-&gt;mutexStrategies_);\n        auto iter = strategies_.find(algoOrder-&gt;GetOrderId());\n        if (iter != strategies_.end())\n        {\n            strategy = iter-&gt;second;\n        }\n    }\n    if (strategy)\n    {\n        return strategy-&gt;Pause(req);\n    }\n}\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">OnResumeRequest()<a href=\"https:\/\/d2a60r40jam9et.cloudfront.net\/tt-core-sdk\/cs-processing-external-algo-requests.html#onresumerequest\"><\/a><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Once an algo has been started, external resume messages are forwarded to it from the TT UI as follows:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\nvoid SDKAlgoManager::OnResumeRequest(ttsdk::SDKAlgoPtr algoOrder, \nttsdk::SDKAlgoRequestPtr req)\n{\n    std::shared_ptr strategy(nullptr);\n    {\n        std::unique_lock lock(this-&gt;mutexStrategies_);\n        auto iter = strategies_.find(algoOrder-&gt;GetOrderId());\n        if (iter != strategies_.end())\n        {\n            strategy = iter-&gt;second;\n        }\n    }\n    if (strategy)\n    {\n        return strategy-&gt;Resume(req);\n    }\n}\n <\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<h2 class=\"wp-block-heading\">OnStartRequest()<a href=\"https:\/\/d2a60r40jam9et.cloudfront.net\/tt-core-sdk\/cs-processing-external-algo-requests.html#onstartrequest\"><\/a><\/h2>\n<p class=\"wp-block-paragraph\">There are several ways to design a mechanism to launch algos within your process. One such approach is to first create a pure virtual base class that defines the semantics for managing the algo. For example:<\/p>\n<p class=\"wp-block-paragraph\">Each algo would then be defined by a class which derives from and provides implementation for:<\/p>\n<p class=\"wp-block-paragraph\">For Example:<\/p>\n<p class=\"wp-block-paragraph\">We can then add a collection to store instances of the algos being launched to the SDKAlgoManager class.<\/p>\n<h2 class=\"wp-block-heading\">OnUpdateRequest()<a href=\"https:\/\/d2a60r40jam9et.cloudfront.net\/tt-core-sdk\/cs-processing-external-algo-requests.html#onupdaterequest\"><\/a><\/h2>\n<p class=\"wp-block-paragraph\">Once an algo has been started, external update messages are forwarded to it from the TT UI as follows:<\/p>\n<h2 class=\"wp-block-heading\">OnStopRequest()<a href=\"https:\/\/d2a60r40jam9et.cloudfront.net\/tt-core-sdk\/cs-processing-external-algo-requests.html#onstoprequest\"><\/a><\/h2>\n<p class=\"wp-block-paragraph\">Once an algo has been started, external stop messages are forwarded to it from the TT UI as follows:<\/p>\n<h2 class=\"wp-block-heading\">OnPauseRequest()<a href=\"https:\/\/d2a60r40jam9et.cloudfront.net\/tt-core-sdk\/cs-processing-external-algo-requests.html#onpauserequest\"><\/a><\/h2>\n<p class=\"wp-block-paragraph\">Once an algo has been started, external pause messages are forwarded to it from the TT UI as follows:<\/p>\n<h2 class=\"wp-block-heading\">OnResumeRequest()<a href=\"https:\/\/d2a60r40jam9et.cloudfront.net\/tt-core-sdk\/cs-processing-external-algo-requests.html#onresumerequest\"><\/a><\/h2>\n<p class=\"wp-block-paragraph\">Once an algo has been started, external resume messages are forwarded to it from the TT UI as follows:<\/p>\n","protected":false},"author":2,"template":"wp-custom-template-single-doc-tt-core-sdk","meta":{"_acf_changed":false,"footnotes":""},"docs-category":[449],"class_list":["post-7029","doc","type-doc","status-publish","hentry","docs-category-creating-a-tt-application-server"],"acf":[],"_links":{"self":[{"href":"https:\/\/library-staging.tradingtechnologies.com\/ja\/wp-json\/wp\/v2\/doc\/7029","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/library-staging.tradingtechnologies.com\/ja\/wp-json\/wp\/v2\/doc"}],"about":[{"href":"https:\/\/library-staging.tradingtechnologies.com\/ja\/wp-json\/wp\/v2\/types\/doc"}],"author":[{"embeddable":true,"href":"https:\/\/library-staging.tradingtechnologies.com\/ja\/wp-json\/wp\/v2\/users\/2"}],"version-history":[{"count":2,"href":"https:\/\/library-staging.tradingtechnologies.com\/ja\/wp-json\/wp\/v2\/doc\/7029\/revisions"}],"predecessor-version":[{"id":59693,"href":"https:\/\/library-staging.tradingtechnologies.com\/ja\/wp-json\/wp\/v2\/doc\/7029\/revisions\/59693"}],"wp:attachment":[{"href":"https:\/\/library-staging.tradingtechnologies.com\/ja\/wp-json\/wp\/v2\/media?parent=7029"}],"wp:term":[{"taxonomy":"docs-category","embeddable":true,"href":"https:\/\/library-staging.tradingtechnologies.com\/ja\/wp-json\/wp\/v2\/docs-category?post=7029"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}