Автор |
Сообщение |
Novi4ok
Зарегистрирован: 15.08.2008
Сообщения: 127
|
ВНИМАНИЕ!
смотрите коды В КОНЦЕ темы, прикрепленные.
все промежуточные коды с ошибкой!
УРА!
я написал программный стоп-лосс:
Код: |
Buy = Cross(C,MA(C,20));
BuyPrice = C;
BuyLevel = ValueWhen(Buy, BuyPrice, 1);
StopSize = 500; // величина Стоп-лосса в пунктах
SellCondition1 = C<(BuyLevel - StopSize);
Sell = Cross(MA(C,20), C) OR SellCondition1;
SellPrice = C;
Buy = ExRem(Buy, Sell);
Sell= ExRem(Sell, Buy);
Plot(C, "", colorBlack, styleCandle);
Plot((BuyLevel-StopSize), "stop", colorRed);
|
вроде все правильно.
это стоп-лосс для покупки. для шорта несложно аналогичный сделать.
пользуйтесь на здоровье!
(гордый собой пошел теперь писать программный трейлинг-стоп) |
Последний раз редактировалось: Novi4ok (Вс Июн 21, 2009 3:15 pm), всего редактировалось 1 раз |
|
Посмотреть профиль Отправить личное сообщение |
|
Novi4ok
Зарегистрирован: 15.08.2008
Сообщения: 127
|
итак, я написал трейлинг-стоп
без всяких циклов, прошу заметить!
Код: |
Buy = Cross(C,MA(C,20));
BuyPrice = C;
BuyLevel = ValueWhen(Buy, BuyPrice, 1);
BuyBarsAgo = BarsSince(Buy)+1;
TrailingStopSize = 1000;
TrailingStopLevel = HHV(H, BuyBarsAgo)-TrailingStopSize;
SellCondition1 = C<TrailingStopLevel;
Sell = Cross(MA(C,20), C) OR SellCondition1;
SellPrice = C;
Buy = ExRem(Buy, Sell);
Sell= ExRem(Sell, Buy);
Plot(C, "", colorBlack, styleCandle);
Plot((TrailingStopLevel), "trailing-stop", colorRed); |
|
|
|
Посмотреть профиль Отправить личное сообщение |
|
Novi4ok
Зарегистрирован: 15.08.2008
Сообщения: 127
|
проверил в амиброкере - работает аналогично встроенному стопу и трейлинг-стопу, если указывать в пунктах.
ТОЛЬКО Я ДО СИХ ПОР НЕ МОГУ ПОНЯТЬ
как он обрабатывает
сигналы ExRem и в то же время корректно обращается к ValueWhen и barsSince.
на мой взгляд здесь должна возникнуть рекурсия, ведь через ExRem сигнал Buy зависит от Sell, а через ValueWhen и BarsSince сигнал Sell зависит от сигнала Buy.
но опять же, повторяюсь, при тестах ВСЕ РАБОТАЕТ!!!! прямо как в амиброкере.!!!!
я в шоке. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
Novi4ok
Зарегистрирован: 15.08.2008
Сообщения: 127
|
так...
проверил на большей выборке
стопы считает правильно,
а вот трейлинг стопы: количество сделок верное, а доходность/просадку совсем чуть-чуть привирает,
сейчас буду разбираться почему. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
Novi4ok
Зарегистрирован: 15.08.2008
Сообщения: 127
|
НАШЕЛ!
в условии трейлинг-стопа должно быть
<= вместо <.
вот верный код:
Код: |
Buy = Cross(C,MA(C,20)); // условие системы на покупку
BuyPrice = C;
BuyLevel = ValueWhen(Buy, BuyPrice, 1); // по какой цене купили
BuyBarsAgo = BarsSince(Buy)+1; // сколько баров назад купили
TrailingStopSize = 1000; // размер трейлинг-стопа
TrailingStopLevel = HHV(Ref(H,0), BuyBarsAgo)-TrailingStopSize; // его уровень
SellCondition1 = C<=TrailingStopLevel; // условие продажи по трейлингу
Sell = Cross(MA(C,20), C) OR SellCondition1; // продаем по системе или по трейлингу
SellPrice = C;
Buy = ExRem(Buy, Sell); // убираем лишние сигналы
Sell= ExRem(Sell, Buy);
Plot(C, "", colorBlack, styleCandle);
Plot((TrailingStopLevel), "trailing-stop", colorRed); //рисуем
|
|
|
|
Посмотреть профиль Отправить личное сообщение |
|
commenced
Советник
Зарегистрирован: 08.04.2008
Сообщения: 643
Откуда: от "Верблюда"
|
Не советую использовать ваши стопы, они работают благодаря cross т.к. это давольно жесткое условие и стоп скорее всего успевает исполниться до появления между стопом и покупкой еще одного условия покупки, если в системе будет успевать проходить несколько условий Buy то стоп будер расчитываться от последней точки выполнения условия. |
_________________ Юра |
|
Посмотреть профиль Отправить личное сообщение Отправить e-mail |
|
Novi4ok
Зарегистрирован: 15.08.2008
Сообщения: 127
|
Cross - это условие системы.
а условие стопа тут стандартное - если цена ушла за такой-то уровень.
ну тоже в какой-то мере кросс.
но так все стопы и все трейлинг-стопы рассчитываются.
а какие иные стопы можно предложить? |
|
|
Посмотреть профиль Отправить личное сообщение |
|
commenced
Советник
Зарегистрирован: 08.04.2008
Сообщения: 643
Откуда: от "Верблюда"
|
Novi4ok писал(а): |
Cross - это условие системы.
а условие стопа тут стандартное - если цена ушла за такой-то уровень.
ну тоже в какой-то мере кросс.
но так все стопы и все трейлинг-стопы рассчитываются.
а какие иные стопы можно предложить? |
Ты не понял, замени cross на > и увидиш почему стопы пишут циклом. |
_________________ Юра |
|
Посмотреть профиль Отправить личное сообщение Отправить e-mail |
|
Novi4ok
Зарегистрирован: 15.08.2008
Сообщения: 127
|
хм... да заменил,
результат моих стопов и встроенных теперь отличается.
ща попробую переделать, есть идейка "разнести" по времени условия системы и стопа, чтобы Exrem вставить пораньше. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
Novi4ok
Зарегистрирован: 15.08.2008
Сообщения: 127
|
получился такой код:
блин, сайт перевирает код, счас прицеплю.
вроде все работает,
счас потестю на большой выборке с разными системами. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
Novi4ok
Зарегистрирован: 15.08.2008
Сообщения: 127
|
хммм... как будто бы опять что-то не то, а что именно, непонятно.
получается, если условие системы на Sell сделать 0, т.е. выход только по стопам, то программа совершает первую покупку и на этом останавливается.
это неправильно. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
Novi4ok
Зарегистрирован: 15.08.2008
Сообщения: 127
|
короче, вот в чем проблема:
если у нас был сигнал на продажу, а потом один сигнал на покупку,
то этот сигнал на покупку истинный;
если у нас не было сигнала на продажу, но сигнал на покупку первый за всю историю баров, то такой сигнал на покупку тоже истинный;
если у нас второй сигнал на покупку, а на продажу не было, то это ложный сигнал и его нужно отменить.
вот, как теперь это запрограммировать? |
|
|
Посмотреть профиль Отправить личное сообщение |
|
Novi4ok
Зарегистрирован: 15.08.2008
Сообщения: 127
|
хм.
почему-то когда пытаюсь сосчитать количество баров, прошедших с последней продажи
s = BarsSince(Sell)
то всегда выдает Null,
хотя
b = BarsSince(Buy) корректно работает |
|
|
Посмотреть профиль Отправить личное сообщение |
|
Novi4ok
Зарегистрирован: 15.08.2008
Сообщения: 127
|
понятно почему.
потому что когда я приравниваю Sell = 0;
то он мне весь массив заполняет нулями.
ужас.
а мне нужно, чтобы предыдущие совершенные сделки в массиве сохранялись. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
commenced
Советник
Зарегистрирован: 08.04.2008
Сообщения: 643
Откуда: от "Верблюда"
|
Novi4ok писал(а): |
короче, вот в чем проблема:
если у нас был сигнал на продажу, а потом один сигнал на покупку,
то этот сигнал на покупку истинный;
если у нас не было сигнала на продажу, но сигнал на покупку первый за всю историю баров, то такой сигнал на покупку тоже истинный;
если у нас второй сигнал на покупку, а на продажу не было, то это ложный сигнал и его нужно отменить.
вот, как теперь это запрограммировать? |
Для этого и нужен цикл. |
_________________ Юра |
|
Посмотреть профиль Отправить личное сообщение Отправить e-mail |
|
|