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

Урок 20. Биржевой симулятор. Реализуем эмулятор стоп-приказов и стратегии.

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

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


Сегодня мы продолжим улучшать функционал нашего симулятора. Но, давайте по по порядку. Сначала немножко изменим класса TESBInstrument,...

....

... И так, все объяснения по порядку. У вас наверняка возникнет вопрос: для чего мы заводим аж три списка для хранения ордеров: FStopLoses, FTakeProfits и FOrders? Все дело в том, что в целях достоверного тестирования стратегии мы должны рассматривать самые неблагоприятные варианты, в противном случае мы не можем гарантировать, что стратегия, показавшая хорошие результаты в тесте, покажет такие же хорошие результаты при реальной торговле. А если при тестировании мы учтем закон Мерфи: "Если неприятность может случиться, то она непременно случиться" и тест все равно покажет прибыль, значит, наша стратегия действительно прибыльная. Теперь предположим, что мы тестируем стратегию на дневных интервалах, и у нас получается, что в один день должен сработать и стоп лосс и тэйк профит. В целях "жесткого" тестирования мы предполагаем, что сначала у нас исполниться стоп лосс. Если наша стратегия предусматривает отмену тэйк профита при срабатывании стоп лосса, то это и будет учет наихудшего варианта развития событий. Вот для того, что бы обеспечить первичное срабатывания стоп лосса по отношению к тейк профиту мы и создаем два списка ссылок на стоп-приказы: FStopLoses и FTakeProfits. А FOrders - это общий список ссылок для доступа через свойство Orders....

.... 

... И так, изменим объявление класса:

      TESBTradeSystem=class(TESBBaseClass)

      protected

        FAccount:TESBAccount;

      public

        property Account:TESBAccount read FAccount write FAccount;

        function Step:boolean; virtual; abstract;

        constructor Create;

      end;

Мы добавили абстрактный метод Step и конструктор. Вот последний то мы и реализуем:

constructor TESBTradeSystem.Create;

begin

   inherited Create;

   FAccount:=nil;

end;

 Теперь реализуем класс торговой стратегии на пробой уровня поддержки и сопротивления с нижеприведенными правилами (TESBExternalTradeSystem):

  • Если котировки пробивают снизу вверх уровень сигнальной цены, то встаем в лонг. 
  • Если котировки пробивают сверху вниз уровень сигнальной цены, то встаем в шорт. 
  • Закрываемся при наличии противоположного сигнала с переворотом.

Поясню сказанное русским языком: у нас есть уровень поддержки и сопротивления. У нас допустим, происходит пробой сопротивления. Мы покупаем на пробое (для этого то и устанавливаем отложенный стоп приказ). Когда нам закрываться? Тогда, когда будет пробой уровня сопротивления (обратный сигнал). При этом мы не просто продаем наш лонг, но и встаем в шорт. Естественно, уровни поддержки и сопротивления у нас постоянно меняются, следовательно, мы постоянно корректируем значение цены наших стоп приказов.  При этом мы предполагаем, что сигналы у нас охраняться во внешнем файле, который по заданному формату сформирован в другой программе. См анонс предыдущего урока.  ...

...

... Теперь начнем тестировать созданные классы. .... 

Нам надо добавить в тестовый пример, который вы создали на предыдущем уроке компонент TStringGrid (назовем его sqOrders), поля вводе (edCandle), которое у нас будет предназначена для ввода количества свечей, на котором мы будем тестировать стратегию и так же добавляем кнопочку btnGoto (тестирование заданного количества свечей)*:

Урок 20. Биржевой симулятор. Реализуем эмулятор стоп-приказов и стратегии.

В объявление класса формы TfrmStockBot на надо добавить поле TradeSystem:TESBExternalTradeSystem*:

Урок 20. Биржевой симулятор. Реализуем эмулятор стоп-приказов и стратегии.

Переделываем процедуру создания формы:

procedure TfrmStockBot.FormCreate(Sender: TObject);

begin

  Account:=TESBAccount.Create;

  Account.Replenish(10000);

  Account.TechCosts:=1;

  Signaler:=TESBExternalSignaler.Create;

  lbCash.Caption:='Деньги '+FloatToStr(Account.Cash);

  TradeSystem:=TESBExternalTradeSystem.Create;

  TradeSystem.Signaler:=Signaler;

  TradeSystem.Account:=Account;

  CreateGrid;

end;

Так же переписываем процедуру уничтожения формы (что бы TradeSystem тоже уничтожалась):

procedure TfrmStockBot.FormDestroy(Sender: TObject);

begin

  FreeAndNil(Account);

  FreeAndNil(Signaler);

  FreeAndNil(TradeSystem);

end;

Для того, что бы мы могли тестировать стратегию в пошаговом режиме, переделаем обработчик нажатия на кнопочку "След. свеча" (btnNext):

procedure TfrmStockBot.btnNextClick(Sender: TObject);

begin

   TradeSystem.Step;

   RedrawGrid;

