diff --git a/TT_NET_CLIENT_SIDE/TTNETAPI_Sample_Console_OMA_ADL/App.config b/TT_NET_CLIENT_SIDE/TTNETAPI_Sample_Console_OMA_ADL/App.config
new file mode 100644
index 0000000..80a0a78
--- /dev/null
+++ b/TT_NET_CLIENT_SIDE/TTNETAPI_Sample_Console_OMA_ADL/App.config
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/TT_NET_CLIENT_SIDE/TTNETAPI_Sample_Console_OMA_ADL/Program.cs b/TT_NET_CLIENT_SIDE/TTNETAPI_Sample_Console_OMA_ADL/Program.cs
new file mode 100644
index 0000000..dc3161f
--- /dev/null
+++ b/TT_NET_CLIENT_SIDE/TTNETAPI_Sample_Console_OMA_ADL/Program.cs
@@ -0,0 +1,70 @@
+// **********************************************************************************************************************
+//
+// Copyright © 2005-2026 Trading Technologies International, Inc.
+// All Rights Reserved Worldwide
+//
+// * * * S T R I C T L Y P R O P R I E T A R Y * * *
+//
+// WARNING: This file and all related programs (including any computer programs, example programs, and all source code)
+// are the exclusive property of Trading Technologies International, Inc. ("TT"), are protected by copyright law and
+// international treaties, and are for use only by those with the express written permission from TT. Unauthorized
+// possession, reproduction, distribution, use or disclosure of this file and any related program (or document) derived
+// from it is prohibited by State and Federal law, and by local law outside of the U.S. and may result in severe civil
+// and criminal penalties.
+//
+// ************************************************************************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+
+
+namespace TTNETAPI_Sample_Console_OMA_ADL
+{
+ class Program
+ {
+ static void Main(string[] args)
+ {
+ try
+ {
+ // Add your app secret Key here. It looks like: 00000000-0000-0000-0000-000000000000:00000000-0000-0000-0000-000000000000
+ string appSecretKey = "Add your app secret Key here";
+
+ // Set the environment the app needs to run in here
+ tt_net_sdk.ServiceEnvironment environment = tt_net_sdk.ServiceEnvironment.DevCert;
+ // Select the mode in which you wish to run -- Client (outside the TT datacenter)
+ // or Server (on a dedicated machine inside TT datacenter)
+ tt_net_sdk.TTAPIOptions.SDKMode sdkMode = tt_net_sdk.TTAPIOptions.SDKMode.Server;
+ tt_net_sdk.TTAPIOptions apiConfig = new tt_net_sdk.TTAPIOptions(
+ sdkMode,
+ environment,
+ appSecretKey,
+ 5000);
+
+
+ // Start the TT API on the same thread
+ TTNetApiFunctions tf = new TTNetApiFunctions();
+
+ Thread workerThread = new Thread(() => tf.Start(apiConfig));
+ workerThread.Name = "TT NET SDK Thread";
+ workerThread.Start();
+
+ while (true)
+ {
+ string input = System.Console.ReadLine();
+ if (input == "q")
+ break;
+ }
+ tf.Dispose();
+ }
+ catch (Exception e)
+ {
+ Console.WriteLine(e.Message + "\n" + e.StackTrace);
+ }
+
+ }
+ }
+}
diff --git a/TT_NET_CLIENT_SIDE/TTNETAPI_Sample_Console_OMA_ADL/Properties/AssemblyInfo.cs b/TT_NET_CLIENT_SIDE/TTNETAPI_Sample_Console_OMA_ADL/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..8605a62
--- /dev/null
+++ b/TT_NET_CLIENT_SIDE/TTNETAPI_Sample_Console_OMA_ADL/Properties/AssemblyInfo.cs
@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("TTNETAPI_Sample_Console_OMA_ADL")]
+[assembly: AssemblyDescription("TT .NET SDK Sample - OMA ADL OCO Order Routing")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("Trading Technologies International, Inc.")]
+[assembly: AssemblyProduct("TTNETAPI_Sample_Console_OMA_ADL")]
+[assembly: AssemblyCopyright("Copyright © 2026 Trading Technologies International, Inc.")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components. If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("f8e9a1b2-3c4d-5e6f-7a8b-9c0d1e2f3a4b")]
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/TT_NET_CLIENT_SIDE/TTNETAPI_Sample_Console_OMA_ADL/TTNETAPI_Sample_Console_OMA_ADL.csproj b/TT_NET_CLIENT_SIDE/TTNETAPI_Sample_Console_OMA_ADL/TTNETAPI_Sample_Console_OMA_ADL.csproj
new file mode 100644
index 0000000..4e80bc5
--- /dev/null
+++ b/TT_NET_CLIENT_SIDE/TTNETAPI_Sample_Console_OMA_ADL/TTNETAPI_Sample_Console_OMA_ADL.csproj
@@ -0,0 +1,100 @@
+
+
+
+
+ Debug
+ x64
+ {F8E9A1B2-3C4D-5E6F-7A8B-9C0D1E2F3A4B}
+ Exe
+ TTNETAPI_Sample_Console_OMA_ADL
+ TTNETAPI_Sample_Console_OMA_ADL
+ v4.6.1
+ 512
+ true
+ true
+
+
+
+
+ true
+ bin\x64\Debug\
+ DEBUG;TRACE
+ full
+ x64
+ prompt
+ MinimumRecommendedRules.ruleset
+ true
+
+
+ bin\x64\Release\
+ TRACE
+ true
+ pdbonly
+ x64
+ prompt
+ MinimumRecommendedRules.ruleset
+ true
+
+
+
+ ..\packages\TT.NET.SDK.3.5.1.1\lib\net461\core-wrapper.dll
+
+
+ ..\packages\Google.Protobuf.3.27.3\lib\net45\Google.Protobuf.dll
+
+
+ ..\packages\Google.ProtocolBuffers.2.4.1.555\lib\net40\Google.ProtocolBuffers.dll
+
+
+ ..\packages\Google.ProtocolBuffers.2.4.1.555\lib\net40\Google.ProtocolBuffers.Serialization.dll
+
+
+ ..\packages\Newtonsoft.Json.13.0.3\lib\net45\Newtonsoft.Json.dll
+
+
+
+ ..\packages\System.Buffers.4.4.0\lib\netstandard2.0\System.Buffers.dll
+
+
+
+ ..\packages\System.Memory.4.5.3\lib\netstandard2.0\System.Memory.dll
+
+
+
+
+ ..\packages\System.Numerics.Vectors.4.4.0\lib\net46\System.Numerics.Vectors.dll
+
+
+ ..\packages\System.Runtime.CompilerServices.Unsafe.4.5.2\lib\netstandard2.0\System.Runtime.CompilerServices.Unsafe.dll
+
+
+
+
+
+
+
+
+ ..\packages\TimeZoneConverter.6.1.0\lib\netstandard2.0\TimeZoneConverter.dll
+
+
+ ..\packages\TT.NET.SDK.3.5.1.1\lib\net461\tt-net-api.dll
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.
+
+
+
+
diff --git a/TT_NET_CLIENT_SIDE/TTNETAPI_Sample_Console_OMA_ADL/TTNetApiFunctions.cs b/TT_NET_CLIENT_SIDE/TTNETAPI_Sample_Console_OMA_ADL/TTNetApiFunctions.cs
new file mode 100644
index 0000000..84481a1
--- /dev/null
+++ b/TT_NET_CLIENT_SIDE/TTNETAPI_Sample_Console_OMA_ADL/TTNetApiFunctions.cs
@@ -0,0 +1,357 @@
+// **********************************************************************************************************************
+//
+// Copyright © 2005-2026 Trading Technologies International, Inc.
+// All Rights Reserved Worldwide
+//
+// * * * S T R I C T L Y P R O P R I E T A R Y * * *
+//
+// WARNING: This file and all related programs (including any computer programs, example programs, and all source code)
+// are the exclusive property of Trading Technologies International, Inc. ("TT"), are protected by copyright law and
+// international treaties, and are for use only by those with the express written permission from TT. Unauthorized
+// possession, reproduction, distribution, use or disclosure of this file and any related program (or document) derived
+// from it is prohibited by State and Federal law, and by local law outside of the U.S. and may result in severe civil
+// and criminal penalties.
+//
+// ************************************************************************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using tt_net_sdk;
+
+namespace TTNETAPI_Sample_Console_OMA_ADL
+{
+ public class TTNetApiFunctions
+ {
+ // Declare the API objects
+ private TTAPI m_api = null;
+ private InstrumentLookup m_instrLookupRequest = null;
+ private PriceSubscription m_priceSubscription = null;
+ private tt_net_sdk.WorkerDispatcher m_disp = null;
+ private AlgoTradeSubscription m_algoTradeSubscription = null;
+ private AlgoLookupSubscription m_algoLookupSubscription = null;
+ private IReadOnlyCollection m_accounts = null;
+ private Instrument m_instrument = null;
+ private Algo m_algo = null;
+ private object m_Lock = new object();
+ private bool m_isDisposed = false;
+ private Price m_price = Price.Empty;
+
+ // Instrument Information
+ private readonly string m_market = "CME";
+ private readonly string m_product = "CY";
+ private readonly string m_prodType = "Future";
+ private readonly string m_alias = "CY Mar26";
+
+
+ ////////////////////////////////////////////////////////////////////////////////////////////////////
+ /// Attach the worker Dispatcher
+ ////////////////////////////////////////////////////////////////////////////////////////////////////
+ public void Start(tt_net_sdk.TTAPIOptions apiConfig)
+ {
+ m_disp = tt_net_sdk.Dispatcher.AttachWorkerDispatcher();
+ m_disp.DispatchAction(() =>
+ {
+ Init(apiConfig);
+ });
+
+ m_disp.Run();
+ }
+
+ ////////////////////////////////////////////////////////////////////////////////////////////////////
+ /// Initialize the API
+ ////////////////////////////////////////////////////////////////////////////////////////////////////
+ public void Init(tt_net_sdk.TTAPIOptions apiConfig)
+ {
+ ApiInitializeHandler apiInitializeHandler = new ApiInitializeHandler(ttNetApiInitHandler);
+ TTAPI.ShutdownCompleted += TTAPI_ShutdownCompleted;
+
+ //For Algo Orders
+ apiConfig.AlgoUserDisconnectAction = UserDisconnectAction.Cancel;
+ TTAPI.CreateTTAPI(tt_net_sdk.Dispatcher.Current, apiConfig, apiInitializeHandler);
+ }
+
+ ////////////////////////////////////////////////////////////////////////////////////////////////////
+ /// Event notification for status of API initialization.
+ ////////////////////////////////////////////////////////////////////////////////////////////////////
+ public void ttNetApiInitHandler(TTAPI api, ApiCreationException ex)
+ {
+ if (ex == null)
+ {
+ Console.WriteLine("TT.NET SDK INITIALIZED");
+
+ // Authenticate your credentials
+ m_api = api;
+ m_api.TTAPIStatusUpdate += new EventHandler(m_api_TTAPIStatusUpdate);
+ m_api.Start();
+ }
+ else if (ex.IsRecoverable)
+ {
+ // this is in informational update from the SDK
+ Console.WriteLine("TT.NET SDK Initialization Message: {0}", ex.Message);
+ if (ex.Code == ApiCreationException.ApiCreationError.NewAPIVersionAvailable)
+ {
+ // a newer version of the SDK is available - notify someone to upgrade
+ }
+ }
+ else
+ {
+ Console.WriteLine("TT.NET SDK Initialization Failed: {0}", ex.Message);
+ if (ex.Code == ApiCreationException.ApiCreationError.NewAPIVersionRequired)
+ {
+ // do something to upgrade the SDK package since it will not start until it is upgraded
+ // to the minimum version noted in the exception message
+ }
+ Dispose();
+ }
+ }
+
+ ////////////////////////////////////////////////////////////////////////////////////////////////////
+ /// Event notification for status of authentication.
+ ////////////////////////////////////////////////////////////////////////////////////////////////////
+ public void m_api_TTAPIStatusUpdate(object sender, TTAPIStatusUpdateEventArgs e)
+ {
+ Console.WriteLine("TTAPIStatusUpdate: {0}", e);
+ if (e.IsReady == false)
+ {
+ // TODO: Do any connection lost processing here
+ return;
+ }
+ // TODO: Do any connection up processing here
+ // note: can happen multiple times with your application life cycle
+
+ // can get status multiple times - do not create subscription if it exists
+ //
+ if (object.ReferenceEquals(m_instrLookupRequest, null) == false)
+ return;
+
+ MarketId marketKey = Market.GetMarketIdFromName(m_market);
+ ProductType productType = Product.GetProductTypeFromName(m_prodType);
+
+ // lookup an instrument
+ m_instrLookupRequest = new InstrumentLookup(tt_net_sdk.Dispatcher.Current,
+ marketKey, productType, m_product, m_alias);
+
+ m_instrLookupRequest.OnData += m_instrLookupRequest_OnData;
+ m_instrLookupRequest.GetAsync();
+
+ }
+
+ private void AlgoLookupSubscription_OnData(object sender, AlgoLookupEventArgs e)
+ {
+ if (e.Event == ProductDataEvent.Found)
+ {
+ Console.WriteLine("Algo Instrument Found: {0}", e.AlgoLookup.Algo.Alias);
+ m_algo = e.AlgoLookup.Algo;
+
+ // Create an Algo TradeSubscription to listen for order / fill events only for orders submitted through it
+ m_algoTradeSubscription = new AlgoTradeSubscription(tt_net_sdk.Dispatcher.Current, m_algo);
+
+ m_algoTradeSubscription.OrderUpdated += new EventHandler(m_algoTradeSubscription_OrderUpdated);
+ m_algoTradeSubscription.OrderAdded += new EventHandler(m_algoTradeSubscription_OrderAdded);
+ m_algoTradeSubscription.OrderDeleted += new EventHandler(m_algoTradeSubscription_OrderDeleted);
+ m_algoTradeSubscription.OrderFilled += new EventHandler(m_algoTradeSubscription_OrderFilled);
+ m_algoTradeSubscription.OrderRejected += new EventHandler(m_algoTradeSubscription_OrderRejected);
+ m_algoTradeSubscription.OrderBookDownload += new EventHandler(m_algoTradeSubscription_OrderBookDownload);
+ m_algoTradeSubscription.Start();
+ }
+ else if (e.Event == ProductDataEvent.NotAllowed)
+ {
+ Console.WriteLine("Not Allowed : Please check your Token access");
+ }
+ else
+ {
+ // Algo Instrument was not found and TT API has given up looking for it
+ Console.WriteLine("Cannot find Algo instrument: {0}", e.Message);
+ Dispose();
+ }
+ }
+
+ void m_instrLookupRequest_OnData(object sender, InstrumentLookupEventArgs e)
+ {
+ if (e.Event == ProductDataEvent.Found)
+ {
+ // Instrument was found
+ m_instrument = e.InstrumentLookup.Instrument;
+ Console.WriteLine("Found: {0}", m_instrument);
+
+ AlgoLookupSubscription algoLookupSubscription = new AlgoLookupSubscription(tt_net_sdk.Dispatcher.Current, "OCO");
+ algoLookupSubscription.OnData += AlgoLookupSubscription_OnData;
+ algoLookupSubscription.GetAsync();
+
+ // Subscribe for market Data
+ m_priceSubscription = new PriceSubscription(m_instrument, tt_net_sdk.Dispatcher.Current);
+ m_priceSubscription.Settings = new PriceSubscriptionSettings(PriceSubscriptionType.MarketDepth);
+ m_priceSubscription.FieldsUpdated += m_priceSubscription_FieldsUpdated;
+ m_priceSubscription.Start();
+ }
+ else if (e.Event == ProductDataEvent.NotAllowed)
+ {
+ Console.WriteLine("Not Allowed : Please check your Token access");
+ }
+ else
+ {
+ // Instrument was not found and TT API has given up looking for it
+ Console.WriteLine("Cannot find instrument: {0}", e.Message);
+ Dispose();
+ }
+ }
+
+ ////////////////////////////////////////////////////////////////////////////////////////////////////
+ /// Event notification for price update.
+ /// Source of the event.
+ /// Fields updated event information.
+ ////////////////////////////////////////////////////////////////////////////////////////////////////
+ void m_priceSubscription_FieldsUpdated(object sender, FieldsUpdatedEventArgs e)
+ {
+ if (e.Error != null)
+ {
+ Console.WriteLine("Unrecoverable price subscription error: {0}", e.Error.Message);
+ Dispose();
+ }
+ else if (e.Fields.GetBestBidPriceField().HasValue)
+ m_price = e.Fields.GetBestBidPriceField().Value - 1;
+ }
+
+ ////////////////////////////////////////////////////////////////////////////////////////////////////
+ /// Event notification for order book download complete.
+ ////////////////////////////////////////////////////////////////////////////////////////////////////
+ void m_algoTradeSubscription_OrderBookDownload(object sender, OrderBookDownloadEventArgs e)
+ {
+ Console.WriteLine("Orderbook downloaded...");
+
+ // Get the accounts
+ m_accounts = m_api.Accounts;
+
+ //Construct a dictionary of the parameters and the values to send out
+ // For OMA ADL algorithms, you can pass custom parameters
+ Dictionary oco_userparams = new Dictionary
+ {
+ {"Ignore Market State", true},
+ // TTOrderKey: Specifies an existing child order to be adopted by the OMA algorithm
+ // The GUID "7c60f278-3728-4199-b969-2244e40abb69" is the SiteOrderKey of an existing order
+ // that you want the OCO algo to take control of and manage
+ {"TTOrderKey", "7c60f278-3728-4199-b969-2244e40abb69"}
+ };
+
+ var lines = oco_userparams.Select(kvp => kvp.Key + ": " + kvp.Value.ToString());
+ Console.WriteLine(string.Join(Environment.NewLine, lines));
+
+ OrderProfile oco_op = m_algo.GetOrderProfile(m_instrument);
+ if (m_accounts.Count > 0)
+ oco_op.Account = m_accounts.ElementAt(0);
+ oco_op.Side = OrderSide.Buy;
+ oco_op.OrderType = OrderType.Limit;
+
+ oco_op.UserParameters = oco_userparams;
+ m_algoTradeSubscription.SendOrder(oco_op);
+ }
+
+ ////////////////////////////////////////////////////////////////////////////////////////////////////
+ /// Event notification for order rejection.
+ ////////////////////////////////////////////////////////////////////////////////////////////////////
+ void m_algoTradeSubscription_OrderRejected(object sender, OrderRejectedEventArgs e)
+ {
+ Console.WriteLine("\nOrderRejected [{0}] Details:{1} [{2}] :", e.Order.SiteOrderKey, e.Message, e.OrderRejectReason);
+ }
+
+ ////////////////////////////////////////////////////////////////////////////////////////////////////
+ /// Event notification for order fills.
+ ////////////////////////////////////////////////////////////////////////////////////////////////////
+ void m_algoTradeSubscription_OrderFilled(object sender, OrderFilledEventArgs e)
+ {
+ if (e.FillType == tt_net_sdk.FillType.Full)
+ {
+ Console.WriteLine("\nOrderFullyFilled [{0}]: {1}@{2}", e.Fill.SiteOrderKey, e.Fill.Quantity, e.Fill.MatchPrice);
+ }
+ else
+ {
+ Console.WriteLine("\nOrderPartiallyFilled [{0}]: {1}@{2}", e.Fill.SiteOrderKey, e.Fill.Quantity, e.Fill.MatchPrice);
+ }
+ }
+
+ ////////////////////////////////////////////////////////////////////////////////////////////////////
+ /// Event notification for order deletion.
+ ////////////////////////////////////////////////////////////////////////////////////////////////////
+ void m_algoTradeSubscription_OrderDeleted(object sender, OrderDeletedEventArgs e)
+ {
+ Console.WriteLine("\nOrderDeleted [{0}] , Message : {1}", e.OldOrder.SiteOrderKey, e.Message);
+ }
+
+ ////////////////////////////////////////////////////////////////////////////////////////////////////
+ /// Event notification for order addition.
+ ////////////////////////////////////////////////////////////////////////////////////////////////////
+ void m_algoTradeSubscription_OrderAdded(object sender, OrderAddedEventArgs e)
+ {
+ if (e.Order.IsSynthetic)
+ Console.WriteLine("\n PARENT Algo OrderAdded [{0}] for Algo : {1} with Synthetic Status : {2} ", e.Order.SiteOrderKey, e.Order.Algo.Alias, e.Order.SyntheticStatus.ToString());
+ else
+ Console.WriteLine("\nCHILD OrderAdded [{0}] {1}: {2}", e.Order.SiteOrderKey, e.Order.BuySell, e.Order.ToString());
+ }
+
+ ////////////////////////////////////////////////////////////////////////////////////////////////////
+ /// Event notification for order update.
+ ////////////////////////////////////////////////////////////////////////////////////////////////////
+ void m_algoTradeSubscription_OrderUpdated(object sender, OrderUpdatedEventArgs e)
+ {
+ if(e.NewOrder.ExecutionType == ExecType.Restated)
+ Console.WriteLine("\n PARENT Algo Order Restated [{0}] for Algo : {1} with Synthetic Status : {2} ", e.NewOrder.SiteOrderKey, e.NewOrder.Algo.Alias, e.NewOrder.SyntheticStatus.ToString());
+ else
+ Console.WriteLine("\nOrderUpdated [{0}] {1}: {2}", e.NewOrder.SiteOrderKey, e.NewOrder.BuySell, e.NewOrder.ToString());
+ }
+
+ public void Dispose()
+ {
+ lock (m_Lock)
+ {
+ if (!m_isDisposed)
+ {
+ // Unattached callbacks and dispose of all subscriptions
+ if (m_instrLookupRequest != null)
+ {
+ m_instrLookupRequest.OnData -= m_instrLookupRequest_OnData;
+ m_instrLookupRequest.Dispose();
+ m_instrLookupRequest = null;
+ }
+
+ if (m_algoLookupSubscription != null)
+ {
+ m_algoLookupSubscription.OnData -= AlgoLookupSubscription_OnData;
+ m_algoLookupSubscription.Dispose();
+ m_algoLookupSubscription = null;
+ }
+
+ if (m_priceSubscription != null)
+ {
+ m_priceSubscription.FieldsUpdated -= m_priceSubscription_FieldsUpdated;
+ m_priceSubscription.Dispose();
+ m_priceSubscription = null;
+ }
+
+ if (m_algoTradeSubscription != null)
+ {
+ m_algoTradeSubscription.OrderUpdated -= m_algoTradeSubscription_OrderUpdated;
+ m_algoTradeSubscription.OrderAdded -= m_algoTradeSubscription_OrderAdded;
+ m_algoTradeSubscription.OrderDeleted -= m_algoTradeSubscription_OrderDeleted;
+ m_algoTradeSubscription.OrderFilled -= m_algoTradeSubscription_OrderFilled;
+ m_algoTradeSubscription.OrderRejected -= m_algoTradeSubscription_OrderRejected;
+ m_algoTradeSubscription.Dispose();
+ m_algoTradeSubscription = null;
+ }
+
+ m_isDisposed = true;
+ }
+
+ TTAPI.Shutdown();
+ }
+ }
+
+ public void TTAPI_ShutdownCompleted(object sender, EventArgs e)
+ {
+ // Dispose of any other objects / resources
+ Console.WriteLine("TTAPI shutdown completed");
+ }
+ }
+}
diff --git a/TT_NET_CLIENT_SIDE/TTNETAPI_Sample_Console_OMA_ADL/packages.config b/TT_NET_CLIENT_SIDE/TTNETAPI_Sample_Console_OMA_ADL/packages.config
new file mode 100644
index 0000000..f88bc01
--- /dev/null
+++ b/TT_NET_CLIENT_SIDE/TTNETAPI_Sample_Console_OMA_ADL/packages.config
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/TT_NET_CLIENT_SIDE/TTSamples.sln b/TT_NET_CLIENT_SIDE/TTSamples.sln
index c900518..f8fe146 100644
--- a/TT_NET_CLIENT_SIDE/TTSamples.sln
+++ b/TT_NET_CLIENT_SIDE/TTSamples.sln
@@ -1,7 +1,7 @@
Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio Version 16
-VisualStudioVersion = 16.0.29123.88
+# Visual Studio Version 17
+VisualStudioVersion = 17.14.36603.0 d17.14
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TTNETAPI_Sample_Console_OrderRouting", "TTNETAPI_Sample_Console_OrderRouting\TTNETAPI_Sample_Console_OrderRouting.csproj", "{7DCAAE8C-3F6F-447F-AB8C-4BC2CB134F76}"
EndProject
@@ -23,6 +23,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TTNETAPI_Sample_Console_Pri
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TTNETAPI_Sample_WPF_VolumeRatio", "TTNETAPI_Sample_WPF_VolumeRatio\TTNETAPI_Sample_WPF_VolumeRatio.csproj", "{3A69FD09-6842-4655-99CE-6CD1FD5555CE}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TTNETAPI_Sample_Console_OMA_ADL", "TTNETAPI_Sample_Console_OMA_ADL\TTNETAPI_Sample_Console_OMA_ADL.csproj", "{F8E9A1B2-3C4D-5E6F-7A8B-9C0D1E2F3A4B}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x64 = Debug|x64
@@ -69,6 +71,10 @@ Global
{3A69FD09-6842-4655-99CE-6CD1FD5555CE}.Debug|x64.Build.0 = Debug|x64
{3A69FD09-6842-4655-99CE-6CD1FD5555CE}.Release|x64.ActiveCfg = Release|x64
{3A69FD09-6842-4655-99CE-6CD1FD5555CE}.Release|x64.Build.0 = Release|x64
+ {F8E9A1B2-3C4D-5E6F-7A8B-9C0D1E2F3A4B}.Debug|x64.ActiveCfg = Debug|x64
+ {F8E9A1B2-3C4D-5E6F-7A8B-9C0D1E2F3A4B}.Debug|x64.Build.0 = Debug|x64
+ {F8E9A1B2-3C4D-5E6F-7A8B-9C0D1E2F3A4B}.Release|x64.ActiveCfg = Release|x64
+ {F8E9A1B2-3C4D-5E6F-7A8B-9C0D1E2F3A4B}.Release|x64.Build.0 = Release|x64
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE