Финансовая лаборатория

Биржевая торговля и торговые роботы


Всем привет!

Как  я и обещал - продолжаем процесс написание нашего первого торгового робота с помощью программы FinLab.MTS

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

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

Напомню, пишем торгового робота мы для торговли на российском биржевом рынке с пмощью программы FinLab.MTS

Начнем!

1. Получать данные от нашего "контрола" мы будем через виртуальный метод ApplyChanges. Для того чтобы реализовать этот метод нам необходимо пронаследовать его от класса ObjectAssociatedControl.

Перед этим добавим с помощью ключевого слова using пространство имен FinLab.TradeBase, в котором и находится этот класс(Рис1).

Рис1 - Наследуем класс ObjectAssociatedControl

2. Теперь заполним метод CreateControl (класса Alghoritm).

При запуске программы для отображения пользовательского интерфейса запускается этот метод. В нем мы создаем экземпляр нашего "контрола", передаем ссылку на самого себя (далее объясню зачем) и передаем экземпляр программе.

В классе UserControl1 создаем переменную типа нашего класса(Class1) и через конструктор присваиваем ей ссылку на, созданный при запуске программы, экземпляр класса Class1(Рис2).

Рис2 - Первый этап создания связи между Class1 и "контролом"

3. Теперь переопределим метод ApplayChanges(наследуемый от класса ObjectAssociatedControl ). Изначально он  использует базовую реализацию (Рис3).

Рис3 - Переопределяем метод ApplyChanges

4. Ну а теперь, наверное, самое творческое занятие. Заполним созданный нами "контрол", согласно стратегии. Здесь должны быть те элементы, через которые мы хотим получить, от пользователя, необходимую для корректной работы программы информацию.

В данном примере я получаю количество лотов, которое будет выставляться в заявке(Рис4).

Рис4 - Заполненный "контрол"

5.  В завершение нашего урока мы сделаем так, чтобы при загрузке наш "контрол" заполнялся сохраненными данными, а  потом передавал данные программе (если пользователь их изменил или если программа запускается в первый раз и сохраненных данных нет).

Вот тут мы и используем нашу ссылку, полученную через конструктор, на класс Class1(Рис5).

Рис5 - Завершающий этап создания связи между Class1 и "контролом"

Код программы:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Text;

using FinLab.MTS.Infinity;

using FinLab.TradeBase;

using System.Drawing;

using System.Windows.Forms;

namespace ClassLibrary1

{

public class Class1:Algorithm

{

public Class1()

{ }

public int Lot_Size { get; set; }

public override AddCommand CheckBuyDirection(IStakan futures, IStakan spot)

{ }

public override AddCommand CheckSellDirection(IStakan futures, IStakan spot)

{ }

public override bool DeleteOrderBuy(AddCommand addCommand, IStakan futures, IStakan spot)

{ }

public override bool DeleteOrderSell(AddCommand addCommand, IStakan futures, IStakan spot)

{ }

public override bool Initialize()

{return true;}

public override void Dispose()

{ }

public override ObjectAssociatedControl CreateControl()

{ }

public override double TargetPriceBuy

{

get { return 0;}

}

public override double TargetPriceSell

{

get { return 0;}

}

public override double AveragePrice

{

get { return 0; }

}

public override int CurrentLotSizeBuy

{

get { return 0; }

}

public override int CurrentLotSizeSell

{

get { return 0; }

}

public override void OnTrade(Trade trade)

{ }

}

}

public partial class UserControl1 : ObjectAssociatedControl

{

private Class1 Cla;

public UserControl1(Class1 state)

{

Cla = state;

InitializeComponent();

numericUpDown1.Value = (decimal)Cla.Lot_Size;

}

public override void ApplyChanges()

{

Cla.Lot_Size = (int)numericUpDown1.Value;

}

}

partial class UserControl1

