![]() |
||||||||||||||||||||||||||||||||||||||||||||
|
Встраивание питона в Метасток Установочный файл 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 Этот встроенный модуль обеспечивает доступ к данным цен базового инструмента, аргументам функции переданных Метастоком(если они есть) и, как минимум, обеспечивает передачу результата работы скрипта обратно в Метасток. Каждый скрипт должен импортировать этот модуль. Имеется следующий набор функций доступа:
Аргументы функций при вызове: -handle: указатель на объект данных базового инструмента; -bar_index: это целочисленный индекс элемена в любом из массивов объекта данных. Индекс может принимать значения от 0 до bar_count - 1; -arg_index: целочисленный порядковый номер аргумента в списке аргументов функции как они описаны в строке документации этой функции и как видны в Метастоке. Первый аргумент имеет номер 0.
Как использовать Установка. Скачать и установить MsxPython-v1.0-RELEASE-Setup.exe в домашний каталог Метастока "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);
Обычно я даю названия индикаторов такие же, как и название используемой функции:
После сохранения индикатор pyRSI появится в выпадающем списке QuickList. Бросьте его на какой нибудь график в отдельное внутренее окно. Также для сравнения можно добавить родной метастоковский RSI.
Создание собственной функции. Можно добавлять свои функции в модуль MSXPython.py. Имена функций не имеют особого значения - в Метастоке они все равно будут видны так, как записано в строке документации. Всего MSXPython.dll экспортирует в Метасток до 10 функций.
Пример работы реализованной на Питоне функции pyJMA в сравненнии с ее реализацией в виде MSX DLL - обновленный скрипт MSXPython.py можно скачать здесь.
Особенности 1.После любого изменения скрипта требуется перезагрузка Метаcтока. 2.Сообщения об ошибках выводятся в файл MSXPython.log в домашнем каталоге MSWin.exe после закрытия Метастока. 3.Функция get_argument() для аргументов числового типа для целых значений возвращает тип целое число, для нецелого - тип числа с плавающей запятой.
|
||||||||||||||||||||||||||||||||||||||||||||
|
Замечания и предложения можно оставить на странице обратной связи. |
||||||||||||||||||||||||||||||||||||||||||||
Обновлено: September 7, 2011 |
||||||||||||||||||||||||||||||||||||||||||||