Я решил использовать методы расширения в своем новом приложении для торговли криптовалютой

Привет, это очень короткий пост. Я бы не назвал это озарением, но я решил использовать методы расширения для добавления фильтрации и бизнес-логики в мое приложение. Конечно, я использую методы расширения, но речь пойдет не о них как таковых.

Прежде чем продолжить — это не приложение для высокочастотной торговли (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 };


        }
    }
}

Вход в полноэкранный режим Выход из полноэкранного режима

Оцените статью
devanswers.ru
Добавить комментарий