Отримуємо дані з quik для торгового робота, торговий робот

Другий етап з плану публікацій - рухаємося за графіком.

Отже, в QPILE існують такі типи даних (приклад):

STRING - строковий: «Профіт» (лапки саме такі);

DOUBLE - число з плаваючою точкою: 500,45;

COLLECTION -коллекція - список об'єктів, з індексацією по целочисленному ключу, починаючи з нуля;

MAP - асоціативний масив - послідовність даних, що ідентифікуються за значенням і ключу.

Будь-змінної можна привласнити будь-який з перерахованих вище типів даних.

Строкові дані, застосовуються для ідентифікації змінних і значень з таблиць:

INSTRUMENT = "RIM9", в цьому випадку ми присвоюємо змінної INSTRUMENT строкове значення RIM9.

MESSAGE (INSTRUMENT, 1). після виконання цієї інструкції QUIK відкриє вікно повідомлень зі значенням змінної INSTRUMENT. Здавалося б, що навіть написання назви змінної в нашому випадку довше, ніж значення, так чому б не писати в коді просто значення? Відповідь проста, є роботи, та й ми будемо такі створювати, де торгівля відбувається по одному, обраному нами заздалегідь, інструменту. А в коді буде місць десять, де нам буде потрібно порівняти його буквене значення, і при переході на інший інструмент, нам доведеться міняти у всіх десяти місцях його написання, а при позначенні змінної на початку програми - всього один раз.

Число з плаваючою точкою, тут все просто:

Тут ми присвоїли змінним цілочисельні значення, які потім будемо використовувати в розрахунках, наприклад:

A = (MOOVING1 + MOOVING2) * MULTIPLER / 100

Дії в дужках виконуються першими, все як у школі.

В процесі виконання програм, ми можемо динамічно змінювати тип цих двох змінних, наприклад:

KOEF = "3,14" - строкова (лапки!), А якщо ми зробимо математичне дію з нею. То отримаємо число:

A = KOEF + 0 - в результаті, змінна А = числу 3,14, і навпаки, якщо нам необхідно число перетворити в рядок, нам треба об'єднати, використовуючи символ , Її або з нового рядка, або з текстом:

в результаті отримаємо текстовий рядок «Коефіцієнт 3.14»

Зроблено це для більшої універсальності, але є невеликий мінус: при отриманні з таблиць цифрових даних, необхідно з складати з нулем (або виробляти будь-яке інше просте математичне дію з числом), щоб на виході отримати дійсно цифру. Так ми робили в нашому першому роботі, коли отримували ціну з таблиці всіх угод: PRICE = GET_VALUE (GET_ITEM ( «ALL_TRADES», I), «PRICE») + 0. Тому, якщо Ваш робот при запуску буде лаятися на те, що Ви намагаєтеся порівняти різні типи даних, в першу чергу дивіться, куди додати «плюс нуль».

Їдемо далі - Колекції і Мапи. Детально і прекрасно вони описані в «Керівництві користувача QPILE» копіпаст їх сюди сенсу немає - ми їх розберемо докладніше, коли при створенні робота «пробійної» доберемося до їх використання.

Тепер найважливіше - Функції для звернення до рядків довільних таблиць QUIK. Для правильно функціонування автономного робота нам просто як повітря необхідна наступна інформація:

  • Поточний баланс - для розрахунку позиції;
  • Поточна чиста позиція - для оцінки ситуації;
  • Поточне значення ГО - в разі операція на ФОРТС, теж потрібно для розрахунку позиції;
  • Ціна нашого інструменту;
  • Дохід / збиток, як сума вармаржі і накопиченого доходу - зрозуміло для чого;
  • Дата;
  • час;

Це тільки початкові параметри, надалі нам буде потрібно ще набагато більше. Всі ці параметри повинні бути отримані з QUIK, при кожному виконанні програми (ми пам'ятаємо що це мінімум 1 раз в секунду), для правдивої і точної оцінки ситуації. Всі вони беруться з різних місць, розглянемо все по порядку (ФОРТС):

Поточний баланс береться з таблиці «Обмеження по клієнтських рахунках» з поля «Ліміт відкритих позицій» з рядка №1 (варіюється в залежності від брокера) функція:

MoneyCurrentBalance = GET_VALUE (GET_ITEM ( «FUTURES_CLIENT_LIMITS», 1), «CBPLIMIT»)

Якщо розібрати написане своїми словами отримаємо «отримати значення CBPLIMIT з рядка номер 1 таблиці FUTURES_CLIENT_LIMITS.

Опис назв таблиць і доступних параметрів дано в керівництві QPILE в розділі 8.9.3

Поточна чиста позиція:

TP = GET_VALUE (GET_ITEM ( «FUTURES_CLIENT_HOLDINGS», 1), «TOTAL_NET»)

Поточне значення ГО. Тут трохи інакше, тому що ГО є в Таблиці поточних значень параметрів, функція трохи інша:

GO = GET_VALUE (GET_PARAM_EX ( «SPBFUT», Instrument, "selldepo"), "param_value")

Price = GET_VALUE (GET_PARAM_EX ( «SPBFUT», Instrument, "last"), "param_value")

Profit = GET_VALUE (GET_ITEM ( «FUTURES_CLIENT_LIMITS», 1), «VARMARGIN») + GET_VALUE (GET_ITEM ( «FUTURES_CLIENT_LIMITS», 1), «ACCRUEDINT»)

Що ми забули? Правильно! До всіх отриманим чисельним даними додати нуль!

Також, слід зауважити, що при створенні торгового робота. дані потрібно отримувати один раз, наприклад поточна чиста позиція, в процесі виконання програми робота, не зміниться, і що б не відбувалося в QUIK, і тільки при наступному запуску робота, можна буде отримати свіжі дані.

У наступній статті, в рубриці «Торговий робот» ми обговоримо алгоритм робота по торгової стратегії «Пробійна», а потім продовжимо його створювати. Все що ми обговорили сьогодні нам стане в нагоді.

Євген, взагалі в одному з наступних твоїх постів було б цікаво побачити приклад таблиці зміни капіталу в часі із заданим інтервалом (TimeFrame-му) 1 хв, 5 хв, щогодини. опціонально. Таку таблицю було б корисно потім експортувати по DDE в Excel і будувати графік Equity. Основна складність, на мій погляд, це організувати всю інфу з таблиць: різні ліміти, варіаціонка, накопичений дохід, біржові збори, комісії брокера і т.д. і відобразити в одній цифрі - поточний стан рахунку (в відповідно до ринкових цін). Було б здорово побачити твій варіант!

Так цю таблицю і так можна в Ексель експортувати.

Вона не дає результат з певною періодичністю

Актуальний стан рахунку ніде не відбивається. Наприклад, комісія брокера списується тільки на ранок.

Схожі статті