Позиция реальная и виртуальная

Подробнее
13 года 1 мес. назад #360 от RomaNick
Спасибо за ответы, по ссылке ALexLan читал. Использовать buyprice/sellprice/ пока не умею, буду разбираться

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

Подробнее
13 года 1 мес. назад - 13 года 1 мес. назад #382 от m1911

admin пишет: Александр, здесь возможны 2 пути.

Очевидный. Входить в сделки по факту закрытия свечи на начале следующей. Не всегда это возможно

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

Например такая последовательность:
1 минута - сигнал лонг - робот купил
2 минута - сигнал лонг пропал - робот в позиции лонг по прежнему
3 минута - появился снова расчетный сигнал лонг. Робот ничего не делает, зная свою реальную позицию
далее может происходить все что угодно - робот будет все расчетные сигналы игнорировать до появления сигнала sell

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


Реанимирую тему. :)

Изначально я пошел по второму пути - отрабатываю сигнал на открытии следующей свечи, т.е. с применением Buy = Ref(Buy,-1);
Все четко, никаких метаний, полное совпадение с историей, но есть большое "но" - стратегия резко теряет в эффективности. Резко - это до полной невозможности ее использовать, поскольку результаты непредсказуемые и часто убыточные. Причем, запаздывание сигнала на одну свечу - это еще не самое плохое. Хуже другое - в следующей свече уже может генерироваться встречный сигнал, а мы только-только отрабатываем предыдущий. Как результат - множественные открытия позиций "против шерсти", стопы, убытки.

В то же время, сигнал в несформированной свече иногда может исчезнуть. В этом случае возможны два варианта:
1. Сигнал оказался истинным, цена пошла в направлении сигнала, все в порядке.
2. Сигнал оказался ложным и исчез чуть позже.

С первым вариантом вопросов нет, все понятно - "перевернулись" и поехали дальше. Поскольку я работаю на минутках, то и второй вариант меня не сильно расстраивает - если по встречному сигналу (который потом исчез) мы "перевернулись" и открылись против шерсти, то это продлится либо до стопа, либо до конца свечи, т.е. не больше минуты. В большинстве случаев цена за это время не успеет далеко убежать, а на начале следующей свечи будет опять сгенерирован правильный сигнал (который был изначально) посредством Buy = flip(Buy,Sell);

Но и тут есть "но" - сигнал может исчезать и снова появляться большое кол-во раз, десятки раз за минуту. "Дребезг контактов". :) Соответственно, комиссионные улетают со свистом, да и микроубытки, связанные с ценой, тоже суммируются.

Поскольку с этим сделать ничего нельзя, появилась мысль - можно ли отработать сигнал только один раз? Т.е. если сигнал исчез и появился повторно (а также в третий-пятый-сотый разы) - игнорировать его?

Из-за flip() у нас на открытии каждой свечи присутствует сигнал, плюс еще может появиться сигнал внутри свечи - итого два сигнала. Как бы ими и ограничиться, а третий и последующие - игнорировать? Возможно такое в принципе?

UPDATE. Сделал вот так. Работает. Но не всегда так, как задумывалось. :) Но, в принципе, цель достигнута.
CurrentTP = Nz(StaticVarGet("POSITION"));
PrevMinute = Nz(StaticVarGet("CURRMINUTE"));
CurrMinute = Hour()*10000 + Minute()*100;

if (CurrentTP == 0)
{
	if (LastValue(Buy))
	{
		Make_Order("B");
		StaticVarSet("POSITION",1);
		StaticVarSet("CURRMINUTE",LastValue(CurrMinute));
	}
	if (LastValue(Sell))
	{
		Make_Order("S");
		StaticVarSet("POSITION",-1);
		StaticVarSet("CURRMINUTE",LastValue(CurrMinute));
	}
}
if (CurrentTP > 0)
{
	if (LastValue(Sell) AND LastValue(PrevMinute) != LastValue(CurrMinute))
	{
		Make_Order("S");
		StaticVarSet("POSITION",-1);
		StaticVarSet("CURRMINUTE",LastValue(CurrMinute));
	}
}
if (CurrentTP < 0)
{
	if (LastValue(Buy) AND LastValue(PrevMinute) != LastValue(CurrMinute))
	{
		Make_Order("B");
		StaticVarSet("POSITION",1);
		StaticVarSet("CURRMINUTE",LastValue(CurrMinute));
	}
}

_SECTION_END();
Последнее редактирование: 13 года 1 мес. назад пользователем m1911.

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

Подробнее
13 года 1 мес. назад - 13 года 1 мес. назад #383 от admin
m1911,

все это здорово за одним исключением. Бестектер и оптимизатор в подавляющем числе случаев будут давать совершенно иные результаты, чем реальная торговля при тех же самых настройках.

Строго говоря, можно написать расчет сигналов таким образом, чтобы результаты бектеста отличались незначительно от реальных торгов с использованием вашего принципа. Но алгоритм генерации сигналов будет намного сложнее И ВСЕ РАВНО 100%ного соответствия добиться невозможно В ПРИНЦИПЕ.
Последнее редактирование: 13 года 1 мес. назад пользователем admin.

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

Подробнее
13 года 1 мес. назад #384 от m1911

admin пишет: все это здорово за одним исключением. Бестектер и оптимизатор в подавляющем числе случаев будут совершенно давать иные результаты, чем реальная торговля при тех же самых настройках.

Строго говоря, можно написать расчет сигналов таким образом, чтобы результаты бектеста отличались незначительно от реальных торгов с использованием вашего принципа. Но алгоритм генерации сигналов будет намного сложнее И ВСЕ РАВНО 100%ного соответствия добиться невозможно В ПРИНЦИПЕ.


Уже убедился. :)

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

Подробнее
12 года 5 мес. назад - 12 года 5 мес. назад #554 от RomaNick

admin пишет: m1911,

все это здорово за одним исключением. Бестектер и оптимизатор в подавляющем числе случаев будут давать совершенно иные результаты, чем реальная торговля при тех же самых настройках.

Строго говоря, можно написать расчет сигналов таким образом, чтобы результаты бектеста отличались незначительно от реальных торгов с использованием вашего принципа. Но алгоритм генерации сигналов будет намного сложнее И ВСЕ РАВНО 100%ного соответствия добиться невозможно В ПРИНЦИПЕ.


Всё так. НО хотя бы сделки должны открываться в бэктестере и в торговле в одно время! А не со сдигом в один бар, на бэктестере, вперёд от реала!!!

Например, алгоритм на 5-ти минутках.
Buy=Ref(Open,-1)>Ref(Close,-1) AND Ref(Open,-2)<Ref(Close,-1);
BuyPrice = ShortPrice = Open;

Так вот вход в Лонг в бектестере происходит в 11:54:59, в реальной торговле 11:50:02.

С этим можно что нибудь сделать? Про цену открытия вообще молчу :(
Amibroker сам по себе "такой"? Очень интересует этот вопрос!! Потому что все тесты на истории можно выкинуть и тогда смысл бэктеста вообще теряется!

Это можно как-нибудь побороть? Хотя бы время открытия(закрытия)!
Я в отчаиньи, начинаю уже смотреть в сторону др. прог для бэктестинга!
Последнее редактирование: 12 года 5 мес. назад пользователем RomaNick.

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

Подробнее
12 года 5 мес. назад - 12 года 5 мес. назад #555 от m1911

RomaNick пишет:

Buy=Ref(Open,-1)>Ref(Close,-1) AND Ref(Open,-2)<Ref(Close,-1);
BuyPrice = ShortPrice = Open;

Так вот вход в Лонг в бектестере происходит в 11:54:59, в реальной торговле 11:50:02.


А что такое Ref(Open,-2) ? Заглядываете в будущее?


RomaNick пишет: С этим можно что нибудь сделать? Про цену открытия вообще молчу :(
Amibroker сам по себе "такой"? Очень интересует этот вопрос!! Потому что все тесты на истории можно выкинуть и тогда смысл бэктеста вообще теряется!


Подождите. Если вы исполняете сигнал не сразу, а после закрытия свечи, в которой этот сигнал сформировался, т.е. на открытии следующей свечи, то никаких отличий от бэктеста в реале быть не должно. Ну разве что проскальзывание.


RomaNick пишет: Это можно как-нибудь побороть? Хотя бы время открытия(закрытия)!
Я в отчаиньи, начинаю уже смотреть в сторону др. прог для бэктестинга!


А если вы исполняете сигнал сразу по его формированию, то вам никакие другие проги для бэктестинга не помогут, потому что тут дело не в проге, а принципе. Бэктест имеет дело с уже сформированными свечками, он ничего не знает и не может знать про то, что было внутри свечи.
Последнее редактирование: 12 года 5 мес. назад пользователем m1911.

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

Подробнее
12 года 5 мес. назад - 12 года 5 мес. назад #556 от RomaNick

А что такое Ref(Open,-2) ? Заглядываете в будущее?


Нет, Открытие 2-е свечи назад

Из документации:

REF
- ссылка на прошлые/будущие значения массива
ПРИМЕР Формула "ref( CLOSE, -14 )" возвратит цену закрытия 14 периодов назад. Таким образом написать 14-дневный показатель изменения цены (ROC) (выраженный в пунктах) можно как "C - ref( C, -14 )". Формула "ref( C, 12 )" возвратит цену закрытия 12 периодов вперед (это дает возможность заглядывания в будущее)


Так что всё нормально по логике должно быть.

Подождите. Если вы исполняете сигнал не сразу, а после закрытия свечи, в которой этот сигнал сформировался, т.е. на открытии следующей свечи, то никаких отличий от бэктеста в реале быть не должно. Ну разве что проскальзывание.


Исполняю сигнал, как в формуле. если пред свечи свормировали структуру, то открываюсь на "Open" след. свечи!
Поэтому и интересуюсь, как так может быть?
Должно всё совпадать, а НЕ совпадает!
Последнее редактирование: 12 года 5 мес. назад пользователем RomaNick.

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

Подробнее
12 года 5 мес. назад #557 от m1911
Хм, тогда странно.

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

Подробнее
12 года 5 мес. назад - 12 года 5 мес. назад #559 от admin

RomaNick пишет: Например, алгоритм на 5-ти минутках.

Так вот вход в Лонг в бектестере происходит в 11:54:59, в реальной торговле 11:50:02


Не находите странным, что свеча на пятиминутках в амиброкере начинается в 11:54:59?

Похоже, вы эспортируете из квика в амиброкер тики, которые потом амиброкер преобразует в 5-минутки. При таких преобразованиях амиброкер не выравнивает время начала свечей к привычным границам таймфрейма.

То есть, если первый тик в базе был на 59 секунде, то теперь все регулярные таймфреймы, полученные из этих тиков, будут начинаться с 59 секунды.

Результат - несовпадение свечей в квике и амиброкере и, соответственно, разное время срабатывания.

Если нужно точное совпадение, экспортируйте в базу амиброкера пятиминутки - все будет совпадать
Последнее редактирование: 12 года 5 мес. назад пользователем admin.

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

Подробнее
12 года 5 мес. назад - 12 года 5 мес. назад #560 от RomaNick

Если нужно точное совпадение, экспортируйте в базу амиброкера пятиминутки - все будет совпадать


Спасибо за ответ. Попробую. Действительно будет совпадать? Ведь разница в бэктестере и торговле не пара секунд а 5 минут!

В бэктестере, фактически открытие в 11:55 , а в торговле 11:50

Экспортирую я минутки в виде тиков. Как правильней? Минутки и интервал поставить - минутный? Или Пятиминутки и интервал пятиминутный или можно оставить тиковый?
Последнее редактирование: 12 года 5 мес. назад пользователем RomaNick.

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

Подробнее
12 года 5 мес. назад - 12 года 5 мес. назад #561 от admin
Ну вот смотрите, RomaNik


Первый тик, лежащий у вас в базе, имеет время (допустим) 00:00:59

Когда амиброкер пересчитывает тиковую базу в 5-минутки, он берет время первого тика в базе и считает его началом отсчета. Прибавляет 5 минут и получает 00:05:59. Все тики, которые есть в этом промежутке, входят в первую пятиминутную свечу. Далее процесс повторяется.

Вот и получается, что все свечи у вас начинаются с 59 секунды. После чего происходит срабатывание сигнала по open, как Вы и хотели, но не на границе 5 минут (11:50:00), как Вам ожидается, а на границе рассчитанной свечи (11:54:59)
Последнее редактирование: 12 года 5 мес. назад пользователем admin.
Спасибо сказали: RomaNick

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

Подробнее
12 года 5 мес. назад - 12 года 5 мес. назад #562 от RomaNick
Спасибо, стало приблизительно понятно как Amirker работает. В связи с этм осталось 2-а вопроса.

1. Лучше экспортировать в базу "Ами" 5-ти минутки с каким "Интервалом" (в настройке Quik, "Экспорт данных"- "Данные для тех.анализа"-"Общие настройки")?
Тиковый или сразу 5-ти минутный?
2. Для бэктестера значение High соответствует в торговле Ref(High,-1)?
Т.е. если я в коде укажу
High > Ref(Close,-1)
То для бэктестера он вычислит High текущей уже сформированной свечи и Close пред. свечи и зайдёт по Open следующей свечи.
В реальной торговле, для такого поведения лучше описать так???
Ref(High,-1) > Ref(Close,-2)

И тогда и в бэктестер и в торговле будет одинаково работать? Я правильно понимаю?
Последнее редактирование: 12 года 5 мес. назад пользователем RomaNick.

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

Подробнее
12 года 5 мес. назад #563 от admin
  1. Экспортируйте 5-минутки
  2. High в амиброкере - это массив максимальных значений всех свечей. Ref(High,-1) - это тот же самый массив, сдвинутый вправо на 1 свечу. Чтобы получить последнее значение массива high исполняйте Lastvalue(High).
  3. Тут есть одна тонкость. В некоторых случаях, когда амиброкеру очевидно, что вам требуется именно последнее значение, а вы ему подсовываете массив, он сам берет это последнее значение из массива. Совет: всегда пишите получение значения из массива явным образом.
  4. High > Ref(Close,-1) сравнит массивы high и сдвинутый вправо close. Сравнение массивов идет по каждой свече. в результате вы получите массив, где для каждой свечи будет 0 или один взависимости от результата сравнения

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

Подробнее
12 года 5 мес. назад - 12 года 5 мес. назад #566 от RomaNick
Продолжение истории.
Поставил на др. компьютере с нуля AmiBroker. Создал минутную базу. Скачал минутки с Финама и загрузил в базу. Запускаю бэктест. Открытие позиций... в 11:52:59 !!!

Опять минута начинается с 59 секунды! В данных котировках и базе нет и тиков!
Что я делаю не так? В чём может быть дело?

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

Вообщем, ни чего не понимаю! Как правильно отдавать данные и настроить Ами, что бы хотя бы время открытия сделок совпадало в реале и в бэктестере?
Последнее редактирование: 12 года 5 мес. назад пользователем RomaNick.

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

Подробнее
12 года 5 мес. назад - 12 года 5 мес. назад #567 от AlexLan
Добрый день.
RomaNick вы пишете
" В бэктестере, фактически открытие в 11:55 , а в торговле 11:50 "

Может у Вам стоит режим отображении базы (расчет ...) по завершению свечки.
"END time of interval" переставте на "Start time of interva"
и у Вас свечки будет отражаться без 59 сек. :)
По пробуйте может поможет.
Последнее редактирование: 12 года 5 мес. назад пользователем AlexLan.
Спасибо сказали: RomaNick

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

Подробнее
12 года 5 мес. назад #568 от RomaNick

AlexLan пишет: Может у Вам стоит режим отображении базы (расчет ...) по завершению свечки.
"END time of interval" переставте на "Start time of interva"
и у Вас свечки будет отражаться без 59 сек. :)
По пробуйте может поможет.

