Автор |
Сообщение |
Arahan
Зарегистрирован: 26.06.2010
Сообщения: 47
|
Привет, Олег! Есть ли какие-то мысли, по реализации этого стопа? |
|
|
Посмотреть профиль Отправить личное сообщение Отправить e-mail |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
По простому похоже никак нельзя. Стандартно такой функции нет. Вероятно потому, что может так получится, что более низкого минимума на истории не найдется совсем..
Если например проверить штук 10 баров и взять из них первый более низкий, а если такого нет, то какую то цифру, то это можно (хотя тоже не просто). |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
Arahan
Зарегистрирован: 26.06.2010
Сообщения: 47
|
Поздравляю с трехтысячным сообщением))
Ну всю историю и не надо наверное. Обычно хватает 5-8 баров. Один из них почти наверняка будет ниже. Вот только иногда бывает, что у свечи на которой зашли, очень большая тень… Вот тогда и нужно тестировать большее количество баров. Или как вариант, можно в случае отсутствия самого низкого бара, ставить стоп на лоу этой свечи. Или, как ты правильно заметил, при отсутствии самого низкого бара, ставить стоп, например на 500 пунктов ниже. Тоже хорошая идея…
А ни как нельзя вот эту строчку как-то зациклить?
Cond1= IIf ( Ref(High, -1) < Ref(High, 1), Ref(High, -2)-Close, Ref(High, -1)- Close);
Как я писал, это то, что нужно, вот только продолжить бы как-то… |
|
|
Посмотреть профиль Отправить личное сообщение Отправить e-mail |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Спасибо за поздравление. Афигеть я тут понаписал....
Я напишу такой код. Там именно циклить надо...
Только вот скорее всего не раньше воскресенья... Постараюсь раньше, но не обещаю. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Вот собственно ближайший уровень Low который ищется за 10 баров
Код: |
Lev = 0;
for(i = 1; i < 10; i++)
{
Lev = IIf(Lev == 0, IIf(Ref(L, -i) < L, Ref(L, -i), 0), Lev);
}
Lev = IIf(Lev == 0, L, Lev);
Plot(C, "", colorBlack, styleCandle);
Plot(Lev, "", colorRed);
|
Для стопа будет так
Код: |
Lev = 0;
for(i = 1; i < 10; i++)
{
Lev = IIf(Lev == 0, IIf(Ref(L, -i) < L, Ref(L, -i), 0), Lev);
}
Lev = IIf(Lev == 0, L, Lev);
ApplyStop(stopTypeLoss, stopModePoint, C - Lev, ExitAtStop = 1, Volatile = False);
|
Это для лонга |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
Arahan
Зарегистрирован: 26.06.2010
Сообщения: 47
|
Спасибо большое, Олег! Попробую потестить пака с этим кодом, посмотрю, что получится. |
|
|
Посмотреть профиль Отправить личное сообщение Отправить e-mail |
|
Arahan
Зарегистрирован: 26.06.2010
Сообщения: 47
|
Код работает как часы. Спасибо еще раз!
Пытаюсь прикрутить его одновременно к лонгу и к шорту, пишу вот так:
Buy= Cross(EMA(Close, 17), EMA(Close, 30));
Sell= Cross (EMA(Close, 30), EMA(Close, 17));
Lev = 0;
for(i = 1; i < 10; i++)
{
Lev = IIf(Lev == 0, IIf(Ref(L, -i) < L, Ref(L, -i), 0), Lev);
}
Lev = IIf(Lev == 0, L, Lev);
ApplyStop(stopTypeLoss, stopModePoint, C - Lev, ExitAtStop = 1, Volatile = False);
Short = Cross (EMA(Close, 30), EMA(Close, 17));
Cover = Cross (EMA(Close, 17), EMA(Close, 30));
Lev = 0;
for(i = 1; i < 10; i++)
{
Lev = IIf(Lev == 0, IIf(Ref(H, -i) > H, Ref(H, -i), 0), Lev);
}
Lev = IIf(Lev == 0, H, Lev);
ApplyStop(stopTypeLoss, stopModePoint, Lev - C, ExitAtStop = 1, Volatile = False);
Работает правильно, но только с шортом. Из лонга систему выбивает на следующей свече.
Подскажите, пожалуйста, что я не так делаю? |
|
|
Посмотреть профиль Отправить личное сообщение Отправить e-mail |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Уже подзабыл тему. По новому разбираться сейчас не хочу.
Попробуй так
Код: |
Buy= Cross(EMA(Close, 17), EMA(Close, 30));
Sell= Cross (EMA(Close, 30), EMA(Close, 17));
Lev1 = 0;
for(i = 1; i < 10; i++)
{
Lev1 = IIf(Lev1 == 0, IIf(Ref(L, -i) < L, Ref(L, -i), 0), Lev1);
}
Lev1 = IIf(Lev1 == 0, L, Lev1);
ApplyStop(stopTypeLoss, stopModePoint, C - Lev1, ExitAtStop = 1, Volatile = False);
Short = Cross (EMA(Close, 30), EMA(Close, 17));
Cover = Cross (EMA(Close, 17), EMA(Close, 30));
Lev2 = 0;
for(i = 1; i < 10; i++)
{
Lev2 = IIf(Lev2 == 0, IIf(Ref(H, -i) > H, Ref(H, -i), 0), Lev2);
}
Lev2 = IIf(Lev2 == 0, H, Lev2);
ApplyStop(stopTypeLoss, stopModePoint, Lev2 - C, ExitAtStop = 1, Volatile = False);
|
|
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
Arahan
Зарегистрирован: 26.06.2010
Сообщения: 47
|
Не помогло. Я думаю дело не в цикле. Думаю, я что-то не понимаю в работе стопов.
Вот на более простом примере, ситуация в тестере повторяется, лонг не работает а шорт работает как надо.
Buy= Cross (EMA(Close, 9), EMA(Close, 20));
Sell= Cross (EMA(Close, 20), EMA(Close, 9));
ApplyStop(stopTypeLoss, stopModePoint, Close - Ref(Low, -1), ExitAtStop = 1, Volatile = False);// стоп на предыдущей свече
Short =Cross (EMA(Close, 20), EMA(Close, 9));
Cover = Cross (EMA(Close,9), EMA(Close, 20));
ApplyStop(stopTypeLoss, stopModePoint, Ref(High, -1)- Close, ExitAtStop = 1, Volatile = False);// стоп на предыдущей свече |
|
|
Посмотреть профиль Отправить личное сообщение Отправить e-mail |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Ааа. Вот что.
ApplyStop(stopTypeLoss... должен быть только один в системе.
Тестер учитывает только последний. Надо написать так
ApplyStop(stopTypeLoss, stopModePoint, IIf(Buy, ..., ...), ExitAtStop = 1, Volatile = False); |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
Arahan
Зарегистрирован: 26.06.2010
Сообщения: 47
|
Олег, подскажи пожалуйста. Я написал вот такой код:
Short = Ref (Cross(EMA(Close, 20), EMA(Close, 9)),-1) AND Cross(EMA(Close, 25), EMA(Close, 15)) ;
Cover = Cross (EMA(Close,15), EMA(Close, 25));
Lev2 = 0;
for(i = 1; i < 10; i++)
{
Lev2 = IIf(Lev2 == 0, IIf(Ref(H, -i) > Ref(H,-1), Ref(H, -i), 0), Lev2);
}
Lev2 = IIf(Lev2 == 0, H, Lev2);
ApplyStop(stopTypeLoss, stopModePoint, Lev2 - C , ExitAtStop = 1, Volatile = False);
Суть в следующем. Чтобы войти в позицию, по пересечению 25 и 15 периодных скользящих, должно быть выполнено условие - за одну свечу до пересечения (25 и 15 периодных)должны были пересечься 20 и 9 периодные.
Тот цикл для стопа который написал ты:
Lev2 = 0;
for(i = 1; i < 10; i++)
{
Lev2 = IIf(Lev2 == 0, IIf(Ref(H, -i) > H, Ref(H, -i), 0), Lev2);
}
Lev2 = IIf(Lev2 == 0, H, Lev2);
ApplyStop(stopTypeLoss, stopModePoint, Lev2 - C, ExitAtStop = 1, Volatile = False);
...ищет свечу с более высоким хаем, чем хай той свечи на которой произошел вход в позицию и ставит стоп на этот хай.
Я чуть-чуть его переделал и хочу, чтобы цикл начинал искать свечу с более высоким хаем, не с той свечи где мы зашли в позицию, а с той свечи где выполнилось первое условие “””Ref (Cross(EMA(Close, 20), EMA(Close, 9)),-1)”””
Вроде бы в том коде, что написал я, это получилось , но такое ощущение, что я фигню написал)).
Изначально я хотел написать, чтобы первое условие не теряло силу в течении -5 свечей и цикл поиска свечи, начинался в зависимости от первого условия.
То есть Условие входа в позу должно выглядеть как-то так:
Short = Ref (Cross(EMA(Close, 20), EMA(Close, 9)),-1) AND Cross(EMA(Close, 25), EMA(Close, 15))
OR Short = Ref (Cross(EMA(Close, 20), EMA(Close, 9)),-2) AND Cross(EMA(Close, 25), EMA(Close, 15))
OR Short = Ref (Cross(EMA(Close, 20), EMA(Close, 9)),-3) AND Cross(EMA(Close, 25), EMA(Close, 15))
OR Short = Ref (Cross(EMA(Close, 20), EMA(Close, 9)),-4) AND Cross(EMA(Close, 25), EMA(Close, 15))
OR Short = Ref (Cross(EMA(Close, 20), EMA(Close, 9)),-5) AND Cross(EMA(Close, 25), EMA(Close, 15));
Но ни как не получается написать цикл для стопа для всех пяти условий. Если не трудно подскажи, как это сделать.
Надеюсь ты хоть что-то понял из моей писанины))) |
|
|
Посмотреть профиль Отправить личное сообщение Отправить e-mail |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Arahan писал(а): |
То есть Условие входа в позу должно выглядеть как-то так:
Short = Ref (Cross(EMA(Close, 20), EMA(Close, 9)),-1) AND Cross(EMA(Close, 25), EMA(Close, 15))
OR Short = Ref (Cross(EMA(Close, 20), EMA(Close, 9)),-2) AND Cross(EMA(Close, 25), EMA(Close, 15))
OR Short = Ref (Cross(EMA(Close, 20), EMA(Close, 9)),-3) AND Cross(EMA(Close, 25), EMA(Close, 15))
OR Short = Ref (Cross(EMA(Close, 20), EMA(Close, 9)),-4) AND Cross(EMA(Close, 25), EMA(Close, 15))
OR Short = Ref (Cross(EMA(Close, 20), EMA(Close, 9)),-5) AND Cross(EMA(Close, 25), EMA(Close, 15));
|
Подобные вещи проще делать функцией hold( EXPRESSION, periods )
"замораживаешь" первоначальный сигнал и ждешь второй. Типа так
Код: |
Short = hold( Cross(EMA(Close, 20), EMA(Close, 9)), 5 ) AND Cross(EMA(Close, 25), EMA(Close, 15));
|
|
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Теперь по поводу цикла. Собственно надо изменить границы цикла в зависимости от того как давно было выполнено первое условие
Для этого удобнее воспользоваться функцией BarsSince()
Код: |
qq = BarsSince(Cross(EMA(Close, 20), EMA(Close, 9)))
Lev = 0;
for(i = qq; i < 10 + qq; i++)
{
Lev = IIf(Lev == 0, IIf(Ref(L, -i) < L, Ref(L, -i), 0), Lev);
}
Lev = IIf(Lev == 0, L, Lev);
|
Вроде так. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
Arahan
Зарегистрирован: 26.06.2010
Сообщения: 47
|
Почему-то не работает, вот эта строчка:
for(i = qq; i < 10 + qq; i++)
выдает ошибку:
Error 6. Condition in IF, WHILE, FOR statements has to be Numeric or Boolean type. You can not use array here, please use [] (array subscript operator) to access array elements |
|
|
Посмотреть профиль Отправить личное сообщение Отправить e-mail |
|
Arahan
Зарегистрирован: 26.06.2010
Сообщения: 47
|
Олег, подскажи пожалуйста. Небольшой вопрос по теме стопов.
Если я хочу, чтобы в дополнение к моему условию, стоп выставлялся еще на 100 пунктов ниже\выше. Достаточно ли просто в ApplyStop добавить + 100?
Вот так:
ApplyStop(stopTypeLoss, stopModePoint, IIf(Sell, Lev2 - C +100 , 100 + C - Lev1), ExitAtStop = 1, Volatile = False); |
|
|
Посмотреть профиль Отправить личное сообщение Отправить e-mail |
|
|
|
Следующая тема
Предыдущая тема
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете вкладывать файлы Вы не можете скачивать файлы
|
|