Питання: Чи можна приклад, що б в 23.40 закривалися всі відкриття позиції по ринку?
Для розв'язання порушеної в даному питанні завдання необхідно наступне:
Тож почнемо. Спочатку робота з часом. Побічно ми вже вміємо це. Давайте згадаємо шматок коду з робота, якого ми писали на уроках 1-6:
Як ви пам'ятаєте, цей шматок коду виводить повідомлення в лог (в файл логу). Крім основного повідомлення, в балці присутній дата і час. Ось зразок:
10/15/14 12:53:58 limit: 0
10/15/14 12:53:58 OnTransReply
10/15/14 12:53:58 початок remember_order
10/15/14 12:53:58 remember_order: заявка активна
10/15/14 12:53:58 прапор: 0
Давайте розглянемо приклад:
У цьому прикладі ми задам дату у вигляді таблиці datetime, перетворимо її в POSIX, потім виводимо результат. У нас повинно вискочити перше повідомлення ось таке (там їх буде три):
Потім програма перетворює з цього формату назад в таблицю і виводить дату і час на екран, звертаючись до полів цієї таблиці:
А потім точно так же виводить поточну дату і час:
І так, зверніть увагу на останні два рядки:
Саме вони ілюструють, як працювати з датою у вигляді таблиці, щоб виконати нашу задачу - закрити позиції в 23.40.
Отже, нам треба отримати дату і час у вигляді таблиці datetime, для чого ми використовуємо os.date () з параметром "* t", другий параметр опускаємо, так як нам треба отримати поточну дату. В отриманій датою перевіряємо годинник (має дорівнювати 23) і хвилини (повинно бути більше або дорівнює 40):
Тепер нам залишилося реалізувати саму функцію close_all_position. Що повинна зробити дана функція? По-перше, перебрати всі відкриті позиції, а по-друге, для кожної з відкритих позицій виставити заявку на закриття, причому по ринку.
Як бачимо, на відміну від того, що робили на уроці 6, ми використовуємо тільки фільтр по типу лімітів, так як нам треба пробігтися по всіх інструментах, але при цьому нам не потрібно розглядати всякі технологічні ліміти.
Тепер перейдемо до ринкових заявками. За фондового ринку це зробити легко, потрібно просто поставити в поле TYPE значення «M» замість «L», а в ціну поставити нуль, ось приклад:
З терміновим ринком такий номер не пройде. Там не можна виставляти заявки типу «M».
Як же бути? - запитаєте ви. Ну що ж, нам нічого не залишається, як самому обчислити ринкову ціну і поставити її в заявку. А як обчислити? Можна взяти з поточної таблиці параметрів:
Для звернення до поточної таблиці параметрів використовуємо getParamEx, наприклад, так:
Цей приклад повідомить ціну попиту:
Відповідно, для отримання ціни пропозиції треба використовувати «OFFER» замість «BID». На жаль, в таблиці futures_client_holding немає коду класу, його доведеться отримувати окремо, наприклад, ось так:
Тепер, власне кажучи, ви все знаєте для того, щоб написати процедуру закриття всіх позицій за розкладом. У додатку 1 ви знайдете приклад закриття всіх позицій за розкладом, зроблений для невеликих обсягів торгівлі і для термінового ринку (ф'ючерси). Просто вставте в свій код функції close_all_position і fn, а виклик close_all_position через умови перевірки часу в те місце вашого коду, де будете перевіряти час, наприклад, в цикл main.
Переходимо до наступного питання.
Питання: Ув. megabax питання - скажіть можна в скриптах Lua використовувати зовнішні dll. Якщо, так то не могли б Ви описати синтаксис функції звернення? P.S. Просто я використовую внешнеюdll написану подOmega і хотілося б її "прикрутити" до графіка ціни в Квік черезLUA.
Отже, для початку створимо новий проект:
Тип проекту «Проект Win32», мова Visual C ++:
Так само в діалозі вибору типу проекту не забудьте вказати ім'я вашого проекту (латинськими літерами, без пробілів) і вибрати каталог, куди ви помістіть проект.
Далі у вас відкриється ось таке вікно, тут треба натиснути «Далі»:
І ми перейдемо до діалогу налаштування параметрів програми, треба вибрати «Бібліотека DLL», все «галочки» залишити вимкненими:
Після цього у нас відкриється створений проект:
Як правило, у верхньому правому куті у нас присутній оглядач рішень, в якому видно дерево об'єктів нашого проекту: файли C ++, заголовки, ресурси та інше:
Для того щоб нашу dll-ку можна було підключити до lua-скрипту, нам необхідна бібліотека lua5.1 і відповідні заголовки (все це, а так само повний робочий дистрибутив lua можна скачати з сайту lua.org, поширяться він безкоштовно). Потрібні файли присутні в додатку 2 (исходники прикладу підключення dll до скрипту lua).
Отже, перерахую ці файли:
Всі їх потрібно покласти в окремий каталог, наприклад, contrib і для зручності скопіювати цей каталог в папку проекту:
Тепер потрібно підключити ці файли до проекту. Для цього в папці «Заголовки» створимо нову папку:
А в саму папку додамо всі заголовки зі списку:
Після цього вони повинні відобразитися в відповідній гілці:
У нас ще залишився файл lua5.1.lib. Його підключаємо через властивості проекту:
Шукаємо в дереві «Властивості конфігурації» -> «Компоновщик» -> «Введення»:
Йдемо в додаткові залежності, вибираємо «Змінити»:
Додаємо шлях до нашої бібліотеки contrib / lua5.1.lib:
Тиснемо «ОК», зберігаємо проект. Тепер можемо перейти до програмування. Відкриємо файл dllmain.cpp:
Тут ми бачимо функцію DllMain. Її треба зробити такий:
Тут ми підключаємо потрібні бібліотеки, встановлюємо директиви препроцесора і підключаємо бібліотеки для роботи з lua. Вони потрібні нам, щоб отримувати від lua-скрипта параметри функції і повернути функції будь-яке значення, а так само для різних допоміжних функцій, типу реєстрації доданих функцій і так далі. Власне, це і є підключення lua5.1.lib.
Далі, після функції DllMain ми розміщуємо наші функції, які потрібно використовувати в lua-скрипта, наприклад, такі:
// Додавання двох чисел
static int forLua_SummTwoNumbers (lua_State * L)
// отримуємо перший і другий параметри виклику функції з стека з перевіркою кожного на число
double d1 = luaL_checknumber (L, 1);
double d2 = luaL_checknumber (L, 2);
// поміщаємо в стек результат складання
lua_pushnumber (L, d1 + d2);
return (1); // ця функція повертає одне значення
// додавання кількох чисел, скільки - заздалегідь невідомо
static int forLua_SummAllNumbers (lua_State * L)
const int n = lua_gettop (L); // кількість переданих аргументів
bool isNumberFound = false;
for (int i = 1; i <= n; ++i)
if (lua_type (L, i) == LUA_TNUMBER)
res + = lua_tonumber (L, i);
Зверніть увагу, що ми може зареєструвати функції не під тими іменами, під якими ми оголосили їх в C ++, а під іншими. З lua-скрипта функції викликаються під тими іменами, під якими зареєстрували.
Тепер можна і скомпілювати. Якщо після компіляції ви не змогли знайти отриману dll, то можете задати конкретне ім'я і шлях вихідного файлу. Для цього йдемо в властивості проекту, в гілці «Властивості конфігурації» -> «Компоновщик» -> «Загальні» ставимо такої вихідний файл і шлях до нього, який нам треба:
Саме в цьому каталозі у нас і з'явитися dll-ка.
Скопіюємо її в каталог з Quik-му:
Крім цього необхідно так само скопіювати в каталог Квик lua5.1.dll. Його так само можна взяти з дистрибутива lua (або з доданих до статті початкових кодів).
Для підключення dll-ки до сріпту використовуємо функцію require, ось зразок синтаксису для нашого прикладу:
Dron, Намагався зробити щось подібне, використовуючи оператор sleep. Тобто при вході в OnQuote умова з прапором, якщо сигнал на відкриття, то прапор відправляє наступні котирування на returne. поки після першого спрацьовування не пройде півсекунди і прапор не прийме початкове значення. але така система працювала тільки кілька циклів, потім зависала ..