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



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

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

Сорри, вот этот http://www.amisite.ru/afl/exp/0002.php
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

СообщениеДобавлено: Ср Мар 11, 2015 10:45 am Ответить с цитатой Вернуться к началу

А этот надо переделывать.
В нем используются не стандартные массивы покупки/продажи
Buy1, Sell1...
Функция Equity() работает только со стандартными массивами.

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



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

СообщениеДобавлено: Ср Мар 11, 2015 10:48 am Ответить с цитатой Вернуться к началу

Окей, а робот со стопами?
Там работает Equity?
Или как избавиться от Equity и прописать TakeProfit?
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

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

Если использовать ApplyStop(), то без Equity() нельзя. А без Equity() в третьем роботе подробно описано.

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



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

СообщениеДобавлено: Вт Мар 24, 2015 10:39 am Ответить с цитатой Вернуться к началу

Стал использовать http://www.amisite.ru/afl/exp/0003.php и избавился от ApplyStop. Но как задать теперь, например, задержку для выполнения сигнала после срабатывания стоп-лосса?
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

СообщениеДобавлено: Вт Мар 24, 2015 11:01 am Ответить с цитатой Вернуться к началу

Вопрос не понял.

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



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

СообщениеДобавлено: Вт Мар 24, 2015 11:26 am Ответить с цитатой Вернуться к началу

В тестере использую такую конструкцию ApplyStop(stopTypeLoss, stopModePercent, 0.35, 1, True,7);
Как её перенести в робота(задержка в 7 баров)
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

СообщениеДобавлено: Вт Мар 24, 2015 11:48 am Ответить с цитатой Вернуться к началу

Хе. Понятно. Запретить вход после стопа в течении 7 баров. Ща подумаю как бы это попроще и понадежнее сделать.

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


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

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

Сначала весь код
Код:

Filter = 1;
SetBarsRequired(sbrAll, sbrAll);

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


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

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

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

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

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

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

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 = Buy1[BarCount - 2] AND L[BarCount - 1] > C[BarCount - 2]*(1 - Stop/100);
Sell1 = Sell1[BarCount - 2];
Short1 = Short1[BarCount - 2] AND H[BarCount - 1] < C[BarCount - 2]*(1 + Stop/100);
Cover1 = Cover1[BarCount - 2];

stop = 0;

stopBar = AS_READ_PARAM("Quik_Robot", Name(), "stopBar");

Buy1 = Buy1 AND BarCount > stopBar + 7;
Short1 = Short1 AND BarCount > stopBar + 7;

/// стопы ///
if(pos > 0 AND L[BarCount-1] < AS_READ_PARAM("Quik_Robot", Name(), "price")*(1 - Stop/100))
{
   Sell1 = 1;
   str = str + "  сработал стоп при лонге";
   stop = 1;
}
else if(pos < 0 AND H[BarCount-1] > AS_READ_PARAM("Quik_Robot", Name(), "price")*(1 + Stop/100))
{
   Cover1 = 1;
   str = str + "  сработал стоп при шорте";
   stop = 1;
}

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

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);
         AS_WRITE_PARAM("Quik_Robot", Name(), "price", 0);
         if(stop == 1)
            AS_WRITE_PARAM("Quik_Robot", Name(), "stopBar", BarCount);
      }
      else if(pos == 0 AND bs == "S")         // шорт
      {
         AS_WRITE_PARAM("Quik_Robot", Name(), "pos", -1*Lot);
         AS_WRITE_PARAM("Quik_Robot", Name(), "price", Close[BarCount - 2]);
         AS_WRITE_PARAM("Quik_Robot", Name(), "stopBar", 0);
      }
      else if(pos < 0 AND bs == "B")          // закрытие шорта
      {
         AS_WRITE_PARAM("Quik_Robot", Name(), "pos", 0);
         AS_WRITE_PARAM("Quik_Robot", Name(), "price", 0);
         if(stop == 1)
            AS_WRITE_PARAM("Quik_Robot", Name(), "stopBar", BarCount);
      }
      else if(pos == 0 AND bs == "B")       // лонг
      {
         AS_WRITE_PARAM("Quik_Robot", Name(), "pos", Lot);
         AS_WRITE_PARAM("Quik_Robot", Name(), "price", Close[BarCount - 2]);
         AS_WRITE_PARAM("Quik_Robot", Name(), "stopBar", 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);
   }
   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);
   }
   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);
   }
   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);

