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



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

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

Приветсвую всех!
Крайне необходимо решить следующую задачу (достаточно простую, но я не особо владею навыками программирования). Хочу настроить реал-тайм выгрузку тиковых данных из Ами в файл txt. Данные должны выглядеть следующим образом:

ггггммдд,ччммсс,last_price,tick_volume,bid,ask

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

_SECTION_BEGIN("запись в файл Last");
fh = fopen( "D:\\2.txt", "w");
GraphZOrder=1;
t=StrFormat("%1.4f",GetRTData("Last"));
fputs( t, fh );
fclose(fh);
_SECTION_END();
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

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

http://www.amisite.ru/afl/ind/0007.htm

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



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

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

000 писал(а):
http://www.amisite.ru/afl/ind/0007.htm

Блин, как всегда, лежит под носом то что нужно, а не видишь Smile
Спасибо, буду осваивать
Посмотреть профиль Отправить личное сообщение
Ti_ru



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

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

Немного преобразовал код, т.к. не подходил формат даты

Код:
SetBarsRequired(100000, 0);
s = ParamStr("Имя файла", "");
e = ParamToggle("Экспорт", "No|Yes", 0);
bar=Param("Число баров",50,1,1000,10,sincr=0);
V = Volume;
p = Close;
p = Nz(p);
V = Nz(V);