{

/// <summary>

/// Required designer variable.

/// </summary>

private System.ComponentModel.IContainer components = null;

/// <summary>

/// Clean up any resources being used.

/// </summary>

/// <param name=”disposing”>true if managed resources should be disposed; otherwise, false.</param>

protected override void Dispose(bool disposing)

{

if (disposing && (components != null))

{

components.Dispose();

}

base.Dispose(disposing);

}

#region Component Designer generated code

/// <summary>

/// Required method for Designer support – do not modify

/// the contents of this method with the code editor.

/// </summary>

private void InitializeComponent()

{

this.numericUpDown1 = new System.Windows.Forms.NumericUpDown();

this.label1 = new System.Windows.Forms.Label();

this.groupBox1 = new System.Windows.Forms.GroupBox();

((System.ComponentModel.ISupportInitialize)(this.numericUpDown1)).BeginInit();

this.SuspendLayout();

//

// numericUpDown1

//

this.numericUpDown1.Location = new System.Drawing.Point(85, 8);

this.numericUpDown1.Name = “numericUpDown1″;

this.numericUpDown1.Size = new System.Drawing.Size(45, 20);

this.numericUpDown1.TabIndex = 0;

//

// label1

//

this.label1.AutoSize = true;

this.label1.Location = new System.Drawing.Point(3, 10);

this.label1.Name = “label1″;

this.label1.Size = new System.Drawing.Size(76, 13);

this.label1.TabIndex = 1;

this.label1.Text = “Кол-ва лотов:”;

//

// groupBox1

//

this.groupBox1.Location = new System.Drawing.Point(3, 34);

this.groupBox1.Name = “groupBox1″;

this.groupBox1.Size = new System.Drawing.Size(229, 186);

this.groupBox1.TabIndex = 2;

this.groupBox1.TabStop = false;

this.groupBox1.Text = “Другие настройки:”;

//

// UserControl1

//

this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);

this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;

this.Controls.Add(this.groupBox1);

this.Controls.Add(this.label1);

this.Controls.Add(this.numericUpDown1);

this.Name = “UserControl1″;

this.Size = new System.Drawing.Size(235, 234);

((System.ComponentModel.ISupportInitialize)(this.numericUpDown1)).EndInit();

this.ResumeLayout(false);

this.PerformLayout();

}

#endregion

private System.Windows.Forms.NumericUpDown numericUpDown1;

private System.Windows.Forms.Label label1;

private System.Windows.Forms.GroupBox groupBox1;

}

Вот и подошел к концу второй урок по созданию простейшего торгового робота.

Чтобы иметь возможность на не только читать, но и самостоятельно постепенно делать именно своего робота - открывайте брокерский счёт, получайте пограмму FinLab.MTS и вперёд - покорять вершины роботостроительства!

Далее я рассмотрю если не самую важную, то одну из важнейших тем при создании робота. Заполнение методов CheckBuyDirection, CheckSellDirection, DeleteOrderBuy, DeleteOrderSell.

Чтобы не пропустить следующие части – не забывайте подписываться на новые статьи по RSS… (кто не знает, что такое RSS – можете посмотреть здесь>>) .

До встречи, уважаемые коллеги роботописатели!

Если информация показалась Вам интеесной и полезной -  поддержите наш блог в рейтинге лучших финансовых блогов. Заодно посмотрите, о чём пишут другие трейдеры (наверняка, там много роботостроителей).

PS: Кто читает - напиите в комментариях - кто в какой среде и с помощью какой программы делает собственных роботов. И ещё - понятен ли стиль изложения?

Так же вы можете посмотреть предыдущие 2 урока:

Рубрики: FinLab

