새로운 암호 화폐 거래 응용 프로그램에서 확장 방법을 사용하기로 결정했습니다.

안녕하세요 정말 짧은 글입니다. 깨달음이라고 부르지는 않겠지만 확장 메서드를 사용하여 애플리케이션에 필터링과 비즈니스 로직을 추가하기로 결정했습니다. 물론 확장 방법을 사용하지만 그 자체에 관한 것은 아닙니다.

더 진행하기 전에 이것은 고주파 거래 애플리케이션(HFT)이 아닙니다. 우리가 자동 거래에 대해 생각하는 일반적인 방식으로 성능에 신경 쓸 필요는 없지만 .Net Core와 영리한 데이터 모델링이 문제를 해결할 것이라고 확신합니다.

저는 5년 이상 암호화폐에 빠져 있었습니다. 너무 짧았지만 그 시간 동안 저는 매우 간단한 거래 전략을 생각해 냈습니다. 걱정하지 마십시오. 여기(또는 다른 곳)에서 사기를 판매할 생각이 없습니다. 그러나 프로그래밍 기술을 사용하여 수동 거래 전략을 개선할 수 있다는 것을 알고 있습니다. 결국 저는 금융 공간 내에서 높은 수준의 수많은 프로젝트에서 금융 분야에서 일했습니다.

많은 금융인들이 암호화폐에 관여하지 않는 이유 중 하나는 암호화폐가 여전히 금기시되는 주제이기 때문입니다.

여기에서 내가 조사하고 있는 내용에 대한 높은 수준의 개요를 읽을 수 있습니다.

https://www.inforhino.co.uk/article/Discussion/Insights%20and%20Thoughts/Automated-Cryptocurrency-Trading-Engine-in-dotnet----08-Aug-2022

일반적으로 다양한 클래스를 만들어 주입했을 것입니다. 한 가지 멋진 작업은 IList를 만들고 일련의 논리 테스트를 추가하여 수행하려는 테스트를 구성하는 것입니다.

IList<ILogicTest> logicTests = new List<ILogicTest>()
{{new ShouldTrade()},{new ShouldNeverTrade()},{new BuyLikeYouNeedANewHandbag()}};


이제 내 응용 프로그램은 여전히 ​​특정 부분에서 위와 같은 작업을 수행합니다. 이는 단일 책임 원칙을 위반하지 않는 좋은 방법입니다. 나는 전에 이것에 대해 썼다. 그러나 얼마나 많은 ShouldTrade 클래스가 필요할까요? 누군가는 말할 것이지만 아마도 우리는 다른 구현을 원할 것입니다. 다른 구현을 만들지 않고 거기에 확장 방법의 사용을 캡슐화하는 것이 어떻습니까?

사람들은 말할 것입니다 - 누가 신경 쓰나요? 많은 사람들이 확장 메서드를 좋아하지 않습니다. 확실히 우리는 동일한 네임스페이스 내에서 충돌을 일으키고 주입할 수 없지만 기본 유형에 대한 순수한 평가를 위해 - 왜 안 될까요?

내가 달성하려는 것은 좀 더 명확하고 덜 어수선한 것이라고 생각합니다. 이것이 작동할지 모르겠지만 코드베이스를 더 간단하게 만드는 데 도움이 된다면 시도해 볼 가치가 있습니다.

물론 확장 메서드를 단위 테스트할 수 없다고 주장하는 사람들이 있습니다. 물론 가능합니다.

C#을 조금 보고 싶은 사람들을 위해



버그를 발견하면 알려주세요. 많은 문제를 생각할 수 있지만 더 이상 고민하지 않습니다.

namespace IR.AssetTrader.Analyser.Helpers
{
    public static class AssetPairRateHelper
    {

        static public IEnumerable<AssetPairRate> GetAssetPairRatesByAsset(this IEnumerable<AssetPairRate> assetPairRates, string CodeLong, string CodeShort)
        {
            return assetPairRates.Where(x => x.LongAsset.Code == CodeLong && x.ShortAsset.Code == CodeShort);

        }


        static public IEnumerable<AssetPairRate> GetAssetPairRatesByAssetDate(this IEnumerable<AssetPairRate>  assetPairRates, string CodeLong, string CodeShort, DateTime Start,DateTime End )
        {
            return assetPairRates.Where(x => x.LongAsset.Code == CodeLong && x.ShortAsset.Code == CodeShort && x.EventTMS >= Start && 
            x.EventTMS <= End);

        }
        static public IEnumerable<AssetPairRate> GetAssetPairRatesByAsset(this IEnumerable<AssetPairRate> assetPairRates, AssetPair assetPair)
        {
            return assetPairRates.Where(x => x.LongAsset.Code == assetPair.LongAsset.Code && x.ShortAsset.Code == assetPair.ShortAsset.Code );

        }
        static public IEnumerable<AssetPairRate> GetAssetPairRatesByAssetDate(this IEnumerable<AssetPairRate> assetPairRates, AssetPair assetPair, DateTime Start, DateTime End)
        {
            return assetPairRates.Where(x => x.LongAsset.Code == assetPair.LongAsset.Code && x.ShortAsset.Code == assetPair.ShortAsset.Code && x.EventTMS >= Start &&
            x.EventTMS <= End);

        }
        static public AssetPair GetAssetPairFromAssetPairRates(this IEnumerable<AssetPairRate> assetPairRates, AssetPair assetPair)
        {

            var firstAsset = assetPairRates.Where(x => x.LongAsset.Code == assetPair.LongAsset.Code && x.ShortAsset.Code == assetPair.ShortAsset.Code).First();

            return new AssetPair { LongAsset = firstAsset.LongAsset, ShortAsset = firstAsset.ShortAsset };

        }
        static public AssetPair GetAssetPairFromAssetPairRates(this IEnumerable<AssetPairRate> assetPairRates, string CodeLong, string CodeShort)
        {
            var firstAsset = assetPairRates.Where(x => x.LongAsset.Code == CodeLong && x.ShortAsset.Code == CodeShort).First();

            return new AssetPair { LongAsset = firstAsset.LongAsset, ShortAsset = firstAsset.ShortAsset };


        }
    }
}

좋은 웹페이지 즐겨찾기