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



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

СообщениеДобавлено: Вс Фев 14, 2010 1:07 am Ответить с цитатой Вернуться к началу

Поскольку вопросы с экспортом в Ами данных из 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

СообщениеДобавлено: Вс Фев 14, 2010 1:31 am Ответить с цитатой Вернуться к началу

Задача поставлена, пробуем ее начать решать.

Возьмем для болванки-заготовки простую в своей гениальности систему. Покупка при превышении МА-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
Откуда: от "Верблюда"

СообщениеДобавлено: Вс Фев 14, 2010 9:18 am Ответить с цитатой Вернуться к началу

VladimirN писал(а):
.

Возгласы "Не мучайся, торгуй из Квика", мы отметем как недостаточно организованные (не все могут так просто взять и открыть счет у другого брокера....)


Могут все, например в ВТБ 24 нет в городе, должен быть в областном центре, в наше время говорить об ограничении выбора не серьезно.

_________________
Юра
Посмотреть профиль Отправить личное сообщение Отправить e-mail
000
Site Admin


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

СообщениеДобавлено: Вс Фев 14, 2010 1:24 pm Ответить с цитатой Вернуться к началу

Разбираться со смартом не охота, но некоторые соображения выскажу.
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

СообщениеДобавлено: Пн Фев 15, 2010 3:21 pm Ответить с цитатой Вернуться к началу

Олег, день добрый.
В чем преимущество твоего последнего робота, от робота выложенного на сайте? Я решил начать торговать потихоньку (не прошло и года Very Happy). Прокоментируй контороль позиций, если это есть.
Какие входы: лимит + отступ или по другому(есть ли оптимизация проскальзывания). И конечно, спасибо что делишься информацией.
Сам стою перед выбором- какого робота использовать. Пока конечно без вариантов, но способ в посте выше заинтересовал.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
000
Site Admin


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

СообщениеДобавлено: Пн Фев 15, 2010 3:38 pm Ответить с цитатой Вернуться к началу

Контроль позиции (чтение текущей позиции из терминала) не делал.
Заявка отправляется "по рынку", возвращается ответ "исполнена" и после этого считаем, что система в рынке на весь заявленный сайз.
Переимущества? Побыстрее и понадежнее, но это не через квик.
Входы по рынку (торгую на достаточно ликвидных бумагах вменяемым сайзом, рынок сильно не двигаю Smile )

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



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

СообщениеДобавлено: Вт Фев 16, 2010 9:53 pm Ответить с цитатой Вернуться к началу

000 писал(а):
Разбираться со смартом не охота, но некоторые соображения выскажу.
1. Заявки на сделку лучше всего подавать только при условии соответствующей рыночной позиции. Например покупаем только когда вне рынка по инструменту. Продаем только когда в рынке.
2. Можно конечно каждый раз считать по сигналам в рынке система или нет, но мне последнее время нравится способ записывать позицию в файл.


Большое спасибо за советы... Я думал, если в коде прописано SetPositionSize(1, spsShares );
то позицию больше ничем контролировать не надо.

Скажите, к какому терминалу Вы привели пример СОМ-кода?

И как в Ами можно вывести где-нибудь цифры того, что он получает через СОМ ? Например, когда он запросил и получил от терминала размер позиции, как где-нибудь вывести в окошке (или поверх графика) - ту цифру, которую он получил? что бы видеть работает сом-связь, хотя бы
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

СообщениеДобавлено: Вт Фев 16, 2010 11:32 pm Ответить с цитатой Вернуться к началу

Цитата:

Я думал, если в коде прописано SetPositionSize(1, spsShares );
то позицию больше ничем контролировать не надо.

Это для теста. Для робота несколько другие дела...
вообще надо четко понимать, что код индикатора (чарта), системы для теста и робота это несколько разные вещи...
То, что я написал то контроль позиции именно для робота.
Цитата:

Скажите, к какому терминалу Вы привели пример СОМ-кода?

Алор трейд
Цитата:

И как в Ами можно вывести где-нибудь цифры того, что он получает через СОМ ? Например, когда он запросил и получил от терминала размер позиции, как где-нибудь вывести в окошке (или поверх графика) - ту цифру, которую он получил? что бы видеть работает сом-связь, хотя бы

Я вывожу в АА при помощи AddColumn(). Это принципиально. Я считаю, что робот должен работать через АА. Если уж так охота через чарт, то можно вывести в Title
Работу COM можно проверять прямо в коде. Например в том коде который я привел заявка отправляется только если связь есть (if (State > 0)). Соответственно и позиция робота изменяется только при наличии связи.

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



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

СообщениеДобавлено: Чт Фев 18, 2010 2:32 pm Ответить с цитатой Вернуться к началу

Не могу сформировать строку для записи в файл. .. Все время Syntax Error.

Дайте пожалуйста пример - как вставить в файл вот такую строку

place_order?portfolio=BP7777-ST-01&security=GAZP_FT&action=BUY&type=MARKET

цену здесь вставлять не надо - просто по Маркету купить... Т.е. все символы в файле неизменные от приказа к приказу.
Посмотреть профиль Отправить личное сообщение
VladimirN



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

СообщениеДобавлено: Чт Фев 18, 2010 11:55 pm Ответить с цитатой Вернуться к началу

У меня еще вопросы...

Вы в примере (данном выше) при отдаче приказа написали такой код

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

СообщениеДобавлено: Пт Фев 19, 2010 12:00 am Ответить с цитатой Вернуться к началу

Хорошо, что дописал в тему. Я забыл что вопрос висит...
На 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

СообщениеДобавлено: Пт Фев 19, 2010 12:08 am Ответить с цитатой Вернуться к началу

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

СообщениеДобавлено: Вс Фев 21, 2010 12:16 am Ответить с цитатой Вернуться к началу

проверял в онлайне, в пятницу поздно вечером (на ФОРТС Стандарт) - файлы успешно создаются. В режиме Scan. И в АА сообщения об ордерах при этом выводятся, но только по одной штуке и ненадолго.... они исчезают при появлении следующего бара без сигнала.

А можно ли как-то лог всех приказов системы за многие часы хотя бы наблюдать?
В идеале надо бы их сохранять в файл...

P.S. Спасибо за подсказки. Без Вас не знаю что бы и делал...
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

СообщениеДобавлено: Вс Фев 21, 2010 9:04 pm Ответить с цитатой Вернуться к началу

Да. Лог можно и нужно. Я лично пишу лог тупо в файл. Раньше писал при каждом прогоне, но при прогоне раз в секунду за день много получается. Теперь пишу только когда проходит сигнал.
Код:

procedure writelog(s) {
  fh = fopen( "robot.log", "a");
  s = s + "\n";
  fputs( s, fh);
  fclose( fh );
}

Эту процедуру ближе к началу
далее
Код:

str = Now(0) + "  " + Name() + "  ";

Это формируем начало строки записываемой в лог. Дата/время и символ
Далее в эту строку дописываем что надо и там где пишем строку отправляющую транзакцию пишем
Код:

writelog(str);

Если надо писать лог при каждом прогоне, то пишем writelog(str); просто в конце кода.
В таблицу АА кстати не дурно бы вывести текущую позицию системы
Типа
Код:

AddColumn(pos, "позиция", 1.0, ColorDefault, IIf(pos>0, ColorGreen, ColorDefault));

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


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

СообщениеДобавлено: Вс Фев 21, 2010 9:05 pm Ответить с цитатой Вернуться к началу

Кстати. Лучше всетаки не режиме Scan, в режиме Exloration. AddColumn работает только в нем.

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Показать сообщения:      
Начать новую тему  Ответить на тему


 Перейти:   



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


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

File Attachment © by Meik Sievertsen