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



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

СообщениеДобавлено: Вт Июл 09, 2019 8:18 pm Ответить с цитатой Вернуться к началу

Здравствуйте!

Задача такая: после того, как получен сигнал, требуется поймать момент, когда цена пробивает некоторый уровень и войти после пробития этого уровня по ближайшей цене, которая выше этого уровня.

Это, как я понимаю, описывается в справке http://www.amibroker.com/guide/h_backtest.html в разделе "Controlling trade price":

Цитата:
Controlling trade price

AmiBroker now provides 4 new reserved variables for specifying the price at which buy, sell, short and cover orders are executed. These arrays have the following names: buyprice, sellprice, shortprice and coverprice.

The main application of these variables is controlling trade price:

Код:
    BuyPrice = IIF( dayofweek() == 1, HIGH, CLOSE );
    // on monday buy at high, otherwise buy on close


So you can write the following to simulate real stop-orders:

Код:
    BuyStop = ... the formula for buy stop level;
    SellStop = ... the formula for sell stop level;

    // if anytime during the day prices rise above buystop level (high>buystop)
    // the buy order takes place (at buystop or low whichever is higher)
    Buy = Cross( High, BuyStop );

    // if anytime during the day prices fall below sellprice level ( low < sellstop )
    // the sell order takes place (at sellstop or high whichever is lower)
    Sell = Cross( SellPrice, SellStop);

    BuyPrice = max( BuyStop, Low ); // make sure buy price not less than Low
    SellPrice = min( SellStop, High ); // make sure sell price not greater than High


Соответственно, вопрос в том, почему пишется
Код:
BuyPrice = max( BuyStop, Low )

Для примера, возьмем, что в результате вычислений имеем
Код:
BuyStop = 242.78;


Цена идёт, как приводится на графиках во вложении:
- Ticks.png (на тиках показано, как идёт цена и уровень, где надо открыться).
- 1MinBars.png (показано, как идёт цена на одно минутных барах).

Таким образом, уровень 242.78 пересекается, но после того, как срабатывает пересечение
Код:
Buy = Cross( High, 242.78)
, то цена становится в последствии ВСЕГДА больше, чем 242.78 (цена даже становится больше уровня 242.79).
То есть, сначала цена была 242,77, а сразу после стала 242,79. Ну и до конца дня цена не опускалась до уровня 242,79.
Соответственно, в кода
Код:
BuyPrice = max( BuyStop, Low )

получаем:
- BuyStop = 242.78
- Low = 242.74
- BuyPrice = 242.78 = max( 242.78, 242.74)

И вот вопрос: каким образом может быть открыта сделка, если у нас в коде AFL указывается цена открытия ниже, чем цена на рынке?

Заранее спасибо за ответ(ы).
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

СообщениеДобавлено: Вт Июл 09, 2019 11:00 pm Ответить с цитатой Вернуться к началу

Имеется в виду следующее.
Произошел пробой ценой уровня BuyStop вверх
Buy = Cross( High, BuyStop );
Это могла произойти с гэпом. Т.е. цена резко проскочила уровень BuyStop. Поэтому сделка по цене BuyStop призойти не могла. Она могла пройти по цене выше. По идее надо бы написать
BuyPrice = max( BuyStop, Open );
Но Томаш почему то написал Low...

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



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

СообщениеДобавлено: Ср Июл 10, 2019 7:44 am Ответить с цитатой Вернуться к началу

000 писал(а):
Имеется в виду следующее.
Произошел пробой ценой уровня BuyStop вверх
Buy = Cross( High, BuyStop );
Это могла произойти с гэпом. Т.е. цена резко проскочила уровень BuyStop.

С этим согласен.

000 писал(а):
Поэтому сделка по цене BuyStop призойти не могла. Она могла пройти по цене выше. По идее надо бы написать
BuyPrice = max( BuyStop, Open );
Но Томаш почему то написал Low...


Вот с ценой Open - непонятно.
Предположим, торговля идет не тиками, а на каком-нибудь диапазоне.
Тогда Open - цена зафиксированная на момент начала этого диапазона. И она не меняется, правильно? Текущую цену отражает цена Close, так?
Во вложении рис. Ticks33min.png - где тиками показано движение цены. Изучаемая ситуация - это 33 минута.
Соответственно, для этого минутного диапазона Open = 242,80
Потом цена падает вниз до Low = 242,74 и начинает расти вверх.


И на мой взгляд правильнее было бы написать
Код:
BuyPrice = max( BuyStop, Close);

Но с этим Close мне не понятно вот что.

Предположим, написан такой код:
Код:
BuyStop = 242.78;
Buy = Cross( High, BuyStop );
BuyPrice = max( BuyStop, Close);


