Программирование - это просто
Advertisement
Главная arrow Уроки программирования arrow Тесты торговых стратегий на C# (платный раздел) arrow Тесты торговых стратегий на C#. Урок 37. В стратегию "Шип" добавили стоп приказы
01.03.2024 г.
Главное меню
Главная
Интернет магазин
Программные продукты
Биржевые роботы
Искусственный интеллект
Математика и информатика
1С:Предприятие
Уроки C#
Уроки Delphi
Уроки программирования
Web-программирование
Дизайн и графика
Компьютер для блондинок
Исходники
Статьи
Платный раздел
Рассказы про компьютеры
Хитрости и секреты
Системный подход
Размышления
Наука для чайников
Друзья сайта
Excel-это не сложно
Все о финансах
.
Тесты торговых стратегий на C#. Урок 37. В стратегию "Шип" добавили стоп приказы Печать E-mail
Автор megabax   
20.05.2023 г.
New Page 1

Тесты торговых стратегий на C#. Урок 37. В стратегию "Шип" добавили стоп приказы

Чтобы смотреть урок полностью, а так же скачать исходники к уроку, подпишитесь на платный раздел.

В платном разделе статья находится здесь.

Исходники к уроку можно скачать в платном разделе.


В статье "Дневник разработчика торговой стратегии. Шаг 40. Исследование стратегии "Шип"" я озвучил идею, что надо предусмотреть стоп лоссы и тэйк профиты. И сейчас мы ее реализуем. И так, в класс SpikeTrader добавим нужные поля:

        /// <summary>

        /// Размер стоп лосса, %

        /// </summary>

        public decimal stop_loss = 1;

 

        /// <summary>

        /// Размер тэйк профита, %

        /// </summary>

        public decimal take_profit=10;

 

        /// <summary>

        /// Код выставленного стоп лосс ордера

        /// </summary>

        public string stop_loss_order;

 

        /// <summary>

        /// Код выставленного тэйк профит ордера

        /// </summary>

        public string take_profit_order;

У этого же класса немного модифицируем метод start(), который отвечает за торговлю:

        /// <summary>

        /// Старт торговой стратегии. При реальной торговле отрабатывается на каждом тике,

        /// при тестировании - на каждой свече

        /// </summary>

        /// <returns>true - отработано успешно, false - были ошибки</returns>

        public override bool start()

        {

            ITerminalDriver driver = manager.strategy.driver;

            string account = manager.strategy.account;

            string market = manager.strategy.market;

            string ticker = manager.strategy.ticker;

 

            int signal = GetSignal(1);

 

 

            decimal koeff = 1;

            int l_count_trade = Convert.ToInt32(get_count_trade() / koeff);

 

            int count_bal;

 

            //если сигнал на покупку

            if (signal == 1)

            {

                count_bal = driver.itemCountOnAccount(ticker); //определим кол-во инструментов на балансе

 

                //определяем, сколько будем покупать, учитывая то, что надо переворачивать позицию

                int count_buy = l_count_trade - count_bal;

 

                //если мы можем что то купить, то покупаем

                if (count_buy > 0)

                {

                    // выставляем ордер на покупку

                    StockOrderInfo info;

                    info.account = account;

                    info.count = count_buy;

                    info.market = market;

                    info.price = 0; //по рынку

                    info.stopType = ""; //обычная заявка

                    info.type = "buy";

                    info.signalPrice = 0;

                    info.ticker = ticker;

                    info.expiry = DateTime.Now;

                    driver.sendOrder(info);

 

                    //выставляем стоп лосс

                    if (stop_loss_order != null)

                    {

                        (driver as IAddTerminalDriver).deleteOrder(stop_loss_order);

                    }

                    info.stopType = "stoploss"; //обычная заявка

                    info.type = "sell";

                    info.signalPrice = _source.getBarFromCurrent(0).open*(1.0-Convert.ToDouble(stop_loss)/100);

                    stop_loss_order=driver.sendOrder(info).orderCode;

 

                    //выставляем тэйк профит

                    if (take_profit_order != null)

                    {

                        (driver as IAddTerminalDriver).deleteOrder(take_profit_order);

                    }

                    info.signalPrice = _source.getBarFromCurrent(0).open * (1.0 + Convert.ToDouble(take_profit) / 100);

                    info.stopType = "takeprofit"; //обычная заявка

                    take_profit_order=driver.sendOrder(info).orderCode;

                }

            }

 

            //если сигнал на продажу

            if (signal == -1)

            {

                count_bal = driver.itemCountOnAccount(ticker); //определим кол-во инструментов на балансе

 

                //определяем, сколько будем покупать, учитывая то, что надо переворачивать позицию

                int count_sell = l_count_trade + count_bal;

 

                //если мы можем что то продать, то продаем

                if (count_sell > 0)

                {

                    //выставим ордер на продажу

                    StockOrderInfo info;

                    info.account = account;

                    info.count = count_sell;

                    info.market = market;

                    info.price = 0; //по рынку

                    info.stopType = ""; //обычная заявка

                    info.type = "sell";

                    info.signalPrice = 0;

                    info.ticker = ticker;

                    info.expiry = DateTime.Now;

                    driver.sendOrder(info);

 

 

                    //выставляем стоп лосс

                    if (stop_loss_order != null)

                    {

                        (driver as IAddTerminalDriver).deleteOrder(stop_loss_order);

                    }

                    info.stopType = "stoploss"; //обычная заявка

                    info.type = "buy";

                    info.signalPrice = _source.getBarFromCurrent(0).open * (1.0 + Convert.ToDouble(stop_loss) / 100); ;

                    stop_loss_order=driver.sendOrder(info).orderCode;

 

                    //выставляем тэйк профит

                    if (take_profit_order != null)

                    {

                        (driver as IAddTerminalDriver).deleteOrder(take_profit_order);

                    }

                    info.signalPrice = _source.getBarFromCurrent(0).open * (1.0 - Convert.ToDouble(take_profit) / 100);

                    info.stopType = "takeprofit"; //обычная заявка

                    take_profit_order=driver.sendOrder(info).orderCode;

 

                }

 

            }

 

            //теперь проверим, надо ли удалить стоп заявки

            Order order = null;

 

            if (take_profit_order != null)

            {

                order = (driver as IAddTerminalDriver).getOrder(take_profit_order);

                if (order != null)

                {

                    if (order.state == OrderState.Full) (driver as IAddTerminalDriver).deleteOrder(stop_loss_order);

                }

            }

 

            if (stop_loss_order != null)

            {

                order = (driver as IAddTerminalDriver).getOrder(stop_loss_order);

                if (order != null)

                {

                    if (order.state == OrderState.Full) (driver as IAddTerminalDriver).deleteOrder(take_profit_order);

                }

            }

 

            return true;

        }

