Список форумов AmiSite.ru AmiSite.ru
Форум по Ами
 FAQ  •  Поиск  •  Пользователи  •  Группы   •  Регистрация  •  Профиль  •  Войти и проверить личные сообщения  •  Вход
 Робот для Квика через API Следующая тема
Предыдущая тема
Начать новую тему  Ответить на тему
Автор Сообщение
bealtrader



Зарегистрирован: 05.05.2014
Сообщения: 40

СообщениеДобавлено: Пн Май 20, 2019 8:08 pm Ответить с цитатой Вернуться к началу

Олег приветствую!

Может подскажешь - мне потребовалось написать свой собственный плагин для 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

СообщениеДобавлено: Пн Май 20, 2019 9:45 pm Ответить с цитатой Вернуться к началу

Увы. Не подскажу... ((

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
bealtrader



Зарегистрирован: 05.05.2014
Сообщения: 40

СообщениеДобавлено: Пн Май 20, 2019 9:51 pm Ответить с цитатой Вернуться к началу

000 писал(а):
Увы. Не подскажу... ((


Эхх... Если вдруг разберусь - отпишусь сюда
Посмотреть профиль Отправить личное сообщение
bealtrader



Зарегистрирован: 05.05.2014
Сообщения: 40

СообщениеДобавлено: Вт Май 21, 2019 6:32 pm Ответить с цитатой Вернуться к началу

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

СообщениеДобавлено: Пн Июн 03, 2019 8:01 pm Ответить с цитатой Вернуться к началу

Доброго времени!
Хотел протестировать коннектор с доливками, чтоб на нем одну систему запустить, а он почему-то ругается. Может плагины не те нужны? Или где-то ошибка? Сперва сказал, что таймфрейм не тот, хотя выставлено правильно. Если проигнорировать, то вроде как стартует, но по первому сигналу пришло например другое предупреждение - 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

СообщениеДобавлено: Вт Июн 04, 2019 12:44 pm Ответить с цитатой Вернуться к началу

После того, как сделал этого робота я переделывал плагин 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

СообщениеДобавлено: Вт Июн 04, 2019 2:34 pm Ответить с цитатой Вернуться к началу

Да, спасибо, ошибка ушла, включая ту, что про несовпадение таймфрейма.
Но есть теперь другой вопрос - почему-то сравнение BarID != SdID работает корректно только на второй и последующей доливках, в то время как первая доливка происходит на следующем тике после первоначального (основного) входа, и это странно, потому что в файл индекс бара попадает верным, я проверил специально. Например закрылся сигнальный бар, происходит покупка, в файл попадает индекс этого бара 2150000, после чего на следующей секунде происходит первая доливка, хотя индекс прошлого бара все еще тот же. При перевороте так же. А вот последующие доливки, начиная со второй, идут четко. Не совсем понятен этот момент.
Посмотреть профиль Отправить личное сообщение
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Ср Июн 05, 2019 12:11 pm Ответить с цитатой Вернуться к началу

На первом входе индекс бара не записывается
Код:

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

СообщениеДобавлено: Ср Июн 05, 2019 2:42 pm Ответить с цитатой Вернуться к началу

Верно! Я сразу и не догадался. Теперь работает.
Посмотреть профиль Отправить личное сообщение
Aleksandr



Зарегистрирован: 13.11.2011
Сообщения: 99

СообщениеДобавлено: Вт Июл 02, 2019 2:26 pm Ответить с цитатой Вернуться к началу

Здравствуйте . Мне для робота с сайта нужно вписать SecCode и Class на фьючерс сбербанка , где брать эти параметры и на другие фьючерсы
Посмотреть профиль Отправить личное сообщение
FriendlyDeepSpace



Зарегистрирован: 07.12.2018
Сообщения: 34

СообщениеДобавлено: Вт Июл 02, 2019 2:47 pm Ответить с цитатой Вернуться к началу

Можно например добавить их в таблицу в Квике и в соответствующих столбцах будут эти значения.

Image
Посмотреть профиль Отправить личное сообщение
Aleksandr



Зарегистрирован: 13.11.2011
Сообщения: 99

СообщениеДобавлено: Чт Июл 18, 2019 3:00 am Ответить с цитатой Вернуться к началу

FriendlyDeepSpace писал(а):
Можно например добавить их в таблицу в Квике и в соответствующих столбцах будут эти значения.

Image

Спасибо !
Посмотреть профиль Отправить личное сообщение
il-ir



Зарегистрирован: 28.05.2013
Сообщения: 189

СообщениеДобавлено: Сб Июл 20, 2019 5:44 pm Ответить с цитатой Вернуться к началу

Здравствуйте.

Олег, запустил робота отсюда: http://www.amisite.ru/afl/exp/0004.php

Получил сообщение об ошибке, приводится на картинке "RobotError17_1.png" и "RobotError17_2.png" во вложении.

Что это может быть?

Да, вот тут: http://www.amisite.ru/files/as_file.php написано, что "...файл создается в папке куда установлен AmiBroker...".

У меня нет такого файла в папке Амиброкера Sad

Заявка вроде проходит (эта картинка к длинной сделке - там были такие же ошибки) - картинка "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

СообщениеДобавлено: Вс Июл 21, 2019 2:45 pm Ответить с цитатой Вернуться к началу

И в дополнение к сообщению выше - вот содержимое файла "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

СообщениеДобавлено: Вс Июл 21, 2019 4:09 pm Ответить с цитатой Вернуться к началу

вот тут: 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 Олег написал:
000 писал(а):
1. Перекачай торговый плагин http://www.amisite.ru/files/plugins/AS_QuikTrade.zip
2. Робот будет такой


Плагин 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 раз(а)
Посмотреть профиль Отправить личное сообщение
Показать сообщения:      
Начать новую тему  Ответить на тему


 Перейти:   



Следующая тема
Предыдущая тема
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете вкладывать файлы
Вы не можете скачивать файлы


Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme :: Часовой пояс: GMT + 3

File Attachment © by Meik Sievertsen