Описание.
Вводим новую переменную
stop = 0;
Если сработал стоп, то она становится 1
Когда закрываем лонг или шорт в случае стопа записываем в Quik_Robot общее число баров на графике.
Код:
if(stop == 1)
   AS_WRITE_PARAM("Quik_Robot", Name(), "stopBar", BarCount);

В системе читаем этот параметр
Код:
stopBar = AS_READ_PARAM("Quik_Robot", Name(), "stopBar");

Когда лонг или шорт проверяем сколько баров прибавилось с момента стопа.
Код:
Buy1 = Buy1 AND BarCount > stopBar + 7;
Short1 = Short1 AND BarCount > stopBar + 7;


Вот как то так.

Какие могут быть косяки. Надо чтобы баров на графике было больше 7 и чтобы плагин сам не удалял первые бары.

Работу не проверял

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



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

СообщениеДобавлено: Вт Мар 24, 2015 4:56 pm Ответить с цитатой Вернуться к началу

Большое спасибо! Буду тестить.

UPD
Работает исправно!!! Спасибо.
Посмотреть профиль Отправить личное сообщение
crn



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

СообщениеДобавлено: Вс Апр 19, 2015 4:47 pm Ответить с цитатой Вернуться к началу

Олег, подскажи пожалуйста как решить такую проблемку в твоем роботе.
Он выставляет заявки в квик, только при нажатии в ами на кнопку Explore.
Видимо это как то связано с Run Every, но он находится с старой версии АА, а у меня 5.9, и он там отмечен восклицательным знаком.
Если я ставлю Run Every = 1sec и нажимаю Explore в старой версии AA, ами ругается и возвращает два месадж бокса - You need to define Filter variable и т.д. и второй Не задан двузначный номер в поле FullName.
Как обойти эту проблему?
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

СообщениеДобавлено: Вс Апр 19, 2015 5:46 pm Ответить с цитатой Вернуться к началу

Вот так

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



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

СообщениеДобавлено: Вс Апр 19, 2015 6:25 pm Ответить с цитатой Вернуться к началу

000 писал(а):
Вот так

Спасибо, заработало!
Только другая проблемка выскочила уже.
У меня 4 бумаги:
Tickers = "LKOH,SBER,GAZP,URKA";


Код:

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


Вроде шаги цены и все остальное выставлены правильно.
Вот код покупки, шортов нет.
Код:

Buy1 = C > O;
Sell1 = C < O;

т.е. белая свеча - покупаем, красная - продаем. ТФ минутки везде минутки. Графики в ами транслируются из квика нормально.
Но вот почему заявки исполняются только по GAZP и SBER.
Смотрю в эксплорере, если сигнал на продажу (прошлый бар красный) то в эксплорер выводится Sell, Есть соединение с сервером , Заявка не исполнена. Это логично, т.к. Buy не было, нет и Sell соответственно.
Но вот когда прошлый бар белый, т.к. должен быть Buy, эксплорер молчит как ни в чем не бывало. Это касается URKA и LKOH.
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

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

Ну а ты попробуй только на одной бумаге сделки. Например только на луке. И в правилах покупки напиши Buy1 = 1; И один раз Explore.

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



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

СообщениеДобавлено: Вс Апр 19, 2015 6:56 pm Ответить с цитатой Вернуться к началу

000 писал(а):
Ну а ты попробуй только на одной бумаге сделки. Например только на луке. И в правилах покупки напиши Buy1 = 1; И один раз Explore.


Пробовал, аналогичный результат.
Щас поставил

Buy1 = 1;
Sell1 = C < O;

Он опять выдает Sell, Есть соединение с сервером, Не исполнена, 0.
т.е. Buy1 для лука он вообще не видит.
AS_QUIK_SEND_SYNC_NEWORDER возвращает 0.

Делаю для GAZP в одиночку, норм работает.
Может в квике дело. Щас попробую другие бумаги потестить.
Посмотреть профиль Отправить личное сообщение
Показать сообщения:      
Начать новую тему  Ответить на тему


 Перейти:   



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


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

File Attachment © by Meik Sievertsen