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



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

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

Всем доброго дня,
несколько дней уже бьюсь над задачей, сможет кто нибудь помочь мне?
Есть тестер работает на исторических (тиковых) данных, написан на C#. На выходе имею текстовый файлик с полями Ticker, Date, Time, Operation, Price. Volume. Чтобы быстро проверить правильность его работы мне нужно нанести на график стрелочками точки сделок, как это сделать?
Посмотреть профиль Отправить личное сообщение ICQ Number
000
Site Admin


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

СообщениеДобавлено: Пт Апр 29, 2011 12:19 am Ответить с цитатой Вернуться к началу

Взял на Пауке. Не проверял, но думаю, что все работает.
Код:

/*
 Индюк для 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

СообщениеДобавлено: Пт Апр 29, 2011 10:22 am Ответить с цитатой Вернуться к началу

Олег, спасибо за быстрые ответы и код. А можно на примере этого скрипта объяснить как он будет работать реал-тайм на 5-секундном графике. Предположим, что моя программа реал-тайм аппендит в конец файла сделок новые строки.
1. Я правильно понимаю, что каждые 5 секунд независимо от того были ли изменения в файле со сделками скрипт будет перечитывать этот файл?
2. Есть ли возможность этого избежать? Кажется в Ами нет функций определения времени создания этого txt файла?
3. Может переименовывать файл в {сделки}.old после прочтения, а в скрипте вставить что-то типа: если файл существует, то читаем, если нет, то все по старому?
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

СообщениеДобавлено: Пт Апр 29, 2011 10:59 am Ответить с цитатой Вернуться к началу

Этот скрипт не совсем то, что ты просил. Я его выложил просто как пример того, как можно решить подобную задачу. В часности скрипту нужен txt файл со сделками для одной бумаги (название файла должно быть имя_бумаги.txt)

Цитата:
1. Я правильно понимаю, что каждые 5 секунд независимо от того были ли изменения в файле со сделками скрипт будет перечитывать этот файл?

Цитата:
2. Есть ли возможность этого избежать? Кажется в Ами нет функций определения времени создания этого txt файла?

Скорее всего даже не раз в 5 секунд а чаще будет перечитывать файл. А в чем проблемма? Пускай себе читает.
Цитата:
3. Может переименовывать файл в {сделки}.old после прочтения, а в скрипте вставить что-то типа: если файл существует, то читаем, если нет, то все по старому?

Ами в любом случае будет переодически пытаться перечитать файл и если его однажды не найдет, то стрелки пропадут.

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



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

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

Спасибо! Супер! Все работает! А можно как то учесть не только координаты свечи но и цену сделки? т.е. здесь стрелочки отображаются или в конце или в начале свечи.
Посмотреть профиль Отправить личное сообщение ICQ Number
000
Site Admin


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

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

В принципе можно. Посмотри функцию PlotShapes которая рисует стрелки. Там есть параметр yposition который определяет уровень на котором будет рисоваться стрелка. Только предупреждаю, что это не очень просто.

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



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

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

вот как то так, что то пытается получится, но почему то стрелки то правильно отображают то неправильно при скроллинге, изменении масштаба и т.п. все разбегаются Smile
и стрелки показываются со сдвигом на один бар вправо (решить это можно доработав функцию где из времени нужно вычесть один интервал) может другие варианты есть?

Код:
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

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

Подробно вникать в работу кода лень, но на вскидку так не лучше будет?
Код:

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

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

по логике вроде правильно и красивее, только массивы p0s и p0b заполняются единичками и нулями (д.б. цены) причем их количество явно меньше фактического,чего то и где то не сростается
Посмотреть профиль Отправить личное сообщение ICQ Number
000
Site Admin


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

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

Держи. Полностью готовый рабочий код.
Код:

/*
Формат файла сделок
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

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

Супер! Все отлично работает спасибо большое!
Посмотреть профиль Отправить личное сообщение ICQ Number
anton-mmvb



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

СообщениеДобавлено: Пн Апр 02, 2012 2:21 pm Ответить с цитатой Вернуться к началу

Добрый день.

Помогите пожалуйста.

Рисую на графике данные индикаторов из текстового файла. Стуктура файла ниже. Поля разделены ",". Предпоследнее поле- наименование индикатора. Сортировка в файле - по имени индикатора, внутри индикатора по дате.

Скажите пожалуйста как написать скрипт что он выводил все инидкаторы (а сколько их будет не известно и нужно определить в процессе обработки файла) на график. На основании постов ниже я сделал скрипт на вывод одного графика, но вот как сделать что бы при нахождении нового имени индикатора ему также строился график. по сути нужно поставить скрипт в цикл но к сожалению знания не позволяют.


Пример файла
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

СообщениеДобавлено: Пн Апр 02, 2012 5:39 pm Ответить с цитатой Вернуться к началу

Код который написан читает и разбирает все строки в текстовом файле.
Т.е. "цикл" там уже есть.
Я вот только не понял что и куда надо выводить.

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



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

СообщениеДобавлено: Вт Апр 03, 2012 1:48 pm Ответить с цитатой Вернуться к началу

спасибо за оперативный ответ.

вопрос в том что указанный скрипт рисует на графике один индикатор из файла. но в текстовом файле может содержаться их несколько.

различаются они по имени индикатора (предпоследнее поле в файле). и нужно что бы скрипт определял сколько индикаторов в файле и каждый выводил на график.

в примере файла в моем предыдущем посте 2 индикатора:

1.EMA (5 Close)
2. EMA (24 Close)

нужно что бы скрипт определил по имени что индикаторов 2 и вывел каждый на график. при этом индикаторов может быть произвольное кол-во.

на вопрос почему нельзя нарисовать ема сразу в АМИ отвечу что на вывод кончено планируются не обычные ема а нечто более сложное из другой программы. ема в данном случаи используется только в качестве примера.


000 писал(а):
Код который написан читает и разбирает все строки в текстовом файле.
Т.е. "цикл" там уже есть.
Я вот только не понял что и куда надо выводить.
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

СообщениеДобавлено: Вт Апр 03, 2012 6:43 pm Ответить с цитатой Вернуться к началу

Ну вроде более менее понятно.

Значит так. Выдергиваешь 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
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Показать сообщения:      
Начать новую тему  Ответить на тему


 Перейти:   



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


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

File Attachment © by Meik Sievertsen