Автор |
Сообщение |
Ust
Зарегистрирован: 28.04.2011
Сообщения: 5
|
Всем доброго дня,
несколько дней уже бьюсь над задачей, сможет кто нибудь помочь мне?
Есть тестер работает на исторических (тиковых) данных, написан на C#. На выходе имею текстовый файлик с полями Ticker, Date, Time, Operation, Price. Volume. Чтобы быстро проверить правильность его работы мне нужно нанести на график стрелочками точки сделок, как это сделать? |
|
|
Посмотреть профиль Отправить личное сообщение ICQ Number |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Взял на Пауке. Не проверял, но думаю, что все работает.
Код: |
/*
Индюк для Ami чтоб смотреть свою/чужую внутридневную торговлю стрелочками :)
При выборе нового security ищет по указанному ниже пути файл с именем
тикера и расширением .txt
Файл должен состоять из строк вида
05/12/05 10.51.14 SELL
12/12/05 11.11.41 BUY
13/12/05 12.31.45 SELL
14/12/05 13.58.36 SHORT
15/12/05 14.43.13 COVER
без отступов в начале строки. Всё идентифицируется по позиции в строке
(номеру колонки) Вид разделителей даты и времени неважен.
Т.е., чтоб по всем тикерам смотреть, нужно иметь стока файлов .txt, скока
тикеров в базе. Пример файла txt прилагается. Времена испорчены из соображений
копирайта (не моя торговля).
*/
// эти 2 функции скрал с амисайта, пардон :)
function Date_To_Num(ddmmyy)
{
dd_ = StrToNum(StrLeft(ddmmyy,2));
mm_ = StrToNum(StrMid(ddmmyy,3,2));
aa_ = StrToNum(StrRight(ddmmyy,2));
return (10000 * (aa_+100)) + (100 * mm_) + dd_;
}
function Time_To_Num(hhmmss)
{
hh_t = StrToNum(StrLeft(hhmmss,2));
mm_t = StrToNum(StrMid(hhmmss,3,2));
ss_t = StrToNum(StrRight(hhmmss,2));
return 10000 * hh_t + 100 * mm_t + ss_t;
}
function rtrim(s)
{
i=StrFind(s," ");
if(i==0)i=StrFind(s,"\n");
if(i==0)i=StrFind(s,"\t");
if(i>0)
s=StrLeft(s,i-1);
return s;
}
fh = fopen( "D:/трейдинг/Стратегии/"+Name()+".txt", "r");
if( fh ){
Buy=0; Sell=0; Short=0; Cover=0;
while( ! feof( fh ) ) {
s= fgets( fh );
d0=Date_To_Num(StrLeft(s,8));
t0=Time_To_Num(StrMid(s,9,8));
act=StrMid(s,18,2);
if(act=="BU")
Buy=(Cross(TimeNum(),t0) AND DateNum()==d0) OR Buy;
else if(act=="SE")
Sell=(Cross(TimeNum(),t0) AND DateNum()==d0) OR Sell;
else if(act=="SH")
Short=(Cross(TimeNum(),t0) AND DateNum()==d0) OR Short;
else if(act=="CO")
Cover=(Cross(TimeNum(),t0) AND DateNum()==d0) OR Cover;
}
fclose( fh );
PlotOHLC(O,H,L,C,"Price",colorBlack);
PlotShapes(IIf(Buy,shapeUpArrow,0),colorGreen);
PlotShapes(IIf(Sell,shapeDownArrow,0),colorRed);
PlotShapes(IIf(Cover,shapeHollowUpArrow,0),colorGreen);
PlotShapes(IIf(Short,shapeHollowDownArrow,0),colorRed);
} else {
printf("ERROR: file can not be found (does not exist)");
}
|
|
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
belin
Зарегистрирован: 09.09.2009
Сообщения: 230
Откуда: wealth-lab user
|
Олег, спасибо за быстрые ответы и код. А можно на примере этого скрипта объяснить как он будет работать реал-тайм на 5-секундном графике. Предположим, что моя программа реал-тайм аппендит в конец файла сделок новые строки.
1. Я правильно понимаю, что каждые 5 секунд независимо от того были ли изменения в файле со сделками скрипт будет перечитывать этот файл?
2. Есть ли возможность этого избежать? Кажется в Ами нет функций определения времени создания этого txt файла?
3. Может переименовывать файл в {сделки}.old после прочтения, а в скрипте вставить что-то типа: если файл существует, то читаем, если нет, то все по старому? |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Этот скрипт не совсем то, что ты просил. Я его выложил просто как пример того, как можно решить подобную задачу. В часности скрипту нужен txt файл со сделками для одной бумаги (название файла должно быть имя_бумаги.txt)
Цитата: |
1. Я правильно понимаю, что каждые 5 секунд независимо от того были ли изменения в файле со сделками скрипт будет перечитывать этот файл? |
Цитата: |
2. Есть ли возможность этого избежать? Кажется в Ами нет функций определения времени создания этого txt файла? |
Скорее всего даже не раз в 5 секунд а чаще будет перечитывать файл. А в чем проблемма? Пускай себе читает.
Цитата: |
3. Может переименовывать файл в {сделки}.old после прочтения, а в скрипте вставить что-то типа: если файл существует, то читаем, если нет, то все по старому? |
Ами в любом случае будет переодически пытаться перечитать файл и если его однажды не найдет, то стрелки пропадут. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
Ust
Зарегистрирован: 28.04.2011
Сообщения: 5
|
Спасибо! Супер! Все работает! А можно как то учесть не только координаты свечи но и цену сделки? т.е. здесь стрелочки отображаются или в конце или в начале свечи. |
|
|
Посмотреть профиль Отправить личное сообщение ICQ Number |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
В принципе можно. Посмотри функцию PlotShapes которая рисует стрелки. Там есть параметр yposition который определяет уровень на котором будет рисоваться стрелка. Только предупреждаю, что это не очень просто. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
Ust
Зарегистрирован: 28.04.2011
Сообщения: 5
|
вот как то так, что то пытается получится, но почему то стрелки то правильно отображают то неправильно при скроллинге, изменении масштаба и т.п. все разбегаются
и стрелки показываются со сдвигом на один бар вправо (решить это можно доработав функцию где из времени нужно вычесть один интервал) может другие варианты есть?
Код: |
if( fh )
{
Buy=0; Sell=0;
ib=0; is=0; i=0;
p0b=Open*0; p0s=Open*0;
tn=TimeNum();
dn=DateNum();
while(!feof(fh))
{
s=fgets(fh);
d0=Date_To_Num(StrExtract(s,1));
t0=Time_to_Num(StrExtract(s,2));
v0=StrToNum(StrExtract(s,4));
act=StrExtract(s,3);
if(act=="BUY")
{
Buy=(Cross(tn,t0) AND dn==d0) OR Buy;
pb[ib]=StrToNum(StrExtract(s,5)); ib++;
}
else if(act=="SELL")
{
Sell=(Cross(tn,t0) AND dn==d0) OR Sell;
ps[is]=StrToNum(StrExtract(s,5)); is++;
}
}
fclose( fh );
p0b=p0b+Buy; j=0;
for( i = 0; i < BarCount; i++ )
{
if (p0b[i]==1)
{
p0b[i]=pb[j]; j++;
}
else p0b[i]=0;
}
p0s=p0s+Sell; j=0;
for( i = 0; i < BarCount; i++ )
{
if (p0s[i]==1)
{
p0s[i]=ps[j]; j++;
}
else p0s[i]=0;
} |
|
|
|
Посмотреть профиль Отправить личное сообщение ICQ Number |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Подробно вникать в работу кода лень, но на вскидку так не лучше будет?
Код: |
if( fh )
{
Buy=0; Sell=0;
ib = 0;
is = 0;
i = 0;
p0b = 0;
p0s = 0;
tn = TimeNum();
dn = DateNum();
while(!feof(fh))
{
s = fgets(fh);
d0 = Date_To_Num(StrExtract(s,1));
t0 = Time_to_Num(StrExtract(s,2));
v0 = StrToNum(StrExtract(s,4));
act = StrExtract(s,3);
if(act=="BUY")
{
Buy = (Cross(tn,t0) AND dn == d0) OR Buy;
p0b = (Cross(tn,t0) AND dn == d0) * StrToNum(StrExtract(s,5)) OR p0b;
}
else if(act=="SELL")
{
Sell = (Cross(tn,t0) AND dn==d0) OR Sell;
p0s = (Cross(tn,t0) AND dn==d0) * StrToNum(StrExtract(s,5)) OR p0s;
}
}
fclose( fh );
}
|
|
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
Ust
Зарегистрирован: 28.04.2011
Сообщения: 5
|
по логике вроде правильно и красивее, только массивы p0s и p0b заполняются единичками и нулями (д.б. цены) причем их количество явно меньше фактического,чего то и где то не сростается |
|
|
Посмотреть профиль Отправить личное сообщение ICQ Number |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Держи. Полностью готовый рабочий код.
Код: |
/*
Формат файла сделок
Ticker,Date,Time,Operation,Price,Volume
Пример
ROSN,21/12/2010,17:30:00,BUY,221,5
ROSN,20/12/2010,11:30:00,BUY,220,1
ROSN,22/12/2010,14:30:00,BUY,220,1
ROSN,22/12/2010,14:45:00,SELL,220,1
ROSN,22/12/2010,15:45:00,SHORT,222,1
ROSN,22/12/2010,18:30:00,SHORT,222,1
ROSN,23/12/2010,14:45:00,COVER,223,6
*/
fh = fopen( "C:/111.txt", "r");
if( fh )
{
Buy = Sell = Short = Cover = 0;
BuyPrice = SellPrice = ShortPrice = CoverPrice = 0;
dt = DateTime();
while(!feof(fh))
{
s = fgets(fh);
if(StrExtract(s, 0) == Name())
{
dtStr = StrToDateTime(StrExtract(s,1) + " " + StrExtract(s,2));
bi = LastValue(ValueWhen(dtStr > Ref(dt, -1) AND dtStr <= dt, BarIndex()));
v0 = StrToNum(StrExtract(s,5));
p0 = StrToNum(StrExtract(s,4));
act = StrExtract(s,3);
if(act=="BUY")
{
Buy[bi] = 1;
BuyPrice[bi] = p0;
PlotText(StrExtract(s,5) + " Lots", bi, p0*0.995, colorBlack);
VolBuy[bi] = V0;
}
else if(act=="SELL")
{
Sell[bi] = 1;
SellPrice[bi] = p0;
PlotText(StrExtract(s,5) + " Lots", bi, p0*1.005, colorBlack);
}
else if(act=="SHORT")
{
Short[bi] = 1;
ShortPrice[bi] = p0;
PlotText(StrExtract(s,5) + " Lots", bi, p0*1.005, colorRed);
VolShort[bi] = V0;
}
else if(act=="COVER")
{
Cover[bi] = 1;
CoverPrice[bi] = p0;
PlotText(StrExtract(s,5) + " Lots", bi, p0*0.995, colorRed);
}
}
}
fclose( fh );
}
Plot(C, "", colorBlack, styleCandle);
PlotShapes(IIf(Buy,shapeUpArrow,0),colorGreen, 0, BuyPrice);
PlotShapes(IIf(Sell,shapeHollowDownArrow, 0),colorGreen, 0, SellPrice);
PlotShapes(IIf(Short,shapeDownArrow,0),colorRed, 0, ShortPrice);
PlotShapes(IIf(Cover,shapeHollowUpArrow, 0),colorRed, 0, CoverPrice);
|
|
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
Ust
Зарегистрирован: 28.04.2011
Сообщения: 5
|
Супер! Все отлично работает спасибо большое! |
|
|
Посмотреть профиль Отправить личное сообщение ICQ Number |
|
anton-mmvb
Зарегистрирован: 16.09.2011
Сообщения: 2
|
Добрый день.
Помогите пожалуйста.
Рисую на графике данные индикаторов из текстового файла. Стуктура файла ниже. Поля разделены ",". Предпоследнее поле- наименование индикатора. Сортировка в файле - по имени индикатора, внутри индикатора по дате.
Скажите пожалуйста как написать скрипт что он выводил все инидкаторы (а сколько их будет не известно и нужно определить в процессе обработки файла) на график. На основании постов ниже я сделал скрипт на вывод одного графика, но вот как сделать что бы при нахождении нового имени индикатора ему также строился график. по сути нужно поставить скрипт в цикл но к сожалению знания не позволяют.
Пример файла
SPFB.GAZR,03/01/2012,10:00:00,EMA (5 Close),17576
SPFB.GAZR,03/01/2012,11:00:00,EMA (5 Close),17579
SPFB.GAZR,03/01/2012,12:00:00,EMA (5 Close),17589
SPFB.GAZR,03/01/2012,13:00:00,EMA (5 Close),17587
SPFB.GAZR,30/03/2012,21:00:00,EMA (24 Close),17495
SPFB.GAZR,30/03/2012,22:00:00,EMA (24 Close),17500
SPFB.GAZR,30/03/2012,23:00:00,EMA (24 Close),17504
Код: |
fh = fopen( "C:/Import/TimeSer.txt", "r");
if( fh )
{
Buy = Sell = Short = Cover = 0;
BuyPrice = SellPrice = ShortPrice = CoverPrice = 0;
dt = DateTime();
while(!feof(fh))
{
s = fgets(fh);
if(StrExtract(s, 0) == Name())
{
dtStr = StrToDateTime(StrExtract(s,1) + " " + StrExtract(s,2));
bi = LastValue(ValueWhen(dtStr > Ref(dt, -1) AND dtStr <= dt, BarIndex()));
//v0 = StrToNum(StrExtract(s,5));
p0 = StrToNum(StrExtract(s,4));
act = StrExtract(s,3);
Buy[bi] = 1;
BuyPrice[bi] = p0;
// PlotText(StrExtract(s,4), bi, p0, colorBlack);
VolBuy[bi] = V0;
}
}
fclose( fh );
}
Plot(BuyPrice, "", colorRed, styleLine+styleNoRescale ); |
|
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Код который написан читает и разбирает все строки в текстовом файле.
Т.е. "цикл" там уже есть.
Я вот только не понял что и куда надо выводить. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
anton-mmvb
Зарегистрирован: 16.09.2011
Сообщения: 2
|
спасибо за оперативный ответ.
вопрос в том что указанный скрипт рисует на графике один индикатор из файла. но в текстовом файле может содержаться их несколько.
различаются они по имени индикатора (предпоследнее поле в файле). и нужно что бы скрипт определял сколько индикаторов в файле и каждый выводил на график.
в примере файла в моем предыдущем посте 2 индикатора:
1.EMA (5 Close)
2. EMA (24 Close)
нужно что бы скрипт определил по имени что индикаторов 2 и вывел каждый на график. при этом индикаторов может быть произвольное кол-во.
на вопрос почему нельзя нарисовать ема сразу в АМИ отвечу что на вывод кончено планируются не обычные ема а нечто более сложное из другой программы. ема в данном случаи используется только в качестве примера.
000 писал(а): |
Код который написан читает и разбирает все строки в текстовом файле.
Т.е. "цикл" там уже есть.
Я вот только не понял что и куда надо выводить. |
|
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Ну вроде более менее понятно.
Значит так. Выдергиваешь 3-ий элемент строки (StrExtract(s,3))
Дальше к сожалению нельзя тупо текстовую переменную тспользовать в качестве записи индикаторов.
Разбираешь этот кусок.
EMA (5 Close)
надо выдернуть параметры индикатора
Потом берем то, что стоит до скобки "("
И пишем типа так
Код: |
if(qqq = "EMA ")
{
Plot(EMA(...), "", ColorRed);
}
else if(qqq = "MA ")
{
Plot(MA(...), "", ColorRed);
}
... |
Если разнообразие возможных индикаторов не велико, то проще прямо так
Код: |
qqq = StrExtract(s,3)
if(qqq = "EMA (5 Close)")
{
Plot(EMA(C, 5), "", ColorRed);
}
else if (qqq = "EMA (24 Close)")
{
Plot(EMA(C, 24), "", ColorRed);
}
...
|
и все это прямо в цикле
Код: |
while(!feof(fh))
{
} |
|
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
|
|
Следующая тема
Предыдущая тема
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете вкладывать файлы Вы не можете скачивать файлы
|
|