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

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



Просмотр профиля Email
« : 13.11.2010, 15:04:57 »

Quote
Технические подробности
— Глобальные переменные сохраняют свое значение при переходе к расчету очередной свечи, однако сбрасывают значение при пересчете последней свечи по приходу нового трейда.

Хотелось бы уточнить...

До какого состояния они "сбрасывают значение"?
Если, например, переменная была объявлена как var period = 10 в самом начале кода, то до этой самой десятки она и будет сбрасываться при приходе каждого нового трейда, а при переходе к новой свечке она сохраняет своё ПОСЛЕДНЕЕ значение до того момента, пока с ней не начнёт свои "манипуляции" функция CALC?
А если она была объявлена как статическая, например static period = 0, то она уже никогда не будет сбрасывать своё значение - ни при переходе от свечки к свечке, ни при приходе нового трейда?

Правильно я понял?

А если переменная объявлена как внешняя, т.е. например extern period = 10, то она будет вести себя как статическая или как обычная? В смысле, она всё время будет считывать своё значение "оттуда"? В смысле, из таблицы?

Во сколько вопросов! Честно говоря, хотелось бы, чтобы в документации этот аспект был рассмотрен более подробно и желательно на ОЧЕНЬ простых примерах.
Записан

Коллеги!
МТС фокусничает!
Будьте бдительны сами и предупредите всех своих хороших знакомых!
Я тоже на днях вляпался.
Схема "фокуса" описана вот здесь:
http://www.forum.sib.mts.ru/viewtopic.php?f=344&t=11381
Heller
Разработчики
Hero Member
*****
Сообщений: 1277


Просмотр профиля Email
« Ответ #1 : 18.11.2010, 16:38:05 »

static-переменные не сбрасываются никогда.
extern-переменные это вообще вроде констант - их можно только читать, но не писать.

С обычными var-переменными несколько сложнее.

Тут надо понимать чем обусловлено такое поведение. Индикаторе в литературе, да и вообще людьми, чаще мыслятся в терминах уже законченных свечек. Последняя свечка при этом постоянно пересчитывается. То есть по идеи значение индикатора на последней свечке при обычном расчете не учитывает те колебания цены, которые происходили внутри нее. То есть индикатор должен при каждом трейде как бы рассчитываться "с нуля", то есть якобы мы сразу получили имели последнюю свечку, без каких-либо расчетов "внутри" нее.

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

Общие рекомендации я думаю можно дать такие:

- для расчета значений индикаторов лучше использовать переменные var
- для учета позиций, счетчиков и подобных вещей, не связанных с индикатором напрямую (на например связанных с торговым роботом), использовать переменные static
- если вас не интересуют промежуточные значения индикаторов, построенные на неполной последней свече, используйте вместо функции calc() функцию onNewCandle()
Записан
Олег
Hero Member
*****
Сообщений: 849



Просмотр профиля Email
« Ответ #2 : 20.11.2010, 17:25:52 »

Спасибо за подробное доходчивое разъяснение.
Записан

Коллеги!
МТС фокусничает!
Будьте бдительны сами и предупредите всех своих хороших знакомых!
Я тоже на днях вляпался.
Схема "фокуса" описана вот здесь:
http://www.forum.sib.mts.ru/viewtopic.php?f=344&t=11381
Олег
Hero Member
*****
Сообщений: 849



Просмотр профиля Email
« Ответ #3 : 25.11.2010, 12:58:05 »

- если вас не интересуют промежуточные значения индикаторов, построенные на неполной последней свече, используйте вместо функции calc() функцию onNewCandle()

Но тогда возникает ещё один "подводный камень", поскольку при наличии в скрипте одновременно calc и onNewCandle (а совсем без calc, согласитесь, всё-таки трудно обойтись), эти функции вызываются на каждой новой свечке ( как я понял из Руководства ATF) в таком порядке:

1. calc()
2. onNewCandle()
3. calc()
4. calc()
5. calc()
...........
n. calc()

А в такой ситуации нелегко уследить за переменными :)

Quote from: Руководство ATF
Третий инструмент, позволяющий обойти стандартное поведение ATF — это определяемая пользователем функция onNewCandle(). Она вызывается однократно после того, как на графике появляется новая свечка. Надо заметить, что вызывается она только после вызова calc().
Записан

Коллеги!
МТС фокусничает!
Будьте бдительны сами и предупредите всех своих хороших знакомых!
Я тоже на днях вляпался.
Схема "фокуса" описана вот здесь:
http://www.forum.sib.mts.ru/viewtopic.php?f=344&t=11381
Heller
Разработчики
Hero Member
*****
Сообщений: 1277


Просмотр профиля Email
« Ответ #4 : 25.11.2010, 13:22:06 »

Ну надо по конкретным ситуациям смотреть.
Записан
Олег
Hero Member
*****
Сообщений: 849



Просмотр профиля Email
« Ответ #5 : 25.11.2010, 15:34:26 »

Но всё-таки я правильно понял, что эти функции будут вызываться на каждой новой свечке именно в таком порядке? Тогда если переменная типа var будет фигурировать в обеих функциях, то за ней будет очень трудно уследить.
Записан

Коллеги!
МТС фокусничает!
Будьте бдительны сами и предупредите всех своих хороших знакомых!
Я тоже на днях вляпался.
Схема "фокуса" описана вот здесь:
http://www.forum.sib.mts.ru/viewtopic.php?f=344&t=11381
Олег
Hero Member
*****
Сообщений: 849



