Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?
ФХЪРСап 14, 2024, 12:14:47 am
Начало Помощь Поиск Войти Регистрация
Новости:

Transaq  |  СБО "Transaq"  |  Подсистема ATF  |  Topic: Как записать в файл данные на подписанную бумагу "f.writeLn(подписка на SiH)" « предыдущая тема следующая тема »
Страниц: [1] Печать
Автор Тема: Как записать в файл данные на подписанную бумагу "f.writeLn(подписка на SiH)"  (Прочитано 3848 раз)
Serega
Newbie
*
Сообщений: 11


Просмотр профиля Email
« : пЭТРап 09, 2020, 08:54:42 pm »

extern "string" filename = "file.txt";
var f;
var statline;
var z;

function init()
{
    statline = new_object("statline");
    statline.subscribe("SiH0", 4);        //подписался на бумагу +++++++
    f = new_object("file");
    f.wopen(filename);
}

function calc()
{
    z = SiH0() ;            //как записать данные из этой подписки в файл, не могу понять. ++++++++
    f.writeLn(z);   //нужно мне "f.writeLn(подписка на SiH)"
}


на форуме в течении миллионов лет обсуждали баги программы на стадии ее рождения.Документация не то что бы не дописана, она очень неинформативна. А на форуме урезанные коды по которым элементарного не понять, всю цепочку того что мне надо в голове сложил, а ошибки с синтаксисом нигде не описаны.
Записан
Pilgrim
Newbie
*
Сообщений: 48


Просмотр профиля Email
« Ответ #1 : пЭТРап 09, 2020, 10:46:26 pm »

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

«signal::notify» заменить на переменную, убрать теги переноса «\n», и отправить сие в файл. 

Так вот, те самые параметры, которые Вы планируете к запросу/выводу, и которых я у Вас в скрипте
уже во втором посте подряд НЕ вижу, необходимо определить. Их описание тут:

http://www.transaq.ru/dokuwiki/atf:%D0%BA%D0%BE%D0%BD%D1%81%D1%82%D0%B0%D0%BD%D1%82%D1%8B

