Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?
Октября 07, 2024, 04:51:58 pm
Начало Помощь Поиск Войти Регистрация
Новости:

Transaq  |  СБО "Transaq"  |  Подсистема ATF  |  Topic: Переменные ведут себя нелогично, помогите разобраться « предыдущая тема следующая тема »
Страниц: [1] Печать
Автор Тема: Переменные ведут себя нелогично, помогите разобраться  (Прочитано 2304 раз)
fans
Newbie
*
Сообщений: 4


Просмотр профиля Email
« : Января 03, 2023, 08:48:44 pm »

Здравствуйте! Я программист с большим стажем, но atf мне не дается, я видимо чего-то не понимают в логике обработки скриптов, а конкретно в поведении переменных. Если не сложно, подскажите или укажите где почитать, почему возникает такая нелогичная работа. Вот написал элементарный пример с имитацией покупки и продажи и выводом сообщений в терминал.
var rsi_akcii = 0;
var shag = 0;
function calc()
{
   var rsi = IndRef("rsi", 14, pt_close)[0];
   shag += 1;
   signal::output("на шаге " + shag + " у нас акций " + rsi_akcii + " rsi = " + rsi);
   if ( rsi<40 and rsi_akcii == 0 ) {
//имитируем покупку
      signal::output("КУПИЛИ по " + close + " на шаге " + shag);
      rsi_akcii = 1;
      signal::output("После полкупки на шаге " + shag + " у нас акций " + rsi_akcii);
   }
   if ( rsi>60 and rsi_akcii>0 ) {
//имитируем продажу
      signal::output("ПРОДАЛИ по " + close + "на шаге " + shag);
      rsi_akcii = 0;
      signal::output("После продажи на шаге " + shag + " у нас акций " + rsi_akcii);
   }
}
В качестве переменной-флага для учета того, была ли сделка, использую переменную rsi_akcii, чтобы как бы не было повторной покупки при каждом проходе скрипта. Но в результате получают такой вывод:
- на шаге 605 у нас акций 0 rsi = 38.0952380952278
- КУПИЛИ по 141.92 на шаге 605
- После полкупки на шаге 605 у нас акций 1
- на шаге 605 у нас акций 0 rsi = 33.3333333333243
- КУПИЛИ по 141.9 на шаге 605
- После полкупки на шаге 605 у нас акций 1
- на шаге 606 у нас акций 1 rsi = 44.4444444444444
Проблема в том, что почему-то переменная rsi_akcii после покупки получает значение 1 как и должно быть, но тут же меняет свое значение на 0, хотя 0 ей нигде не присваивается. Как так?
Записан
Almaz
Newbie
*
Сообщений: 20


Просмотр профиля Email
« Ответ #1 : Января 11, 2023, 09:15:07 pm »

http://www.transaq.ru/dokuwiki/atf:%D1%80%D1%83%D0%BA%D0%BE%D0%B2%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D0%BE
при каждом вызове calc() все переменные var обнуляются(создаются)
Записан
fans
Newbie
*
Сообщений: 4


Просмотр профиля Email
« Ответ #2 : Января 12, 2023, 10:04:47 am »

http://www.transaq.ru/dokuwiki/atf:%D1%80%D1%83%D0%BA%D0%BE%D0%B2%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D0%BE
при каждом вызове calc() все переменные var обнуляются(создаются)

Ваш ответ не подходит, потому что там еще есть:
"Первая переменная объявлена перед всеми функциями, вторая — внутри функции calc(). Вследствие этого переменная period будет доступна из всех функций, и она будет сохранять свое значение при каждом последующем обращении к calc()"
У меня переменные как раз объявлены перед всеми функциями, и должны быть "доступна из всех функций, и она будет сохранять свое значение при каждом последующем обращении к calc()". И вроде нигде не сказано, что значение таких переменных нельзя менять, и как видно из моего примера, переменная shag принимает значение 605, на следующем проходе 606 и т.д., т.е. увеличивает свое значение на +1 после каждого прохода и ведет себя как предписано.
Записан
Almaz
Newbie
*
Сообщений: 20


Просмотр профиля Email
« Ответ #3 : Января 12, 2023, 10:29:18 am »

Попробуйте вместо
var rsi_akcii = 0;
var shag = 0;
function calc()
написать
static rsi_akcii = 0;
static shag = 0;
function calc()
Записан
fans
Newbie
*
Сообщений: 4


