Автор |
Сообщение |
Orange2000
Зарегистрирован: 15.10.2009
Сообщения: 185
|
Добрый день всем!
Решил попробовать сделать робота для данной схемы. Сам не крутой программер, поэтому я воспользовался Роботом Меха
Вот готовый код, рабочий. С пояснениями. Помимо стоп-лосса должны работать и другие разновидности ApplyStop.
В правилах системы указана тестовая система, которая убыточная.
За создание данного робота особые благодарности Олегу (000) - за помощь и консультации и Механизатору - за идею и начальный код.
Возможно, код далек от совершенства, но он рабочий и возможные улучшения и дополнения только привествуются! |
Последний раз редактировалось: Orange2000 (Пн Окт 19, 2009 2:10 pm), всего редактировалось 2 раз(а) |
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Каждый раз прогоняя код AFL видит сигнал и отправляет его в Алфу. Он не в курсе, чтоперед этим уже отправил эту заявку.
У Меха в роботе эта проблемка решена проверкой tri файла и поиском ID этой заявки. Если такая заявка уже была, то новая не отправляется.
В данном случае самое простое записывать в файл отправленные заявки и перед отправкой заявки читать его из робота и проверять не отправлялась ли уже эта заявка.
Дальше. Необходимо решить надо ли на одном баре допускать несколько одинаковых сделок. Например Buy
Если нет, то можно в некий файл при совершении покупки записывать 1 и при следующем прогоне кода если там уже 1 и сделка buy не отправлять заявку.
Можно записывать в файл сайз сделки и тогда при следующем прогоне робот будет знать в кауой позиции он сейчас находится.
Конечно самый идеальный случай был бы если есть возможность прочитать в терминале текущую позицию.
В данном случае это как раз актуально ибо заявка вешается в стакан и в общем толком не известно исполнилась заявка или нет.
Соответственно не ясно надо ли закрывать позицию.
В общем выглядеть будет примерно так.
Вообще мне не нравится код. Мне нравится когда робот работает через АА |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Да. Честно говоря я код не проверял. Надергал из других наработок. Так, что внимательнее. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
Orange2000
Зарегистрирован: 15.10.2009
Сообщения: 185
|
Олег, кроме твоего решения я вот подумал возможно есть следущее, попытаюсь объяснить идею:
Будем рассматривать простую схему: ЛОНГ(покупка) и СЕЛЛ(продажа).
Постоянно обрабатываются 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
в общем такие у меня мысли не программера Мне кажется может получиться..и даже если потом прикурутить short и cover |
|
|
Посмотреть профиль Отправить личное сообщение |
|
Orange2000
Зарегистрирован: 15.10.2009
Сообщения: 185
|
000 писал(а): |
Каждый раз прогоняя код AFL видит сигнал и отправляет его в Алфу. Он не в курсе, чтоперед этим уже отправил эту заявку.
У Меха в роботе эта проблемка решена проверкой tri файла и поиском ID этой заявки. Если такая заявка уже была, то новая не отправляется.
В данном случае самое простое записывать в файл отправленные заявки и перед отправкой заявки читать его из робота и проверять не отправлялась ли уже эта заявка.
Дальше. Необходимо решить надо ли на одном баре допускать несколько одинаковых сделок. Например Buy
Если нет, то можно в некий файл при совершении покупки записывать 1 и при следующем прогоне кода если там уже 1 и сделка buy не отправлять заявку.
Можно записывать в файл сайз сделки и тогда при следующем прогоне робот будет знать в кауой позиции он сейчас находится.
Конечно самый идеальный случай был бы если есть возможность прочитать в терминале текущую позицию.
В данном случае это как раз актуально ибо заявка вешается в стакан и в общем толком не известно исполнилась заявка или нет.
Соответственно не ясно надо ли закрывать позицию.
В общем выглядеть будет примерно так.
Вообще мне не нравится код. Мне нравится когда робот работает через АА |
проверять не получится, потому что по условию сделки проходят по рынку и еще дело в том что по Фьючу у меня три системы одновременно и однозначно будут ситуации когда одна будет в лонге и вторая захочет...в общем так.
Поглядел втой код, спасибо большое за старания, завтра проверю его в торгах)
Все, разобрался) завтра попробую) потом выложу результаты и отпишусь) |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
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
|
Олег, есть некторые трудности:
Первая, когда создается тот файл контрольный, то в него пишется не только "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
|
вторую проблему разрешил сам: вот так надо было:
Цитата: |
fputs(NumToStr( n, 1.0, False ),fh); |
а с первой не получается. При создании файла пишет всякий бред дополнительно, я код создания файла передвинул в самый верх, теперь там другой набор символов после "0"
я вручную после создания файла стираю все и пишу 0 или 1 в зависимости какая поза в системе...и вроде потом 1 и 0 она меняет правильно и код РАБОТАЕТ. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Попробуй блок создания файла заменить на этот.
Код: |
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
|
С этим кодом все равно создается файл где кроме 0 еще много всякого бреда. Но потом он переписывается на 1 при лонге. и дальше нет проблем. Не понимаю, что присходит при первом обращении. Он видит 0 или видит кучу знаков и распознает их за 0? Но первая сделка ЛОНг проходит нормально)
Я сейчас попробую без записи в файл сделать код, по моему методу) Отпишусь позже)
ну и потом докручу короткие позиции и еще нужно будет разобраться со стопами))
У меня маленький вопрос есть. в моей функйии orderbuy есть пременная про сколько заявка активна. у меня стоит "24.10.09 23:00". В принципе мне не важно это потому что сделки по рынку идут.
Подскажи что там можно указать, что бы никогда больше не трогать и не менять дату? |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Попробовал этот код. Нормальный создается файл. (в нем один ноль и больше ничего нет) Что-то у тебя не так...
Цитата: |
У меня маленький вопрос есть. в моей функйии orderbuy есть пременная про сколько заявка активна. у меня стоит "24.10.09 23:00". В принципе мне не важно это потому что сделки по рынку идут.
Подскажи что там можно указать, что бы никогда больше не трогать и не менять дату?
|
Посмотрю потом что там можно прикрутить. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
Orange2000
Зарегистрирован: 15.10.2009
Сообщения: 185
|
Короткие позиции прикрутил, сделал что можно модифицировать имя файла на случай если на один график больше одного робота...
Теперь вопрос со стопами.
Олег я правильно понимаю что applystop для робота не виден, он видит только buy sell short cover?
И поэтому стоп нужно писать через Интерфейс АД. Я по эуспереминтирую сейчас.
А возможно лучшим решением описать стоп через афл код и он будет как дополнительное условие в cover sell? |
|
|
Посмотреть профиль Отправить личное сообщение |
|
Orange2000
Зарегистрирован: 15.10.2009
Сообщения: 185
|
Orange2000 писал(а): |
Короткие позиции прикрутил, сделал что можно модифицировать имя файла на случай если на один график больше одного робота...
Теперь вопрос со стопами.
Олег я правильно понимаю что applystop для робота не виден, он видит только buy sell short cover?
И поэтому стоп нужно писать через Интерфейс АД. Я по эуспереминтирую сейчас.
А возможно лучшим решением описать стоп через афл код и он будет как дополнительное условие в cover sell? |
Да, попробовал разные варианты. Убеждаюсь что нужно написать в условиях Sell и Cover дополнительный код для стоп лоса. Стоп у меня 0.5 процента.
Олег, как лучше это сделать? Нужно как-то цену покупки запонмить (вернее сколько была цена, когда пришел сигнал) |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Если несколько систем в роботе, то лучше всего в цикле зафигачить.
Если система одна, то можно использовать ApplyStop() и Equity() |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
Orange2000
Зарегистрирован: 15.10.2009
Сообщения: 185
|
000 писал(а): |
Если несколько систем в роботе, то лучше всего в цикле зафигачить.
Если система одна, то можно использовать ApplyStop() и Equity() |
система одна на одном роботе.
ApplyStop( 0, 1, .5, 1 ); Система такая: 2 лота - лонг. 1 лот - шорт.
На графике рисуются значки выхода по стопу из лога, но сам робот не продает. И когда потом появляется сигнал, то он его исполняет в количестве как будто стоп отработан.
т.е. я был в лонге 2 лота. Получил стоплосс. На графике отобразился значок...Потом появился сигнал на продажу (шорт) и робот отсылает заявку на продажу 1 лота будто я в кэше...Но он не посылал заявку на закрытие по стопу лонга |
|
|
Посмотреть профиль Отправить личное сообщение |
|
|