Просмотр профиля Email
« Ответ #6 : 28.11.2010, 20:35:22 »

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

В скрипте, который сейчас разрабатываю, столкнулся с неожиданным поведением переменной типа STATIC. Решил написать очень простенький скрипт, чтобы разобраться.
Скрипт написал вот такой:

Code: [Select]
#samewindow
#line 0 solid red

static MyVariable = "Yes";

function calc()
{
   signal::outputMultiple (" Это функция Calc" +
   "   MyVariable = " + MyVariable);
   line[0]=close;
   MyVariable = "No";
}

Разумеется, ожидал, что один раз получу сообщение, что моя переменная имеет значение "Yes", а все другие сообщения будут говорить, что она имеет значение "No". Не тут-то было!
В окне вывода ATF увидел вот такую картину:

 
Quote
Это функция Calc   MyVariable = No
 Это функция Calc   MyVariable = No
 Это функция Calc   MyVariable = No
 Это функция Calc   MyVariable = No
 Это функция Calc   MyVariable = No
 Это функция Calc   MyVariable = No
 Это функция Calc   MyVariable = No
 Это функция Calc   MyVariable = No
 Это функция Calc   MyVariable = No
 Это функция Calc   MyVariable = No

Решил попробовать дополнительно присвоить ей значение "Yes" в функции INIT:

Code: [Select]
#samewindow
#line 0 solid red

static MyVariable = "Yes";

function init()
{
   MyVariable = "Yes";
 }

function calc()
{
   signal::outputMultiple (" Это функция Calc" +
   "   MyVariable = " + MyVariable);
   line[0]=close;
   MyVariable = "No";
}

В результате в окне вывода ATF ничего нового не увидел:

 
Quote
Это функция Calc   MyVariable = No
 Это функция Calc   MyVariable = No
 Это функция Calc   MyVariable = No
 Это функция Calc   MyVariable = No
 Это функция Calc   MyVariable = No
 Это функция Calc   MyVariable = No
 Это функция Calc   MyVariable = No
 Это функция Calc   MyVariable = No
 Это функция Calc   MyVariable = No
 Это функция Calc   MyVariable = No

Почему так происходит? Как заставить переменную типа STATIC иметь то значение,  с которой я хочу её инициализировать?
Записан

Коллеги!
МТС фокусничает!
Будьте бдительны сами и предупредите всех своих хороших знакомых!
Я тоже на днях вляпался.
Схема "фокуса" описана вот здесь:
http://www.forum.sib.mts.ru/viewtopic.php?f=344&t=11381
Heller
Разработчики
Hero Member
*****
Сообщений: 1277


Просмотр профиля Email
« Ответ #7 : 29.11.2010, 14:04:53 »

Тут дело в том, что сообщения signal::output выводятся только при расчете в реальном времени, то есть когда calc() вызывается при прохождении трейдов. Изначально calc() рассчитывается для всех свечек в истории, и в этот момент сообщения не выводятся.
Записан
Олег
Hero Member
*****
Сообщений: 849



Просмотр профиля Email
« Ответ #8 : 29.11.2010, 20:21:23 »

Тут дело в том, что сообщения signal::output выводятся только при расчете в реальном времени, то есть когда calc() вызывается при прохождении трейдов. Изначально calc() рассчитывается для всех свечек в истории, и в этот момент сообщения не выводятся.

Тогда, наверно, придётся мне в разрабатываемом в данный момент скрипте ещё одну переменную вводить, которая будет учитывать количество вызовов подпрограммы из функции CALC() для каждой конкретной свечи. Если имеется только одно обращение,  свеча "мёртвая" и это обращение игнорируем, а если больше чем одно, значит свеча "живая" и подпрограмма получает разрешение делать своё чёрное дело :)
« Последнее редактирование: 29.11.2010, 21:37:05 от Олег » Записан

Коллеги!
МТС фокусничает!
Будьте бдительны сами и предупредите всех своих хороших знакомых!
Я тоже на днях вляпался.
Схема "фокуса" описана вот здесь:
http://www.forum.sib.mts.ru/viewtopic.php?f=344&t=11381
Heller
Разработчики
Hero Member
*****
Сообщений: 1277


Просмотр профиля Email
« Ответ #9 : 03.12.2010, 12:53:54 »

На мой взгляд слишком сложно. Вы можете вместо этого проверять функцию isHistoryCalculated() или же переопределить функцию onHistoryCalculated().
Записан
Олег
Hero Member
*****
Сообщений: 849



Просмотр профиля Email
« Ответ #10 : 03.12.2010, 21:08:29 »

На мой взгляд слишком сложно. Вы можете вместо этого проверять функцию isHistoryCalculated() или же переопределить функцию onHistoryCalculated().

Так у меня же пока ещё нет этих фишек! :(  Я же до сих пор живу в эпоху версии 4.98 :(  Вот и приходится выкручиваться, например, вот так:
Code: [Select]
 
   // Фильтр, запрещающий анализ всех "мертвых" свечек.
   CalcCallsCounter = CalcCallsCounter + 1;
   if (CalcCallsCounter <= noCandle()){return;}
« Последнее редактирование: 03.12.2010, 21:18:13 от Олег » Записан

Коллеги!
МТС фокусничает!
Будьте бдительны сами и предупредите всех своих хороших знакомых!
Я тоже на днях вляпался.
Схема "фокуса" описана вот здесь:
http://www.forum.sib.mts.ru/viewtopic.php?f=344&t=11381
Страниц: [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!