Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Upwork 01ce4c9974c060ef8d #34

Closed
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions DEV_NOTES.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# Developer Notes

## Market Connectors

| Exchange | Underlay Library |
| -------- | ----------------------------------------------------------------------------------- |
| Binance | [Binance.Net v9.1.2](https://www.nuget.org/packages/Binance.Net/9.1.2) |
| Bitfinex | [Bitfinex.Net v7.0.5](https://www.nuget.org/packages/Bitfinex.Net/7.0.5) |
| Bitstamp | ??? |
| Kraken | [KrakenExchange.Net 4.2.1](https://www.nuget.org/packages/KrakenExchange.Net/4.2.1) |
| KuCoin | [Kucoin.Net v5.1.0](https://www.nuget.org/packages/Kucoin.Net/5.1.0) |
| Gemini | ??? |
| Coinbase | ??? |
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net7.0-windows</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>

<IsPackable>false</IsPackable>
<IsTestProject>true</IsTestProject>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="coverlet.collector" Version="3.2.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.7.1" />
<PackageReference Include="xunit" Version="2.4.2" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.5" />
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\..\VisualHFT.Commons\VisualHFT.Commons.csproj" />
<ProjectReference Include="..\MarketConnectors.Bitstamp\MarketConnectors.Bitstamp.csproj" />
</ItemGroup>

<ItemGroup>
<Using Include="Xunit" />
</ItemGroup>

</Project>
12 changes: 12 additions & 0 deletions VisualHFT.Plugins/MarketConnectors.Bitstamp.Tests/UnitTest2.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
namespace MarketConnectors.Bitstamp.Tests
{
public class UnitTest2
{
[Fact]
public void Test2()
{
int a = 42;
Assert.Equal(42, a);
}
}
}
196 changes: 196 additions & 0 deletions VisualHFT.Plugins/MarketConnectors.Bitstamp/BitstampPlugin.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,196 @@
using MarketConnectors.Bitstamp.Model;
using MarketConnectors.Bitstamp.UserControls;
using MarketConnectors.Bitstamp.ViewModel;
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using VisualHFT.Commons.PluginManager;
using VisualHFT.DataRetriever;
using VisualHFT.UserSettings;

namespace MarketConnectors.Bitstamp
{
public class BitstampPlugin : BasePluginDataRetriever
{
private PlugInSettings? _settings;
private Action? _closeSettingWindow;
private bool _isConnected;

private Timer _heartbeatTimer;

private static readonly log4net.ILog log = log4net.LogManager.GetLogger(typeof(BitstampPlugin));

private DataEventArgs heartbeatDataEvent = new DataEventArgs() { DataType = "HeartBeats" };//reusable object. So we avoid allocations

public override string Name { get; set; } = "Bitstamp Plugin";
public override string Version { get; set; } = "1.0.0";
public override string Description { get; set; } = "Connects to TBD.";
public override string Author { get; set; } = "VisualHFT";
public override ISetting Settings
{
get
{
ISetting? settings = _settings;

if (settings == null)
{
throw new InvalidOperationException();
}

return settings;
}
set => _settings = (PlugInSettings)value;
}

public override Action CloseSettingWindow
{
get
{
Action? closeSettingWindow = _closeSettingWindow;

if (closeSettingWindow == null)
{
throw new InvalidOperationException();
}

return closeSettingWindow;
}
set => _closeSettingWindow = value;
}

public BitstampPlugin()
{
_isConnected = false;
// Initialize the timer
_heartbeatTimer = new Timer(CheckConnectionStatus, null, TimeSpan.Zero, TimeSpan.FromSeconds(5)); // Check every 5 seconds

log.Debug("Create instance");
}

~BitstampPlugin()
{
Dispose(false);
}

public override async Task StartAsync()
{
await base.StartAsync();

_isConnected = true;
}

public override async Task StopAsync()
{
_isConnected = false;

heartbeatDataEvent.ParsedModel = new List<VisualHFT.Model.Provider>();
//reset models
RaiseOnDataReceived(heartbeatDataEvent);

await base.StopAsync();
}

protected override void Dispose(bool disposing)
{
base.Dispose(disposing);
if (!_disposed)
{
if (disposing)
{
_heartbeatTimer.Dispose();
}
_disposed = true;
}
}

protected override void LoadSettings()
{
_settings = LoadFromUserSettings<PlugInSettings>();
if (_settings == null)
{
InitializeDefaultSettings();
}
if (_settings!.Provider == null) //To prevent back compability with older setting formats
{
_settings.Provider = CreateProvider();
}
ParseSymbols(string.Join(',', _settings.Symbols.ToArray())); //Utilize normalization function
}

protected override void SaveSettings()
{
SaveToUserSettings(Settings);
}

protected override void InitializeDefaultSettings()
{
_settings = new PlugInSettings()
{
ApiKey = "",
ApiSecret = "",
DepthLevels = 10,
UpdateIntervalMs = 100,
Provider = CreateProvider(),
Symbols = new List<string>() { "???(BTC/USD)", "???(ETH/USD)" } // Add more symbols as needed
};
SaveToUserSettings(_settings);
}

public override object GetUISettings()
{
PluginSettingsView view = new PluginSettingsView();
PluginSettingsViewModel viewModel = new PluginSettingsViewModel(CloseSettingWindow);
PlugInSettings settings = (PlugInSettings)Settings;
viewModel.ApiSecret = settings.ApiSecret;
viewModel.ApiKey = settings.ApiKey;
viewModel.UpdateIntervalMs = settings.UpdateIntervalMs;
viewModel.DepthLevels = settings.DepthLevels;
viewModel.ProviderId = settings.Provider.ProviderID;
viewModel.ProviderName = settings.Provider.ProviderName;
viewModel.Symbols = settings.Symbols;
viewModel.UpdateSettingsFromUI = () =>
{
settings.ApiSecret = viewModel.ApiSecret;
settings.ApiKey = viewModel.ApiKey;
settings.UpdateIntervalMs = viewModel.UpdateIntervalMs;
settings.DepthLevels = viewModel.DepthLevels;
settings.Provider = new VisualHFT.Model.Provider() { ProviderID = viewModel.ProviderId, ProviderName = viewModel.ProviderName };
settings.Symbols = viewModel.Symbols;
SaveSettings();
ParseSymbols(string.Join(',', settings.Symbols.ToArray()));

// Start the HandleConnectionLost task without awaiting it
//run this because it will allow to reconnect with the new values
Task.Run(HandleConnectionLost);
};
// Display the view, perhaps in a dialog or a new window.
view.DataContext = viewModel;
return view;
}

private void CheckConnectionStatus(object? state)
{
heartbeatDataEvent.ParsedModel = new List<VisualHFT.Model.Provider>() { ToHeartBeatModel(_isConnected) };
RaiseOnDataReceived(heartbeatDataEvent);
}

private VisualHFT.Model.Provider ToHeartBeatModel(bool isConnected)
{
PlugInSettings settings = (PlugInSettings)Settings;
return new VisualHFT.Model.Provider()
{
ProviderCode = settings.Provider.ProviderID,
ProviderID = settings.Provider.ProviderID,
ProviderName = settings.Provider.ProviderName,
Status = isConnected ? eSESSIONSTATUS.BOTH_CONNECTED : eSESSIONSTATUS.BOTH_DISCONNECTED,
Plugin = this
};
}

private static VisualHFT.Model.Provider CreateProvider()
{
return new VisualHFT.Model.Provider() { ProviderID = 5, ProviderName = "Bitstamp" };
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net7.0-windows</TargetFramework>
<Nullable>enable</Nullable>
<UseWPF>true</UseWPF>
</PropertyGroup>

<ItemGroup>
<None Include="..\..\log4net.config" Link="log4net.config" />
</ItemGroup>

<ItemGroup>
<PackageReference Include="ApiSharp" Version="2.2.1" />
<PackageReference Include="log4net" Version="2.0.15" />
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\..\VisualHFT.Commons\VisualHFT.Commons.csproj" />
</ItemGroup>

<ItemGroup>
<AssemblyAttribute Include="System.Runtime.CompilerServices.InternalsVisibleToAttribute">
<_Parameter1>MarketConnectors.Bitstamp.Tests</_Parameter1>
</AssemblyAttribute>
</ItemGroup>

</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
//using CryptoExchange.Net.CommonObjects;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using VisualHFT.UserSettings;

namespace MarketConnectors.Bitstamp.Model
{
public class PlugInSettings : ISetting
{
public string ApiKey { get; set; }
public string ApiSecret { get; set; }
public List<string> Symbols { get; set; }
public int DepthLevels { get; set; }
public int UpdateIntervalMs { get; set; }

public string Symbol { get; set; }
public VisualHFT.Model.Provider Provider { get; set; }
public AggregationLevel AggregationLevel { get; set; }
}
}
Loading