diff --git a/Binance.SDK.Test/Binance.SDK.Test.csproj b/Binance.SDK.Test/Binance.SDK.Test.csproj deleted file mode 100644 index 00f65d9..0000000 --- a/Binance.SDK.Test/Binance.SDK.Test.csproj +++ /dev/null @@ -1,12 +0,0 @@ - - - - Exe - netcoreapp3.1 - - - - - - - diff --git a/Binance.SDK.Test/Program.cs b/Binance.SDK.Test/Program.cs deleted file mode 100644 index e7af04f..0000000 --- a/Binance.SDK.Test/Program.cs +++ /dev/null @@ -1,27 +0,0 @@ -using Binance.Net.Clients; -using Binance.Net.Objects; -using CryptoExchange.Net.Authentication; -using System; - -namespace Binance.SDK.Test -{ - internal class Program - { - static void Main(string[] args) - { - var apiKey = "muiZ1IA2sPMQ2m0YFPubEvZepjzn2nxeuPHqQ6mejKVXljYDQTOIYbm22NlXxKcv"; - var apiSecret = "3Clur3D1hDeZYhtVSJzPBiEBb7S0ktC8WpaRQ3F7ysQe55kbsPTBZ6U4X9XsX4Ww"; - var client = new BinanceClient(new BinanceClientOptions() - { - UsdFuturesApiOptions = new BinanceApiClientOptions() - { - BaseAddress = "https://fapi.binance.com", - ApiCredentials = new ApiCredentials(apiKey, apiSecret) - } - }); - - var result = client.UsdFuturesApi.Account.GetBalancesAsync().Result; - Console.WriteLine(result); - } - } -} diff --git a/Binance.SDK/BinanceContractTest.cs b/Binance.SDK/BinanceContractTest.cs deleted file mode 100644 index 41041f9..0000000 --- a/Binance.SDK/BinanceContractTest.cs +++ /dev/null @@ -1,14 +0,0 @@ -using Binance.Net.Clients; -using Binance.Net.Objects; -using CryptoExchange.Net.Authentication; - -namespace Binance.SDK -{ - public class BinanceContractTest - { - public BinanceContractTest() - { - - } - } -} diff --git a/Binance.TradeRobot.API.sln b/Binance.TradeRobot.API.sln index f94c304..6994f53 100644 --- a/Binance.TradeRobot.API.sln +++ b/Binance.TradeRobot.API.sln @@ -16,9 +16,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution .editorconfig = .editorconfig EndProjectSection EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Binance.SDK", "Binance.SDK\Binance.SDK.csproj", "{8B84B654-82D9-42C0-AF0C-5C78CE916253}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Binance.SDK.Test", "Binance.SDK.Test\Binance.SDK.Test.csproj", "{52E20E47-2605-48A8-B09C-1C61194502F9}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SDKAdapter", "SDKAdapter\SDKAdapter.csproj", "{E461043B-179D-4625-BF2F-C00EAB1C8213}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -42,14 +40,10 @@ Global {C840DCF2-0E1E-4F9F-9EAA-5A4F80B51BD2}.Debug|Any CPU.Build.0 = Debug|Any CPU {C840DCF2-0E1E-4F9F-9EAA-5A4F80B51BD2}.Release|Any CPU.ActiveCfg = Release|Any CPU {C840DCF2-0E1E-4F9F-9EAA-5A4F80B51BD2}.Release|Any CPU.Build.0 = Release|Any CPU - {8B84B654-82D9-42C0-AF0C-5C78CE916253}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {8B84B654-82D9-42C0-AF0C-5C78CE916253}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8B84B654-82D9-42C0-AF0C-5C78CE916253}.Release|Any CPU.ActiveCfg = Release|Any CPU - {8B84B654-82D9-42C0-AF0C-5C78CE916253}.Release|Any CPU.Build.0 = Release|Any CPU - {52E20E47-2605-48A8-B09C-1C61194502F9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {52E20E47-2605-48A8-B09C-1C61194502F9}.Debug|Any CPU.Build.0 = Debug|Any CPU - {52E20E47-2605-48A8-B09C-1C61194502F9}.Release|Any CPU.ActiveCfg = Release|Any CPU - {52E20E47-2605-48A8-B09C-1C61194502F9}.Release|Any CPU.Build.0 = Release|Any CPU + {E461043B-179D-4625-BF2F-C00EAB1C8213}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E461043B-179D-4625-BF2F-C00EAB1C8213}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E461043B-179D-4625-BF2F-C00EAB1C8213}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E461043B-179D-4625-BF2F-C00EAB1C8213}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/Binance.TradeRobot.API/Binance.TradeRobot.API.csproj b/Binance.TradeRobot.API/Binance.TradeRobot.API.csproj index 2a3ee39..4bb766b 100644 --- a/Binance.TradeRobot.API/Binance.TradeRobot.API.csproj +++ b/Binance.TradeRobot.API/Binance.TradeRobot.API.csproj @@ -25,7 +25,6 @@ - diff --git a/Binance.TradeRobot.API/appsettings.json b/Binance.TradeRobot.API/appsettings.json index b1baca5..7f68d13 100644 --- a/Binance.TradeRobot.API/appsettings.json +++ b/Binance.TradeRobot.API/appsettings.json @@ -10,8 +10,8 @@ "ConnectionStrings": { //"DB": "Data Source=192.168.201.44;Initial Catalog=HY.TradingRobot.DB;User ID=sa;Pwd=kaicn1132+-;" //"DB": "Data Source=.;Initial Catalog=Binance.TradeRobot.DB;User ID=sa;Pwd=pc911103;Encrypt=True; TrustServerCertificate=True;" - "DB": "data source=47.245.58.112;port=3306;user id=sa;password=rYn6re2AKhcDWcBi;initial catalog=tradedb;charset=utf8;sslmode=none;", - "Redis": "127.0.0.1:6379,password=kaicn1132+-,defaultDatabase=0,testcluster=false" + "DB": "data source=8.209.252.195;port=3306;user id=sa;password=rYn6re2AKhcDWcBi;initial catalog=tradedb;charset=utf8;sslmode=none;", + "Redis": "8.209.252.195:6379,password=kaicn1132+-,defaultDatabase=0,testcluster=false" }, "JwtConfig": { "Secret": "heyitraderobot11", diff --git a/Binance.TradeRobot.Business/Binance.TradeRobot.Business.csproj b/Binance.TradeRobot.Business/Binance.TradeRobot.Business.csproj index 81f65bd..2050c2c 100644 --- a/Binance.TradeRobot.Business/Binance.TradeRobot.Business.csproj +++ b/Binance.TradeRobot.Business/Binance.TradeRobot.Business.csproj @@ -18,7 +18,6 @@ - diff --git a/Binance.TradeRobot.Business/Business/ExchangeBusiness.cs b/Binance.TradeRobot.Business/Business/ExchangeBusiness.cs index adce801..f6de8f4 100644 --- a/Binance.TradeRobot.Business/Business/ExchangeBusiness.cs +++ b/Binance.TradeRobot.Business/Business/ExchangeBusiness.cs @@ -76,7 +76,7 @@ namespace Binance.TradeRobot.Business.Exchange Id = k.Id, AccountId = k.AccountId, APIKey = k.APIKey, - SecretKey = k.SecretKey, + SecretKey = "********", CreateTime = k.CreateTime, RobotId = k.RobotId, RobotSymbol = r.Symbol diff --git a/Binance.TradeRobot.Business/Business/RobotBusiness.cs b/Binance.TradeRobot.Business/Business/RobotBusiness.cs index f7e4357..9602550 100644 --- a/Binance.TradeRobot.Business/Business/RobotBusiness.cs +++ b/Binance.TradeRobot.Business/Business/RobotBusiness.cs @@ -48,11 +48,15 @@ namespace Binance.TradeRobot.Business public void StartRobot(long robotId) { + fsql.Update(robotId).Set(r => r.State, Enums.RobotState.Runing).ExecuteAffrows(); + //监听K线和订单 } public void StopRobot(long robotId) { + fsql.Update(robotId).Set(r => r.State, Enums.RobotState.Stop).ExecuteAffrows(); + //取消监听K线和订单 } @@ -113,6 +117,7 @@ namespace Binance.TradeRobot.Business /// public void AddD21PolicyRobot(AddRobotRequest addRobotRequest) { + addRobotRequest.TradePolicy = Enums.TradePolicy.D21; CheckRobotRegister(addRobotRequest, out _); var d21Policy = new D21Policy() { @@ -151,7 +156,7 @@ namespace Binance.TradeRobot.Business .WhereIf(robotState != null, (r, ra, d, e) => r.State == robotState) .WhereIf(signalPeriod != null, (r, ra, d, e) => d.PeriodicSignal == signalPeriod) .WhereIf(!string.IsNullOrEmpty(symbol), (r, ra, d, e) => r.Symbol == symbol) - .Where((r, ra, d, e) => r.TradePolicy == Enums.TradePolicy.动量趋势v21) + .Where((r, ra, d, e) => r.TradePolicy == Enums.TradePolicy.D21) .ToList((r, ra, d, e) => new Robot() { Id = r.Id, diff --git a/Binance.TradeRobot.Business/Business/SingalBusiness.cs b/Binance.TradeRobot.Business/Business/SingalBusiness.cs index 9a8b0fd..a0f0631 100644 --- a/Binance.TradeRobot.Business/Business/SingalBusiness.cs +++ b/Binance.TradeRobot.Business/Business/SingalBusiness.cs @@ -34,20 +34,24 @@ namespace Binance.TradeRobot.Business.Business if (robotList == null || robotList.Count() == 0) throw new BusinessException("未找到符合条件的机器人"); - var robot = robotList.FirstOrDefault(); - var d21TradeBusiness = tradeBusinessList.FirstOrDefault(t => t.TradePolicy == Enums.TradePolicy.动量趋势v21); - switch (d21SingalRequest.SingalType) + //var robot = robotList.FirstOrDefault(); + var d21TradeBusiness = tradeBusinessList.FirstOrDefault(t => t.TradePolicy == Enums.TradePolicy.D21); + + foreach (var robot in robotList) { - case Enums.SingalType.小趋势看空: - case Enums.SingalType.小趋势看多: - Task.Factory.StartNew(() => d21TradeBusiness.TrendChanged(d21SingalRequest, robot)); - break; - case Enums.SingalType.多交叉: + switch (d21SingalRequest.SingalType) + { + case Enums.SingalType.小趋势看空: + case Enums.SingalType.小趋势看多: + Task.Factory.StartNew(() => d21TradeBusiness.TrendChanged(d21SingalRequest, robot)); + break; + case Enums.SingalType.多交叉: - break; - case Enums.SingalType.空交叉: + break; + case Enums.SingalType.空交叉: - break; + break; + } } } } diff --git a/Binance.TradeRobot.Business/Business/TradeBusiness/D21TradeBusiness.cs b/Binance.TradeRobot.Business/Business/TradeBusiness/D21TradeBusiness.cs index 9c87080..a8f361f 100644 --- a/Binance.TradeRobot.Business/Business/TradeBusiness/D21TradeBusiness.cs +++ b/Binance.TradeRobot.Business/Business/TradeBusiness/D21TradeBusiness.cs @@ -18,24 +18,31 @@ namespace Binance.TradeRobot.Business } - public Enums.TradePolicy TradePolicy => Enums.TradePolicy.动量趋势v21; + public Enums.TradePolicy TradePolicy => Enums.TradePolicy.D21; public void TrendChanged(T singalRequest, T1 robot) where T : BaseSingalRequest where T1 : RobotResponse { - var executionLog = new ExecutionLog() + try { - Id = idGenerator.NewLong(), - RobotId = robot.Id, - CreateTime = DateTime.Now, - SourceSingal = singalRequest.SingalType, - Content = $"收到趋势信号【{singalRequest.SingalType}】" - }; - fsql.Insert(executionLog).ExecuteAffrows(); - var d21RuningInfo = RedisHelper.Get(robot.Id.ToString()); - if (d21RuningInfo == null) - d21RuningInfo = new D21RuningInfo() { RobotId = robot.Id }; - d21RuningInfo.RecentSmallTrendSingal = singalRequest.SingalType; - RedisHelper.Set(robot.Id.ToString(), d21RuningInfo); + var executionLog = new ExecutionLog() + { + Id = idGenerator.NewLong(), + RobotId = robot.Id, + CreateTime = DateTime.Now, + SourceSingal = singalRequest.SingalType, + Content = $"收到趋势信号【{singalRequest.SingalType}】" + }; + fsql.Insert(executionLog).ExecuteAffrows(); + var d21RuningInfo = RedisHelper.Get(robot.Id.ToString()); + if (d21RuningInfo == null) + d21RuningInfo = new D21RuningInfo() { RobotId = robot.Id }; + d21RuningInfo.RecentSmallTrendSingal = singalRequest.SingalType; + RedisHelper.Set(robot.Id.ToString(), d21RuningInfo); + } + catch (Exception ex) + { + + } } } } diff --git a/Binance.TradeRobot.Business/Extensions/RobotExtension.cs b/Binance.TradeRobot.Business/Extensions/RobotExtension.cs index f4ff5fe..bf82484 100644 --- a/Binance.TradeRobot.Business/Extensions/RobotExtension.cs +++ b/Binance.TradeRobot.Business/Extensions/RobotExtension.cs @@ -7,9 +7,9 @@ namespace Binance.TradeRobot.Business.Extensions { private static IDictionary BusinessTypeDic = new Dictionary() { - {Enums.TradePolicy.金字塔, Enums.BusinessType.UPrep }, - { Enums.TradePolicy.动量趋势v2, Enums.BusinessType.Spot_Margin}, - { Enums.TradePolicy.动量趋势v21, Enums.BusinessType.Spot_Margin} + {Enums.TradePolicy.Pyramid, Enums.BusinessType.UPrep }, + { Enums.TradePolicy.D2, Enums.BusinessType.Spot_Margin}, + { Enums.TradePolicy.D21, Enums.BusinessType.Spot_Margin} }; /// diff --git a/Binance.TradeRobot.Business/GlobalContext.cs b/Binance.TradeRobot.Business/GlobalContext.cs new file mode 100644 index 0000000..5c66ea7 --- /dev/null +++ b/Binance.TradeRobot.Business/GlobalContext.cs @@ -0,0 +1,14 @@ +using Binance.TradeRobot.Common.DI; +using Microsoft.Extensions.DependencyInjection; + +namespace Binance.TradeRobot.Business +{ + [BatchRegistration(ServiceLifetime.Singleton, RegistrationType.Self)] + public class GlobalContext + { + public GlobalContext() + { + + } + } +} diff --git a/Binance.TradeRobot.Model/Base/Enums.cs b/Binance.TradeRobot.Model/Base/Enums.cs index 7a75bc4..c947a3e 100644 --- a/Binance.TradeRobot.Model/Base/Enums.cs +++ b/Binance.TradeRobot.Model/Base/Enums.cs @@ -69,10 +69,10 @@ namespace Binance.TradeRobot.Model.Base /// public enum TradePolicy { - 动量趋势v2 = 0, - 动量趋势v21 = 1, + D2 = 0, + D21 = 1, - 金字塔 = 11 + Pyramid = 11 } /// diff --git a/Binance.SDK/Binance.SDK.csproj b/SDKAdapter/SDKAdapter.csproj similarity index 60% rename from Binance.SDK/Binance.SDK.csproj rename to SDKAdapter/SDKAdapter.csproj index 175f351..ca327b0 100644 --- a/Binance.SDK/Binance.SDK.csproj +++ b/SDKAdapter/SDKAdapter.csproj @@ -6,7 +6,11 @@ - + + + + + diff --git a/SDKAdapter/WebSockets/Market/SpotMarketWebSocketClient.cs b/SDKAdapter/WebSockets/Market/SpotMarketWebSocketClient.cs new file mode 100644 index 0000000..b33a71b --- /dev/null +++ b/SDKAdapter/WebSockets/Market/SpotMarketWebSocketClient.cs @@ -0,0 +1,57 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace SDKAdapter.WebSockets.Market +{ + public class SpotMarketWebSocketClient + { + /// + /// 更新间隔(ms) + /// + protected int updateInterval = 3000; + + /// + /// 交易对 + /// + public string Symbol { get; private set; } + + /// + /// 最新成交价 + /// + public decimal NewestPrice { get; private set; } + + /// r + /// 上一次价格更新时间 + /// + public DateTime? LastUpdateTime { get; private set; } + + public NLog.ILogger logger { get; private set; } + + public SpotMarketWebSocketClient(string symbol, NLog.ILogger logger) + { + this.Symbol = symbol; + this.logger = logger; + } + + public virtual void Start() + { + + } + + public virtual void Stop() + { + + } + + protected virtual void OnReceived(decimal newestPrice) + { + NewestPrice = newestPrice; + if (LastUpdateTime == null || (DateTime.Now - LastUpdateTime.Value).TotalMilliseconds >= updateInterval) + { + logger.Info($"NewestPrice:{newestPrice}"); + LastUpdateTime = DateTime.Now; + } + } + } +}