Sergey Kosinsky Personal web site

Встраивание питона в Метасток

Установочный файл MsxPython-v1.0-RELEASE-Setup.exe содержит DLL расширение для Метастока которое позволяет запускать на выполнение скрипты написанные на языке Питон. Например функция RSI индикатора выглядит так:

 

import msx

def msx_rsi(handle, bar_count):    
    """Usage: pyRSI(Price[], Period)"""
 
    #get script argument values
    period = msx.get_argument(handle, 1)
    
    #initialize local variables
    gain = 0.0
    loss = 0.0

    #calculate first gain\loss 
    for i in range(1, period): 
		
        price_change = msx.get_argument(handle, 0, i) - msx.get_argument(handle, 0, i - 1)

        if price_change > 0:
            gain = gain + price_change
	                                
        if price_change < 0:
            loss = loss - price_change

    gain = gain / (period - 1)
    loss = loss / (period - 1) 
        
    #pass data back to MSX dll
    if loss == 0:
        rsi = 100
    else:
        rs = gain / loss
        rsi = 100 - 100 /(1 + rs)
     
    msx.set_result(handle, i, rsi)
             
    #do processing for every other bars    
    for i in range(period, bar_count):
        
        price_change = msx.get_argument(handle, 0, i) - msx.get_argument(handle, 0, i - 1)
        
        if price_change > 0:
            gain = (gain * (period - 1) + price_change) / period
        else:    
            gain = (gain * (period - 1)) / period
        
        if price_change < 0:   
            loss = (loss * (period - 1) - price_change) / period
        else:
            loss = (loss * (period - 1)) / period
            		
        if loss == 0:
            rsi = 100
        else:
            rs = gain / loss
            rsi = 100 - 100 / (1 + rs)

        #pass data back to MSX dll
        msx.set_result(handle, i, rsi)

    return 

Описание скрипта

Функция msx_rsi(handle, bar_count)

Функция вызывается каждый раз, когда Метасток получает новые биржевые данные или просто считает, что пора обновить график. Функция получает два аргумента служебных аргумента . Первый из них handle является указателем на объект данных содержащий OHLCVOIP массивы цен, фактические данные аргументов и пустой массив для возвращаемого в Метасток результата работы скрипта. Второй аргумент bar_count указывает на размер всех вышеупомянутых массивов. Данные в массивах упорядочены по дате и времени в возрастающем порядке.

Строка документации функции имеет специальное назначение: Она описывает функцию и ее аргументы с точки зрения Метастока. Каждый аргумент имеет признак типа согласно следующему соглашению: для аргументов типа ценового массива после имени добавляется "[]", имя строкового аргумента заключается в кавычки, а числовой агумент не имеет таких признаков. В начале строки документации используется сигнатура "Usage: " по которой и определяется, что функция должна быть экспортирована в Метасток.

 

import msx

def msx_example(handle, bar_count):
    """Usage: Example(Price[], Period)"""

    for bar_index in range(bar_count):
        #do some processing for every bar
        open  = msx.get_open(handle, bar_index)
        close = msx.get_close(handle, bar_index)
        value = (open - close)/2 + close
        #pass data back to MSX dll
        msx.set_result(handle, bar_index, value)         
    return

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

Если скрипту требуются данные цен или другие данные, которые может передавать Метасток, то доступ к таким данным осуществляется через специальные функции доступа get_* и set_* находящиеся в модуле msx.

Модуль msx

Этот встроенный модуль обеспечивает доступ к данным цен базового инструмента, аргументам функции переданных Метастоком(если они есть) и, как минимум, обеспечивает передачу результата работы скрипта обратно в Метасток. Каждый скрипт должен импортировать этот модуль.

Имеется следующий набор функций доступа:

 

Функция

Тип результата
доступ к ценам базового интрумента
msx.get_date(handle, bar_index)
целое число в формате YYYYMMDD - 19000000
msx.get_time(handle, bar_index)

целое число в формате HHMMSSNNN

msx.get_open(handle, bar_index) число с плавающей точкой
msx.get_high(handle, bar_index) число с плавающей точкой
msx.get_low(handle, bar_index) число с плавающей точкой
msx.get_close(handle, bar_index) число с плавающей точкой
msx.get_vol(handle, bar_index) число с плавающей точкой
msx.get_oi(handle, bar_index) число с плавающей точкой
доступ к аргументам функции
msx.get_argument(handle, arg_index, bar_index) число с плавающей точкой
msx.get_argument(handle, arg_index)
целое число, число с плавающей точкой или строка
другие данные базового инструмента
msx.get_symbol(handle) строка
msx.get_period(handle)
строка из одного символа:"I","D","W","Q","Y"
msx.get_interval(handle) целое число
msx.get_start_time(handle) целое число в формате HHMM
msx.get_end_timel(handle) целое число в формате HHMM
вывод результата  
msx.set_result(handle, bar_index, value) аргумент value - целое число или число с плавающей точкой

 

Аргументы функций при вызове:

-handle: указатель на объект данных базового инструмента;

-bar_index: это целочисленный индекс элемена в любом из массивов объекта данных. Индекс может принимать значения от 0 до bar_count - 1;

-arg_index: целочисленный порядковый номер аргумента в списке аргументов функции как они описаны в строке документации этой функции и как видны в Метастоке. Первый аргумент имеет номер 0.

 

Как использовать

Установка.

Скачать MsxPython-v1.0-RELEASE-Setup.zip и установить в домашний каталог Метастока "C:\Program Files\Equis\MetaStock". Должны появиться следуюшие файлы.

 

Directory of C:\Program Files\Equis\MetaStock\External Function DLLs

02/20/2011 05:37 PM 123,904 MSXPython.dll

Directory of C:\Program Files\Equis\MetaStock\PyScripts

09/07/2011 03:29 PM 10,220 MSXPython.py

 

 

 

Запустите Метасток и создайте пользовательский индикатор.

 

{Usage: ExtFml( "MSXPython.pyRSI", Close[], Period)} 

Period:=Input("Period", 1, 50, 14);
ExtFml( "MSXPython.pyRSI", C, Period); 
      

1

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

1

После сохранения индикатор pyRSI появится в выпадающем списке QuickList. Бросьте его на какой нибудь график в отдельное внутренее окно. Также для сравнения можно добавить родной метастоковский RSI.

1

 

Создание собственной функции.

Можно добавлять свои функции в модуль MSXPython.py. Имена функций не имеют особого значения - в Метастоке они все равно будут видны так, как записано в строке документации.

Всего MSXPython.dll экспортирует в Метасток до 10 функций.

 

Пример работы реализованной на Питоне функции pyJMA в сравненнии с ее реализацией в виде MSX DLL - обновленный скрипт MSXPython.py можно скачать здесь.

 

Особенности

1.После любого изменения скрипта требуется перезагрузка Метаcтока.

2.Сообщения об ошибках выводятся в файл MSXPython.log в домашнем каталоге MSWin.exe после закрытия Метастока.

3.Функция get_argument() для аргументов числового типа для целых значений возвращает тип целое число, для нецелого - тип числа с плавающей запятой.

 

Замечания и предложения можно оставить на странице обратной связи.

/ksr
Сергей Р. Косинский,
Санкт-Петербург, Россия.
Создано: 12 февряля 2011

Обновлено: September 26, 2013

www.000webhost.com