int start() // Спец. функция start { if(Fun_New_Bar())//проверка наличия нового бара { Alert("Сформировался новый бар"); // Вывод на экран } return(0); // Выход из start() } //-------------------------------------------------------------------- bool Fun_New_Bar() // Ф-ия обнаружения .. { // .. нового бара static datetime New_Time=0; // Время текущего бара bool New_Bar=false; // Нового бара нет if(New_Time!=Time[0]) // Сравниваем время { New_Time=Time[0]; // Теперь время такое New_Bar=true; // Поймался новый бар } return(New_Bar); }
//--------------------------------------------------------------------// staticvar.mq4// Предназначен для использования в качестве примера в учебнике MQL4.//--------------------------------------------------------------------int start() // Специальная функция start()
{
staticint Tick; // Статическая локальная перем
Tick++; // Счётчик тиковComment("Поступил тик № ",Tick); // Сообщение, содержащее номерreturn; // Оператор выхода из start()
}
//--------------------------------------------------------------------
那么这到底是什么?
bool Fun_New_Bar() // Fun_New_Bar detection fi
{ // ...新酒吧
static datetime New_Time=0; // 当前条形图的时间
这被称为初始化一个静态变量。只有在该变量被初始化时才会被赋值为零。
哦,伙计!酷。一个子程序被调用,一个静态变量 被初始化。子程序结束,将其变量留在RAM地址空间中。而最重要的是,没有把空间本身从忙碌中解放出来,对吗?
你的子程序中的静态初始化将在NEW!!!! 的每个新刻度上发生。这适用于所有子程序的所有变量的初始化。你的静态变量的范围和寿命是什么,嗯?
哦,伙计!酷。一个子程序被调用,一个静态变量被初始化。子程序结束,将其变量留在RAM地址空间中。而最重要的是,没有把空间本身从忙碌中解放出来,对吗?
哦,伙计!酷。一个子程序被调用,一个静态变量被初始化。子程序结束,将其变量留在RAM地址空间中。而最重要的是,没有把空间本身从忙碌中解放出来,对吗?
你的子程序中的静态初始化将在NEW!!!! 的每个新刻度上发生。这适用于所有子程序的所有变量的初始化。你的静态变量的范围和寿命是什么,嗯?
是的,检查一下你的M1图!毕竟,一切都在按部就班地进行,似乎是这样!而且它并不是每一次嘀嗒声都在 响,而是只有在形成新的嘀嗒声时 才会响。
int start() // Спец. функция start
{
if(Fun_New_Bar())//проверка наличия нового бара
{
Alert("Сформировался новый бар"); // Вывод на экран
}
return(0); // Выход из start()
}
//--------------------------------------------------------------------
bool Fun_New_Bar() // Ф-ия обнаружения ..
{ // .. нового бара
static datetime New_Time=0; // Время текущего бара
bool New_Bar=false; // Нового бара нет
if(New_Time!=Time[0]) // Сравниваем время
{
New_Time=Time[0]; // Теперь время такое
New_Bar=true; // Поймался новый бар
}
return(New_Bar);
}
要检查它是否有效很容易。为什么会有这些理论化的东西?实践是真理的标准。如果你发现了自己的知识差距,你应该感到高兴。在这种情况下,我总是很满意,并对启迪我的人说谢谢。
我同意。我有点激动。我很抱歉。检查静力学。写一个脚本。
//+------------------------------------------------------------------+ //| Старт работы скрипта | //+------------------------------------------------------------------+ int start(){ int SchVizovov=0; for(int i=1;i<5;i++){ SchVizovov=Proverka(i); } Alert("-------------------"); return(0); } //+------------------------------------------------------------------+ //| Пользовательские подпрограммы | //+------------------------------------------------------------------+ int Proverka(int Sch){ static int My_value=0; // if(My_value==0){ My_value=Sch; Alert("Статическая переменная инициализирована. Proverka() вызвана ",Sch,"-й раз. Статическая переменная = ",My_value); return(Sch); } else{ My_value=Sch; Alert("Статическая не реинициализирована. Proverka() вызвана ",Sch,"-й раз. Статическая переменная = ",My_value); } return(Sch); }
编译它,然后把它扔到图表上。其结果是http://s2.ipicture.ru/uploads/20101229/k2u2OUqX.jpg。
好吧。唉,我不得不承认,statik没有被重新初始化。然后代码就会工作。这不是好事。:( 语言帮助应该解释这种细微差别。帮助只告诉你,静态变量 在函数退出时不会丢失其值。但它并没有说这个变量在被重新初始化时不会重新初始化。天啊,我又碰到了元编辑器中的帮助不完整的事实。天啊,我以为我再也不会被抓了 :)))))))。
我同意。我有点激动。我很抱歉。检查静力学。写一个脚本。
编译它,然后把它扔到图表上。其结果是http://s2.ipicture.ru/uploads/20101229/k2u2OUqX.jpg。
好吧。唉,我不得不承认,statik没有被重新初始化。然后代码就会工作。这不是好事。:( 语言帮助应该解释这种细微差别。帮助只告诉你,静态变量在函数退出时不会丢失其值。但它并没有说这个变量在被重新初始化时不会重新初始化。哦,糟糕,我又被抓住了。天啊,我以为我再也不会被抓了 :)))))))。
不过不要生气,我们都在这里学习。碰巧的是,一些细微的差别没有引起你的注意,当你以为自己知道一切的时候,你却发现了它。
参考文献说,静态变量的初始化 是一次性的,这意味着没有重新初始化这种情况。
最主要的是不要生气,我们都在这里学习。碰巧的是,一些细微的差别没有引起你的注意,当你以为自己已经知道了一切的时候,你才发现了它。
我并不因为发现了自己知识上的漏洞而感到不安--当我发现自己代码中的错误时,当我花了一个多小时去发现它们时,当发现不是我的错,而是帮助系统或终端中的错误时,我就会感到不安。如果把我在过去6年的编程过程中为寻找与此类问题有关的错误所花费的时间加起来,我可以说我的生活中相当大的一块时间根本就被毁了。这就是令人沮丧的地方--生命的时间 被浪费在了废话上。它飞走了,再也不回来了。好吧,今天的情况并不令人不安--相反,它令人高兴--我不必花几个晚上去寻找一个错误--它很快就被发现了。
Nikolai,我再次向你道歉--6年来,我一直认为在函数中用一个值声明初始化的变量,在这个函数被再次调用时就会重新初始化。(我对终端的全局快捷方式的变量保持沉默--那是另一首歌)。事实证明,规则也有例外。今天我有一个简单的皇家课程!
帮助中说,静态变量的初始化是一次性的,这意味着不存在重新初始化。
引用帮助中的话。
静态变量在调用专门的init()函数之前被初始化一次。
而我们在哪里初始化了一个静态变量?在一个子程序中。我们打破了初始化规则--我们打破了它。
在调用init()函数之前,这个静态变量既没有被声明,也没有从子程序中调用。这就是造成混乱的原因。由于在init()块之前没有初始化静态变量,奇异性规则将是无效的,因为它被绑定在程序结构的一个特定片段上。这是帮助中对它的描述。但它并没有实现--尽管一次性规则是无效的,但重新初始化仍然没有发生!
问题是,一次性规则强加了一种僵化。这时,判断的主语和谓语之间的等价关系就发挥作用了。所以它是等价的--一个没有另一个就不存在。
但话说回来,这种语言也允许另一种违反奇异性规则的行为。如果我们按规定声明这个变量,并且如果它只能在初始化块之前被初始化一个值,我们就不能在代码的其他地方初始化这个变量,因为这将违反奇异性规则。但我做的脚本显示并非如此--变量可以用另一个值即时初始化。
我从来没有在我的代码中使用过这些变量,也不会这么做,因为这里违反了这样的规则。我不知道他们还有什么隐患。
我有一个问题 ....
当我在终端设置 中设置邮件时,在SMTP中 - 我使用smtp.gmail.com:25
我得到的错误是 - 邮件:530 5.7.0 必须先发出STARTTLS命令。l3sm2329679fan.0引用帮助中的话。
我们在哪里初始化了这个静态变量?在一个子程序中。你破坏了初始化规则--你破坏了它。
在调用init()函数之前,这个静态变量既没有被声明,也没有从子程序中调用。这就是造成混乱的原因。由于静态变量在初始化块之前没有被初始化,奇异性规则是无效的,因为它被绑定在程序结构的一个特定片段上。这正是帮助中所说的情况。但魔鬼并没有满足它--尽管奇点规则无效,但重新初始化仍然没有发生!
另外,在教程中有一个使用静态变量 的例子,从中可以看出,它只被初始化一次,否则tick计数器将无法工作。