Автор |
Сообщение |
Bystrij_kabanchik
Зарегистрирован: 02.06.2010
Сообщения: 15
|
Привет уважаемым форумчанам.
Озадачилась тестированием фьюча ртс с 2005 года целиком,
а не по отдельным кусочкам/годам, как раньше.
Для системки на циклах нужна проверка на конец/начало дня, чтобы обнулять переменные в начале нового торогово дня и закрываться на последней свече, если еще не было сигнала на выход.
До этого все решалось с помощью timenum() и явного указания времени начала/конца сессии.
Вопрос - как научить ами распознавать первую и последнюю свечу дня, чтобы затем торговать внутри этого промежутка? С учетом того, что сперва не было вечерки на фортсе, потом открытие перенесли на полчаса назад и т.п.
Покопавшись на форуме и в мануале подумала, что
можно обозначить начало торгов как
session_start = Day() != Ref(Day(), -1);
и окончание торгов, соответственно, как
session_end = Day() != Ref(Day(), 1);
В результате получаем примерно такой код:
Код: |
session_start = Day() != Ref(Day(), -1);
session_end = Day() != Ref(Day(), 1);
time = Day();
for (i = 1; i < BarCount -1; i++) { // торговый цикл
if (time[i] == start_time[i]) { // первая свеча дня
// здесь обнуляем позиции и делаем всякую прочую подготовку
}
if (time[i] >= session_start[i] AND time[i] < session_end[i]) { // задаем временные рамки для торговли, от первой до последней свечи сессии
// здесь торгуем
}
}
if (time[i] == end_time[i])) { // тут выходим из позиций, если это последний бар дня, а мы еще в позе
}
|
Засунула полученную конструкцию в тестер, но никаких сделок он не совершает.
Таймфрейм пятиминутки.
Аналогичный код, но с
session_start = 100000;
session_end = 234500;
time = TimeNum();
работает как надо.
Не вижу, где ошибка, но подозреваю, что напутала с массивами.
Как всегда, буду признательна за помощь. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Цитата: |
Покопавшись на форуме и в мануале подумала, что
можно обозначить начало торгов как
session_start = Day() != Ref(Day(), -1);
и окончание торгов, соответственно, как
session_end = Day() != Ref(Day(), 1);
|
Совершенно верно.
Цитата: |
В результате получаем примерно такой код: Код:
Код: |
session_start = Day() != Ref(Day(), -1);
session_end = Day() != Ref(Day(), 1);
time = Day();
for (i = 1; i < BarCount -1; i++) { // торговый цикл
if (time[i] == start_time[i]) { // первая свеча дня
// здесь обнуляем позиции и делаем всякую прочую подготовку
}
if (time[i] >= session_start[i] AND time[i] < session_end[i]) { // задаем временные рамки для торговли, от первой до последней свечи сессии
// здесь торгуем
}
}
if (time[i] == end_time[i])) { // тут выходим из позиций, если это последний бар дня, а мы еще в позе
} |
Засунула полученную конструкцию в тестер, но никаких сделок он не совершает.
Таймфрейм пятиминутки. |
Уф. Как то мне не нравится...
Сделай так
Код: |
session_start = Day() != Ref(Day(), -1);
session_end = Day() != Ref(Day(), 1);
time = Flip(session_start, session_end); // задаем рамки для торговли, от первой до последней свечи сессии
for (i = 1; i < BarCount -1; i++) { // торговый цикл
if (session_start[i]) { // первая свеча дня
// здесь обнуляем позиции и делаем всякую прочую подготовку
}
if (time[i]) {
// здесь торгуем
}
}
if (session_end[i]) { // тут выходим из позиций, если это последний бар дня, а мы еще в позе
} |
Но и это не совсем хорошо.
Еще проще так
Код: |
session_start = Day() != Ref(Day(), -1);
session_end = Day() != Ref(Day(), 1);
TradeCondition = Flip(session_start, session_end);
Buy = TradeCondition AND .....; // правила покупки
/*Только непонятно зачем вводить ограничение на начало и конец торговли если один черт торгуем всю сессию.*/
Sell = session_end OR ...; // правила закрытия лонга
|
|
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
Bystrij_kabanchik
Зарегистрирован: 02.06.2010
Сообщения: 15
|
Как обычно - спасибо, Олег, сейчас буду пробовать.
Глядишь, однажды и сама помогу кому-то разобраться. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
Артур
Зарегистрирован: 10.02.2011
Сообщения: 6
|
Цитата: |
session_end = Day() != Ref(Day(), 1); |
Олег, а вот эта строчка в будущее не заглядывает? при тестировании sell = session_end продает в 23:50:00... видимо я что то не понимаю |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Ну в общем она заглядывает, но только для того, чтобы определить конец дня. Просто так проще всего это сделать. В реальных торгах тоже нет проблем определить, что это последняя свечка торговой сессии поэтому ничего страшного в этом заглядывании нет. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
Артур
Зарегистрирован: 10.02.2011
Сообщения: 6
|
000 писал(а): |
В реальных торгах тоже нет проблем определить, что это последняя свечка торговой сессии поэтому ничего страшного в этом заглядывании нет. |
но, если я правильно понимаю, то система не сможет выйти в конце дня , так как она поймет что это был конец дня только в 10:01:00 следующего дня...не легче ли тогда выходить через
Цитата: |
sell = session_end;
session_end = timenum >=234930;
|
|
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Артур писал(а): |
000 писал(а): |
В реальных торгах тоже нет проблем определить, что это последняя свечка торговой сессии поэтому ничего страшного в этом заглядывании нет. |
но, если я правильно понимаю, то система не сможет выйти в конце дня , так как она поймет что это был конец дня только в 10:01:00 следующего дня...не легче ли тогда выходить через
Цитата: |
sell = session_end;
session_end = timenum >=234930;
|
|
Нет. Не так. Система как раз выйдет в конце дня. Она посмотрит следующую свечку, увидит, что она относится к завтрашнему дню, таким образом поймет, что эта свечка последняя и выйдет как и планировалось в конце дня.
Этот способ универсальный, а способ который ты предлогаешь сработает далеко не всегда. Например если время бара в настройках установлено "время начала бара" и фрейм например 30 мин, то последний бар будет иметь время 23:30 и условие timenum >=234930 никогда не выполнится. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
Brig
Зарегистрирован: 10.03.2011
Сообщения: 3
|
Почему-то такой код
Код: |
if(pos[i] == 1 and session_end[i])
{
Sell[i] = 1;
SellPrice[i] = O[i]-slpg;
}
|
и такой
Код: |
if(pos[i] == -1 and session_end[i])
{
Cover[i] = 1;
CoverPrice[i] = O[i]+slpg;
}
|
Не срабатывают в конце торгов, хотя на всех предыдущих днях все нормально.
То есть все же получается, что session_end не наступает на последней свече.[/quote] |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Чему в твоем коде равен session_end? |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
Brig
Зарегистрирован: 10.03.2011
Сообщения: 3
|
Также как в постах сверху.
session_end = Day() != Ref(Day(), 1);
Проблемы только на самой последней свече. То есть сигнал не отрабатывает в конце сессии. Как только сейчас началась сессия, сигнал сразу появился. Но уже поздно
Наверное нельзя использовать в цикле
Код: |
session_start = Day() != Ref(Day(), -1);
session_end = Day() != Ref(Day(), 1);
time = Flip(session_start, session_end); // задаем рамки для торговли,
for( i = 1; i < BarCount; i++ )
|
|
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Ну вот. Все понятно. Разумеется на последней свечке такой код работать не будет.
Как он работает.
Он сравнивает дату изучаемой и следующей свечки и если она разная, значит это последная свечка дня. На последней свечки код пытается посмотреть дату следующего бара, а его нет... Вот он и не работает. Для робота надо использовать код типа
Код: |
timenum() == 234500;
|
Ну разумеется цифры ставить в зависимости от фрейма и настроек. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
Brig
Зарегистрирован: 10.03.2011
Сообщения: 3
|
000 писал(а): |
Ну вот. Все понятно. Разумеется на последней свечке такой код работать не будет.
Как он работает.
Он сравнивает дату изучаемой и следующей свечки и если она разная, значит это последная свечка дня. На последней свечки код пытается посмотреть дату следующего бара, а его нет... Вот он и не работает. Для робота надо использовать код типа
Код: |
timenum() == 234500;
|
Ну разумеется цифры ставить в зависимости от фрейма и настроек. |
Да, я так и делал, но неудобно менять из-за таймфрейма. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Brig писал(а): |
Да, я так и делал, но неудобно менять из-за таймфрейма. |
А по другому никак... |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
belin
Зарегистрирован: 09.09.2009
Сообщения: 230
Откуда: wealth-lab user
|
Brig писал(а): |
Да, я так и делал, но неудобно менять из-за таймфрейма. |
А если попробовать вычесть Interval() из конца дня:
Код: |
EndDay=timenum() == (235000-Interval(0));
|
|
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Попробуй. По идее вроде должно сработать... |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
|