Skip to content

Commit

Permalink
Re-target to .NET Standard 2.0. Update version to 3.0.0-beta0 as ther…
Browse files Browse the repository at this point in the history
…e's some major breaking change since 2.x
  • Loading branch information
Karl Wan committed Sep 25, 2017
1 parent 1e5cb71 commit ff27611
Show file tree
Hide file tree
Showing 19 changed files with 109 additions and 97 deletions.
7 changes: 4 additions & 3 deletions .gitignore
Expand Up @@ -251,6 +251,7 @@ paket-files/
.idea/
*.sln.iml

# Ignore non-public code
Trady.App.Pad/
Trady.Vic/
# Hide private code
Trady.Analysis.Stat/
Trady.Test.Stat/
Trady_Full.sln
28 changes: 13 additions & 15 deletions README.md
@@ -1,29 +1,29 @@
# Trady
[![Build status](https://ci.appveyor.com/api/projects/status/kqwo74gn5ms3h0n2?svg=true)](https://ci.appveyor.com/project/lppkarl/trady)
[![NuGet Pre Release](https://img.shields.io/nuget/vpre/Trady.Analysis.svg)](https://www.nuget.org/packages/Trady.Analysis/2.1.0-beta6)
[![NuGet Pre Release](https://img.shields.io/nuget/vpre/Trady.Analysis.svg)](https://www.nuget.org/packages/Trady.Analysis/3.0.0-beta0)
[![license](https://img.shields.io/github/license/lppkarl/Trady.svg)](LICENSE)

Trady is a handy library for computing technical indicators, and targets to be an automated trading system that provides stock data feeding, indicator computing, strategy building and automatic trading. It is built based on .NET Standard 1.6.1.
Trady is a handy library for computing technical indicators, and targets to be an automated trading system that provides stock data feeding, indicator computing, strategy building and automatic trading. It is built based on .NET Standard 2.0.

### Read Before You Use
This library is intended for personal use, use with care for production environment.
This library is a hobby project, and would probably making breaking changes, use with care when in production.

### Currently Available Features
* Stock data feeding (via CSV File, [Quandl.NET](https://github.com/lppkarl/Quandl.NET), [YahooFinanceApi](https://github.com/lppkarl/YahooFinanceApi), [StooqApi](https://github.com/lppkarl/StooqApi), [Nuba.Finance.Google](https://github.com/nubasoftware/Nuba.Finance.Google))
* Indicator computing (including SMA, EMA, RSI, MACD, BB, etc.)
* Signal capturing by rules
* Strategy backtesting by buy/sell rule

### Updates from 2.0.x to 2.1.0 (Currently 2.1.0-alpha6)
### Updates from 2.0.x to 3.0.0 (Currently 3.0.0-beta0)
Please refer to another markdown document [here](update_from_2.0.x.md)

### Supported Platforms
* .NET Core 1.0 or above
* .NET Core 2.0 or above
* .NET Framework 4.6.1 or above
* Mono 4.6 or above
* Xamarin.iOS 10.0 or above
* Xamarin.Android 7.0 or above
* Xamarin.Mac 3.0 or above
* Mono 5.4 or above
* Xamarin.iOS 10.4 or above
* Xamarin.Android 7.5 or above
* Xamarin.Mac 3.8 or above

### Currently Supported Indicators
Please refer to another markdown document [here](supported_indicators.md)
Expand Down Expand Up @@ -204,8 +204,8 @@ Nuget package is available in modules, please install the package according to t
}

// Use case
var buyRule = Rule.Create(c => c.IsEma10BullishCrossEma30()).And(c.IsEma10Rising());
var sellRule = Rule.Create(c => c.IsEma10BearishCrossEma30()).Or(c.IsEma10Dropping());
var buyRule = Rule.Create(c => c.IsEma10BullishCrossEma30()).And(c => c.IsEma10Rising());
var sellRule = Rule.Create(c => c.IsEma10BearishCrossEma30()).Or(c => c.IsEma10Dropping());
var runner = new Builder().Add(candles, 10).Buy(buyRule).Sell(sellRule).Build();
var result = await runner.RunAsync(10000, 1);
[Back to content](#Content)
Expand Down Expand Up @@ -303,16 +303,14 @@ Nuget package is available in modules, please install the package according to t
{
// parameters: initialValueIndex, initialValueFunction, indexValueFunction, smoothingFactorFunction
_gma = new GenericMovingAverage(
0,
i => inputs.Select(ip => ip.Close).ElementAt(i),
i => inputs.Select(ip => ip.Close).ElementAt(i),
i => 2.0m / (periodCount + 1),
2.0m / (periodCount + 1),
inputs.Count());
}

protected override AnalyzableTick<decimal?> ComputeByIndexImpl(IReadOnlyList<Candle> mappedInputs, int index)
{
return new AnalyzableTick<decimal?>(mappedInputs[index].DateTime, _gema[index]);
return new AnalyzableTick<decimal?>(mappedInputs[index].DateTime, _gma[index]);
}
}
[Back to content](#Content)
Expand Down
4 changes: 2 additions & 2 deletions Trady.Analysis/Extension/IndexedCandleExtension.cs
Expand Up @@ -5,10 +5,10 @@ namespace Trady.Analysis
public static class IndexedCandleExtension
{
public static decimal? ClosePriceChange(this IndexedCandle ic)
=> ic.Get<ClosePriceChange>()[ic.Index].Tick;
=> ic.Get<ClosePriceChange>(1)[ic.Index].Tick;

public static decimal? ClosePricePercentageChange(this IndexedCandle ic)
=> ic.Get<ClosePricePercentageChange>()[ic.Index].Tick;
=> ic.Get<ClosePricePercentageChange>(1)[ic.Index].Tick;

public static bool IsBullish(this IndexedCandle ic)
=> ic.Get<ClosePriceChange>()[ic.Index].Tick.IsPositive();
Expand Down
2 changes: 1 addition & 1 deletion Trady.Analysis/Infrastructure/AnalyzableFactory.cs
Expand Up @@ -25,7 +25,7 @@ internal static class AnalyzableFactory
var @params = new List<object>();
@params.Add(inputs);
for (int i = 1; i < ctor.GetParameters().Count(); i++)
@params.Add(Convert.ChangeType(parameters[i - 1], ctor.GetParameters()[i].ParameterType));
@params.Add(Convert.ChangeType(parameters[i - 1], ctor.GetParameters()[i].ParameterType));

return (TAnalyzable)ctor.Invoke(@params.ToArray());
}
Expand Down
52 changes: 30 additions & 22 deletions Trady.Analysis/Infrastructure/FuncRegistry.cs
@@ -1,6 +1,7 @@
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq.Expressions;
using System.Reflection;
using Microsoft.CodeAnalysis.CSharp.Scripting;
using Microsoft.CodeAnalysis.Scripting;
Expand Down Expand Up @@ -80,8 +81,11 @@ public class Func3Globals<TInput> : Func2Globals<TInput>

#endregion

public static bool Register<TInput>(string name, string expression)
public static bool Register<TInput>(string name, string expression, bool @override = false)
{
if (@override)
_funcDict.TryRemove(name, out _);

if (expression.Contains("p2"))
return _funcDict.TryAdd(name, CreateFunc3<TInput>(expression));
else if (expression.Contains("p1"))
Expand All @@ -92,37 +96,41 @@ public static bool Register<TInput>(string name, string expression)
return _funcDict.TryAdd(name, CreateFunc0<TInput>(expression));
}

public static bool Register<TInput>(string name, Func<IReadOnlyList<TInput>, int, IAnalyzeContext<TInput>, decimal?> expr)
=> _funcDict.TryAdd(name, expr);
public static bool Register<TInput>(string name, Expression<Func<IReadOnlyList<TInput>, int, IAnalyzeContext<TInput>, decimal?>> expr, bool @override = false)
=> Register<TInput>(name, expr.Body.ToString(), @override);

public static bool Register<TInput>(string name, Func<IReadOnlyList<TInput>, int, decimal, IAnalyzeContext<TInput>, decimal?> expr)
=> _funcDict.TryAdd(name, expr);
public static bool Register<TInput>(string name, Expression<Func<IReadOnlyList<TInput>, int, decimal, IAnalyzeContext<TInput>, decimal?>> expr, bool @override = false)
=> Register<TInput>(name, expr.Body.ToString(), @override);

public static bool Register<TInput>(string name, Func<IReadOnlyList<TInput>, int, decimal, decimal, IAnalyzeContext<TInput>, decimal?> expr)
=> _funcDict.TryAdd(name, expr);
public static bool Register<TInput>(string name, Expression<Func<IReadOnlyList<TInput>, int, decimal, decimal, IAnalyzeContext<TInput>, decimal?>> expr, bool @override = false)
=> Register<TInput>(name, expr.Body.ToString(), @override);

public static bool Register<TInput>(string name, Func<IReadOnlyList<TInput>, int, decimal, decimal, decimal, IAnalyzeContext<TInput>, decimal?> expr)
=> _funcDict.TryAdd(name, expr);
public static bool Register<TInput>(string name, Expression<Func<IReadOnlyList<TInput>, int, decimal, decimal, decimal, IAnalyzeContext<TInput>, decimal?>> expr, bool @override = false)
=> Register<TInput>(name, expr.Body.ToString(), @override);

public static bool Register(string name, Func<IReadOnlyList<Candle>, int, IAnalyzeContext<Candle>, decimal?> expr)
=> Register<Candle>(name, expr);
public static bool Register(string name, Expression<Func<IReadOnlyList<Candle>, int, IAnalyzeContext<Candle>, decimal?>> expr, bool @override = false)
=> Register<Candle>(name, expr, @override);

public static bool Register(string name, Func<IReadOnlyList<Candle>, int, decimal, IAnalyzeContext<Candle>, decimal?> expr)
=> Register<Candle>(name, expr);
public static bool Register(string name, Expression<Func<IReadOnlyList<Candle>, int, decimal, IAnalyzeContext<Candle>, decimal?>> expr, bool @override = false)
=> Register<Candle>(name, expr, @override);

public static bool Register(string name, Func<IReadOnlyList<Candle>, int, decimal, decimal, IAnalyzeContext<Candle>, decimal?> expr)
=> Register<Candle>(name, expr);
public static bool Register(string name, Expression<Func<IReadOnlyList<Candle>, int, decimal, decimal, IAnalyzeContext<Candle>, decimal?>> expr, bool @override = false)
=> Register<Candle>(name, expr, @override);

public static bool Register(string name, Func<IReadOnlyList<Candle>, int, decimal, decimal, decimal, IAnalyzeContext<Candle>, decimal?> expr)
=> Register<Candle>(name, expr);
public static bool Register(string name, Expression<Func<IReadOnlyList<Candle>, int, decimal, decimal, decimal, IAnalyzeContext<Candle>, decimal?>> expr, bool @override = false)
=> Register<Candle>(name, expr, @override);

public static bool Register(string name, string expression)
=> Register<Candle>(name, expression);
public static bool Register(string name, string expression, bool @override = false)
=> Register<Candle>(name, expression, @override);

public static bool Register(string name, IFuncAnalyzable analyzable)
=> _funcDict.TryAdd(name, analyzable.Func);
public static bool Register(string name, IFuncAnalyzable analyzable, bool @override = false)
{
if (@override)
_funcDict.TryRemove(name, out _);
return _funcDict.TryAdd(name, analyzable.Func);
}

public static bool Unregister(string name) => _funcDict.TryRemove(name, out var _);
public static bool Unregister(string name) => _funcDict.TryRemove(name, out _);

internal static object Get(string name) => _funcDict[name];
}
Expand Down
16 changes: 7 additions & 9 deletions Trady.Analysis/Trady.Analysis.csproj
@@ -1,20 +1,20 @@
<Project Sdk="Microsoft.NET.Sdk">
<!--<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" />-->
<PropertyGroup>
<TargetFramework>netstandard1.4</TargetFramework>
<TargetFramework>netstandard2.0</TargetFramework>
</PropertyGroup>
<PropertyGroup>
<Description>Analysis module of Trady, a handy library for computing technical indicators, based on .NET Standard 1.4</Description>
<Description>Analysis module of Trady, a handy library for computing technical indicators, based on .NET Standard 2.0</Description>
<Copyright>Copyright (c) 2016-2017 Karl Wan</Copyright>
<AssemblyTitle>Trady.Analysis</AssemblyTitle>
<VersionPrefix>2.1.0-beta6</VersionPrefix>
<VersionPrefix>3.0.0-beta0</VersionPrefix>
<Authors>Karl Wan</Authors>
<TargetFramework>netstandard1.4</TargetFramework>
<TargetFramework>netstandard2.0</TargetFramework>
<AssemblyName>Trady.Analysis</AssemblyName>
<PackageId>Trady.Analysis</PackageId>
<PackageTags>Trady;Technical;Analysis;Finance;Stock</PackageTags>
<PackageReleaseNotes>
[29/8/2017] Various changes from v2.0, please refer to https://github.com/lppkarl/Trady/tree/v2.1
[29/8/2017] Various changes from v2.0, please refer to https://github.com/lppkarl/Trady/tree/v3.0
</PackageReleaseNotes>
<PackageProjectUrl>https://github.com/lppkarl/Trady</PackageProjectUrl>
<PackageLicenseUrl>https://github.com/lppkarl/Trady/blob/master/LICENSE</PackageLicenseUrl>
Expand All @@ -33,13 +33,11 @@
<EmbeddedResource Include="**\*.resx" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="1.1.1">
</PackageReference>
<PackageReference Include="System.Reflection.TypeExtensions" Version="4.3.0">
</PackageReference>
<PackageReference Include="Microsoft.CSharp" Version="4.4.0" />
<PackageReference Include="System.ValueTuple" Version="4.4.0" />
<PackageReference Include="Microsoft.CodeAnalysis.CSharp.Scripting" Version="2.3.2" />
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="2.0.0" />
<PackageReference Include="System.Reflection.TypeExtensions" Version="4.4.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Trady.Core\Trady.Core.csproj" />
Expand Down
10 changes: 5 additions & 5 deletions Trady.Core/Trady.Core.csproj
@@ -1,20 +1,20 @@
<Project Sdk="Microsoft.NET.Sdk">
<!--<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" />-->
<PropertyGroup>
<TargetFramework>netstandard1.4</TargetFramework>
<TargetFramework>netstandard2.0</TargetFramework>
</PropertyGroup>
<PropertyGroup>
<Description>Core module of Trady, a handy library for computing technical indicators, based on .NET Standard 1.4</Description>
<Description>Core module of Trady, a handy library for computing technical indicators, based on .NET Standard 2.0</Description>
<Copyright>Copyright (c) 2016-2017 Karl Wan</Copyright>
<AssemblyTitle>Trady.Core</AssemblyTitle>
<VersionPrefix>2.1.0-beta6</VersionPrefix>
<VersionPrefix>3.0.0-beta0</VersionPrefix>
<Authors>Karl Wan</Authors>
<TargetFramework>netstandard1.4</TargetFramework>
<TargetFramework>netstandard2.0</TargetFramework>
<AssemblyName>Trady.Core</AssemblyName>
<PackageId>Trady.Core</PackageId>
<PackageTags>Trady;Technical;Analysis;Finance;Stock</PackageTags>
<PackageReleaseNotes>
[29/8/2017] Various changes from v2.0, please refer to https://github.com/lppkarl/Trady/tree/v2.1
[29/8/2017] Various changes from v2.0, please refer to https://github.com/lppkarl/Trady/tree/v3.0
</PackageReleaseNotes>
<PackageProjectUrl>https://github.com/lppkarl/Trady</PackageProjectUrl>
<PackageLicenseUrl>https://github.com/lppkarl/Trady/blob/master/LICENSE</PackageLicenseUrl>
Expand Down
10 changes: 5 additions & 5 deletions Trady.Importer.Csv/Trady.Importer.Csv.csproj
@@ -1,20 +1,20 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>netstandard1.4</TargetFramework>
<TargetFramework>netstandard2.0</TargetFramework>
</PropertyGroup>
<PropertyGroup>
<Description>Csv importer module of Trady, a handy library for computing technical indicators, based on .NET Standard 1.4</Description>
<Description>Csv importer module of Trady, a handy library for computing technical indicators, based on .NET Standard 2.0</Description>
<Copyright>Copyright (c) 2016-2017 Karl Wan</Copyright>
<AssemblyTitle>Trady.Importer.Csv</AssemblyTitle>
<VersionPrefix>2.1.0-beta5</VersionPrefix>
<VersionPrefix>3.0.0-beta0</VersionPrefix>
<Authors>Karl Wan</Authors>
<TargetFramework>netstandard1.4</TargetFramework>
<TargetFramework>netstandard2.0</TargetFramework>
<AssemblyName>Trady.Importer.Csv</AssemblyName>
<PackageId>Trady.Importer.Csv</PackageId>
<PackageTags>Trady;Technical;Analysis;Finance;Stock</PackageTags>
<PackageReleaseNotes>
[29/8/2017] Various changes from v2.0, please refer to https://github.com/lppkarl/Trady/tree/v2.1
[29/8/2017] Various changes from v2.0, please refer to https://github.com/lppkarl/Trady/tree/v3.0
</PackageReleaseNotes>
<PackageProjectUrl>https://github.com/lppkarl/Trady</PackageProjectUrl>
<PackageLicenseUrl>https://github.com/lppkarl/Trady/blob/master/LICENSE</PackageLicenseUrl>
Expand Down
10 changes: 5 additions & 5 deletions Trady.Importer.Google/Trady.Importer.Google.csproj
@@ -1,20 +1,20 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>netstandard1.4</TargetFramework>
<TargetFramework>netstandard2.0</TargetFramework>
</PropertyGroup>
<PropertyGroup>
<Description>Google finance importer module of Trady, a handy library for computing technical indicators, based on .NET Standard 1.4</Description>
<Description>Google finance importer module of Trady, a handy library for computing technical indicators, based on .NET Standard 2.0</Description>
<Copyright>Copyright (c) 2016-2017 Karl Wan</Copyright>
<AssemblyTitle>Trady.Importer.Google</AssemblyTitle>
<VersionPrefix>2.1.0-beta5</VersionPrefix>
<VersionPrefix>3.0.0-beta0</VersionPrefix>
<Authors>Karl Wan</Authors>
<TargetFramework>netstandard1.4</TargetFramework>
<TargetFramework>netstandard2.0</TargetFramework>
<AssemblyName>Trady.Importer.Google</AssemblyName>
<PackageId>Trady.Importer.Google</PackageId>
<PackageTags>Trady;Technical;Analysis;Finance;Stock</PackageTags>
<PackageReleaseNotes>
[29/8/2017] Various changes from v2.0, please refer to https://github.com/lppkarl/Trady/tree/v2.1
[29/8/2017] Various changes from v2.0, please refer to https://github.com/lppkarl/Trady/tree/v3.0
</PackageReleaseNotes>
<PackageProjectUrl>https://github.com/lppkarl/Trady</PackageProjectUrl>
<PackageLicenseUrl>https://github.com/lppkarl/Trady/blob/master/LICENSE</PackageLicenseUrl>
Expand Down
12 changes: 6 additions & 6 deletions Trady.Importer.Quandl/Trady.Importer.Quandl.csproj
@@ -1,20 +1,20 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>netstandard1.4</TargetFramework>
<TargetFramework>netstandard2.0</TargetFramework>
</PropertyGroup>
<PropertyGroup>
<Description>Quandl importer module of Trady, a handy library for computing technical indicators, based on .NET Standard 1.4</Description>
<Description>Quandl importer module of Trady, a handy library for computing technical indicators, based on .NET Standard 2.0</Description>
<Copyright>Copyright (c) 2016-2017 Karl Wan</Copyright>
<AssemblyTitle>Trady.Importer.Quandl</AssemblyTitle>
<VersionPrefix>2.1.0-beta5</VersionPrefix>
<VersionPrefix>3.0.0-beta0</VersionPrefix>
<Authors>Karl Wan</Authors>
<TargetFramework>netstandard1.4</TargetFramework>
<TargetFramework>netstandard2.0</TargetFramework>
<AssemblyName>Trady.Importer.Quandl</AssemblyName>
<PackageId>Trady.Importer.Quandl</PackageId>
<PackageTags>Trady;Technical;Analysis;Finance;Stock</PackageTags>
<PackageReleaseNotes>
[29/8/2017] Various changes from v2.0, please refer to https://github.com/lppkarl/Trady/tree/v2.1
[29/8/2017] Various changes from v2.0, please refer to https://github.com/lppkarl/Trady/tree/v3.0
</PackageReleaseNotes>
<PackageProjectUrl>https://github.com/lppkarl/Trady</PackageProjectUrl>
<PackageLicenseUrl>https://github.com/lppkarl/Trady/blob/master/LICENSE</PackageLicenseUrl>
Expand All @@ -29,7 +29,7 @@
<GenerateAssemblyFileVersionAttribute>false</GenerateAssemblyFileVersionAttribute>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Quandl.NET" Version="1.1.1" />
<PackageReference Include="Quandl.NET" Version="1.2.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Trady.Core\Trady.Core.csproj" />
Expand Down

0 comments on commit ff27611

Please sign in to comment.