Начать новую тему Ответить на тему |
Список форумов 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 След. |
Автор |
Сообщение |
Enhema
Зарегистрирован: 25.12.2014
Сообщения: 36
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
А этот надо переделывать.
В нем используются не стандартные массивы покупки/продажи
Buy1, Sell1...
Функция Equity() работает только со стандартными массивами. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
Enhema
Зарегистрирован: 25.12.2014
Сообщения: 36
|
Окей, а робот со стопами?
Там работает Equity?
Или как избавиться от Equity и прописать TakeProfit? |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Если использовать ApplyStop(), то без Equity() нельзя. А без Equity() в третьем роботе подробно описано. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
Enhema
Зарегистрирован: 25.12.2014
Сообщения: 36
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Вопрос не понял. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
Enhema
Зарегистрирован: 25.12.2014
Сообщения: 36
|
В тестере использую такую конструкцию ApplyStop(stopTypeLoss, stopModePercent, 0.35, 1, True,7);
Как её перенести в робота(задержка в 7 баров) |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Хе. Понятно. Запретить вход после стопа в течении 7 баров. Ща подумаю как бы это попроще и понадежнее сделать. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Сначала весь код
Код: |
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
|
Большое спасибо! Буду тестить.
UPD
Работает исправно!!! Спасибо. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
crn
Зарегистрирован: 28.03.2015
Сообщения: 30
|
Олег, подскажи пожалуйста как решить такую проблемку в твоем роботе.
Он выставляет заявки в квик, только при нажатии в ами на кнопку Explore.
Видимо это как то связано с Run Every, но он находится с старой версии АА, а у меня 5.9, и он там отмечен восклицательным знаком.
Если я ставлю Run Every = 1sec и нажимаю Explore в старой версии AA, ами ругается и возвращает два месадж бокса - You need to define Filter variable и т.д. и второй Не задан двузначный номер в поле FullName.
Как обойти эту проблему? |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Вот так |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
crn
Зарегистрирован: 28.03.2015
Сообщения: 30
|
Спасибо, заработало!
Только другая проблемка выскочила уже.
У меня 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
|
Ну а ты попробуй только на одной бумаге сделки. Например только на луке. И в правилах покупки напиши Buy1 = 1; И один раз Explore. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
crn
Зарегистрирован: 28.03.2015
Сообщения: 30
|
000 писал(а): |
Ну а ты попробуй только на одной бумаге сделки. Например только на луке. И в правилах покупки напиши Buy1 = 1; И один раз Explore. |
Пробовал, аналогичный результат.
Щас поставил
Buy1 = 1;
Sell1 = C < O;
Он опять выдает Sell, Есть соединение с сервером, Не исполнена, 0.
т.е. Buy1 для лука он вообще не видит.
AS_QUIK_SEND_SYNC_NEWORDER возвращает 0.
Делаю для GAZP в одиночку, норм работает.
Может в квике дело. Щас попробую другие бумаги потестить. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
|
Начать новую тему Ответить на тему |
Список форумов 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 След. |
|
Следующая тема
Предыдущая тема
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете вкладывать файлы Вы не можете скачивать файлы
|
|