pmus
pmus личный блог
24 января 2017, 06:32

Простые плагины для RTS-Robot с Гитлером и без

Простые плагины для RTS-Robot с Гитлером и без
Под катом рассматриваем структуру самого простого плагина.

Сегодня я расскажу, как устроены плагины в моей торговой платформе. Плагин — это программа на Python, записанная в файл с любым именем в подпапке /plugins основной программы. Плагин — это не обязательно торговая система, т.к. он может выполнять любые функции (планировщик соединений, доставщик новостей, sms-оповещатель) — всё, что может пригодиться в работе. Начну с описания самого простого плагина, который традиционно будет 'Hello, world'.

Для начала поясню, чего мне хотелось избежать в своих программах, и почему я выбрал именно Python.
Обычный скрипт для TSLab API выглядит приблизительно так:

using System.Collections.Generic;                                                                          
using TSLab.Script;                                                                             
using TSLab.Script.Handlers;                                                                            
using TSLab.Script.Optimization;                                                                                
using TSLab.Script.Helpers;                                                                             
using TSLab.Script.Realtime;                                                                            
                                                                                
namespace TSLab.Samples                                                                         
{                                                                               
        public class Final : IExternalScript                                                                    
        {                                                                       
                public …
                public virtual void Execute(IContext ctx, ISecurity sec)                                                                
                {                                                               
                        var …                                            
                        IList …
                        {                       
                                int barsCount = sec.Bars.Count;
                                for (int i = 50; (i < barsCount); i++)
                                        
                                {                                                       
                                        if …                                             
                                        else …
                                        {                                               
                                                BT = …;                                  
                                                ST = …;
                                        }
        
                                }
                        }

Как говорится, ехал Гитлер через Гитлер… или это был Public через Public?

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

Структура плагина максимально проста: в нем обязательны ровно две вещи.
  1. название: plugin_name
  2. функция init()

Если плагину необходимо получить управление в момент успешной установки соединения, то нужно добавить ещё одну функцию: trade()

Итак, простейший плагин hello_world по строчкам:

# -*- coding: utf-8 -*-#
plugin_name = 'Hello world!'

 Указываем, что файл сохранен в кодировке UTF-8 и называется он 'Hello world'

global api

Указываем, что будем использовать встроенный API — он нам понадобится для вывода текста в окно программы

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

class HelloWorld():

    def __init__(self):
        pass

    def sayhello(self):
        api.pprint('<strong>Hello!</strong>', 'magenta')

    def trade(self):
        api.pprint('<strong>Trade!</strong>', 'blue')

hello = HelloWorld()

И наконец, обязательные функции

def init():
    hello.sayhello()


def trade():
    hello.trade()

При успешной загрузке плагина выполнится init(), которая вызовет метод hello.sayhello(), а тот, в свою очередь, вызовет функцию api под названием pprint. А функция api.pprint(текст, цвет) по умолчанию выводит текст нужного цвета в закладку 'Консоль'.
Простые плагины для RTS-Robot с Гитлером и без
Сразу после установки соединения будет вызвана (при наличии ее в плагине) функция trade(). У нас она просто сообщает, что успешно запустилась.
Простые плагины для RTS-Robot с Гитлером и без
Вот и весь hello_world.

Приведу ещё раз полный текст плагина:

# -*- coding: utf-8 -*-#
plugin_name = 'Hello'
global api

class HelloWorld():
    def __init__(self):
        pass

    def sayhello(self):
        api.pprint('<strong>Hello!</strong>', 'magenta')

    def trade(self):
        api.pprint('<strong>Trade!</strong>', 'blue')

hello = HelloWorld()

def init():
    hello.sayhello()

def trade():
    hello.trade()

Как видите, получается компактный и читаемый код безо всяких Гитлеров. А если упростить, убрав класс,  то вообще семь строк:

# -*- coding: utf-8 -*-#
plugin_name = 'Hello'
global api

def init():
    api.pprint('<strong>Hello!</strong>', 'magenta')

def trade():
    api.pprint('<strong>Trade!</strong>', 'blue')


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

Буду рад вашим комментариям!


Демка платформы лежит здесь: http://rts-robot.ru

p.s. Самые внимательные разглядят на скриншотах путь C:\Yukon. Это рабочее название проекта, но раз уж сайт называется rts-robot, то и программу я решил называть так же.

2 Комментария
  • akuloff
    24 января 2017, 12:15
    предлагаю выпустить книжку по программированию «Моя борьба»

Активные форумы
Что сейчас обсуждают

Старый дизайн
Старый
дизайн