Board index Bitcoin Qt Bitcoin Trader JL Script - Скриптовый язык для автоматизации торгов

JL Script - Скриптовый язык для автоматизации торгов

Qt Bitcoin Trader is open source application that helps you open and cancel BTC-e, Bitstamp, BTCChina, Bitfinex, GOC.io orders very fast. Real time data monitoring.


Posts: 11
Location: Ukraine

English

JL Script это упрощенный язык программирования разработанный мной, который позволяет создавать сложные стратегии и полностью автоматизировать торговлю.
Есть полная поддержка JavaScript функций и методов.

Вы можете создавать скрипты JL Script внутри программы Qt Bitcoin Trader (скачать под Mac, Windows и Linux).

Все функции и методы специфичные для JL Script начинаються на "trader." и после точки можно вызывать один из трех типов методов: Событие, Функция и Команда. Простой пример обращения к методу это trader.get("LastPrice") эта функция возвращает последнюю цену маркета.

События

Событие это функция которая связана с индикатором и вызываеться в момент изменения значения индикатора.
Структура методов событий начинаеться командой "trader.on(", дальше идет название индикатора а потом ").changed()". Название индикатора должно быть в кавычках.
Пример использования функции события:

trader.on("LastPrice").changed()
{
//Ваш код тут
}


У каждого события есть три переменные локального действия. Это: symbol, name, value.
symbol это пара, символ примером которой есть текст "BTC/USD"
name код индикатора, текстовое название, пример "LastPrice"
value дробное значение которое содержит последнее значение индикатора
Эти переменные могут быть использованы в любом месте события, а так же не использованы вовсе.

Пример использования локальных переменных из события:

trader.on("LastPrice").changed()
{
if(symbol!="BTC/USD")return; // Сравнение, если индикатор не от пары BTC/USD, то стоп, и следующие строки не будут исполнены
if(value>500)than ..; //сравнение значения индикатора с числом 500. В нашем случае это последняя цена маркета
}


Список поддерживаемых событий:
trader.on("10MinBuyDivSell").changed()
//Это осбытие вызываеться индикатором который вычисляет деление между объемом покупок и продаж в промежуток последних 10 минут.

trader.on("10MinVolume").changed()
//Объем за последние 10 минут

trader.on("ApiLag").changed()
//Api Lag - это значение в секундах которое являеться промежутком времени между отправкой запроса и приемом результата. Используеться для определения доступности биржи. Например если лаг больше 15 секунд, значит возможности торговать нет, проблемы у биржи или у вас нет интернета.

trader.on("LastPrice").changed() // Последняя цена маркета

trader.on("AskPrice").changed() // Цена предложения маркета

trader.on("BidPrice").changed() // Цена спроса маркета

trader.on("LastMyBuyPrice").changed() // Цена последней покупки аккаунта

trader.on("LastMySellPrice").changed() // Цена последней продажи аккаунта

trader.on("Fee").changed() // Коммисия аккаунта

trader.on("Balance","BTC").changed()
// Этот метод возвращает баланс по заданной валюте. Можете подставить вместо "BTC" любую другую. Но если баланс выбранной валюты недоступен то событие не будет вызываться

trader.on("HighPrice").changed() // Максимальная цена за последние 24 часа

trader.on("LowPrice").changed() // Минимальная цена за последние 24 часа

trader.on("DayVolume").changed() // Объем торгов за последние 24 часа

trader.on("MyLastTrade").changed() // Срабатывает при продаже или покупке аккаунта

trader.on("LastTrade").changed() // Срабатывает при любой покупке или продаже маркета

trader.on("AnyValue").changed()
// Это событие вызываеться если любой из индикаторов изменился. Но черезмерное использование данного события в многочисленных группах одновременно может привести к большей нагрузки CPU. Лучше используйте таймеры (примеры ниже).

trader.on("Time").changed()
// Это событие вызываеться раз в секунду

trader.on("OpenOrdersCount").changed()
//Количество открытых ордеров изменилось

trader.on("OpenBidsCount").changed()
//Количество открытых ордеров на покупку изменилось

trader.on("OpenAsksCount").changed()
//Количество открытых ордеров на продажу


Функции

Функция это метод, который возвращает значение индикатора или каких-либо вычислений.
Вы можете достать значение любого индикатора используя метод "get". Пример: trader.get("LastPrice").
Функции которые возвращяют значения индикаторов поддерживают два аргумента, первый это пара (символ) а второй название индикатора. Пример: trader.get("BTC/USD","LastPrice").
Вы можете доставать значения индикаторов из любого места в скрипте.

Список функций которые возращяют значения индикаторов:
trader.get("Balance","BTC") // Этот метод возвращает баланс по заданной валюте. Можете подставить вместо "BTC" любую другую. Но если баланс выбранной валюты недоступен то событие не будет вызываться

