Начать новую тему Ответить на тему |
Список форумов 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 След. |
Автор |
Сообщение |
VladimirN
Зарегистрирован: 07.11.2009
Сообщения: 49
|
Поскольку вопросы с экспортом в Ами данных из SmartTrade уже решены на 2/3 (http://amisite.ru/phpBB2/viewtopic.php?t=31) то логично попытаться хоть немного автоматизировать выставление приказов. Приглашаю всех желающих свободно высказываться по данному вопросу.
Возгласы "Не мучайся, торгуй из Квика", мы отметем как недостаточно организованные (не все могут так просто взять и открыть счет у другого брокера....)
От себя пока напишу, для завтравки темы, следующее.
Прямой связки приказов через длл-ку, как для других программ, Смарт для Ами не поддерживает. Однако, Смарт может читать приказы из текстовых файлов в своей папке Orders (или любой другой). Проверяя ее каждую секунду. Если он находит там файлы с раширением new - читате их и пытается выполнить. И пишет результаты в лог.
Файл с приказом должен иметь одну строку и вид типа
place_order?portfolio=BP7777-ST-01&security=GAZP_FT&action=BUY&type=LIMIT&validity=DAY&price=137200&stop_price=0&amount=1
что он значит
BP7777-ST-01 - это Ваш счет на фортс-стандарте.
GAZP_FT - берем газпром
action=BUY
type=LIMIT
validity=DAY приказ на завтра не переносится
price=137
stop_price=0 стопа нет
amount=1 одну штуку
после обработки файла с таким или другим приказом (независимо от результатов), Смарт его переименуеи в расширение OLD
Таким образом, Амиброкеровский робот, должен СОЗДАВАТЬ
для каждого приказа новый файл с произвольным именем (но лучше по порядку, правда?) и расширением new в нужной папке.
Начальная задача, думаю поставлена...
ВНИМАНИЕ - обязательно выставляйте при отладке "спрашивать подтверждение" в Смарте. У меня только что заклинило Смарт - что-то с переименованием файла было - new не исчезал хотя old писался... И Смарт на генерировал мне 5 штук однтипных заявок. Ночью. 5 штук - только потому что я пять раз соглашался на запрос. Если бы запроса не выводилось, думаю, он в секунду выставился бы на все депо. Так что будьте предельно осторожны.... |
|
|
Посмотреть профиль Отправить личное сообщение |
|
VladimirN
Зарегистрирован: 07.11.2009
Сообщения: 49
|
Задача поставлена, пробуем ее начать решать.
Возьмем для болванки-заготовки простую в своей гениальности систему. Покупка при превышении МА-5 медленной МА-13, выход только трэйлингом (трейлинг = 10) или в конце сессии, только один лот, для простоты - покупка всегда по маркету. Шортов не надо.
У нас думаю, будет код типа
SetPositionSize(1, spsShares );
ApplyStop(stopTypeTrailing, stopModePoint, 10 ), True );
endday = TimeNum() >234300;
Buy = EMA(Close, 5) > EMA(Close, 13) ; можете подправить
Sell = endday;
Вопрос! Как правильно, при наступлении сигнала на покупку
записывать в папку C:\Orders один файл с командой
place_order?portfolio=BP7777-ST-01&security=GAZP_FT&action=BUY&type=MARKET&validity=DAY&stop_price=0&amount=1
А при срабатывании стопа и конце дня писать один файл с командой
place_order?portfolio=BP7777-ST-01&security=GAZP_FT&action=SELL&type=MARKET&validity=DAY&stop_price=0&amount=1
Разумеется, приказы не должны отдаваться (файлы не должны писаться) на каждом баре\свече, когда срабатывает условие Buy. К счастью, пока мы торгуем толко ордерами "по маркету", проверять их исполнение... не очень обязательно. Допускаем, что "один раз файл на покупку записали = одил лот купили".
У кого есть идеи? |
|
|
Посмотреть профиль Отправить личное сообщение |
|
commenced
Советник
Зарегистрирован: 08.04.2008
Сообщения: 643
Откуда: от "Верблюда"
|
VladimirN писал(а): |
.
Возгласы "Не мучайся, торгуй из Квика", мы отметем как недостаточно организованные (не все могут так просто взять и открыть счет у другого брокера....)
|
Могут все, например в ВТБ 24 нет в городе, должен быть в областном центре, в наше время говорить об ограничении выбора не серьезно. |
_________________ Юра |
|
Посмотреть профиль Отправить личное сообщение Отправить e-mail |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Разбираться со смартом не охота, но некоторые соображения выскажу.
1. Заявки на сделку лучше всего подавать только при условии соответствующей рыночной позиции. Например покупаем только когда вне рынка по инструменту. Продаем только когда в рынке.
2. Можно конечно каждый раз считать по сигналам в рынке система или нет, но мне последнее время нравится способ записывать позицию в файл.
Делается это так
Записываем позицию
Код: |
procedure writeposition( q ) {
fh = fopen( "robot.smart", "w");
fputs( NumToStr( q, 1.0, False ), fh);
fclose( fh );
}
|
Читаем позицию
Код: |
function readposition() {
fh = fopen( "robot.smart", "r");
p = fgets( fh );
fclose( fh );
p = StrToNum(p);
return p;
}
|
В результате в папке Ами появится файл с именем robot.smart и в нем будет цифра.
В коде робота делаем так
Код: |
pos = readposition(); // узнаем рыночную позицию
Buy = ...;
Sell = ...;
Buy = Buy AND pos == 0;
if(Buy[BarCount-2]) {
order("B", C[BarCount-1] + отступ); // процедура формирования строки и записи её в файл
writeposition(lots);
}
|
Имя файла со строкой по моему проще всего задавать в зависимости от времени бара на котором он создан и направления сделки...
Кроме того сейчас быстренько глянул. В смарте есть ком технология. Используя её можно попытаться отправлять заявку из Ами напрямую в смарт. AFL может создавать и работать с COM
Пример. Вот таким макаром я подаю заявки используя COM (не в смарт)
Код: |
procedure order(bs, pr) {
Slot = CreateObject( "TEClient.Slot" );
Slot.Open(1);
State = Slot.GetCurrentState();
AddColumn(State, "State");
if (State > 0) {
qq = Slot.AddOrder(
"бла-бла", // Accaunt
bs, // BuySell
"L", // MktLimit
"O", // SplitFlag
" ", // ImmCancel
"P", // EnterType
"SBRF", // SecBoard
"SBRF-3.10", // SecCode 9
"", // IssueCode
pr, // Price
1, // Amount
"бла-бла", // BrokerRef
"", // ExtRef
""); // pResultMsg
}
}
|
|
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
Teema
Зарегистрирован: 01.04.2009
Сообщения: 184
|
Олег, день добрый.
В чем преимущество твоего последнего робота, от робота выложенного на сайте? Я решил начать торговать потихоньку (не прошло и года ). Прокоментируй контороль позиций, если это есть.
Какие входы: лимит + отступ или по другому(есть ли оптимизация проскальзывания). И конечно, спасибо что делишься информацией.
Сам стою перед выбором- какого робота использовать. Пока конечно без вариантов, но способ в посте выше заинтересовал. |
|
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Контроль позиции (чтение текущей позиции из терминала) не делал.
Заявка отправляется "по рынку", возвращается ответ "исполнена" и после этого считаем, что система в рынке на весь заявленный сайз.
Переимущества? Побыстрее и понадежнее, но это не через квик.
Входы по рынку (торгую на достаточно ликвидных бумагах вменяемым сайзом, рынок сильно не двигаю ) |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
VladimirN
Зарегистрирован: 07.11.2009
Сообщения: 49
|
000 писал(а): |
Разбираться со смартом не охота, но некоторые соображения выскажу.
1. Заявки на сделку лучше всего подавать только при условии соответствующей рыночной позиции. Например покупаем только когда вне рынка по инструменту. Продаем только когда в рынке.
2. Можно конечно каждый раз считать по сигналам в рынке система или нет, но мне последнее время нравится способ записывать позицию в файл.
|
Большое спасибо за советы... Я думал, если в коде прописано SetPositionSize(1, spsShares );
то позицию больше ничем контролировать не надо.
Скажите, к какому терминалу Вы привели пример СОМ-кода?
И как в Ами можно вывести где-нибудь цифры того, что он получает через СОМ ? Например, когда он запросил и получил от терминала размер позиции, как где-нибудь вывести в окошке (или поверх графика) - ту цифру, которую он получил? что бы видеть работает сом-связь, хотя бы |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Цитата: |
Я думал, если в коде прописано SetPositionSize(1, spsShares );
то позицию больше ничем контролировать не надо.
|
Это для теста. Для робота несколько другие дела...
вообще надо четко понимать, что код индикатора (чарта), системы для теста и робота это несколько разные вещи...
То, что я написал то контроль позиции именно для робота.
Цитата: |
Скажите, к какому терминалу Вы привели пример СОМ-кода?
|
Алор трейд
Цитата: |
И как в Ами можно вывести где-нибудь цифры того, что он получает через СОМ ? Например, когда он запросил и получил от терминала размер позиции, как где-нибудь вывести в окошке (или поверх графика) - ту цифру, которую он получил? что бы видеть работает сом-связь, хотя бы
|
Я вывожу в АА при помощи AddColumn(). Это принципиально. Я считаю, что робот должен работать через АА. Если уж так охота через чарт, то можно вывести в Title
Работу COM можно проверять прямо в коде. Например в том коде который я привел заявка отправляется только если связь есть (if (State > 0)). Соответственно и позиция робота изменяется только при наличии связи. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
VladimirN
Зарегистрирован: 07.11.2009
Сообщения: 49
|
Не могу сформировать строку для записи в файл. .. Все время Syntax Error.
Дайте пожалуйста пример - как вставить в файл вот такую строку
place_order?portfolio=BP7777-ST-01&security=GAZP_FT&action=BUY&type=MARKET
цену здесь вставлять не надо - просто по Маркету купить... Т.е. все символы в файле неизменные от приказа к приказу. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
VladimirN
Зарегистрирован: 07.11.2009
Сообщения: 49
|
У меня еще вопросы...
Вы в примере (данном выше) при отдаче приказа написали такой код
if(Buy[BarCount-2]) {
order("B", C[BarCount-1] + отступ); // процедура формирования строки и записи её в файл
writeposition(lots);
}
Зачем здесь - Buy[BarCount-2]) ?
(как я понимаю, это проверка "был ли сигнал Buy на последних двух барах" ?) А почему просто нельзя запускать процедуру order по условию If(Buy)
Другой вопрос - можно ли в AFL запустить некое табло или консоль, куда в рилтайме выводились бы отладочные сообщение, надписи и значения переменых? Например, я вижу что Scan запускает систему на чарте каждую секунду. Чарт живой - последний бар все время меняется. Внутри системы из-за этого происходят измнения, но сделок никаких (пока) нет.. Как в рилтайме можно наблюдать за внутри системной переменной?
P.S. Извините что отнимаю время - но больше ж некого спрашивать. А ваши ответы, надеюсь, будут не только мне полезны... |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Хорошо, что дописал в тему. Я забыл что вопрос висит...
На 1 вопрос. Этот код прекрасно записывает строку в файл robot.smart в папке Ами. Проверил.
Код: |
procedure writetrans( q ) {
fh = fopen( "robot.smart", "w");
fputs( q, fh);
fclose( fh );
}
writetrans("place_order?portfolio=BP7777-ST-01&security=GAZP_FT&action=Buy&type=MARKET");
|
|
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
VladimirN писал(а): |
У меня еще вопросы...
Вы в примере (данном выше) при отдаче приказа написали такой код
if(Buy[BarCount-2]) {
order("B", C[BarCount-1] + отступ); // процедура формирования строки и записи её в файл
writeposition(lots);
}
Зачем здесь - Buy[BarCount-2]) ?
(как я понимаю, это проверка "был ли сигнал Buy на последних двух барах" ?) А почему просто нельзя запускать процедуру order по условию If(Buy)
|
Последний бар имеет индекс BarCount-1 поэтому BarCount-2 это предпоследний бар. Проверка сигнала на ПРЕДПОСЛЕДНЕМ баре
Функция If работает ТОЛЬКО с константами, просто Buy это массив. Необходимо указать какой конкретно член массива проверять, поэтому Buy[BarCount-2]. Именно - 2 для того, чтобы не брался сигнал с текущего, еще не сформированного бара. Т.е. старый бар закончиося и на нем появился сигнал. Как только появился новый бар, так сразу исполняем сигнал на старом. Практически это равно исполнению на закрытии старого.
VladimirN писал(а): |
Другой вопрос - можно ли в AFL запустить некое табло или консоль, куда в рилтайме выводились бы отладочные сообщение, надписи и значения переменых? Например, я вижу что Scan запускает систему на чарте каждую секунду. Чарт живой - последний бар все время меняется. Внутри системы из-за этого происходят измнения, но сделок никаких (пока) нет.. Как в рилтайме можно наблюдать за внутри системной переменной?
|
Для контроля и наблюдения за поведением системы лучше используй не режим scan, а режим explore.
Рзницы практически никактй, а этот режим позволяет выводить в таблицу что угодно при помощи AddColumn(). Только надо будет в код добавить Filter = 1; |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
VladimirN
Зарегистрирован: 07.11.2009
Сообщения: 49
|
проверял в онлайне, в пятницу поздно вечером (на ФОРТС Стандарт) - файлы успешно создаются. В режиме Scan. И в АА сообщения об ордерах при этом выводятся, но только по одной штуке и ненадолго.... они исчезают при появлении следующего бара без сигнала.
А можно ли как-то лог всех приказов системы за многие часы хотя бы наблюдать?
В идеале надо бы их сохранять в файл...
P.S. Спасибо за подсказки. Без Вас не знаю что бы и делал... |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Да. Лог можно и нужно. Я лично пишу лог тупо в файл. Раньше писал при каждом прогоне, но при прогоне раз в секунду за день много получается. Теперь пишу только когда проходит сигнал.
Код: |
procedure writelog(s) {
fh = fopen( "robot.log", "a");
s = s + "\n";
fputs( s, fh);
fclose( fh );
}
|
Эту процедуру ближе к началу
далее
Код: |
str = Now(0) + " " + Name() + " ";
|
Это формируем начало строки записываемой в лог. Дата/время и символ
Далее в эту строку дописываем что надо и там где пишем строку отправляющую транзакцию пишем
Если надо писать лог при каждом прогоне, то пишем writelog(str); просто в конце кода.
В таблицу АА кстати не дурно бы вывести текущую позицию системы
Типа
Код: |
AddColumn(pos, "позиция", 1.0, ColorDefault, IIf(pos>0, ColorGreen, ColorDefault));
|
|
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Кстати. Лучше всетаки не режиме Scan, в режиме Exloration. AddColumn работает только в нем. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
|
Начать новую тему Ответить на тему |
Список форумов 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 След. |
|
Следующая тема
Предыдущая тема
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете вкладывать файлы Вы не можете скачивать файлы
|
|