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



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

СообщениеДобавлено: Пт Окт 15, 2010 3:52 pm Ответить с цитатой Вернуться к началу

Привет уважаемым форумчанам.

Озадачилась тестированием фьюча ртс с 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

СообщениеДобавлено: Пт Окт 15, 2010 4:28 pm Ответить с цитатой Вернуться к началу

Цитата:

Покопавшись на форуме и в мануале подумала, что
можно обозначить начало торгов как
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

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

Как обычно - спасибо, Олег, сейчас буду пробовать.
Глядишь, однажды и сама помогу кому-то разобраться.
Посмотреть профиль Отправить личное сообщение
Артур



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

СообщениеДобавлено: Чт Мар 03, 2011 1:26 pm Ответить с цитатой Вернуться к началу

Цитата:
session_end = Day() != Ref(Day(), 1);

Олег, а вот эта строчка в будущее не заглядывает? при тестировании sell = session_end продает в 23:50:00... видимо я что то не понимаю Sad
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

СообщениеДобавлено: Чт Мар 03, 2011 1:47 pm Ответить с цитатой Вернуться к началу

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

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



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

СообщениеДобавлено: Чт Мар 03, 2011 2:23 pm Ответить с цитатой Вернуться к началу

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

но, если я правильно понимаю, то система не сможет выйти в конце дня , так как она поймет что это был конец дня только в 10:01:00 следующего дня...не легче ли тогда выходить через
Цитата:
sell = session_end;
session_end = timenum >=234930;
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

СообщениеДобавлено: Чт Мар 03, 2011 3:34 pm Ответить с цитатой Вернуться к началу

Артур писал(а):
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

СообщениеДобавлено: Чт Мар 24, 2011 7:51 am Ответить с цитатой Вернуться к началу

Почему-то такой код
Код:

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

СообщениеДобавлено: Чт Мар 24, 2011 9:18 am Ответить с цитатой Вернуться к началу

Чему в твоем коде равен session_end?

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



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

СообщениеДобавлено: Чт Мар 24, 2011 9:58 am Ответить с цитатой Вернуться к началу

Также как в постах сверху.
session_end = Day() != Ref(Day(), 1);

Проблемы только на самой последней свече. То есть сигнал не отрабатывает в конце сессии. Как только сейчас началась сессия, сигнал сразу появился. Но уже поздноSad

Наверное нельзя использовать в цикле

Код:

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

СообщениеДобавлено: Чт Мар 24, 2011 11:41 am Ответить с цитатой Вернуться к началу

Ну вот. Все понятно. Разумеется на последней свечке такой код работать не будет.
Как он работает.
Он сравнивает дату изучаемой и следующей свечки и если она разная, значит это последная свечка дня. На последней свечки код пытается посмотреть дату следующего бара, а его нет... Вот он и не работает. Для робота надо использовать код типа

Код:

timenum() == 234500;

Ну разумеется цифры ставить в зависимости от фрейма и настроек.

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



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

СообщениеДобавлено: Чт Мар 24, 2011 11:56 am Ответить с цитатой Вернуться к началу

000 писал(а):
Ну вот. Все понятно. Разумеется на последней свечке такой код работать не будет.
Как он работает.
Он сравнивает дату изучаемой и следующей свечки и если она разная, значит это последная свечка дня. На последней свечки код пытается посмотреть дату следующего бара, а его нет... Вот он и не работает. Для робота надо использовать код типа

Код:

timenum() == 234500;

Ну разумеется цифры ставить в зависимости от фрейма и настроек.


Да, я так и делал, но неудобно менять из-за таймфрейма.
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

СообщениеДобавлено: Чт Мар 24, 2011 1:50 pm Ответить с цитатой Вернуться к началу

Brig писал(а):

Да, я так и делал, но неудобно менять из-за таймфрейма.

А по другому никак...

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



Зарегистрирован: 09.09.2009
Сообщения: 230
Откуда: wealth-lab user

СообщениеДобавлено: Чт Мар 24, 2011 10:40 pm Ответить с цитатой Вернуться к началу

Brig писал(а):

Да, я так и делал, но неудобно менять из-за таймфрейма.

А если попробовать вычесть Interval() из конца дня:
Код:

EndDay=timenum() == (235000-Interval(0));
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

СообщениеДобавлено: Чт Мар 24, 2011 10:48 pm Ответить с цитатой Вернуться к началу

Попробуй. По идее вроде должно сработать...

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Показать сообщения:      
Начать новую тему  Ответить на тему


 Перейти:   



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


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

File Attachment © by Meik Sievertsen