Комментариев: 17

  1. Андрей - делаю торговые роботы в MATLAB пишет:

    Хорошая статья – добавил в социальные закладки и по ссылке рейтинга блогов перешел…
    По правде говоря, стиль изложения не очень понятный, поскольку лучше записывать Скринкаст – в динамике гораздо проще понять. ИМХО. По поводу платформы для написания торговых роботов – крайне советую MATLAB. Имеет безграничные возможности для алгоритмизации, бэктестинга, интеграции с другими приложениями, создания графического интерфейса, при необходимости и т.п. Есть много уже готовых решений по ипользованию покрытого и непокрытого арбитража, pairs trading, high-frequency finance и прочего… Больше 5 лет с MATLAB работаю и очень доволен, а раньше со многими специализированными решениями работал, но они всегда в чем-то ограничены.

    • Дмитрий Власов пишет:

      А что значит “скринкаст в динамике”?
      По поводу MATLAB – слышал не единожды, что удобная прогрмма. Где про неё почитать на русском можно?

      • Андрей - делаю торговые роботы в MATLAB пишет:

        Скринкаст – это запись происходящего на рабочем столе. Могу посоветовать Adobe Captivate или Camtasia для этих целей.

        Увы, если Вы хотите иметь дело с MATLAB, вам придется как минимум вплотную работать с обширной документацией на английском, я бы еще посоветовал прослушать пару записанных вебинаров для начинающих на их сайте (тоже на английском). Вот http://matlab.exponenta.ru/ – максимум что есть на русском, но, поверьте мне, этим обойтись не возможно.

    • Владислав пишет:

      Андрей-Делаю торговые роботы, напишите в личку есть предложения по сотрудничеству.

  2. brody пишет:

    Классно!
    Ждём 3-й урок.

  3. Brrrr пишет:

    А-а-а-а! У меня от этого ООП и классов с объектами мозг взрывается!
    Вы главное, в конце повествования, укажите в каком месте торговую логику нужно описывать. )

    • Дмитрий Власов пишет:

      Блин, до торговой логики ещё добраться надо… :-)
      Но зато торговая логика будет самой простой частью!

  4. korshun пишет:

    Торговая логика будет в последнем уроке.Так как пока мы делаем инфраструктуру.

  5. gars пишет:

    Хорошо бы было как-то анонсировать выход новых версий программы и что в ней нового. А то чтобы узнать появилось ли обновление нужно грохнуть имеющуюся, установить новую и убедиться что она старая.

  6. gars пишет:

    Не могли бы Вы поподробнее объяснить для НЕпрограммеров как добавить с помощью ключевого слова using пространство имен FinLab.TradeBase, в котором и находится этот класс. Пункт первый второго урока.

    • korshun пишет:

      gars,здравствуйте!

      Не совсем понятен ваш вопрос. Но попробую ответить.
      Вам необходимо написать следующее: using FinLab.TradeBase;
      using объявляется в начале кода программа, в самом верху(вы должны увидеть уже созданные using, созданные программой автоматически при создании проекта, просто добавьте свой using строчкой выше/ниже)

      Все, больше от вас ничего не требуется, если перед этим вы добавили сборку в проект(Урок 1, пкт3).

  7. Евгений пишет:

    В коде теперь в строке using FinLab…./a>.Infinity добавлена ссылка на сайт(http://finlabportal.ru). В начале написания кода её не было . объясните для чего так нужно.Что необходимо использовать библиотеку с сайта , а не из папки на компе ? Или я не догоняю чего то.

  8. Евгений пишет:

    Для новичков (коим я и являюсь ) нужно хорошо ознакомиться с программой Microsoft Visual C# 2010 Express. Я уж не заостряю на том что для этого пришлось порыться в инете и выкачоь 13гигов софта , т.к. там все разновидности программ Microsoft Visual даны одним архивом. Затем найти в архиве знакомый символ C# – и установить программу Microsoft Visual C# 2010 Express.Слава богу она русифицирована. А вот уже в ней есть хорошая помощь с уроками на русском языке. Там построение кода разжевано на примерах.Кстати построение уроков там составлено очень неплохо .Свою первую программу на C# я составил вчера за один вечер по шагам данным в примере. По крайней мере что то становится понятно по струкруре и логике работы. Ещё конечно необходимо почитать что нибудь про язык программирования C#. В инете полно материала(например Эндрю Троелсен ” Язык программирования C#2010 и платформа .NET 4″.Сам я всё это ещё не дочитал ,но думаю что этот путь правильный.

  9. Евгений пишет:

    Самая классная книга”С#.4.автор HERBERT SCHILDT”. Пробовал начинать несколько трудов , но эта -просто супер. Всё понятно ихложено. Вопросы которые я поднимал снимаю – во всём сам разобрался. Пока новых вопрсов не возникло. Активности на форуме всё равно нет сам с собою переписываюсь.

  10. Евгений пишет:

    «Спасибо», что никто не ответил , т.к. это заставило самому во всём разобраться – «Class1.» выдавал ошибку т.к. эта часть кода пишется на другой странице кода (UserContrul1.cs) , а поначалу я всё в Class1.cs прописывал. А насчет того что FinLab.PairTrade не видит библиотеки – вот тут я помучился . Оказалось всё просто – я создавал библиотеку с использованием 4 .NET. а не 3.5.NET.( о чём написано в 1 уроке). Как всегда – ВСЁ ИМЕЕТ ЗНАЧЕНИЕ ! Так что будьте внимательны !!!

    • Дмитрий Власов пишет:

      Евгений, рад что Вы во всём сами разобрались. Чем больше начинаешь в вопросе самостоятельно копаться тем быстрее осваиваешь нужные тебе вещи… :-)

Оставить комментарий