//-------------------------------------------------------------------- int start() // Спец. функция start { if(Fun_New_Bar())//проверка наличия нового бара return; // Выход из 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; // Поймался новый бар Alert("Сформировался новый бар"); // Вывод на экран } } //--------------------------------------------------------------------
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); }
这个功能不是我的--我在网上买的,但还没有用过。现在仔细看了一下--少了一个操作员。
正确的方法是这样的。
又错了!EA将在每一次嘀嗒 声中再次鸣叫,因为Fun_New_Bar()将始终返回true。问题是,如果Fun_New_Bar()总是返回true,我们为什么需要它呢?
而且它不会工作--你一定是把程序写错了。而这是因为你不知道你自己的代码将如何工作。让我们把它分解一下。专家顾问的主体。
一个新的刻度线到来,Fun_New_Bar()函数被调用。如果它向主程序返回真,就会弹出Alert。否则,EA通过返回来终止其工作,并等待一个新的tick。一切都在一个新的刻度上重复。
你说这个代码不工作?现在看看你的子程序里有什么。
声明了一个布尔函数。由于它是一个函数而不是一个过程,它应该向调用它的主程序返回一些东西。由于该函数是布尔型的,它应该返回一个布尔型的值。你在哪里有一个向主程序返回任何东西的字符串?它没有!这意味着在程序开始时,由于函数没有返回任何东西,if(Fun_New_Bar())表达式的括号将永远是假的,警报永远不会弹出。
让我们更进一步。你为什么要把数据时间New_Time=0;声明为静态?你的理由是什么?你声明了一个变量并立即将其初始化为零。在下一次嘀嗒声中,同样的事情将发生--变量将再次被声明和初始化为零。If(New_Time!=Time[0]){ 这一行检查变量的值是否与当前时间不相等。嗯,是的,变量有零,但当前时间不是零。条件得到满足,当前的时间值被写入变量,参数New_Bar变为true。在下一次打勾时 ,New_Time不会再 等于Time[0],它将再次成功地检查不等式,接下来的两个操作将被执行。换句话说,当检查条件if(New_Time!=Time[0])时,括号内的表达式将在每个刻度处为真。始终如此。这就引出了一个问题,如果它总是真实的,为什么这个支票要在这里?也许我们应该直接删除它?如果这两个变量不在任何地方使用,我们为什么要指定New_Time=Time[0]和New_Bar=true?我们到底为什么需要这两项任务?你想玩一玩吗?还是你懒得去思考?
试试这个代码。这似乎是有效的,但要看它是对还是错。如果有什么不对,就纠正它。
//--------------------------------------------------------------------
int start() // Спец. функция start
{
if(Fun_New_Bar())//проверка наличия нового бара
return; // Выход из 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; // Поймался новый бар
Alert("Сформировался новый бар"); // Вывод на экран
}
}
//--------------------------------------------------------------------
试试这个代码。这似乎是有效的,只是看它是对还是错。
kolyango: 我会告诉你正确的代码。看。
不,这是不对的--我已经把这个代码都给你写出来了。你难道什么都不明白吗?
但你看,它似乎是在正常工作!我在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);
}
但你看,它似乎是在正常工作!在M1的时间框架上检查了一下。
又错了!由于Fun_New_Bar()总是返回true,EA将在每次打勾时再次发出哔哔声。问题是,如果Fun_New_Bar()总是返回true,我们到底为什么需要它呢?
New_Time=Time[0] функция Fun_New_Bar() не будет возвращать истину
kolyango: 我会告诉你正确的代码。看。
drknn:
... Программирование - это не игра в угадайки - тут думать надо...
...嗯,至少有时候......。 :-)))
而使用Bars的变体则不太可取,因为Bars的值不仅会因新条形的出现而改变。
请告诉我--图表上的蜡烛数量除了出现一个新的柱子外,还能有什么变化吗?:)))))
哦,是的,这就对了--历史加载。:)总之,它的功能会在每一个滴答声 中发出哔哔声--它不能正确记住时间。