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


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

СообщениеДобавлено: Чт Сен 22, 2016 7:45 pm Ответить с цитатой Вернуться к началу

Хм. Та "рыба" которая выложена на сайте проверена 1000000 раз. Она точно работает без сбоев. Ты внес в него изменения и теперь выскакивает ошибка. С удовольствием помогу, но не могу этого сделать не видя всего кода. Если не хочешь выкладывать тут, то пиши в личку.

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



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

СообщениеДобавлено: Чт Сен 22, 2016 8:23 pm Ответить с цитатой Вернуться к началу

изменений не вносил, код все равно проверочный, сейчас выложу
Код:

Filter = 1;

TimeFrame      = 60;               // таймфрейм в секундах.
Account         = "XXXXXX2";   // Номер счета
Client_Code   = "XXXXXXX2";            // Код Клиента
Quik            = "C:\\Info";         // путь к Квику


Tickers = "GAZR_ff";             // торгуемые символы через запятую без пробелов. Для контроля ошибок. Так, как они называются в Ами
/////////////

///////////////
// задаем размер лотов, коды и отступ для разных символов
/////////////

if(Name() == "GAZR_ff") {            //Символ как он называется в Ами
   SecCode         = "GZZ6";            
   Class         = "SPBFUT";
   Lots            = 1;
   TickS         = 1;               // Минимальный шаг цены торгуемой бумаги
   Otstup         = 3;               // Заявка будет выставлена хуже текущей цены на Otstup рублей
}


//////////////Система///////////////



Buy1 = TimeNum() >= 192100 AND TimeNum() <= 192300;// AND Cross(C,PriceIn);
Sell1 = TimeNum() >= 192200;// OR Cross (Stl,C);


///////////Конец Системы////////////

Buy1 = Ref(Buy1, -1);
Sell1 = Ref(Sell1, -1);
Short1 = Ref(Short1, -1);
Cover1 = Ref(Cover1, -1);
Buy1 = ExRem(Buy1, Sell1);
Sell1 = ExRem(Sell1, Buy1);
Short1 = ExRem(Short1,Cover1);
Cover1 = ExRem(Cover1,Short1);

////////////////////////////////////

text = iz = sd = order = "";
color = coloriz = colorDefault;
price = 0;
str = Now(0) + "  " + Name();
pos = AS_READ_PARAM("Quik_Robot", Name(), "pos");

///////////// проверка наличия символа в списке для торговли ////////////////

k = 0;
Permit_Ticker = False;
do {
  Tick = StrExtract(Tickers, k);
  k++;
  if(Name() == Tick)
    Permit_Ticker = True;
} while(Tick != "");

///////////    Функции  ////////////

procedure orders(bs, pr, Lot)
{
   connection = 0;

   QC = AS_QUIK_CONNECT(Quik);

   if (QC == 1)
   {
      connection = 1;
      text = "Есть соединение с сервером";
      Color = colorGreen;
   }
   else if (QC == -1)
   {
      text = "нет соединения с квиком";
      Color = colorRed;   
   }
   else if (QC == -2)
   {
      text = "нет соединения с сервером";
      Color = colorRed;
   }
   else
   {
      text = "фигня какая то";
      Color = colorRed;
   }
 
   if(connection == 1)
   {
      order = AS_QUIK_SEND_SYNC_NEWORDER(   "123",            // OrderID - Любые цифры
                                                Account,
                                                Client_Code,
                                                "L",                  // Тип заявки M-рыночная, L-лимитированная
                                                Class,
                                                SecCode,
                                                bs,
                                                pr,
                                                Lot);
   }

   if(StrToNum(order) > 100)
   {
      iz = "исполнена";
      coloriz = colorGreen;
      str = str + "  заяка исполнена" + " ответ сервера=" + order;
      if(pos > 0 AND bs == "S")                // закрытие лонга
         AS_WRITE_PARAM("Quik_Robot", Name(), "pos", 0);
      else if(pos == 0 AND bs == "S")         // шорт
         AS_WRITE_PARAM("Quik_Robot", Name(), "pos", -1*Lot);
      else if(pos < 0 AND bs == "B")          // закрытие шорта
         AS_WRITE_PARAM("Quik_Robot", Name(), "pos", 0);
      else if(pos == 0 AND bs == "B")       // лонг
         AS_WRITE_PARAM("Quik_Robot", Name(), "pos", Lot);
      str = str + "  позиция на момент исполнения " + pos;
   }
   else {
      iz = "не исполнена";
      coloriz = colorRed;
      str = str + "  заяка НЕ исполнена" + " ответ сервера=" + order;
   }
}

