Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?
16.02.2025, 08:22:46
Начало Помощь Поиск Войти Регистрация
Новости: ООО «Скрин маркет системз», правообладатель программы «Система брокерского обслуживания «TRANSAQ» официально заявляет, что не ведет никакой деятельности в мессенджерах или социальных сетях. 
Подробности на нашем сайте  WWW.TRANSAQ.RU.

Transaq  |  СБО "Transaq"  |  Подсистема ATF  |  Topic: Массив почему-то не массив. Всю голову сломал. « предыдущая тема следующая тема »
Страниц: [1] Печать
Автор Тема: Массив почему-то не массив. Всю голову сломал.  (Прочитано 3749 раз)
andreyvv
Jr. Member
**
Сообщений: 89


Просмотр профиля Email
« : 14.06.2019, 15:55:01 »

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




#samewindow
#line 0 solid red // Текущее значение массива
#line 1 dashed black // Прошлое значение массива

static data;


function drawline()
{
   data.clear(); // Очищаем массив - БЕЗ ЭТОГО РЕЗУЛЬТАТЫ РАСЧЁТОВ = 0

   data.push(low); // Вносим в конец массива
   
}


function init()
{
    data = new_object("array"); // Создаём массив data
       
    var xml = new_object("xmlarchive"); // Создаём объект
   xml.loadfile("file.xml"); // Загружаем сохранённые данные индикатора
   data = xml.loadvar("data"); // Получаем переменные

    setTimer("drawline", 60000,  TIMER_PERIODICALLY); // Включаем функцию drawline по таймеру
     
}


function onStopIndicator(var reason) {
   var xml = new_object("xmlarchive"); // Создаём объект
   xml.newdocument("file.xml"); // Создаём новый файл
   xml.savevar("data", data); // Сохранеяем data в xml-архив
   xml.savefile();
}


function calc()
{

line[0] = data[0]; // Отрисовываем текущее значение  (ЕСЛИ ОСТАВИТЬ ПРОСТО data - не работает

line[1] = data[1]; // Отрисовываем прошлое значение (ЭТА ЛИНИЯ ПОЧЕМУ-ТО ВСЕГДА = 0)

}

Код работает нормально, кроме этой строчки:

line[1] = data[1]; // Отрисовываем прошлое значение (ЭТА ЛИНИЯ ПОЧЕМУ-ТО ВСЕГДА = 0)

При попытке обратиться к прошлой ячейке массива (по замыслу по-крайней мере) рисует line[1] = 0;

Такое ощущение, что массив почему-то состоит всего из одной ячейки с текущим значением.

Возможно проблема в том, что массив очищается в функции:

data.clear(); // Очищаем массив - БЕЗ ЭТОГО РЕЗУЛЬТАТЫ РАСЧЁТОВ = 0

Но как написано в комментарии без data.clear(); код не работает. В xml data, кстати, тоже сохраняется в виде единственного числа.

В manual-е крайне мало описания работы с массивами, надежда только на форум. Голову уже сломал как этот код заставить работать как задумано.
« Последнее редактирование: 14.06.2019, 15:57:04 от andreyvv » Записан
Pilgrim
Newbie
*
Сообщений: 48


Просмотр профиля Email
« Ответ #1 : 14.06.2019, 23:31:22 »

Попробуйте такой вариант drawline():

function drawline()
{
data.unshift( low );
}

А в init(), после определения массива, добавьте строчки:

data.resize( 2 );
data[ 0 ] = 1; data[ 1 ] = 1; // это первые значения для calc(), любые значения удобные для начала графика, в общем ...

И я бы ещё разместил drawline() всё таки после init() ...
Записан
andreyvv
Jr. Member
**
Сообщений: 89


Просмотр профиля Email
« Ответ #2 : 15.06.2019, 08:57:47 »

Благодарю за ответ. Доберусь до Транзака попробую ваш вариант. Жаль, конечно, что разработчики забросили тему, лично для меня ATF решает многие проблемы алготрейдинга. Когда есть язык программирования прямо в терминале брокера без всяких танцев с бубном вокруг API и Python или C# это хорошо.
Записан
Pilgrim
Newbie
*
Сообщений: 48


Просмотр профиля Email
« Ответ #3 : 15.06.2019, 14:02:46 »

Согласен с Вами. Остается надеяться на то, что разработчики в каком нибудь очередном
релизе терминала не изымут из него АТФ. Тогда придется решать те же задачи только
кратно сложными путями: API, C#, «кубики» и другими «бубнами». При этом многие из
альтернативных решений ещё и уступают АТФ в скорости и надежности, судя по
форумам ...
Записан
andreyvv
Jr. Member
**
Сообщений: 89


Просмотр профиля Email
« Ответ #4 : 17.06.2019, 10:47:16 »

Спасибо, добрый человек. Оно работает ). Чтобы при выключении роботов сохранялись значения линий в XML добавил код сохранения в файл. Единственная проблема, что не нашёл как добавлять разные переменные от разных эмитентов в один файл. Почему-то не нашёл как открыть уже существующий файл XML и переписать существующие переменные на новые значения. Получается, файл всё время надо пересоздавать и сохранять с новыми переменными. И, скажем, при запущенных роботах на 100 эмитентах будет в папке 100 файлов с переменными по каждому эмитенту лежать. Не очень верно, но, в принципе, терпимо. Код:

#samewindow
#line 0 solid red // Текущее значение массива
#line 1 dashed black // Прошлое значение массива

static data;


function init()
{
    data = new_object("array"); // Создаём массив data
    data.resize( 2 );

    var xml = new_object("xmlarchive"); // Создаём объект
    xml.loadfile("file.xml"); // Загружаем сохранённые данные индикатора
    data[0] = xml.loadvar("data_0"); // Получаем переменные
    data[1] = xml.loadvar("data_1"); // Получаем переменные   
       
    setTimer("drawline", 60000,  TIMER_PERIODICALLY); // Включаем функцию drawline по таймеру
     
}


function drawline()
{
data.unshift( low ); // Получаем значение low по таймеру в массива

}

function onStopIndicator(var reason) {

   var xml = new_object("xmlarchive"); // Создаём объект
   xml.newdocument("file.xml"); // Создаём новый файл
   xml.savevar("data_0", data[0]); // Сохраняем data[0] в xml-архив
        xml.savevar("data_1", data[1]); // Сохраняем data[1] в xml-архив
   xml.savefile(); // Сохраняем файл
}


function calc()
{

line[0] = data[0]; // Текущее значение
line[1] = data[1]; // Прошлое значение


}
Записан
andreyvv
Jr. Member
**
Сообщений: 89


Просмотр профиля Email
« Ответ #5 : 17.06.2019, 13:57:47 »

Сейчас думаю, как синхронизировать время периодического срабатывания таймера со временем сервера. То есть, сейчас получается, что срабатывание таймера и получение данных зависит от того, когда запущен робот. Думается, есть способ как-то синхронизировать, чтобы данные обновлялись близко к началу новой свечи (вернее к началу нового минутного интервала времени сервера) на графике. Тогда будет грамотная эмуляция минутного (или любого другого фрейма) на дневном или каком угодно интервале.
« Последнее редактирование: 17.06.2019, 14:00:06 от andreyvv » Записан
Страниц: [1] Печать 
Transaq  |  СБО "Transaq"  |  Подсистема ATF  |  Topic: Массив почему-то не массив. Всю голову сломал. « предыдущая тема следующая тема »
Перейти в:  


Войти

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