собственно, как в примере по ссылке (из предыдущего поста: http://www.transaq.ru/forum/index.php?topic=7863.0).

ЗЫ. а про баги АТФ, об которые тут «миллионы лет» ... «ноги ломали», - что-то мне подсказывает, что
Вы их «в живую» ни разу и не видели. Так что поближе к документации и простым примерам, и всё
будет замечательно. И эта, в calc(), таки, к файлам обращаться минимум не корректно,
- это если совсем «мягко говоря» ...
« Последнее редактирование: пЭТРап 09, 2020, 11:25:42 pm от Pilgrim » Записан
Serega
Newbie
*
Сообщений: 11


Просмотр профиля Email
« Ответ #2 : пЭТРап 10, 2020, 07:22:59 am »

"Так вот, те самые параметры, которые Вы планируете к запросу/выводу, и которых я у Вас в скрипте
уже во втором посте подряд НЕ вижу, необходимо определить."
Помогите их определить, какую строчку надо вставить что бы это стало работать. Или проще умничать?
Записан
andreyvv
Jr. Member
**
Сообщений: 89


Просмотр профиля Email
« Ответ #3 : пЭТРап 10, 2020, 11:05:21 am »

Я вот так записываю данные о сделках и переменных:

function FileWriterShort() // ФУНКЦИЯ ЗАПИСИ ТРЕЙДОВ В ФАЙЛ (ШОРТ)
{
 file = new_object("file");
 file.waopen("test.txt"); // Открываем файл для записи
    if (file.isopen()) { // Если файл успешно открыт, записываем данные

   file.writeLn(ticker + ";" + "и так далее" +  ";");

   file.close();} // Закрываем файл
}

Далее функция FileWriterShort(); вызывается по событию OnTrade() и записывает данные в файд txt.
Записан
Pilgrim
Newbie
*
Сообщений: 48


Просмотр профиля Email
« Ответ #4 : пЭТРап 10, 2020, 10:36:01 pm »

...
Помогите их определить, какую строчку надо вставить что бы это стало работать. Или проще умничать?
Это тот случай когда действительно «проще умничать». Без коментариев.
Вот прям готового решения не предложу, но некоторые моменты, ведущие к решению, подскажу. А решить эту
очень простую задачу Вам надо обязательно самому, и это важно. Иначе на кой тот АТФ нужен? ...

Итак, «какую строчку надо вставить» - их несколько, в зависимости от количества параметров, которые Вы(!) для себя
определите. Ссылку на параметры я уже предоставлял. Так вот, для запроса этих параметров применяется «.getparam()».
А вот «.subscribe()», Вы удивитесь, можно даже не использовать. Подписываться или нет на параметры определяется как
раз частотой запроса и/или их (параметров) требуемого количества. Т.е., подписываясь имеем в локальном кэше всю(!)
статистику по инструменту, постоянно собирая её с сервера TQ, НЕ подписываясь получаем самые последние данные с
сервера по запросу на конкретный параметр.

Скрипт, примерно( ! - так как ни знака, ни скобки не проверял на терминале ), выглядит так:

static st_ZZZ;
static st_TXT = "";

static seZ_last;
static seZ_quant;
static seZ_time;
// ...

                              function init()   
{

st_ZZZ = new_object( "statline" );
st_ZZZ.subscribe();
// ...

}

// следующие строки включаются в ту функцию из которой идёт запрос параметров

seZ_last = st_ZZZ.getparam( param_last );
seZ_quant = st_ZZZ.getparam( param_quantity );
seZ_time = st_ZZZ.getparam( param_time );

// формат записи запроса «простой», без указания рынка и имени бумаги, т.к. находится скрипт, предположительно, под графиком инструмента 


Получив параметры в переменные, собираем из них текстовую переменную для последующей передачи в файл:

st_TXT = seZ_last +  "\t" + seZ_quant +  "\t" + seZ_time; // параметры разделены табулятором ...


Пишем текстовую переменную в файл на новую строку:

file.writeLn( st_TXT );
st_TXT = ""; // «обнуляем» после записи в файл ...


Здесь пример про .txt. Это немного проще чем .xml, но принцип примерно тот же. Просто определяясь с форматом файла
надо понимать почему лучше использовать тот или иной. Например для логов лучше .txt, а для передачи в скрипт или
тестер .xml. Ну как-то так, в общем ...
« Последнее редактирование: пЭТРап 10, 2020, 10:49:55 pm от Pilgrim » Записан
Serega
Newbie
*
Сообщений: 11


Просмотр профиля Email
« Ответ #5 : пЭТРап 21, 2020, 12:54:03 pm »

 Т.е., подписываясь имеем в локальном кэше всю(!) статистику по инструменту, постоянно собирая её с сервера TQ,

Какая нужна функция что бы осуществить подписку на всю статистику по инструменту? И какой константой эту статистику записать в файл (как вытащить эту статистику?)
subscribe() которая типа подписывается на всю статистику, не работает, она просто показывает последние актуальные данные.
.getparam(param) Как использовать? Что нужно в скобках указать вместо param?
« Последнее редактирование: пЭТРап 21, 2020, 01:09:27 pm от Serega » Записан
Pilgrim
Newbie
*
Сообщений: 48


Просмотр профиля Email
« Ответ #6 : пЭТРап 21, 2020, 10:56:05 pm »

Цитата верна про «всю(!) статистику».  Subscribe() подразумевает трансляцию на ваш терминал всех изменений по всем параметрам. Но как это реализовано разработчиками остаётся только догадываться. Т.е. или же эти данные прилетают одним пакетом с какой-то частотой, или же отслеживается только изменения в параметре и тогда информация поступает с сервера, а в кэше, соответственно, копится и утилизируется - ну вот не знаем мы этого. По-этому идея получения всех(!) параметров на каждом тике - абсурдна изначально. Вы вот посмотрите таки на предлагаемые в документации параметры - их там более тридцати(!). И далеко не все способны меняться даже в течении минуты. Так всё таки какие конкретно Вас параметры интересуют (из 30-ти)? Или это тайна?

Далее, судя по форуму, вопросы по получению параметров были, и можно предположить(!), что так и не были решены разработчиками в полном объёме (то же произвольное количество запросов, которое упоминалось). Я лично, в разумных пределах, конкретные параметры запрашиваю, и оно всё изумительно работает (понятно, что не на тиках). Не могу понять, что Вы там хотите от данных получаемых с такой частотой. Может в «ИИ» планируете передавать, - не знаю. Но следует отметить, что даже в самом терминале параметры, меняющиеся с такой частотой, и в таком объёме, вряд ли увидите. Кроме(!): цена, объём, направление сделки, время - «это святое!», и гарантированно есть на каждом тике. А эти параметры НЕ требуют обращения по относительно сложному алгоритму (через .getparam), - для этого существуют более простые функции, и более стабильные при этом. Например: getLastTradeVolume() для объёма, close для цены и т.д. Это я к тому, что от правильности постановки задачи сильно зависит метод её решения.

По-этому, я ещё раз предлагаю Вам определиться с параметрами ( смотрите список: «Константы в языке ATF»/ param_*** ) - это важно: что/когда/в каком объёме запрашивать, и только потом подготовка данных (структура данных может зависеть от «что/когда») для записи в файл ...
Записан
Serega
Newbie
*
Сообщений: 11


Просмотр профиля Email
« Ответ #7 : пЭТРап 22, 2020, 10:29:45 am »

Здравствуйте ещё раз, я думал вы разработчик. По этому писал как бы с лёгким наездом что все через жопу.
По поводу то что мне нужно это не секрет.  Я написал программу на нескольких языках робот "внешний" и он может принимать решения и заставлять любую торговую платформу выполнять нужные для него действия. Данные берет то же с этих платформ транзак, Квик ет разницы, но они не очень точные(но точнее чем те что я получил от АТФ) что бы оставлять робота один на один с рынком мне нужны данные поточнее. А нужно все го то какие были сделки из примера в другом вопросе, я могу копировать их с комбинированных котировок, но наверно правильнее будет если с помощью АТФ они будут записываться сами. Мне не нужен "тик" пусть будет весь список сделок приходить хоть раз в секунду (но не последняя актуальная), я так понял этот список записывается в кеш? Хеш? Как его там. И из Кеша в файл, мне и этого вполне достаточно. Если бы вы показали или кто то на этом форуме, подсказал в каком направлении двигаться, а ещё лучше пример работающий, который этот список из памяти вытаскивает, это было бы круто, но а про то что АТФ для новичков в программировании это все не так, так как он тупо не объяснен.
Записан
Serega
Newbie
*
Сообщений: 11


Просмотр профиля Email
« Ответ #8 : пЭТРап 22, 2020, 07:57:09 pm »

Я вот так записываю данные о сделках

Да это очень хороший и информативный(с пояснениями) пример, сложив два ваших примера, я "прозрел". Спасибо что не поленились написать его, мне помогло, уверен поможет ещё кому нибудь. По больше бы таких элементарных кодов, демонстрирующих логику этого языка программирования.
Записан
Pilgrim
Newbie
*
Сообщений: 48


Просмотр профиля Email
« Ответ #9 : пЭТРап 23, 2020, 03:50:42 am »

Да какой там «разработчик», - я жеш: «Newbie» :). А с «легким наездом» - это Вы зря. Небольшой коллектив собрал очень стабильный, очень быстрый и лёгкий продукт, - тут только «снимать шляпу», что называется ...