////////// конец Функций //////////

if (TimeFrame == Interval() AND Permit_Ticker)
{
   if(Buy1[BarCount-1] AND pos == 0) {
      str = str + "  Buy";
      sd = "Buy";
      orders("B", round(C[BarCount-1]) + Otstup, Lots);
      AS_WRITE_FILE("log.quik", str);
   }
   else if(Sell1[BarCount-1] AND pos > 0) {
      str = str + "  Sell";
      sd = "Sell";
      orders("S", round(C[BarCount-1]) - Otstup, abs(pos));
      AS_WRITE_FILE("log.quik", str);
   }
   else if(Short1[BarCount-1] AND pos == 0) {
      str = str + "  Short";
      sd = "Short";
      orders("S", round(C[BarCount-1]) - Otstup, Lots);
      AS_WRITE_FILE("log.quik", str);
   }
   else if(Cover1[BarCount-1] AND pos < 0) {
      str = str + "  Cover";
      sd = "Cover";
      orders("B", round(C[BarCount-1]) + Otstup, abs(pos));
      AS_WRITE_FILE("log.quik", str);
   }
}
else if(TimeFrame != Interval()) {
   PopupWindow( "Не соответствует временной интервал в настройках АА и в коде",
                     "ошибка", timeout = 5, left = -1, top = -1 );
}

SetOption( "NoDefaultColumns", 1 );
AddTextColumn(Name(), "Символ", 1.0, colorDefault, colorDefault, 60);
AddColumn( C[BarCount-1], "Последняя цена", 1.2, colorDefault, colorDefault, 100 );
AddColumn( AS_READ_PARAM("Quik_Robot", Name(), "pos"), "Позиция", 1.0, colorDefault,
   IIf(AS_READ_PARAM("Quik_Robot", Name(), "pos") > 0, colorGreen,
   IIf(AS_READ_PARAM("Quik_Robot", Name(), "pos") < 0, colorRed, colorDefault)), 60);
AddTextColumn(sd, "Сигнал", 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) > 100, colorGreen, colorRed), 90);
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

СообщениеДобавлено: Чт Сен 22, 2016 10:31 pm Ответить с цитатой Вернуться к началу

Аааа, понял. Я внес изменение в плагин зписи. Там добавился еще один параметр - точность. А этот код заточен под старый плагин, вот Ами и ругаетсяЮ что в функции не хватает аргументов.
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);

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



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

СообщениеДобавлено: Пт Сен 23, 2016 5:43 pm Ответить с цитатой Вернуться к началу

Заменил везде строку,
Теперь ругается на

AddTextColumn(order, "Заявка", 1.2, colorDefault, IIf(StrToNum(order) > 100, colorGreen, colorRed), 90);
говорит что AddTextColumn должен быть стринг, а он обнаруживает номер

лог пишет так
23.09.2016 20:29:04 GAZR_ff Buy заяка НЕ исполнена ответ сервера={EMPTY}
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

СообщениеДобавлено: Сб Сен 24, 2016 8:08 am Ответить с цитатой Вернуться к началу

сегодня или завтра сам проверю тщательно и выложу проверенный код робота.

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


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

СообщениеДобавлено: Вс Сен 25, 2016 2:25 pm Ответить с цитатой Вернуться к началу

Прошу прощения, накосячил....
1. Перекачай торговый плагин http://www.amisite.ru/files/plugins/AS_QuikTrade.zip
2. Робот будет такой
Код:

Filter = 1;

TimeFrame      = 60*15;            // таймфрейм в секундах.
Account         = "NL0011100043";      // Номер счета
Client_Code      = "10133";            // Код Клиента
Quik         = "C:\\Program Files\\QUIK-Junior";         // путь к Квику


Tickers = "SBER";             // торгуемые символы через запятую без пробелов. Для контроля ошибок. Так, как они называются в Ами
/////////////

///////////////
// задаем размер лотов, коды и отступ для разных символов
/////////////

if(Name() == "SBER") {      //Символ как он называется в Ами
   SecCode         = "SBER";            
   Class         = "QJSIM";
   Lots         = 1;
   TickS         = 0.01;               // Минимальный шаг цены торгуемой бумаги
   Otstup         = 1;                  // Заявка будет выставлена хуже текущей цены на Otstup рублей
}

//////////////Система///////////////