К форме SpikeEdit добавим пару компонентов NumericUpDown*:

????? ???????? ????????? ?? C#. ???? 37. ? ????????? "???" ???????? ???? ???????

Назовем их nudStopLoss и nudTakeProfit соответственно. Свойство Modifiers у обоих из них делаем Public. После этого у класса SpikeStrategy осталось только изменить методы edit():

        /// <summary>

        /// Вызвать диалог редактирования параметров стратегии

        /// </summary>

        /// <returns>true - если редактирование применилось,

        /// false - в противном случае (пользователь нажал "Отмена")

        /// </returns>

        public bool edit()

        {

            SpikeEdit form = new SpikeEdit();

            SpikeTrader trader = (manager.traders[0] as SpikeTrader);

            form.nudPriods.Value = trader.periods;

            form.nudStopLoss.Value = trader.stop_loss;

            form.nudTakeProfit.Value = trader.take_profit;

            if (form.ShowDialog() == DialogResult.OK)

            {

                trader.periods = Convert.ToInt32(form.nudPriods.Value);

                trader.stop_loss=form.nudStopLoss.Value;

                trader.take_profit=form.nudTakeProfit.Value;

                return true;

            }

            else

            {

                return false;

            }

        }

 

и ToString():

        /// <summary>

        /// Строковое представление стратегии

        /// </summary>

        /// <returns>Строковое представление</returns>

        public override string ToString()

        {

            SpikeTrader trader = (manager.traders[0] as SpikeTrader);

            string s = trader.periods.ToString();

            string s1 = trader.take_profit.ToString() + ", " + trader.stop_loss.ToString();

            return "Шип 1 (" + s + "); (" + s1 + ")";

        }

Все, теперь можно тестировать стратегию. К сожалению, введение стоп лоссов только ухудшило результат:

????? ???????? ????????? ?? C#. ???? 37. ? ????????? "???" ???????? ???? ???????

Правда, их можно отключить, сделав достаточно большими. Тогда стратегия будет работать так же, как и без них.


Скриншоты, помеченные знаком *, являются цитатами и иллюстрациями  программного продукта "Microsoft Visual Studio 2010", авторское право на который принадлежит "Microsoft". 

 

Последнее обновление ( 20.05.2023 г. )
 
« След.   Пред. »
 
© 2024 Программирование - это просто
Joomla! - свободное программное обеспечение, распространяемое по лицензии GNU/GPL.
Русская локализация © 2005-2008 Joom.Ru - Русский Дом Joomla!
Design by Mamboteam.com | Powered by Mambobanner.de
Я принимаю Яндекс.Деньги