Просмотр профиля Email
« Ответ #4 : Января 13, 2023, 10:14:43 am »

Попробуйте вместо
var rsi_akcii = 0;
var shag = 0;
function calc()
написать
static rsi_akcii = 0;
static shag = 0;
function calc()

Вообще тогда хрень какая-то получается:
JUST RSI на шаге 1453 у нас акций 1 rsi = 41.5730337078653
JUST RSI на шаге 1640 у нас акций 1 rsi = 39.3442622950826
JUST RSI на шаге 2405 у нас акций 1 rsi = 39.2473118279568
JUST RSI на шаге 2591 у нас акций 1 rsi = 27.9503105590058
Почему shag += 1; теперь выдает 1453,  1640, 2405, 2591? Прибавляет что вздумается. Эта система вообще работает нормально, я ничего не понимаю? И я программист с огромным стажем, не могу победить этот бред, а как же тогда с этим работают не программисты?????
Записан
Almaz
Newbie
*
Сообщений: 20


Просмотр профиля Email
« Ответ #5 : Января 13, 2023, 07:31:45 pm »

Я вначале матерился как...
Тут 2 пути
1 можно ругаться и отвергнуть
2 или принять ее как есть и работать с ней
Вы говорите что программист, думаю за неделю Вы освоите странности вселенной ATF...
Лично я переходил на Transaq с C# Tradematica
никого не агитирую но для работы ATF достаточно (хотя всегда хочется большего)
Сейчас бегло посмотрел Ваш алгоритм (и честно говоря не понял его)
На сайте есть примеры разных кодов (не без ошибок я вначале тоже долго вникал с VAR и STATIC)
вверху задаем глобальные переменные (да и вообще лучше их делать все глобальными тогда с помощью правой кнопки мыши можем посмотреть переменные ATF и это вам поможет в отладке. А ниже в calce задаем им значения. Есть еще один подвох в ATF (у меня ушло пару часов в начале) что на истории сообщения на экран не выводятся
Записан
Almaz
Newbie
*
Сообщений: 20


Просмотр профиля Email
« Ответ #6 : Января 13, 2023, 08:28:12 pm »

Почему shag += 1; теперь выдает 1453,  1640, 2405, 2591? Прибавляет что вздумается. Эта система вообще работает нормально, я ничего не понимаю? И я программист с огромным стажем, не могу победить этот бред, а как же тогда с этим работают не программисты?????

Скорее всего потому что вывод на экран идет через функцию signal::output
Во вселенной транзак это одно сообщение на свечку!
используйте signal::outputMultiple это множественные сообщения на свечку
а в одной свечке содержится много калков
Записан
fans
Newbie
*
Сообщений: 4


Просмотр профиля Email
« Ответ #7 : Января 16, 2023, 09:20:34 am »

Почему shag += 1; теперь выдает 1453,  1640, 2405, 2591? Прибавляет что вздумается. Эта система вообще работает нормально, я ничего не понимаю? И я программист с огромным стажем, не могу победить этот бред, а как же тогда с этим работают не программисты?????

Скорее всего потому что вывод на экран идет через функцию signal::output
Во вселенной транзак это одно сообщение на свечку!
используйте signal::outputMultiple это множественные сообщения на свечку
а в одной свечке содержится много калков
Спасибо за совет, попробую! Хотя тогда по прежнему странно, почему на каждой свечке такое разное количество вызовов calc: то около 100, то около 500. Честно говоря, теперь уже понял, что это неадекватная система с бестолково написанной справкой, поэтому использовать ее под реальную работу очень боязно а жаль.
Записан
Almaz
Newbie
*
Сообщений: 20


Просмотр профиля Email
« Ответ #8 : Января 18, 2023, 10:23:43 pm »

Ну даже не знаю.Вы не изучили ничего а уже высказываете свое мнение что это не годно для торговли (а куча дураков ее использует???)
функция calc() вызывается (что написано в руководстве) при каждом трейде то есть сделке,
а сколько сделок должно быть в одной свечке по вашему?? 10,100,1000. Сделок столько сколько реально есть.
Кто то признает свои ошибки а кто то считает что он прав а все остальные нет
впрочем успехов...
Записан
Страниц: [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!