if(e)
{
   a =Name();
   fh = fopen( s+".txt", "w");
   if( fh )
   {
      dat = (10000 * Year())  + (100 * Month())+Day();
      tim = 10000 * Hour() + 100 * Minute() + Second();
     
      for( i = BarCount - bar ; i < BarCount; i++ )
      {
         ds = NumToStr (dat[i], 1.0, False ) +","+ NumToStr (tim[i], 1.0, False ) + "," + NumToStr (p[i], 1.2,

False ) +"," + NumToStr (V[i], 1.0, False ) +"\n";
         fputs( ds, fh );
      }
      fclose( fh );
   }


Столкнулся со следующей проблемой. Почему-то первое число месяца отображается некорректно. Например, для 1 марта должно быть 20110301, а в текстовик попадает 20110300. Для остальных дат все корректно.
И такой вопрос: есть ли встроенные функции, которые позволяют рассчитывать бид и аск для текущей цены?
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

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

По поводу
Цитата:
первое число месяца отображается некорректно

Попробуй использовать datenum() вместо NumToStr (dat[i], 1.0, False )

Цитата:
И такой вопрос: есть ли встроенные функции, которые позволяют рассчитывать бид и аск для текущей цены?

Такой функции нет. Это надо для форекса я так понимаю? Тогда тупо прибавляй спред когда надо и все. Для фондового рынка узнать бид/оффер из OHLC не возможно никак.

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



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

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

Цитата:
Попробуй использовать datenum() вместо NumToStr (dat[i], 1.0, False )

Пробовал, datenum() выдает что-то вроде 1110301 вместо 20110301, т.к. год в ней считается так: (уууу-1900), - вот и получаем 111 вместо 2011.
Цитата:
Такой функции нет. Это надо для форекса я так понимаю? Тогда тупо прибавляй спред когда надо и все. Для фондового рынка узнать бид/оффер из OHLC не возможно никак.

Нет, это для фортса. Экспортирую тиковые сделки. Я тоже решил не искать и плясать от изменения цены, то есть если цена вырастает, то аск=цене, а бид=цена-5, если цена падает, то аск=цена+5, а бид=цена, если не меняется, то предыдущие значения.
Получил вот такой корявы код, но он некорректный, иногда проскакивают нули вместо бида и аска в начале расчетного диапазона. Я знаю, что проблема в том что я беру i-1 бар для первого значения оператора for и это не совсем верно, но как сделать корректно, мыслей пока нет. Посмотрите, пожалуйста:
Код:
SetBarsRequired(100000, 0);
s = ParamStr("Имя файла", "");
e = ParamToggle("Экспорт", "No|Yes", 0);
bar=Param("Число баров",50,1,15000,100,sincr=0);
V = Volume;
p = Close;
p = Nz(p);
V = Nz(V);

if(e)
{
   a =Name();
   fh = fopen( s+"RIH1.txt", "w");
   if( fh )
   {
      dat = (10000 * Year())  + (100 * Month())+Day();
      tim = 10000 * Hour() + 100 * Minute() + Second();
      bid=0;
      ask=0;
      for( i = BarCount - bar ; i < BarCount; i++ )
      {
         if (p[i]>p[i-1])
             {
               bid = p[i]-5;
               ask = p[i];
            }
         if (p[i]<p[i-1])
            {
               bid = p[i];
               ask = p[i]+5;
            }
         /*if (p[i]=p[i-1])
            {
               bid = bid[i-1];
               ask = ask[i-1];
            }*/
         ds = NumToStr (dat[i], 1.0, False ) +","+ NumToStr (tim[i], 1.0, False ) + "," + NumToStr (p[i], 1.2,

False ) +"," + NumToStr (V[i], 1.0, False )+","+NumToStr (bid[i], 1.2, False )+","+NumToStr (ask[i], 1.2, False ) +"\n";
         fputs( ds, fh );
      }
      fclose( fh );
   }
Посмотреть профиль Отправить личное сообщение
Ti_ru



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

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

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

Код:
SetBarsRequired(100000, 0);
s = ParamStr("Имя файла", "");
e = ParamToggle("Экспорт", "No|Yes", 0);
bar=Param("Число баров",50,1,15000,100,sincr=0);
V = Volume;
p = Close;
p = Nz(p);
V = Nz(V);

if(e)
{
   a =Name();
   fh = fopen( s+"RIH1.txt", "w");
   if( fh )
   {
      //dat = (10000 * Year())  + (100 * Month())+Day();
      dat = DateNum();
      //tim = 10000 * Hour() + 100 * Minute() + Second();
      tim=TimeNum();
      bid=p;
      ask=p;
      min_=100*Minute();
      for( i = BarCount - bar ; i < BarCount; i++ )
      {
         if (p[i]>p[i-1])
             {
               bid = p[i]-5;
               ask = p[i];
            }
         if (p[i]<p[i-1])
            {
               bid = p[i];
               ask = p[i]+5;
            }
         /*if (p[i]=p[i-1])
            {
               bid = bid[i-1];
               ask = ask[i-1];
            }*/
         if (i>BarCount-bar+50)
{
         ds = NumToStr (dat[i], 1.0, False ) +","+ NumToStr (tim[i], 1.0, False ) + "," + NumToStr (p[i], 1.2,

False ) +"," + NumToStr (V[i], 1.0, False )+","+NumToStr (bid[i], 1.2, False )+","+NumToStr (ask[i], 1.2, False ) +"\n";
         fputs( ds, fh );
}
      }
      fclose( fh );
   }
Посмотреть профиль Отправить личное сообщение
Ti_ru



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

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

Все, сделал. Добавил условие перед выводом строки:
Код:

myminute = DateTimeConvert( 4, DateTime() );
....
for ...


if (myminute[i]>myminute[BarCount - bar])

...


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


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

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

Дело, скорее всего, не в том, что [i-1] ты же цикл начинаешь не с i = 0. Скорее всего дело в
Код:
         if (p[i]>p[i-1])
             {
               bid = p[i]-5;
               ask = p[i];
            }
         if (p[i]<p[i-1])
            {
               bid = p[i];
               ask = p[i]+5;
            }

а если равно, то у тебя закоментировано...

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


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

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

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

Начал писать и убежал на 2 часа Smile...

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



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

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

Бывает Smile

Как и ожидалось, при переходе на новый час полностью пропадает 1 минута часа.
Посмотреть профиль Отправить личное сообщение
Ti_ru



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

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

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

_SECTION_BEGIN("RealQuotes2");
SetBarsRequired(100000, 0);
s = ParamStr("Имя файла", "");
e = ParamToggle("Экспорт", "Off|On", 0);
bar=Param("Буфер тиков",3000,1,15000,100,sincr=0);
V = Volume;
p = Close;
p = Nz(p);
V = Nz(V);

if(e)
{
   a =Name();
   fh = fopen( s+".txt", "w");
   if( fh )
   {
      //dat = (10000 * Year())  + (100 * Month())+Day();
      dat = DateNum();
      //tim = 10000 * Hour() + 100 * Minute() + Second();
      tim=TimeNum();
      bid=p;
      ask=p;
      //myminute = DateTimeConvert( 4, DateTime() );
      myminute = 60 * Hour() + Minute();

      for( i = BarCount - bar ; i < BarCount; i++ )
      {
         if (p[i]>p[i-1])
             {
               bid = p[i]-5;
               ask = p[i];
            }
         if (p[i]<p[i-1])
            {
               bid = p[i];
               ask = p[i]+5;
            }
         /*if (p[i]=p[i-1])
            {
               bid = bid[i-1];
               ask = ask[i-1];
            }*/

         if (myminute[i]>myminute[BarCount - bar])
{
         ds = NumToStr (dat[i], 1.0, False ) +","+ NumToStr (tim[i], 1.0, False ) + "," + NumToStr (p[i], 1.2,

False ) +"," + NumToStr (V[i], 1.0, False )+","+NumToStr (bid[i], 1.2, False )+","+NumToStr (ask[i], 1.2, False ) +"\n";
         fputs( ds, fh );
}
      }
      fclose( fh );
   }
}_SECTION_END();
Посмотреть профиль Отправить личное сообщение
Показать сообщения:      
Начать новую тему  Ответить на тему


 Перейти:   



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


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

File Attachment © by Meik Sievertsen