Автор |
Сообщение |
max
Зарегистрирован: 01.08.2008
Сообщения: 253
|
добрый день!
стоит следующая задача
1.посчитать вольюм на премаркете
2.посчитать вольюм на постмаркете вчера
3. вычислить дыру между закрытием бара в 15.59 вчера с открытием бара сегодня в 09.34
при условии что работаем внутри дня и в настройках базы открытие указано с учетом премаркета и закрытие с учетом постмаркета
Вот с тем как считать вольюм на премаркете (да и вообще на заданном интервале ) я разобрался (добрые люди помогли). Теперь осталось понять как дать знать АМИ что мне нужно данные на закрытие 15.59 но за вчера и вольюм за вчера
спасибо! |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Цитата: |
3. вычислить дыру между закрытием бара в 15.59 вчера с открытием бара сегодня в 09.34
|
А в чем сложность?
Код: |
C1559 = ValueWhen(TimeNum() == 155900, C);
O0934 = ValueWhen(TimeNum() == 093400, O);
Ch = C1559 - O0934;
|
Цитата: |
Вот с тем как считать вольюм на премаркете (да и вообще на заданном интервале ) я разобрался (добрые люди помогли). Теперь осталось понять как дать знать АМИ что мне нужно данные на закрытие 15.59 но за вчера и вольюм за вчера
спасибо!
|
Было бы проще, если бы написали как считаете. Потому, что непонятно в чем сложность. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
max
Зарегистрирован: 01.08.2008
Сообщения: 253
|
Вот какие идеи:
1.Отловить дни, в которых объем премаркета и\или постмаркета был "ненормальным" (или в качестве % от среднедневного или отличного в разы от внутредневного) и посмотреть что в эти дни происходило интересного
2.отловить эти же дни, но которые сопровождались гепом на открытии.
Вот какие сложности:
мне никак не удается его заставить выводить
результаты в следующем виде для гепа:
размер дырки | вольюм на премаркете сегодня | вольюм на постмаркете вчера
Вот код
Код: |
Vop = IIf( TimeNum() > 080000 AND TimeNum() <= 092400,V,0);
prem_end = IIf( Vop==0 AND Ref(Vop,-1)>0, BarIndex(),0);
prem_start = IIf( Vop>0 AND Ref(Vop,-1)==0, BarIndex(),0);
Vl_sum= IIf(prem_end,Sum(V,BarsSince(prem_start>0)),0);
Vcl = IIf( TimeNum() > 160000 AND TimeNum() <= 200000,V,0);
post_end = IIf( Vcl==0 AND Ref(Vcl,-1)>0, BarIndex(),0);
post_start = IIf( Vcl>0 AND Ref(Vcl,-1)==0, BarIndex(),0);
Vc_sum= IIf(post_end,Sum(V,BarsSince(post_start>0)),0);
TimeFrameSet(inDaily); // switch to 5 minute frame
Vo50 = MA(V,50);
Vo1 = V;
TimeFrameRestore();
C1559 = ValueWhen(TimeNum() == 155900, C);
O0934 = ValueWhen(TimeNum() == 093400, O);
Ch = (C1559 - O0934)/C1559;
Plot(Vl_sum,"Volprem",colorRed, styleLine);
Plot(Vc_sum,"Volpost",colorYellow, styleLine);
//Plot( TimeFrameExpand(Vo50, inDaily), "13 bar moving average from 5 min bars", colorRed );
Filter=Ch*100>1;//Vc_sum OR Vl_sum;
AddColumn(Ch*100,"Ch*100");
AddColumn(Vl_sum,"Volprem");
AddColumn(Vc_sum,"Volpost");
AddColumn( TimeFrameExpand(Vo50, inDaily),"Vo50"); |
|
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Попробуй так.
Код: |
C_end = ValueWhen(TimeNum() == 155900, C);
O_begin = ValueWhen(TimeNum() == 093400, O);
Ch = IIf(TimeNum() >= 155900 OR TimeNum() < 093400, Null, (C_end - O_begin)/C_end);
Vop = IIf( TimeNum() > 080000 AND TimeNum() <= 092400, V, 0);
prem_start = TimeNum() == 080000;
prem_end = TimeNum() == 092400;
Vl_sum = ValueWhen(prem_end, Sum(V, BarsSince(prem_start)));
Vcl = IIf( TimeNum() > 160000 AND TimeNum() <= 200000, V, 0);
post_start = TimeNum() == 160000;
post_end = TimeNum() == 200000;
Vc_sum= ValueWhen(post_end, Sum(V, BarsSince(post_start)));
Vo50 = TimeFrameGetPrice("V", inDaily, -1);
Filter = abs(Ch) * 100 > 1; // абс берется т.к. геп может быть вверх и вниз
AddColumn(Ch*100, "Ch*100");
AddColumn(Vl_sum, "Volprem");
AddColumn(Vc_sum, "Volpost");
AddColumn( Vo50, "Vo50");
|
Только очень тщательно проверь время в коде, оно в точности должно соответствовать временам баров на графике. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
max
Зарегистрирован: 01.08.2008
Сообщения: 253
|
Добрый день!
Спасибо за помощь. Действительно, так выглядит лучше. Я только дописал немного кода для вывода результатов объемов на график
К сожалению ваш вариант
Vl_sum = ValueWhen(prem_end, Sum(V, BarsSince(prem_start)));
не позволяет строить график, поэтому я добавил
Vl_sum2= IIf(prem_end,Sum(V,BarsSince(prem_start>0)),0);
Кроме того, расчет вольюма на дневках так же чуток переделал - иначе средняя не получалась
Итоговый код ниже.
Но всплыла очень странная и серьезная засада. Я тестировал на AAPL - у него всегда большой премаркет и пост маркет. Так вот, если первый бар (5минут) рисуется в 0804 - все считается правильно. Если же первый бар датирован 0803, то сумма объема считается не верно и как правило в разы превышает дневной объем. Аналогичная хрень с постмаркетом - если происходит сдвиг по времени - выдаем фигню
Странный глюк - ведь база минутная, по идее он должен считать просто по базе
Код: |
C_end = ValueWhen(TimeNum() == 155900, C);
O_begin = ValueWhen(TimeNum() == 093400, O);
Ch = IIf(TimeNum() >= 155900 OR TimeNum() < 093400, Null, (C_end - O_begin)/C_end);
Vop = IIf( TimeNum() > 080000 AND TimeNum() <= 092900, V, 0);
prem_start = TimeNum() == 080400;
prem_end = TimeNum() == 092900;
Vl_sum = ValueWhen(prem_end, Sum(V, BarsSince(prem_start)));
Vl_sum2= IIf(prem_end,Sum(V,BarsSince(prem_start>0)),0);
Vcl = IIf( TimeNum() > 160000 AND TimeNum() <= 195900, V, 0);
post_start = TimeNum() == 160400;
post_end = TimeNum() == 195900;
Vc_sum= ValueWhen(post_end, Sum(V, BarsSince(post_start)));
Vc_sum2= IIf(post_end,Sum(V,BarsSince(post_start>0)),0);
TimeFrameSet(inDaily); // switch to 5 minute frame
Vo50 = Ref(MA(V,50),-1);
Vo = Ref(V,-1);
TimeFrameRestore();
Filter = TimeNum() == 093400 AND abs(Ch) * 100 > 1; // абс берется т.к. геп может быть вверх и вниз
AddColumn(Ch*100, "Ch*100",1.2);
AddColumn(Vl_sum, "Volprem",1.0);
AddColumn(Vc_sum, "Volpost",1.0);
AddColumn( TimeFrameExpand(Vo50, inDaily),"Vo50",1.0);
AddColumn( TimeFrameExpand(Vo, inDaily),"Vo",1.0);
Plot(Vl_sum2,"Volprem",colorRed, styleLine);
Plot(Vc_sum2,"Volpost",colorYellow, styleLine);
|
|
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Есть у меня одна мысль, но точно не уверен. Скинь плиз данные на которых такой косяк и напиши конкретно даты. Посмотрю. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
max
Зарегистрирован: 01.08.2008
Сообщения: 253
|
000 писал(а): |
Есть у меня одна мысль, но точно не уверен. Скинь плиз данные на которых такой косяк и напиши конкретно даты. Посмотрю. |
настройки базы - открытие в 08-00 закрытие в 20-00
Даты вы сами сможете увидеть в эксплорейшене, но в качестве примера
преопен косяки
3/27/2009
1/2/2009
2/6/2009
3/26/2009
постмаркет
2/26/2009
1/14/2009
3/25/2009
эксплорейшн делал на 5 и 1 минутках - один хрне
а вот прицепить файл не получается - он зазипованный чуть выше 1 мб получается, а рар форум не понимает
Пришлось тут положить
http://forex.kbpauk.ru/showflat.php?Cat=0&Number=256024&page=0&vc=#Post256024
Спасибо за помощь!
(зы есть уже еще один вопрос - я тут код любопытный от Томаша нашел, но это потом - если сам не соображу) |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Ага. Даже тестить не пришлось и так все ясно (надеюсь )
Смотрю преопен 27 марта. По коду начало в 8 часов 4 минуты. А такой свечки там нет совсем. Поэтому он берет ближайшую свечку с этим временем, а она была только 24 го. Вот он и складывает все эти дни. Придется изменить код таким макаром
Код: |
prem_start = TimeNum() >= 080400 AND Ref(TimeNum(), -1) < 080400; |
и так везде. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
max
Зарегистрирован: 01.08.2008
Сообщения: 253
|
000 писал(а): |
Ага. Даже тестить не пришлось и так все ясно (надеюсь )
Смотрю преопен 27 марта. По коду начало в 8 часов 4 минуты. А такой свечки там нет совсем. Поэтому он берет ближайшую свечку с этим временем, а она была только 24 го. Вот он и складывает все эти дни. Придется изменить код таким макаром
Код: |
prem_start = TimeNum() >= 080400 AND Ref(TimeNum(), -1) < 080400; |
и так везде. |
К сожалению, это не помогает 100%
дело в том, что фактическое открытие в каждой акции свое. Эппл как очень леквидный открывается 08-00
а вот Agilent Tec(A) может открыться и 8-10 и 09-00
аналогично по закрытию - что-то закрылось в 1959, а что-то последней сделкой в 16-15
И Ами сносит башку мгновенно |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Давай тогда сделаем
начало премаркета - первая сделка дня
Код: |
prem_start = Day() != Ref(Day(), -1); |
конец премаркета
Код: |
prem_end = TimeNum() >= 092900 AND (Ref(TimeNum(), -1) < 092900 OR Day() != Ref(Day(), -1)); |
Начало постмаркета
Код: |
post_start = TimeNum() >= 160400 AND Ref(TimeNum(), -1) < 160400; |
Конец постмаркета
последняя сделка дня
Код: |
post_end = Day() != Ref(Day(), 1); |
|
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
max
Зарегистрирован: 01.08.2008
Сообщения: 253
|
Похоже все работает как нужно!
Завтра на свежую голову проверю, но похоже
получилось
Спасибо большое!!!! |
|
|
Посмотреть профиль Отправить личное сообщение |
|
|
|
Следующая тема
Предыдущая тема
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете вкладывать файлы Вы не можете скачивать файлы
|
|