Помогло! Спасибо, теперь время открытия совпадает! :)

Остался один вопросик по бектестеру и времени.
Каким образом можно в бектестре сэмулировать время работы робота?
Например, чтоб робот работал с 12:00 до 18:00
Функции Now(), TimeNum()и т.д. работают только в реальной торговле. На бэктестре они НЕ функционируют.
Каким образом можно решить эту проблему? И решаема ли она, в принципе в AmiBroker'e ?

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

Подробнее
12 года 5 мес. назад - 12 года 5 мес. назад #569 от AlexLan
У меня реально работает и тестируется )))
tnewDay12=TimeNum()>=120000 AND TimeNum()<180000;
Формирует импульс с 12 до 18:00
В рамках этого импульса разрешить сделки. в другое время запрет.

Buy =Buy and tnewDay12; - по аналогии другие сигналы.
Последнее редактирование: 12 года 5 мес. назад пользователем AlexLan.
Спасибо сказали: RomaNick

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

Подробнее
12 года 5 мес. назад #570 от admin
AlexLan, надо только добавить, что таймфрейм должен быть при этом маленький

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

Подробнее
12 года 5 мес. назад - 12 года 5 мес. назад #571 от AlexLan
Михаил добрый вечер)))
По тексту у него 1 мин и 5 мин )))
Думаю хватит )))))
Но если глобально подходить то замечание правильное )))))
;)
Последнее редактирование: 12 года 5 мес. назад пользователем AlexLan.

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

  • игорь
  • Посетитель
  • Посетитель