Ну да ладно, «к вашим баранам». Вот видите, не прошло и недели, а мы совместными усилиями, наконец таки, добрались до вашего «Тех. Задания» (ТЗ). Из крайнего сообщения стало понятно, что параметры Вам нужны самые, что ни на есть, простые: «с комбинированных котировок». Это вообще упрощает задачу в части сбора этих данных. Про .xml думаю так: надо бы посмотреть тот формат .xml, который Вы передаёте той своей программе. По-этому просьба: выложите здесь из собранного для вашей программы в, например, Квике .xml файла фрагменты:
- с самого(!) начала строк 10-15 вместе с «шапкой»;
- концовочку строк 5-7.
Очень интересно посмотреть как у Вас организован .xml из «потоковых» данных, а НЕ из статических.

А пока я Вам предлагаю попробовать вариант скрипта, сохраняющего «поток», опять таки, в .txt. Синтаксис проверил, а вот протестировать не успел. Так что «как есть»:

// старт ...

static vr_Trd = 0;
static vr_DATA = "";
static vr_DATA_tmp = "";
static fl_XFile;


function init()
{
fl_XFile = new_object( "file" );
fl_XFile.wopen( "XFile.txt" );
}


function out_2_XFile()   // можно было без определения функции, а прямо в калке, но так правильно ...
{
fl_XFile.write( vr_DATA );   // здесь запись x в файл БЕЗ перехода на новую строку ...
vr_DATA = "";
}


function calc()
{
vr_Trd += 1;
vr_DATA_tmp = getFormattedTime( getServerTime()) + ";" + close + ";" + getLastTradeVolume() + ";" + getLastTradeDirection() + "\n";
vr_DATA += vr_DATA_tmp; vr_DATA_tmp = "";

   if ( vr_Trd > 99 ) { vr_Trd = 0; out_2_XFile(); }   // уменьшаем кол-во обращений к файлу, здесь только на каждую сотую строку ...
}