Соответственно, в какой момент сработает покупка, с использованием написанного кода и применительно к ситуации, указанной на рис. Ticks33min.png?

Правильно ли я понимаю, что когда цена была 242,77 и затем прыгнула на 242,79, то в этот момент Cross( High, BuyStop ) выдаст TRUE, после чего будет выполнен оператор BuyPrice = max( BuyStop, Close) и произойдет покупка по цене 242,79.
При дальнейшем движении цены Cross( High, BuyStop ) будет принимать значение FALSE и несмотря на то, что оператор BuyPrice = max( BuyStop, Close); будет принимать новое значение с каждым изменением Close, то покупка производиться не будет?
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

СообщениеДобавлено: Ср Июл 10, 2019 10:09 pm Ответить с цитатой Вернуться к началу

Пока будешь думать тиками не поймешь.
Свеча это это область в которой была цена от открытия до закрытия. При этом мы не знаем когда и где. Это известно только для двух моментов. Открытие (знаем цену и время) и закрытие (аналогично)
Вот смотри. Предыдущая свечка была вся ниже уровня BuyStop ( из условия Buy = Cross( High, BuyStop ) )
Следующая свеча вылезла выше уровня BuyStop. Либо она открылась ниже и в процессе роста перелезла через этот уровень (тогда BuyPrice = BuyStop), либо он с гэпом перемахнула через этот уровень. Тогда открытие > BuyStop и сделка должна пройти в момент открытия по цене открытия.

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



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

СообщениеДобавлено: Чт Июл 11, 2019 6:51 am Ответить с цитатой Вернуться к началу

Погоди, у меня задача, как мне видится, немного другая.

Мне не надо дожидаться, пока закончится свеча, а надо открыться сразу как цена пересекает снизу вверх некоторый уровень.
То есть - цена была выше или ниже уровня - сидим, ждем. Как только цена упала ниже уровня (если до этого была выше уровня) и когда цена поднялась, пересекая уровень, сразу же после этого открываемся по рыночной цене, не зависимо от того, закончилась свеча или открытие происходит внутри свечного диапазона.
Это планируется для автоматизированной торговли - определяется точка входа.

Это некоторый аналог того, что в квике называется "условная заявка": ...поручение, исполняемое в зависимости от достижения рыночной ценой инструмента определенного уровня... В такой заявке указывается два значения цены:
— стоп-цена – условие вида «цена последней сделки не более (не менее) заданной величины». При наступлении условия заявка активируется, т.е. отправляется на биржу в виде обычной лимитированной заявки,
— цена, указываемая в заявке при отправке на биржу.

Только у меня дополнительным критерием является ещё и пересечение цены снизу вверх уровня, а не только условие "стоп-цена – условие вида «цена последней сделки не более (не менее) заданной величины»".


Последний раз редактировалось: il-ir (Чт Июл 11, 2019 8:37 am), всего редактировалось 1 раз
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

СообщениеДобавлено: Чт Июл 11, 2019 7:17 am Ответить с цитатой Вернуться к началу

Блин. Изначально вопрос звучал несколько подругому.
В любом случае речь о тестировании. и цену сделки мы назначаем BuyStop всегда, кроме случая гэпа.
Если предыдущая свеча ВСЯ ниже BuyStop, а следующая открылась выше уровня BuyStop, то цена сделки будет Open.

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



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

СообщениеДобавлено: Чт Июл 11, 2019 9:29 am Ответить с цитатой Вернуться к началу

000 писал(а):
Блин. Изначально вопрос звучал несколько подругому.

Извини, что в первоначальной задаче криво сформулировал. Старался, как мог - даже картинки приложил Embarassed

000 писал(а):
В любом случае речь о тестировании.

А почему о тестировании говорим, но не о торговле?

Мне это надо для торговли роботом - или для неё нельзя так сделать?

000 писал(а):
и цену сделки мы назначаем BuyStop всегда, кроме случая гэпа.
Если предыдущая свеча ВСЯ ниже BuyStop, а следующая открылась выше уровня BuyStop, то цена сделки будет Open.

У меня специфика в том, что рабочие свечи - часовки. Но входить в сделку надо не по Open свечи, а внутри свечи при пересечении определённого уровня. Поэтому я и заглядываю в тиковый график Embarassed

000 писал(а):
Если предыдущая свеча ВСЯ ниже BuyStop, а следующая открылась выше уровня BuyStop, то цена сделки будет Open.

Для тестирования - скорее всего пойдёт.
Но вот для торговли у меня вопрос про "цена сделки будет Open".

