Начать новую тему Ответить на тему |
Список форумов AmiSite.ru » Роботы |
На страницу Пред. 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55 След. |
Автор |
Сообщение |
bealtrader
Зарегистрирован: 05.05.2014
Сообщения: 40
|
Олег приветствую!
Может подскажешь - мне потребовалось написать свой собственный плагин для Quik. Все почти написал - заявки отправляются через вызов TRANS2QUIK_SEND_SYNC_TRANSACTION.
Но не получается получить информацию о статусе заявки - не понимаю как использовать TRANS2QUIK_ORDER_STATUS_CALLBACK.
Написал что-то вроде вот такого, но явно неправильно
Код: |
AmiVar AMI_ORDER_STATUS_CALLBACK(int NumArgs, AmiVar *ArgsTable)
{
TRANS2QUIK_SUBSCRIBE_ORDERS("", "");
TRANS2QUIK_START_ORDERS(ORDER_STATUS_CALLBACK);
}
|
Объявление ORDER_STATUS_CALLBACK
Код: |
void __stdcall ORDER_STATUS_CALLBACK(long nMode, DWORD dwTransID, double dNumber, LPCTSTR ClassCode, LPCTSTR SecCode, double dPrice, long nBalance, double dValue, long nIsSell, long nStatus, long nOrderDescriptor)
{
//AmiVar result, amiReturnCode, amiTransID, amiOrderNum, amiOrderStatus;
//amiTransID.type = VAR_FLOAT;
//amiTransID.val = dwTransID;
//gSite.SetVariable("quikTransID", amiTransID);
//amiOrderNum.type = VAR_FLOAT;
//amiOrderNum.val = dNumber;
//gSite.SetVariable("quikOrderNum", amiOrderNum);
//amiOrderStatus.type = VAR_FLOAT;
//amiOrderStatus.val = 111;// nStatus;
//gSite.SetVariable("quikOrderStatus", amiOrderStatus);
amiNumber = dNumber;
amiStatus = nStatus;
}
|
Если я правильно понимаю, то в функции ORDER_STATUS_CALLBACK должен формироваться некий массив с данными по заявкам и из этой функции эти данные нужно возвращать в Amibroker? |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Увы. Не подскажу... (( |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
bealtrader
Зарегистрирован: 05.05.2014
Сообщения: 40
|
000 писал(а): |
Увы. Не подскажу... (( |
Эхх... Если вдруг разберусь - отпишусь сюда |
|
|
Посмотреть профиль Отправить личное сообщение |
|
bealtrader
Зарегистрирован: 05.05.2014
Сообщения: 40
|
bealtrader писал(а): |
Олег приветствую!
Может подскажешь - мне потребовалось написать свой собственный плагин для Quik. Все почти написал - заявки отправляются через вызов TRANS2QUIK_SEND_SYNC_TRANSACTION.
Но не получается получить информацию о статусе заявки - не понимаю как использовать TRANS2QUIK_ORDER_STATUS_CALLBACK.
Написал что-то вроде вот такого, но явно неправильно
Код: |
AmiVar AMI_ORDER_STATUS_CALLBACK(int NumArgs, AmiVar *ArgsTable)
{
TRANS2QUIK_SUBSCRIBE_ORDERS("", "");
TRANS2QUIK_START_ORDERS(ORDER_STATUS_CALLBACK);
}
|
Объявление ORDER_STATUS_CALLBACK
Код: |
void __stdcall ORDER_STATUS_CALLBACK(long nMode, DWORD dwTransID, double dNumber, LPCTSTR ClassCode, LPCTSTR SecCode, double dPrice, long nBalance, double dValue, long nIsSell, long nStatus, long nOrderDescriptor)
{
//AmiVar result, amiReturnCode, amiTransID, amiOrderNum, amiOrderStatus;
//amiTransID.type = VAR_FLOAT;
//amiTransID.val = dwTransID;
//gSite.SetVariable("quikTransID", amiTransID);
//amiOrderNum.type = VAR_FLOAT;
//amiOrderNum.val = dNumber;
//gSite.SetVariable("quikOrderNum", amiOrderNum);
//amiOrderStatus.type = VAR_FLOAT;
//amiOrderStatus.val = 111;// nStatus;
//gSite.SetVariable("quikOrderStatus", amiOrderStatus);
amiNumber = dNumber;
amiStatus = nStatus;
}
|
Если я правильно понимаю, то в функции ORDER_STATUS_CALLBACK должен формироваться некий массив с данными по заявкам и из этой функции эти данные нужно возвращать в Amibroker? |
Разобрался, все работает. Я не очень большой сишник, потэтому были некие танцы с бубном с преобразованием double to float. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
FriendlyDeepSpace
Зарегистрирован: 07.12.2018
Сообщения: 34
|
Доброго времени!
Хотел протестировать коннектор с доливками, чтоб на нем одну систему запустить, а он почему-то ругается. Может плагины не те нужны? Или где-то ошибка? Сперва сказал, что таймфрейм не тот, хотя выставлено правильно. Если проигнорировать, то вроде как стартует, но по первому сигналу пришло например другое предупреждение - Missing Arguments в строке AS_WRITE_PARAM("Quik_Robot", Name(), "BarID", 0); Запускаю для отладки в квике-юниоре, обычный коннектор работает без ошибок. Код коннектора с доливками взят тут: http://www.amisite.ru/afl/exp/files/Quik_Robot3.afl |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
После того, как сделал этого робота я переделывал плагин AS_File.
В функцию AS_WRITE_PARAM добавился еще один параметр. Точность. Соответственно в коде надо его добавить в эту функцию.
Было
Код: |
AS_WRITE_PARAM("Quik_Robot", Name(), "pos", 0) |
Надо сделать
Код: |
AS_WRITE_PARAM("Quik_Robot", Name(), "pos", 0, 1) |
И так везде. Просто добавь 1 последним параметром.
По таймфрейму не должен ругаться. Возможно ошибка с функцией AS_WRITE_PARAM спровоцировала. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
FriendlyDeepSpace
Зарегистрирован: 07.12.2018
Сообщения: 34
|
Да, спасибо, ошибка ушла, включая ту, что про несовпадение таймфрейма.
Но есть теперь другой вопрос - почему-то сравнение BarID != SdID работает корректно только на второй и последующей доливках, в то время как первая доливка происходит на следующем тике после первоначального (основного) входа, и это странно, потому что в файл индекс бара попадает верным, я проверил специально. Например закрылся сигнальный бар, происходит покупка, в файл попадает индекс этого бара 2150000, после чего на следующей секунде происходит первая доливка, хотя индекс прошлого бара все еще тот же. При перевороте так же. А вот последующие доливки, начиная со второй, идут четко. Не совсем понятен этот момент. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
На первом входе индекс бара не записывается
Код: |
else if(pos == 0 AND bs == "B") // лонг
{
AS_WRITE_PARAM("Quik_Robot", Name(), "pos", Lot);
AS_WRITE_PARAM("Quik_Robot", Name(), "BarID", 0);
}
|
Поэтому доливка на баре входа не запрещена. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
FriendlyDeepSpace
Зарегистрирован: 07.12.2018
Сообщения: 34
|
Верно! Я сразу и не догадался. Теперь работает. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
Aleksandr
Зарегистрирован: 13.11.2011
Сообщения: 99
|
Здравствуйте . Мне для робота с сайта нужно вписать SecCode и Class на фьючерс сбербанка , где брать эти параметры и на другие фьючерсы |
|
|
Посмотреть профиль Отправить личное сообщение |
|
FriendlyDeepSpace
Зарегистрирован: 07.12.2018
Сообщения: 34
|
Можно например добавить их в таблицу в Квике и в соответствующих столбцах будут эти значения.
|
|
|
Посмотреть профиль Отправить личное сообщение |
|
Aleksandr
Зарегистрирован: 13.11.2011
Сообщения: 99
|
FriendlyDeepSpace писал(а): |
Можно например добавить их в таблицу в Квике и в соответствующих столбцах будут эти значения.
|
Спасибо ! |
|
|
Посмотреть профиль Отправить личное сообщение |
|
il-ir
Зарегистрирован: 28.05.2013
Сообщения: 189
|
Здравствуйте.
Олег, запустил робота отсюда: http://www.amisite.ru/afl/exp/0004.php
Получил сообщение об ошибке, приводится на картинке "RobotError17_1.png" и "RobotError17_2.png" во вложении.
Что это может быть?
Да, вот тут: http://www.amisite.ru/files/as_file.php написано, что "...файл создается в папке куда установлен AmiBroker...".
У меня нет такого файла в папке Амиброкера
Заявка вроде проходит (эта картинка к длинной сделке - там были такие же ошибки) - картинка "RobotError17-trade.png".
Вот код, где возникает ошибка:
Код: |
if(StrToNum(order) > 100)
{
iz = "исполнена";
coloriz = colorGreen;
str = str + " заяка исполнена" + " ответ сервера=" + order;
if(pos > 0 AND bs == "S") // закрытие лонга
{
AS_WRITE_PARAM("Quik_Robot", Name(), "pos", 0);
AS_WRITE_PARAM("Quik_Robot", Name(), "BarID", 0);
}
else if(pos == 0 AND bs == "S") // шорт
{
AS_WRITE_PARAM("Quik_Robot", Name(), "pos", -1*Lot);
AS_WRITE_PARAM("Quik_Robot", Name(), "BarID", 0);
}
else if(pos < 0 AND bs == "B") // закрытие шорта
{
AS_WRITE_PARAM("Quik_Robot", Name(), "pos", 0);
AS_WRITE_PARAM("Quik_Robot", Name(), "BarID", 0);
}
else if(pos == 0 AND bs == "B") // лонг
{
AS_WRITE_PARAM("Quik_Robot", Name(), "pos", Lot);
AS_WRITE_PARAM("Quik_Robot", Name(), "BarID", 0);
}
else if(pos > 0 AND bs == "B") // доливка к покупке
{
AS_WRITE_PARAM("Quik_Robot", Name(), "pos", pos + Lot);
AS_WRITE_PARAM("Quik_Robot", Name(), "BarID", BarID);
}
else if(pos < 0 AND bs == "S") // доливка к шорту
{
AS_WRITE_PARAM("Quik_Robot", Name(), "pos", pos - Lot);
AS_WRITE_PARAM("Quik_Robot", Name(), "BarID", BarID);
}
str = str + " позиция на момент исполнения " + pos;
}
else {
iz = "не исполнена";
coloriz = colorRed;
str = str + " заяка НЕ исполнена" + " ответ сервера=" + order;
} |
Заранее спасибо за ответ(ы). |
|
|
Посмотреть профиль Отправить личное сообщение |
|
il-ir
Зарегистрирован: 28.05.2013
Сообщения: 189
|
И в дополнение к сообщению выше - вот содержимое файла "log.quik.txt" за сегодня:
Код: |
21.07.2019 18:37:42 LKOH Buy заяка исполнена ответ сервера=4428501395 позиция на момент исполнения 0
21.07.2019 18:37:48 LKOH Buy заяка исполнена ответ сервера=4428501499 позиция на момент исполнения 0
21.07.2019 18:37:52 LKOH Buy заяка исполнена ответ сервера=4428501612 позиция на момент исполнения 0
21.07.2019 18:37:55 LKOH Buy заяка исполнена ответ сервера=4428501745 позиция на момент исполнения 0
21.07.2019 18:38:55 LKOH Short заяка исполнена ответ сервера=4428502619 позиция на момент исполнения 0
21.07.2019 18:39:01 LKOH Short заяка исполнена ответ сервера=4428502706 позиция на момент исполнения 0
21.07.2019 18:39:03 LKOH Short заяка исполнена ответ сервера=4428502742 позиция на момент исполнения 0
21.07.2019 18:39:06 LKOH Short заяка исполнена ответ сервера=4428502756 позиция на момент исполнения 0
21.07.2019 18:39:09 LKOH Short заяка исполнена ответ сервера=4428502844 позиция на момент исполнения 0
21.07.2019 18:39:12 LKOH Short заяка исполнена ответ сервера=4428502910 позиция на момент исполнения 0
21.07.2019 18:39:19 LKOH Short заяка исполнена ответ сервера=4428502963 позиция на момент исполнения 0
21.07.2019 18:39:22 LKOH Short заяка исполнена ответ сервера=4428503008 позиция на момент исполнения 0
21.07.2019 18:39:31 LKOH Short заяка исполнена ответ сервера=4428503297 позиция на момент исполнения 0
21.07.2019 18:39:36 LKOH Short заяка исполнена ответ сервера=4428503525 позиция на момент исполнения 0
21.07.2019 18:39:40 LKOH Short заяка исполнена ответ сервера=4428503686 позиция на момент исполнения 0
21.07.2019 18:39:58 LKOH Short заяка исполнена ответ сервера=4428504174 позиция на момент исполнения 0 |
Сообщения об ошибке появляются (картинки с сообщениями приведены ранее), но если нажать на кнопку "Close", то получается такой отчёт, что приведён выше.
Отчет о сделках в квике приведён в файле "Tbl_zayvki.png" во вложении. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
il-ir
Зарегистрирован: 28.05.2013
Сообщения: 189
|
вот тут: http://amisite.ru/phpBB2/viewtopic.php?p=23819#23819 задавался вопрос, аналогичный моему:
Sergey51 писал(а): |
Но в АА как только заявка исполниться робот ругается на эту строку
AS_WRITE_PARAM("Quik_Robot", Name(), "pos", Lot);
Говорит, что потерян аргумент. |
В этом сообщении: http://amisite.ru/phpBB2/viewtopic.php?p=23822#23822 Олег предложил:
000 писал(а): |
Я внес изменение в плагин зписи. Там добавился еще один параметр - точность. А этот код заточен под старый плагин, вот Ами и ругаетсяЮ что в функции не хватает аргументов.
2 варианта
Либо использовать старый плагин ( http://www.amisite.ru/files/plugins/AS_File.zip )
Либо изменить использование функции в коде. Везде заменить
AS_WRITE_PARAM("Quik_Robot", Name(), "pos", .....);
на
AS_WRITE_PARAM("Quik_Robot", Name(), "pos", ..... , 0); |
Так же и тут: http://amisite.ru/phpBB2/viewtopic.php?p=23825#23825 Олег написал:
Плагин AS_File.dll у меня скачан отсюда: http://www.amisite.ru/files/as_file_new.php.
Заново скачал плагин AS_QuikTrade.dll как указано по ссылке http://www.amisite.ru/files/plugins/AS_QuikTrade.zip.
Добавил точность:
Код: |
if(pos > 0 AND bs == "S") // закрытие лонга
{
AS_WRITE_PARAM("Quik_Robot", Name(), "pos", 0, 0);
AS_WRITE_PARAM("Quik_Robot", Name(), "BarID", 0, 0);
}
else if(pos == 0 AND bs == "S") // шорт
{
AS_WRITE_PARAM("Quik_Robot", Name(), "pos", -1*Lot, 0);
AS_WRITE_PARAM("Quik_Robot", Name(), "BarID", 0, 0);
}
else if(pos < 0 AND bs == "B") // закрытие шорта
{
AS_WRITE_PARAM("Quik_Robot", Name(), "pos", 0, 0);
AS_WRITE_PARAM("Quik_Robot", Name(), "BarID", 0, 0);
}
else if(pos == 0 AND bs == "B") // лонг
{
AS_WRITE_PARAM("Quik_Robot", Name(), "pos", Lot, 0);
AS_WRITE_PARAM("Quik_Robot", Name(), "BarID", 0, 0);
}
else if(pos > 0 AND bs == "B") // доливка к покупке
{
AS_WRITE_PARAM("Quik_Robot", Name(), "pos", pos + Lot, 0);
AS_WRITE_PARAM("Quik_Robot", Name(), "BarID", BarID, 0);
}
else if(pos < 0 AND bs == "S") // доливка к шорту
{
AS_WRITE_PARAM("Quik_Robot", Name(), "pos", pos - Lot, 0);
AS_WRITE_PARAM("Quik_Robot", Name(), "BarID", BarID, 0);
}
str = str + " позиция на момент исполнения " + pos;
}
|
после чего заявка не прошла (в лог-файле фраза: "21.07.2019 19:33:56 SBER Short заяка НЕ исполнена ответ сервера={EMPTY}").
И появились другие ошибки:
- картинка в файле "RobotErrorNew1.png", текст сообщения:
Цитата: |
if(connection == 1)
{
order = AS_QUIK_SEND_SYNC_NEWORDER(
---------------------------------------------^
Error 17.
Missing arguments
|
- картинка в файле "RobotErrorNew2.png", текст сообщения:
Цитата: |
Lot);
}
if(StrToNum(order) > 100)
-----------------^
Error 5.
`1st` argument of the `StrToNum()` call has incorrect type. The function expected `a STRING` here, but found `a NUMBER`.
|
- картинка в файле "RobotErrorNew3.png", текст сообщения:
Цитата: |
гнал", 1.0, colorDefault, colorDefault, 60);
AddTextColumn(text, "Соединение", 1.2, colorDefault, color, 170);
AddTextColumn(iz, "Исполнение заявки", 1.2, colorDefault, coloriz, 120 );
AddTextColumn(order, "Заявка", 1.2, colorDefault, IIf(StrToNum(order
-------------------------------------------------------------------^
Error 5.
`1st` argument of the `StrToNum()` call has incorrect type. The function expected `a STRING` here, but found `a NUMBER`.
|
- картинка в файле "RobotErrorNew4.png", текст сообщения:
Цитата: |
AddTextColumn(sd, "Сигнал", 1.0, colorDefault, colorDefault, 60);
AddTextColumn(text, "Соединение", 1.2, colorDefault, color, 170);
AddTextColumn(iz, "Исполнение заявки", 1.2, colorDefault, coloriz, 120 );
AddTextColumn(order
------------------^
Error 5.
`1st` argument of the `AddTextColumn()` call has incorrect type. The function expected `a STRING` here, but found `a NUMBER`.
|
|
Последний раз редактировалось: il-ir (Пн Июл 22, 2019 12:02 pm), всего редактировалось 5 раз(а) |
|
Посмотреть профиль Отправить личное сообщение |
|
|
Начать новую тему Ответить на тему |
Список форумов AmiSite.ru » Роботы |
На страницу Пред. 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55 След. |
|
Следующая тема
Предыдущая тема
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете вкладывать файлы Вы не можете скачивать файлы
|
|