trader.get("10MinBuyDivSell")
//Возвращает вычисление, результатом которого есть деление между объемом покупок и продаж в промежуток последних 10 минут.

trader.get("10MinVolume")
//Объем за последние 10 минут

trader.get("ApiLag")
//Api Lag - это значение в секундах которое являеться промежутком времени между отправкой запроса и приемом результата. Используеться для определения доступности биржи. Например если лаг больше 15 секунд, значит возможности торговать нет, проблемы у биржи или у вас нет интернета.

trader.get("AskPrice") // Цена предложения маркета

trader.get("BidPrice") // Цена спроса маркета

trader.get("DayVolume") // Объем торгов за последние 24 часа

trader.get("Fee") // Коммисия аккаунта

trader.get("HighPrice") // Максимальная цена за последние 24 часа

trader.get("LastMyBuyPrice") // Цена последней покупки аккаунта

trader.get("LastMySellPrice") // Цена последней продажи аккаунта

trader.get("LastPrice") // Последняя цена маркета

trader.get("LowPrice") // Минимальная цена за последние 24 часа


Специальные функции

trader.get("Time") // Функция возращяет (секунды) текущее время в unix формате числом (time_t)

trader.get("AsksPrice",объем) //Цена предложения по указанному объему
trader.get("BidsPrice",объем) //Цена спроса по указанному объему
//Эти функции возвращяют вычисления которые используют стакан (глубину, ордер бук). Например, вы хотите узнать какой цена станет если кто-нибудь продаст 1000 BTC. Результатом функции trader.get("BidsPrice",1000) будет цена которая находиться напротив суммы объемов стакана с значением минимум 1000 BTC.

trader.get("AsksVolume",price) //Объем по указанной цене предложения
trader.get("BidsVolume",price) //Объем по указанной цене спроса
//Эти функции работают в противоположном направлении. Вы можете достать суммарный объем ордеров до указанной цены. Например если вы хотите узнать объем между текущей ценой и указанной, используйте код: trader.get("AsksVolume",600)

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

trader.get("OpenOrdersCount")
//Возвращает количество открытых ордеров в вашем аккаунте

trader.get("OpenAsksCount")
//Возвращает количество открытых ордеров на продажу

trader.get("OpenBidsCount")
//Возвращает количество открытых ордеров на покупку


Команды

Таймеры и задержки

Используя JL Script вы можете устанавливать таймеры и задержки таким способом:

trader.timer(секунды,"команда")
trader.delay(секунды,"команда")


Например, у нас есть функция "myFunction()" и мы хотим ее запустить с задержкой 1,5 секунды (1500 мс).
Это можно сделать таким образом:

trader.delay(1.5,"myFunction()");


Таймер работает таким же образом:
trader.timer(1.5,"myFunction()");

В результате ваша функция "myFunction()" будет регулярно выполняться с интервалом в 1.5 секунды.

Вывод лога

В JL Script вы можете в любом месте выводить свой лог, замечания или любую информацию, которая будет отображена в окне для вывода лога. Для каждой группы скриптов или правил лог отдельный и независимый.

Функция которая используеться для вывода: trader.log()

Пример:
trader.log("Хэло ворлд!"); //В результате в логе появиться строка "Хэло ворлд!"

trader.log(200.45); //В результате будет выведено число "200.45"

trader.log("Последняя цена:",trader.get("LastPrice")); //Результатом будет вывод текста "Последняя цена:" и дальше число последней цены


Вы можете использовать до 4 аргументов любого типа в функции log().

Для очистки лога используеться команда trader.logClear()

Звуковые оповещения

Есть три команды которые могут озвучить работу программы:

trader.beep() // Создает звук пищалки

trader.playWav("C:/МойЗвук.wav") //Проиграет файл (только WAV формат)  по указаному полному пути файла переданному через параметр

trader.say("текст")
//Эта команда произносит вслух любой текст используя встроеный движок в ОС. Прекрасно работает в Windows b Mac, но под Linux она всего-лишь вызывает команду "say" с параметром текста для произношения. Вам следует самим найти способ поместить ярлык-программу "say" которая будет произносить текст выбранным вами способом.
//Можете использовать код: trader.say("Текущая цена маркета",trader.get("LastPrice")) и программа произнесет вслух "Текущая цена маркета 500.4".


Запуск сторонних программ

Из JL Script вы можете запустить любую программу или команду используя код: trader.startApp("C:/ПутьКПрограмме.exe")

Торговые команды

Торговые команды это покупка, продажа и отмена ордеров. Для любого из методов можете использовать дополнительный первый параметр symbol, который указывает в какой конкретно паре надо открыть ордер.

