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



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

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

Добрый день всем!
Решил попробовать сделать робота для данной схемы. Сам не крутой программер, поэтому я воспользовался Роботом МехаSmile

Вот готовый код, рабочий. С пояснениями. Помимо стоп-лосса должны работать и другие разновидности ApplyStop.
В правилах системы указана тестовая система, которая убыточная.

За создание данного робота особые благодарности Олегу (000) - за помощь и консультации и Механизатору - за идею и начальный код.

Возможно, код далек от совершенства, но он рабочий и возможные улучшения и дополнения только привествуются!


Последний раз редактировалось: Orange2000 (Пн Окт 19, 2009 2:10 pm), всего редактировалось 2 раз(а)
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

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

Каждый раз прогоняя код AFL видит сигнал и отправляет его в Алфу. Он не в курсе, чтоперед этим уже отправил эту заявку.
У Меха в роботе эта проблемка решена проверкой tri файла и поиском ID этой заявки. Если такая заявка уже была, то новая не отправляется.
В данном случае самое простое записывать в файл отправленные заявки и перед отправкой заявки читать его из робота и проверять не отправлялась ли уже эта заявка.

Дальше. Необходимо решить надо ли на одном баре допускать несколько одинаковых сделок. Например Buy
Если нет, то можно в некий файл при совершении покупки записывать 1 и при следующем прогоне кода если там уже 1 и сделка buy не отправлять заявку.
Можно записывать в файл сайз сделки и тогда при следующем прогоне робот будет знать в кауой позиции он сейчас находится.
Конечно самый идеальный случай был бы если есть возможность прочитать в терминале текущую позицию.
В данном случае это как раз актуально ибо заявка вешается в стакан и в общем толком не известно исполнилась заявка или нет.
Соответственно не ясно надо ли закрывать позицию.

В общем выглядеть будет примерно так.
Вообще мне не нравится код. Мне нравится когда робот работает через АА

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


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

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

Да. Честно говоря я код не проверял. Надергал из других наработок. Так, что внимательнее.

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



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

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

Олег, кроме твоего решения я вот подумал возможно есть следущее, попытаюсь объяснить идею:

Будем рассматривать простую схему: ЛОНГ(покупка) и СЕЛЛ(продажа).

Постоянно обрабатываются 2 блока кода (в моем случае функции OrderBuy и OrderSell). Задача - что бы после первой генерации ордера, его повторные - игнорировались)

Введем две переменные OB=0 и OS=0, первая относится к покупке и вторая к продаже. Изначльно они равны 0.

Включаем робота. Приходит сигнал на покупку...
Работает Блок (1):
if OB=1 then END function
Иначе: делаем покупку и делаем OB=1 и OS=0
END function

Дальше робот через несколько секунд опять идет на блок один что бы сгенерить второй сигнал..но OB=1 и он возвращается ни с чем и т.д.
пок ане придет сигнал на продажу
Работает Блок (2):
if OS=1 then END function
Иначе: продаем и делаем OB=0 и OS=1
END function


в общем такие у меня мысли не программераSmile Мне кажется может получиться..и даже если потом прикурутить short и cover
Посмотреть профиль Отправить личное сообщение
Orange2000



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

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

000 писал(а):
Каждый раз прогоняя код AFL видит сигнал и отправляет его в Алфу. Он не в курсе, чтоперед этим уже отправил эту заявку.
У Меха в роботе эта проблемка решена проверкой tri файла и поиском ID этой заявки. Если такая заявка уже была, то новая не отправляется.
В данном случае самое простое записывать в файл отправленные заявки и перед отправкой заявки читать его из робота и проверять не отправлялась ли уже эта заявка.