Рассмотрим такой пример.
Первая свеча - ниже уровня. Вторая открылась гэпом, перепрыгнув уровень BuyStop.
Первый пакет сделок (Open свечи) прошел - на котором сработало условие
Код:
Buy = Cross( High, BuyStop );

Под пакетом я имею в виду те сделки, что имеют один временной маркер, например, 09.07.19 18:33:02.362 открытие свечи, в этот момент сработало условие; следующие сделки совершены:
- 09.07.19 18:33:04.070,
- 09.07.19 18:33:04.072,
- 09.07.19 18:33:04.074,
- 09.07.19 18:33:04.075,
- 09.07.19 18:33:04.878,
...
по цене ниже Open.

И дальше цена стала идти вниз, то есть, рыночная цена становится ниже Open. И ходит в этой свече цена ниже Open, но выше уровня BuyStop.
Получается, что в этой свече фактически, по Open открыться в реальном рынке не можем.

А на следующей свече, когда цена пошла вверх, условие
Код:
Buy = Cross( High, BuyStop );

не сработает, так как цена уже находится выше уровня BuyStop.

Иными словами, в момент времени 09.07.19 18:33:02.362 получили информацию о пересечении уровня и среагировать мы можем в следующую микросекунду, то есть в момент времени 09.07.19 18:33:02.363.
А тут цена уже никак не Open, а какая-то другая - может и совпасть с Open, но может быть как больше, так и меньше.

Поэтому я и заморачиваюсь с ценой Close Embarassed
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

СообщениеДобавлено: Чт Июл 11, 2019 7:12 pm Ответить с цитатой Вернуться к началу

Стоп. Если речь о роботе, то что мы тогда обсуждаем?
Там BuyPrice нет вообще. Сложились условия для сделки - вперед по текущей цене.

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



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

СообщениеДобавлено: Пт Июл 12, 2019 10:04 am Ответить с цитатой Вернуться к началу

Постараюсь по новой сформулировать задачу.

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

НУ, то есть, из квика получаю данные и как только цена пробьёт снизу вверх заданный уровень, то надо открыть позицию.

Перепрыгнет уровень, это такой код:
Код:
BuyStop = 242.78;  //Предположим, что в результате вычислений уровня получили 242.78.
Buy = Cross( High, BuyStop );


И получается, что мне не надо никаких действий делать с BuyPrice, так?

Но в этом случае, Cross( High, BuyStop ) после срабатывания, то есть, когда High пересечёт уровень BuyStop, будет принимать значение TRUE на всем остатке свечи.
И как отфильтровать только первый сигнал в пределах конкретной свечи?

Вот в ранее рассмотренном примере с гэпом, когда одна свеча была ниже уровня, а текущая свеча открывается над уровнем, например, 09.07.19 18:33:02.362 открытие свечи, в этот момент сработало условие Cross( High, BuyStop ); следующие сделки совершены:
- 09.07.19 18:33:04.070,
- 09.07.19 18:33:04.072,
- 09.07.19 18:33:04.074,
- 09.07.19 18:33:04.075,
- 09.07.19 18:33:04.878,
...
по цене ниже Open.
Но условие Cross( High, BuyStop ) всё равно срабатывает для каждой сделки из списка, правильно я понимаю?


А мне надо, чтоб было так:
- 09.07.19 18:33:02.362 открытие свечи, в этот момент сработало условие Cross( High, BuyStop ),
- 09.07.19 18:33:04.070 подана заявка на открытие сделки и блокируем последующую реакцию на сработавшее условие Cross( High, BuyStop ),
- 09.07.19 18:33:04.072 тут и далее ничего не делаем, то есть, игнорируем сработавшее условие Cross( High, BuyStop ), при условии, что сделка совершена,
- 09.07.19 18:33:04.074,
- 09.07.19 18:33:04.075,
- 09.07.19 18:33:04.878,
...
Соответственно, не понимаю, как реализовать именно такой механизм.


Что-то я маленько запутался с применением BuyPrice.
И интересно, если можно коротко, в пару слов, поясни, зачем используется BuyPrice - только для тестов?


Олег, уж извини за такие, наверное, дилетантские вопросы Embarassed
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

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

Цитата:
И получается, что мне не надо никаких действий делать с BuyPrice, так?

ДА!
Цитата:
И как отфильтровать только первый сигнал в пределах конкретной свечи?

http://www.amisite.ru/afl/exp/0004.php
Код:

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

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



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

СообщениеДобавлено: Вт Июл 16, 2019 8:16 am Ответить с цитатой Вернуться к началу

Олег, спасибо за ответы!
Посмотреть профиль Отправить личное сообщение
Показать сообщения:      
Начать новую тему  Ответить на тему


 Перейти:   



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


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

File Attachment © by Meik Sievertsen