// финиш ...

Вроде должно работать. Если что, то это просто «блок-схема», - «докрутить чутка» и пойдёт. Только здесь файл не закрывается (специально). Допишите что-нибудь типа закрыть по времени (23:51) или комбинацией клавиш, - не принципиально. Так же, насколько помню, здесь время только до секунд, без десятых/сотых. И конечно размер будет приличный, если вся сессия, а .xml ещё процентов на сорок побольше, как минимум ...
Записан
Serega
Newbie
*
Сообщений: 11


Просмотр профиля Email
« Ответ #10 : пЭТРап 28, 2020, 12:28:56 am »

Он работает, этот ваш код, только почему то сервер показывает как будто бы сделки были совершены на секунду позже, (и еще не тестил на больших объемах, я почитал на форуме было у кого то что направление сделки указывалось ошибочно(но это почти не критично))

Это больше похоже на имитацию работы, проверял поверхностно и уже столько ошибок в работе, нет желания даже, проверять на более длинном сроке и с большими объемами (для того что бы хотя бы получить статистику "неправельности", так как уже хуже некуда).
« Последнее редактирование: пЭТРап 28, 2020, 12:57:45 pm от Serega » Записан
Pilgrim
Newbie
*
Сообщений: 48


Просмотр профиля Email
« Ответ #11 : пЭТРап 28, 2020, 07:05:25 pm »

// ==========================================================

static vr_Trd = 0;
static vr_DATA = "";
static vr_DATA_tmp = "";
static vr_DATA_out = "";
static fl_XFile;
static st_ZZZ;

         function init()
{
st_ZZZ = new_object( "statline" );
st_ZZZ.subscribe();

fl_XFile = new_object( "file" );
fl_XFile.wopen( "XFile.txt" );
}


         function out_2_XFile()
{
fl_XFile.write( vr_DATA_out );
}


         function calc()
{
if ( isHistoryCalculated() )   {

vr_Trd += 1;

vr_DATA_tmp = "\n" +
   getFormattedTime( getServerTime()) + ";" +
   getLastTradeDirection() + ";" +
   close + ";" +
   getLastTradeVolume() + "\t" +
   st_ZZZ.getparam( param_openpositions );

vr_DATA += vr_DATA_tmp; vr_DATA_tmp = "";

if ( vr_Trd > 49 ) { vr_Trd = 0; vr_DATA_out = vr_DATA; vr_DATA = ""; out_2_XFile(); }
                  }
}

// ==========================================================


Это    MGNT-3.20:   
...
18:35:39;B;3800;18    217550
18:35:39;B;3801;20    217550
18:35:39;B;3801;18    217550
18:35:39;B;3801;3      217550
18:35:39;B;3794;2      217550
18:35:39;S;3793;1      217550
18:35:39;S;3793;8      217550
18:35:39;S;3793;18    217550
18:35:39;S;3791;8      217550
18:35:39;S;3791;18    217550
18:35:39;S;3791;4      217550
18:35:50;B;3793;2      217550
18:35:50;S;3791;1      217548
18:36:02;S;3792;2      217548
18:36:09;S;3791;1      217538
18:36:09;S;3791;4      217538
18:36:09;S;3790;18    217538
18:36:09;S;3790;1      217538
18:36:09;S;3789;1      217538
...

Сравнивал с «Комбинированными котировками» инструмента. Точное соответствие в:
-  последовательности сделок внутри секунды (т.к. без десятых/сотых секунды);
-  объёмах;
-  ценах сделок.

Иногда бывает не соответствие по «инициатору сделки» (ну так процентов до пяти примерно), и
ничего не могу сказать по «ОИ» (последний столбец), т.к. уже говорили, что эти параметры приходят
по другому несколько алгоритму. Но и по «инициатору», и по «ОИ» тенденцию можно увидеть, и даже
принимать к расчёту с учётом некоторой погрешности ...
« Последнее редактирование: пЭТРап 28, 2020, 07:33:11 pm от Pilgrim » Записан
Страниц: [1] Печать 
Transaq  |  СБО "Transaq"  |  Подсистема ATF  |  Topic: Как записать в файл данные на подписанную бумагу "f.writeLn(подписка на SiH)" « предыдущая тема следующая тема »
Перейти в:  


Войти

Powered by MySQL Powered by PHP Powered by SMF 2.0.10 | SMF © 2006-2008, Simple Machines LLC Valid XHTML 1.0! Valid CSS!