9 года 4 мес. назад #2038 от игорь
игорь ответил в теме Позиция реальная и виртуальная
Михаил, добрый день.

вопрос не совсем по теме, но всё же и к ней можно отнести.
Вы пишете и рекомендуете писать стратегии в Ами через циклы, работая с переменными, а не массивами.
Вы это делаете и для бэктестов и для реальной торговли? или только для торговли?
если и для бэктеста, то вопрос: если на бэктесте использовать циклы, то на сколько (а скорее всего во сколько раз ) увеличится время тестирования (точнее оптимизации) ?
с массивами Ами действительно работать неудобно, и вроде есть уже желание перейти на циклы, но смущает то, что скорость при оптимизации упадет в разы.

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

Подробнее
9 года 4 мес. назад #2039 от admin
Ой-ой...

Циклы в AFL это моветон. Ни в коем случае не нужно их использовать, если задачу можно решить родными векторными функциями.

Я прибегаю к использованию циклов крайне редко и крайне неохотно.

Не мог я дать рекомендацию, о которой вы пишете. Если сможете привести ссылку - значит я в тот момент думал о женщинах, а не о программировании )

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

  • игорь
  • Посетитель
  • Посетитель
9 года 4 мес. назад #2041 от игорь
игорь ответил в теме Позиция реальная и виртуальная
еще раз прошелся по форуму. действительно не нашел совета использовать циклы.
что то я попутал. сори.

позвольте еще вопрос:
много проблем в коде AFL создает отсутствие неплавающего значения цены входа (BuyPrice). но ведь Ами его знает и где-то хранит! как то ведь ApplyStop работает! но где и как его получить? знаю про конструкции с ValueWhen, но у меня не всегда это корректно работает. а это напрягает...

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

Подробнее
9 года 4 мес. назад - 9 года 4 мес. назад #2042 от admin
Что такое "неплавающее значение"?

BuyPrice - это самый-пресамый обычный массив. Если покупки в свече не было, вы должны установить в ней значение Null, а если покупка была -то в этой свече (элементе) массива вы должны поместить цену этой покупки

Например так : BuyPrice=ValueWhen(Buy,Open)
Во всех свечах массива BuyPrice будет стоять соответствующая цена открытия свечи, если в этой свече была покупка ( массив Buy[ i] =true) и Null иначе.

Соответственно, если позиция есть, то цена входа в нее есть последнее не-Null значение в массиве BuyPrice. Получить ее удобно, размножив buyprice посредством flip и после этого просто взять последнее значение полученного от flip массива.
Последнее редактирование: 9 года 4 мес. назад пользователем admin.
Спасибо сказали: ASCH

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

Модераторы: admin