Buy1 = Cross(C, MA(C, 40)) AND C > MA(C, 20);
Sell1 = Cross(MA(C, 20), C);
Short1 = Cross(MA(C, 40), C) AND C < MA(C, 20);
Cover1 = Cross(C, MA(C, 20));

///////////Конец Системы////////////

Buy1 = Ref(Buy1, -1);
Sell1 = Ref(Sell1, -1);
Short1 = Ref(Short1, -1);
Cover1 = Ref(Cover1, -1);

////////////////////////////////////

text = iz = sd = order = "";
color = coloriz = colorDefault;
price = 0;
str = Now(0) + "  " + Name();
pos = AS_READ_PARAM("Quik_Robot", Name(), "pos");

///////////// проверка наличия символа в списке для торговли ////////////////

k = 0;
Permit_Ticker = False;
do {
  Tick = StrExtract(Tickers, k);
  k++;
  if(Name() == Tick)
    Permit_Ticker = True;
} while(Tick != "");

///////////    Функции  ////////////

procedure orders(bs, pr, Lot)
{
   connection = 0;

   QC = AS_QUIK_CONNECT(Quik);

   if (QC == 1)
   {
      connection = 1;
      text = "Есть соединение с сервером";
      Color = colorGreen;
   }
   else if (QC == -1)
   {
      text = "нет соединения с квиком";
      Color = colorRed;   
   }
   else if (QC == -2)
   {
      text = "нет соединения с сервером";
      Color = colorRed;
   }
   else
   {
      text = "фигня какая то";
      Color = colorRed;
   }
 
   if(connection == 1)
   {
      order = AS_QUIK_SEND_SYNC_NEWORDER(   "123",            // OrderID - Любые цифры
                                 Account,
                                 Client_Code,
                                 "L",                  // Тип заявки M-рыночная, L-лимитированная
                                 Class,
                                 SecCode,
                                 bs,
                                 pr,
                                 TickS,
                                 Lot);
   }

   if(StrToNum(order) > 100)
   {
      iz = "исполнена";
      coloriz = colorGreen;
      str = str + "  заяка исполнена" + " ответ сервера=" + order;
      if(pos > 0 AND bs == "S")                // закрытие лонга
         AS_WRITE_PARAM("Quik_Robot", Name(), "pos", 0, 0);
      else if(pos == 0 AND bs == "S")         // шорт
         AS_WRITE_PARAM("Quik_Robot", Name(), "pos", -1*Lot, 0);
      else if(pos < 0 AND bs == "B")          // закрытие шорта
         AS_WRITE_PARAM("Quik_Robot", Name(), "pos", 0, 0);
      else if(pos == 0 AND bs == "B")       // лонг
         AS_WRITE_PARAM("Quik_Robot", Name(), "pos", Lot, 0);
      str = str + "  позиция на момент исполнения " + pos;
   }
   else {
      iz = "не исполнена";
      coloriz = colorRed;
      str = str + "  заяка НЕ исполнена" + " ответ сервера=" + order;
   }
}

////////// конец Функций //////////

if (TimeFrame == Interval() AND Permit_Ticker)
{
   if(Buy1[BarCount-1] AND pos == 0) {
      str = str + "  Buy";
      sd = "Buy";
      orders("B", round(C[BarCount-1]) + Otstup, Lots);
      AS_WRITE_FILE("log.quik", str);
   }
   else if(Sell1[BarCount-1] AND pos > 0) {
      str = str + "  Sell";
      sd = "Sell";
      orders("S", round(C[BarCount-1]) - Otstup, abs(pos));
      AS_WRITE_FILE("log.quik", str);
   }
   else if(Short1[BarCount-1] AND pos == 0) {
      str = str + "  Short";
      sd = "Short";
      orders("S", round(C[BarCount-1]) - Otstup, Lots);
      AS_WRITE_FILE("log.quik", str);
   }
   else if(Cover1[BarCount-1] AND pos < 0) {
      str = str + "  Cover";
      sd = "Cover";
      orders("B", round(C[BarCount-1]) + Otstup, abs(pos));
      AS_WRITE_FILE("log.quik", str);
   }
}
else if(TimeFrame != Interval()) {
   PopupWindow( "Не соответствует временной интервал в настройках АА и в коде",
                     "ошибка", timeout = 5, left = -1, top = -1 );
}