trader.sell(объем,цена)
trader.buy(объем,цена)
// Продать указанный объем по указанной цене. Пример: trader.sell(1,500) - команда продает 1 BTC по 500 USD - будет использована текущая валютная пара.
// Покупка работает таким же образом. Так же вы можете добавить первый аргумент для указания пары и выглядеть это будет так: trader.sell("BTC/USD",1,500) - будет продано 1 BTC по 500 USD.

trader.cancelOrders() // Отменяет все открытые ордера

trader.cancelAsks() // Отменяет все ордера на продажу

trader.cancelBids() // Отменяет все ордера на покупку


Выключить/Включить группы с помощью скрипта

Вы можете включать или выключать существующие группы скриптов или правил по их имени.

trader.groupStart("имя") //Запускает группу правил или скрипт по имени

trader.groupStop("имя") //Останавливает выполнение группы по имени

trader.groupIsRunning("имя") //Возвращает true если у группы есть рабочие правила или скрипт


Переменные

Вы можете использовать код JavaScript для создания своих переменных в любом месте скрипта.
Пример: "var a=0;" и использование переменной позже "a=a+6" так же можно скомбинировать вычисление с функциями JL Script: "a=a+trader.get('LastPrice')"

Пользовательские индикаторы и события

В JL Script можно создавать как свои индикаторы так и события к ним.
Для этого используеться одна команда trader.sendEvent("имя",значение);
Так же команда может быть вызвана с помощью трех параметров trader.sendEvent("символ","имя",значение);
Вы можете придумать любое уникальное имя которое не совпадает с существующими именами индикаторов и отправлять значение всем группам скриптов.
Например, вы хотите создать индикатор вычисления среднего чесла последних цен спроса и предложения AskPrice и BidPrice.
Назовем индикатор "MidPrice". Транслировать событие этого индикатора будет выше указанная функция trader.sendEvent("MidPrice",значение);
Теперь нам надо вычислять значение среднего при каждом изменении цены спроса или предложения.

Создаем новую группу для скрипта и назовем его "Индикатор среднего числа".
И добавляем туда два события на изменение последних цен спроса и предложения.

Image

Теперь добавляем код который будет транслировать наше событие, вычисление которого будем делать в отдельной функции, назвоем ее "calculateMidPrice()".
Кодом который вычисляет среднее значение у нас будет "(trader.get("BidPrice")+trader.get("AskPrice"))/2".
Транслировать событие надо только если изменилось наше среднее значение, поэтому создаем переменную "lastMidPrice", в которой будем хранить последнее значение.

var lastMidPrice=0;
calculateMidPrice(); // Вызываем функцию при старте, чтобы не дожидаться изменения индикаторов

function calculateMidPrice()
{
var midPrice=(trader.get("BidPrice")+trader.get("AskPrice"))/2;
if(midPrice==lastMidPrice)return; // Останавливаемся если значение не изменилось
lastMidPrice=midPrice; // Сохраняем последнее значение
trader.sendEvent("MidPrice",midPrice); // Транслируем наше событие
}

trader.on("BidPrice").changed()
{
calculateMidPrice();
}

trader.on("AskPrice").changed()
{
calculateMidPrice();
}


Image

Теперь проверим как работает наш индикатор. Создаем еще одну пустую группу скрипта под названием "Проверка".
Получать событие пользовательского индикатора так же просто как и с стандартными событиями.
Пишем тело события:

trader.on("MidPrice").changed()
{

}


И мы будем получать значения внутри него. Чтобы увидеть работу его визуально, добавляем вывод в лог всех изменений.

trader.on("MidPrice").changed()
{
trader.log("Средняя цена изменилась:", value);
}


Запускаем обе группы скриптов и смотрим в лог.

Image

Наш индикатор работает, и его можно использовать в любом скрипте и в любом месте с помощью стандартного метода trader.get("MidPrice");

Надо помнить

Помните что нужно следить за тем чтобы желаемый объем продажи и покупки а так же цена соответствовали критериям бирж. Если объем ордера который будет выполнен будет меньше 0.001 например, то биржа его проигнорирует.

Помните что если лаг больше 15 секунд, то хоть и используеться повтор запросов и компенсация потери пакетов, но шансов на открытие, закрытие, отмену ордера меньше. Открывайте ордера только когда лаг находиться в допустимых рамках.

Получение данных с валютных пар отличных от выбранной в интерфейсе пока не работает, но в некоторых биржах методы покупки и продажи работают не зависимо от текущей пары.

Видео документация: https://www.youtube.com/watch?v=a02i_dKBN4k

Обновлено 2014-10-10
Добавлены новые события: OpenOrdersCount, OpenBidsCount, OpenAsksCount

Return to Qt Bitcoin Trader