вот и второй варинт
выходит так что переменные указывают на одно и тоже место в памяти после первого присвоения
if(firsttime) { backup = StringVal;
хотел бы я знать с какого билда эта лебеда тянется
вот пример
extern string StringVal = "string"; string backup = ""; bool firsttime = true; int init() { Print("========================="); Print("StringVal=",StringVal," backup=",backup); if(StringVal != backup){ if(firsttime) { backup = StringVal; Print(" First Call ===> backup = StringVal"); } Print("StringVal=",StringVal,"< > backup=",backup); } firsttime = false; } int start() { }
если компилирую как эксперт
то при изменении StringVal сразу же меняется backup
причем последний Print не вызывается
где собака зарыта?
Ну вы же StringVal вручную меняете и сразу инит отрабатывает, все верно...
понятно что init() срабатывает
проблема в том что 2. переменная обнавляется независимо от других условий
нет условия на обновление - а обновление происходит!
да всё это понятно
проблема в том что 2. переменная обнавляется независимо от других условий
причём ВСЕГДА
КОСЯК СЕРЪЁЗНЫЙ
приведу подобный пример
значение первой переменной передаётся второй переменной всего лишь один раз и значение второй переменной не должно менятся при дальнейшем исполнении программы
однако при каждом изменении первой переменной - меняется и вторая, что не должно быть
extern string Value = "O"; string temp_=""; bool firsttime=true; int start() { string txt=StringConcatenate( " Value: ",Value,"\n", " temp_: ",temp_,"\n", " firsttime: ",firsttime); if(firsttime) { temp_=Value; firsttime=false; } // значение присваевается тольо ОДИН раз Print(txt); Comment(txt); }
приведу подобный пример
значение первой переменной передаётся второй переменной всего лишь один раз и значение второй переменной не должно менятся при дальнейшем исполнении программы
однако при каждом изменении первой переменной - меняется и вторая, что не должно быть
При изменении extern переменной происходит перезапуск советника, что приводит к инициализации переменных, объявленных на глобальном уровне. Все правильно. Если хотите этого избежать - используйте Глобальные переменные.
неправильно - никакой инициализации не производитсья
вот доказательство из справки
Инициализация глобальных переменных производится однократно сразу после загрузки программы в память клиентского терминала.
и вообще здесь дело не в инициализации а в изменении переменной
прошу внимательно код прочитать
причём проблема возникает только с переменными типа string
c другими типами без проблем!
вот и второй варинт
выходит так что переменные указывают на одно и тоже место в памяти после первого присвоения
хотел бы я знать с какого билда эта лебеда тянется
вот пример
у вас всегда выполнено условие StringVal != backup и firsttime всегда будет true, поскольку он (инит) запускается единственный раз но при КАЖДОМ перезапуске советника, а новый пуск происходит при смене тф окна, при изменении сета при запуске терминала. То есть когда вы изменяете StringVal вы снова запускаете инит.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
если компилирую как эксперт
то при изменении StringVal сразу же меняется backup
причем последний Print не вызывается
где собака зарыта?