SetOption( "NoDefaultColumns", 1 );
AddTextColumn(Name(), "Символ", 1.0, colorDefault, colorDefault, 60);
AddColumn( C[BarCount-1], "Последняя цена", 1.2, colorDefault, colorDefault, 100 );
AddColumn( AS_READ_PARAM("Quik_Robot", Name(), "pos"), "Позиция", 1.0, colorDefault,
   IIf(AS_READ_PARAM("Quik_Robot", Name(), "pos") > 0, colorGreen,
   IIf(AS_READ_PARAM("Quik_Robot", Name(), "pos") < 0, colorRed, colorDefault)), 60);
AddTextColumn(sd, "Сигнал", 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) > 100, colorGreen, colorRed), 90);

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



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

СообщениеДобавлено: Вс Сен 25, 2016 3:30 pm Ответить с цитатой Вернуться к началу

Спасибо Олег!!!!, завтра проверю в деле и отпишу.
Посмотреть профиль Отправить личное сообщение
Sergey51



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

СообщениеДобавлено: Пн Сен 26, 2016 5:14 pm Ответить с цитатой Вернуться к началу

Еще раз спасибо Олег!!! проверил, все работает.
Посмотреть профиль Отправить личное сообщение
OldYoung



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

СообщениеДобавлено: Чт Ноя 03, 2016 6:58 pm Ответить с цитатой Вернуться к началу

Может кому поможет наблюдение.....
Если выставить слишком большой отступ, то при попытке отправить заявку через АПИ, робот получает ответ "Empty". Хотя, казалось бы, если выдрать чисто функцию отправки заявки, добавить к ней проверку коннекта, вручную забить актуальную цену, заявка улетает на ура. Но вот робот с настройками отступа, получает ответ 0, и валится.
Косяк был найдет путем забивания в квик ордера вручную, с ценой, довольной сильно отличающейся от актуальной. Квик ее не принимает, давая ответ "Ошибка создания заявки. [GW][32] "Цена сделки вне лимита"". А функция получает ответ EMPTY.
UPD Опять пустой ответ..... буду дальше смотреть

_________________
Учусь потихоньку.....
Посмотреть профиль Отправить личное сообщение
shaly



Зарегистрирован: 01.07.2008
Сообщения: 53
Откуда: Омск

СообщениеДобавлено: Вт Окт 10, 2017 2:44 pm Ответить с цитатой Вернуться к началу

Где можно вручную изменить состояние робота, файла robot.ini нет?
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

СообщениеДобавлено: Вт Окт 10, 2017 6:40 pm Ответить с цитатой Вернуться к началу

Попробуй задать вопрос подробнее.

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



Зарегистрирован: 01.07.2008
Сообщения: 53
Откуда: Омск

СообщениеДобавлено: Ср Окт 11, 2017 9:06 am Ответить с цитатой Вернуться к началу

000 писал(а):
Попробуй задать вопрос подробнее.

Все решено. Просто прошло около 10 сделок, с ошибками, и текущая позиция была равна 0. Как только все ошибки были исправлены и прошла сделка, файл появился.
Посмотреть профиль Отправить личное сообщение
shaly



Зарегистрирован: 01.07.2008
Сообщения: 53
Откуда: Омск

СообщениеДобавлено: Чт Окт 12, 2017 3:29 am Ответить с цитатой Вернуться к началу

В результате работы робота выявлен следующий косяк, в некоторых случаях, вместо закрытия позиции и на следующем баре выставлять новый ордер на разворот, проходит 2 сделки на закрытие и в счетчике позиций выставляается 0. В результате в дальнейшем торговля идет без разворотов.
Код:

11.10.2017 22:46:13  RIZ7  Cover  the order is executed server's response=28129813481  position at the time of execution -1
11.10.2017 22:46:13  RIZ7  Cover  the order is executed server's response=28129813484  position at the time of execution -1

Как это исправить?
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

СообщениеДобавлено: Чт Окт 12, 2017 8:43 am Ответить с цитатой Вернуться к началу

надо смотреть код робота. По логу непонятно почему он так делает.

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



Зарегистрирован: 01.07.2008
Сообщения: 53
Откуда: Омск

СообщениеДобавлено: Сб Окт 14, 2017 7:29 am Ответить с цитатой Вернуться к началу

000 писал(а):
надо смотреть код робота. По логу непонятно почему он так делает.

Боюсь это зависит не от кода, а от ОС, после того как происходит блокировка экрана.
Посмотреть профиль Отправить личное сообщение
Показать сообщения:      
Начать новую тему  Ответить на тему


 Перейти:   



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


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

File Attachment © by Meik Sievertsen