JL Script это упрощенный язык программирования разработанный мной, который позволяет создавать сложные стратегии и полностью автоматизировать торговлю.
Есть полная поддержка JavaScript функций и методов.
Вы можете создавать скрипты JL Script внутри программы Qt Bitcoin Trader (скачать под Mac, Windows и Linux).
Все функции и методы специфичные для JL Script начинаються на "trader." и после точки можно вызывать один из трех типов методов: Событие, Функция и Команда. Простой пример обращения к методу это trader.get("LastPrice") эта функция возвращает последнюю цену маркета.
События
Событие это функция которая связана с индикатором и вызываеться в момент изменения значения индикатора.
Структура методов событий начинаеться командой "trader.on(", дальше идет название индикатора а потом ").changed()". Название индикатора должно быть в кавычках.
Пример использования функции события:
Code: Select all
trader.on("LastPrice").changed()
{
//Ваш код тут
}
У каждого события есть три переменные локального действия. Это: symbol, name, value.
symbol это пара, символ примером которой есть текст "BTC/USD"
name код индикатора, текстовое название, пример "LastPrice"
value дробное значение которое содержит последнее значение индикатора
Эти переменные могут быть использованы в любом месте события, а так же не использованы вовсе.
Пример использования локальных переменных из события:
Code: Select all
trader.on("LastPrice").changed()
{
if(symbol!="BTC/USD")return; // Сравнение, если индикатор не от пары BTC/USD, то стоп, и следующие строки не будут исполнены
if(value>500)than ..; //сравнение значения индикатора с числом 500. В нашем случае это последняя цена маркета
}
Список поддерживаемых событий:
Code: Select all
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").
Вы можете доставать значения индикаторов из любого места в скрипте.
Список функций которые возращяют значения индикаторов:
Code: Select all
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 часа
Специальные функции
Code: Select all
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 вы можете устанавливать таймеры и задержки таким способом:
Code: Select all
trader.timer(секунды,"команда")
trader.delay(секунды,"команда")
Например, у нас есть функция "myFunction()" и мы хотим ее запустить с задержкой 1,5 секунды (1500 мс).
Это можно сделать таким образом:
Code: Select all
trader.delay(1.5,"myFunction()");
Таймер работает таким же образом:
Code: Select all
trader.timer(1.5,"myFunction()");
В результате ваша функция "myFunction()" будет регулярно выполняться с интервалом в 1.5 секунды.
Вывод лога
В JL Script вы можете в любом месте выводить свой лог, замечания или любую информацию, которая будет отображена в окне для вывода лога. Для каждой группы скриптов или правил лог отдельный и независимый.
Функция которая используеться для вывода: trader.log()
Пример:
Code: Select all
trader.log("Хэло ворлд!"); //В результате в логе появиться строка "Хэло ворлд!"
trader.log(200.45); //В результате будет выведено число "200.45"
trader.log("Последняя цена:",trader.get("LastPrice")); //Результатом будет вывод текста "Последняя цена:" и дальше число последней цены
Вы можете использовать до 4 аргументов любого типа в функции log().
Для очистки лога используеться команда trader.logClear()
Звуковые оповещения
Есть три команды которые могут озвучить работу программы:
Code: Select all
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, который указывает в какой конкретно паре надо открыть ордер.
Code: Select all
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() // Отменяет все ордера на покупку
Выключить/Включить группы с помощью скрипта
Вы можете включать или выключать существующие группы скриптов или правил по их имени.
Code: Select all
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",значение);
Теперь нам надо вычислять значение среднего при каждом изменении цены спроса или предложения.
Создаем новую группу для скрипта и назовем его "Индикатор среднего числа".
И добавляем туда два события на изменение последних цен спроса и предложения.
Теперь добавляем код который будет транслировать наше событие, вычисление которого будем делать в отдельной функции, назвоем ее "calculateMidPrice()".
Кодом который вычисляет среднее значение у нас будет "(trader.get("BidPrice")+trader.get("AskPrice"))/2".
Транслировать событие надо только если изменилось наше среднее значение, поэтому создаем переменную "lastMidPrice", в которой будем хранить последнее значение.
Code: Select all
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();
}
Теперь проверим как работает наш индикатор. Создаем еще одну пустую группу скрипта под названием "Проверка".
Получать событие пользовательского индикатора так же просто как и с стандартными событиями.
Пишем тело события:
Code: Select all
trader.on("MidPrice").changed()
{
}
И мы будем получать значения внутри него. Чтобы увидеть работу его визуально, добавляем вывод в лог всех изменений.
Code: Select all
trader.on("MidPrice").changed()
{
trader.log("Средняя цена изменилась:", value);
}
Запускаем обе группы скриптов и смотрим в лог.
Наш индикатор работает, и его можно использовать в любом скрипте и в любом месте с помощью стандартного метода trader.get("MidPrice");
Надо помнить
Помните что нужно следить за тем чтобы желаемый объем продажи и покупки а так же цена соответствовали критериям бирж. Если объем ордера который будет выполнен будет меньше 0.001 например, то биржа его проигнорирует.
Помните что если лаг больше 15 секунд, то хоть и используеться повтор запросов и компенсация потери пакетов, но шансов на открытие, закрытие, отмену ордера меньше. Открывайте ордера только когда лаг находиться в допустимых рамках.
Получение данных с валютных пар отличных от выбранной в интерфейсе пока не работает, но в некоторых биржах методы покупки и продажи работают не зависимо от текущей пары.
Видео документация: https://www.youtube.com/watch?v=a02i_dKBN4k
Обновлено 2014-10-10
Добавлены новые события: OpenOrdersCount, OpenBidsCount, OpenAsksCount