end;

Для отображения списка выставленных ордеров переделаем процедуру CreateGrid:

procedure TfrmStockBot.CreateGrid;

begin

   sgInstrs.Cols[0].Text:='№';

   sgInstrs.Cols[1].Text:='Наименование';

   sgInstrs.Cols[2].Text:='Цена';

   sgInstrs.Cols[3].Text:='Количество';

   sgInstrs.Cols[4].Text:='Стоимость';

   sgInstrs.Cols[5].Text:='Дата и время';

   sgInstrs.Cols[6].Text:='Тек. свеча';

   sgInstrs.Cols[7].Text:='Активность';

 

   sgInstrs.ColWidths[1]:=140;

   sgInstrs.ColWidths[5]:=100;

 

 

   sgOrders.Cols[0].Text:='Акция';

   sgOrders.Cols[1].Text:='Количество';

   sgOrders.Cols[2].Text:='Стоп-цена';

   sgOrders.Cols[3].Text:='Цена исполнения';

   sgOrders.Cols[4].Text:='Направление';

   sgOrders.Cols[5].Text:='Тип';

   sgOrders.Cols[6].Text:='Статус';

 

   sgOrders.ColWidths[0]:=140;

   sgOrders.ColWidths[3]:=100;

   sgOrders.ColWidths[4]:=100;

end;

и процедуру RedrawGrid дописываем с этой же целью:

procedure TfrmStockBot.RedrawGrid;

var i,cn,curCandle:integer;

begin

   cn:=Account.InstrumetnsCount;

   sgInstrs.RowCount:=cn+1;

   for i:=1 to cn do

   begin

      sgInstrs.Cells[0,i]:=IntToStr(i);

      sgInstrs.Cells[1,i]:=Account.Instruments[i-1].Name;

      sgInstrs.Cells[2,i]:=FloatToStr(Account.Instruments[i-1].CurrentPrice);

      sgInstrs.Cells[3,i]:=IntToStr(Account.Instruments[i-1].Count);

      sgInstrs.Cells[4,i]:=FloatToStr(Account.Instruments[i-1].Count*Account.Instruments[i-1].CurrentPrice);

      curCandle:=Account.Instruments[i-1].CurrentCandle;

      sgInstrs.Cells[5,i]:=DateTimeToStr(Account.Instruments[i-1].PriceSource.GetBarDataByIndex(curCandle).DateTime);

      sgInstrs.Cells[6,i]:=IntToStr(curCandle);

      if Account.Instruments[i-1].Active then

             sgInstrs.Cells[7,i]:='Да'

      else

             sgInstrs.Cells[7,i]:='Нет';

   end;

 

   cn:=Account.OrdersCount;

   sgOrders.RowCount:=cn+1;

   if cn>0 then sgOrders.FixedRows:=1;

   for i:=1 to cn do

   begin

     sgOrders.Cells[0,i]:=Account.Orders[i-1].Instrument.Name;

     sgOrders.Cells[1,i]:=IntToStr(Account.Orders[i-1].Count);

     sgOrders.Cells[2,i]:=FloatToStr(Account.Orders[i-1].StopPrice);

     sgOrders.Cells[3,i]:=FloatToStr(Account.Orders[i-1].PriceFull);

     sgOrders.Cells[4,i]:=IntToStr(Account.Orders[i-1].TradeDirection);

     if Account.Orders[i-1].OrderType=otStopLoss then

        sgOrders.Cells[5,i]:='Stop loss'

     else

        sgOrders.Cells[5,i]:='Take profit';

     if Account.Orders[i-1].State=osActive then

        sgOrders.Cells[6,i]:='Активный'

     else

        sgOrders.Cells[6,i]:='Исполнен';

   end;

 

   lbCash.Caption:='Деньги '+FloatToStr(Account.Cash);

   lbcurDate.Caption:=DatetimeToStr(Account.CurrentDateTime);

   lbSignal.Caption:=IntToStr(Signaler.SignalDirection);

   lbSignalPrice.Caption:=FloatToStr(Signaler.SignalPrice);

end;

Ну, и наконец, пишем обработчик нажатия на кнопочку тестирования по заданному количеству свечей (btnGo):

procedure TfrmStockBot.btnGotoClick(Sender: TObject);

begin

  while TradeSystem.Account.Instruments[0].PriceSource.CurrentItemIndex<StrToInt(edCandle.Text) do

       TradeSystem.Step;

  RedrawGrid;

end;

Все, запускаем программу и тестируем:

Урок 20. Биржевой симулятор. Реализуем эмулятор стоп-приказов и стратегии.

Для того, что бы убедиться, что программа работает, убедимся, что стопы срабатывают:

Урок 20. Биржевой симулятор. Реализуем эмулятор стоп-приказов и стратегии.


Скриншоты, помеченные знаком * , являются цитатами и иллюстрациями  программного продукта "Turbo Delphi", авторское право на который принадлежит "Borland Software Corporation


 

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