Дальше. Необходимо решить надо ли на одном баре допускать несколько одинаковых сделок. Например Buy
Если нет, то можно в некий файл при совершении покупки записывать 1 и при следующем прогоне кода если там уже 1 и сделка buy не отправлять заявку.
Можно записывать в файл сайз сделки и тогда при следующем прогоне робот будет знать в кауой позиции он сейчас находится.
Конечно самый идеальный случай был бы если есть возможность прочитать в терминале текущую позицию.
В данном случае это как раз актуально ибо заявка вешается в стакан и в общем толком не известно исполнилась заявка или нет.
Соответственно не ясно надо ли закрывать позицию.

В общем выглядеть будет примерно так.
Вообще мне не нравится код. Мне нравится когда робот работает через АА


проверять не получится, потому что по условию сделки проходят по рынку и еще дело в том что по Фьючу у меня три системы одновременно и однозначно будут ситуации когда одна будет в лонге и вторая захочет...в общем так.

Поглядел втой код, спасибо большое за старания, завтра проверю его в торгах)

Все, разобрался) завтра попробую) потом выложу результаты и отпишусь)
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

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

Orange2000 писал(а):
Олег, кроме твоего решения я вот подумал возможно есть следущее, попытаюсь объяснить идею:

Будем рассматривать простую схему: ЛОНГ(покупка) и СЕЛЛ(продажа).

Постоянно обрабатываются 2 блока кода (в моем случае функции OrderBuy и OrderSell). Задача - что бы после первой генерации ордера, его повторные - игнорировались)

Введем две переменные OB=0 и OS=0, первая относится к покупке и вторая к продаже. Изначльно они равны 0.

Включаем робота. Приходит сигнал на покупку...
Работает Блок (1):
if OB=1 then END function
Иначе: делаем покупку и делаем OB=1 и OS=0
END function


Ну в общем именно это и сделано. Только записано в файл. Потому, что AFL не знает что было при прошлом прогоне и какой это прогон по счету. Конечно можно запомнить OB в StaticVar, но выключил ты к примеру комп или перезагрузил Ами и все прошлые данные пропали...

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



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

СообщениеДобавлено: Пт Окт 16, 2009 11:15 am Ответить с цитатой Вернуться к началу

Олег, есть некторые трудности:

Первая, когда создается тот файл контрольный, то в него пишется не только "0" но и еще много чего, типа:
Цитата:
0И–Ђ?/  Jx @° ’  D i m @Х p  t,’И¶“ A D ’ {  ь? @.•  S e t @ ··¬ t·“ C r e a t e O b j e c t
’ @t*…Ђ Њ¶“ A D L i t e . A l f a D i r e c t D  Ц|дp 
’  f u n c t i o n
’ @,·ЬG8  Ё‡Ц ф№“ O r d e r B u y • @{Џ§ІР  X Џ ё“ v b p r i c e @дЫ?Ф (є“


При поступлении сигнала на покупку, прошла куча сделок и "1" он не смог написать, потому что указал, что в коде
Код:
fputs(NumToStr( q, 1.0, False ));
есть недостающий аргумент перед 1.0
Посмотреть профиль Отправить личное сообщение
Orange2000



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

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

вторую проблему разрешил сам: вот так надо было:

Цитата:
fputs(NumToStr( n, 1.0, False ),fh);


а с первой не получается. При создании файла пишет всякий бред дополнительно, я код создания файла передвинул в самый верх, теперь там другой набор символов после "0"

я вручную после создания файла стираю все и пишу 0 или 1 в зависимости какая поза в системе...и вроде потом 1 и 0 она меняет правильно и код РАБОТАЕТ.
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

СообщениеДобавлено: Пт Окт 16, 2009 12:35 pm Ответить с цитатой Вернуться к началу

Попробуй блок создания файла заменить на этот.
Код:
fh = fopen( Name() + ".alfa", "r");     
if( !fh ) {                         
  fh = fopen( Name() + ".alfa", "w");   
  fputs( "0", fh );
  pos = 0;
  fclose( fh );
}
else {
  pos = StrToNum(fgets( fH ));           
  fclose( fh );                           
}

К сожалению проверить сейчас не могу.

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



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

СообщениеДобавлено: Пт Окт 16, 2009 1:18 pm Ответить с цитатой Вернуться к началу

С этим кодом все равно создается файл где кроме 0 еще много всякого бреда. Но потом он переписывается на 1 при лонге. и дальше нет проблем. Не понимаю, что присходит при первом обращении. Он видит 0 или видит кучу знаков и распознает их за 0? Но первая сделка ЛОНг проходит нормально)


Я сейчас попробую без записи в файл сделать код, по моему методу) Отпишусь позже)

ну и потом докручу короткие позиции и еще нужно будет разобраться со стопами))

У меня маленький вопрос есть. в моей функйии orderbuy есть пременная про сколько заявка активна. у меня стоит "24.10.09 23:00". В принципе мне не важно это потому что сделки по рынку идут.
Подскажи что там можно указать, что бы никогда больше не трогать и не менять дату?
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

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

Попробовал этот код. Нормальный создается файл. (в нем один ноль и больше ничего нет) Что-то у тебя не так...
Цитата:

У меня маленький вопрос есть. в моей функйии orderbuy есть пременная про сколько заявка активна. у меня стоит "24.10.09 23:00". В принципе мне не важно это потому что сделки по рынку идут.
Подскажи что там можно указать, что бы никогда больше не трогать и не менять дату?

Посмотрю потом что там можно прикрутить.

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



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

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

Короткие позиции прикрутил, сделал что можно модифицировать имя файла на случай если на один график больше одного робота...

Теперь вопрос со стопами.
Олег я правильно понимаю что applystop для робота не виден, он видит только buy sell short cover?
И поэтому стоп нужно писать через Интерфейс АД. Я по эуспереминтирую сейчас.
А возможно лучшим решением описать стоп через афл код и он будет как дополнительное условие в cover sell?
Посмотреть профиль Отправить личное сообщение
Orange2000



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

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

Orange2000 писал(а):
Короткие позиции прикрутил, сделал что можно модифицировать имя файла на случай если на один график больше одного робота...

Теперь вопрос со стопами.
Олег я правильно понимаю что applystop для робота не виден, он видит только buy sell short cover?
И поэтому стоп нужно писать через Интерфейс АД. Я по эуспереминтирую сейчас.
А возможно лучшим решением описать стоп через афл код и он будет как дополнительное условие в cover sell?



Да, попробовал разные варианты. Убеждаюсь что нужно написать в условиях Sell и Cover дополнительный код для стоп лоса. Стоп у меня 0.5 процента.
Олег, как лучше это сделать? Нужно как-то цену покупки запонмить (вернее сколько была цена, когда пришел сигнал)
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

СообщениеДобавлено: Пт Окт 16, 2009 6:01 pm Ответить с цитатой Вернуться к началу

Если несколько систем в роботе, то лучше всего в цикле зафигачить.
Если система одна, то можно использовать ApplyStop() и Equity()

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



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

СообщениеДобавлено: Пт Окт 16, 2009 6:59 pm Ответить с цитатой Вернуться к началу

000 писал(а):
Если несколько систем в роботе, то лучше всего в цикле зафигачить.
Если система одна, то можно использовать ApplyStop() и Equity()

система одна на одном роботе.

ApplyStop( 0, 1, .5, 1 ); Система такая: 2 лота - лонг. 1 лот - шорт.

На графике рисуются значки выхода по стопу из лога, но сам робот не продает. И когда потом появляется сигнал, то он его исполняет в количестве как будто стоп отработан.

т.е. я был в лонге 2 лота. Получил стоплосс. На графике отобразился значок...Потом появился сигнал на продажу (шорт) и робот отсылает заявку на продажу 1 лота будто я в кэше...Но он не посылал заявку на закрытие по стопу лонга
Посмотреть профиль Отправить личное сообщение
Показать сообщения:      
Начать новую тему  Ответить на тему


 Перейти:   



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


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

File Attachment © by Meik Sievertsen