[警告关闭!]任何新手问题,为了不给论坛添乱。专业人士,不要走过。没有你,哪里都不能去。 - 页 1085

 
khorosh:

这个功能不是我的--我在网上买的,但还没有用过。现在仔细看了一下--少了一个操作员。

正确的方法是这样的。


又错了!EA将在每一次嘀嗒 声中再次鸣叫,因为Fun_New_Bar()将始终返回true。问题是,如果Fun_New_Bar()总是返回true,我们为什么需要它呢?
 
drknn:


而且它不会工作--你一定是把程序写错了。而这是因为你不知道你自己的代码将如何工作。让我们把它分解一下。专家顾问的主体。

一个新的刻度线到来,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:


试试这个代码。这似乎是有效的,只是看它是对还是错。

不,不是这样的--我已经为你讲清楚了。你难道什么都不明白吗?
 

kolyango: 我会告诉你正确的代码。看。

//+------------------------------------------------------------------+
//|                                                            0.mq4 |
//|                                                                  |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright ""
#property link      ""

int MyChandle;// количество свеч на графике
//+------------------------------------------------------------------+
//|                  Блок инициализации                                |
//+------------------------------------------------------------------+
int init(){
  MyChandle=0;// ну или можно вот так : MyChandle=Bars;

  return(0);
}
//+------------------------------------------------------------------+
//|                  Блок деинициализации                              |
//+------------------------------------------------------------------+
int deinit(){
  if (!IsTesting()){
    Comment("");
    Print("Советник деинициализирован (выключен совсем)");
  }
  return(0);
}
//+------------------------------------------------------------------+
//|                  Старт работы советника                            |
//+------------------------------------------------------------------+
int start(){
  if(MyChandle<Bars){
   Alert("Было свеч = ", MyChandle," Стало свеч = ",Bars);

   MyChandle=Bars;
  }
  return(0);
}
//+------------------------------------------------------------------+
//|                  Пользовательские подпрограммы                       |
//+------------------------------------------------------------------+
 
drknn:
不,这是不对的--我已经把这个代码都给你写出来了。你难道什么都不明白吗?


但你看,它似乎是在正常工作!我在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);
}

 
kolyango:


但你看,它似乎是在正常工作!在M1的时间框架上检查了一下。



你看,你能不能读懂,或者不懂--上面告诉你了--不是正确的代码--它将在每个tick 上发出信号,而不是在一个新的蜡烛上发出一次。见上文--我给了你正确的代码。还有什么是你不需要的,以获得幸福?要知道为什么你的代码不对?我已经解释过了,这是不对的,因为子程序一直都是返回真,而且只返回真。每次打勾时都会弹出警报!编程不是一个猜测的游戏--你必须思考。
 
drknn:

又错了!由于Fun_New_Bar()总是返回true,EA将在每次打勾时再次发出哔哔声。问题是,如果Fun_New_Bar()总是返回true,我们到底为什么需要它呢?
它工作正常--我在图表上检查了它。当
New_Time=Time[0]

функция Fun_New_Bar() не будет возвращать истину
 
drknn:

kolyango: 我会告诉你正确的代码。看。

使用Bars 的变体则不太可取,因为Bars的值不仅会因为新条形的出现而改变。
 

drknn:
... Программирование - это не игра в угадайки - тут думать надо...

...嗯,至少有时候......。 :-)))

 
khorosh:
而使用Bars的变体则不太可取,因为Bars的值不仅会因新条形的出现而改变。


请告诉我--图表上的蜡烛数量除了出现一个新的柱子外,还能有什么变化吗?:)))))

哦,是的,这就对了--历史加载。:)总之,它的功能会在每一个滴答声 中发出哔哔声--它不能正确记住时间。

原因: