新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 1060

 
Igor Zakharov:

这不是一个替代物--MB在指示器中不起作用,因为它在按下按钮之前会停止流动!这不是一个替代品。

我不经意地建议了这一点,但说明中根本不是这么说的。

注意事项

不建议 在自定义指标中使用这个函数,因为调用MessageBox()会在等待用户回答的整个过程中停止指标线程的执行。而由于每个符号的所有指标都在一个线程中执行,这个符号的所有时间段的所有图表都将被停止。

在策略测试器中工作时,MessageBox()函数没有被执行。

 
MakarFX:

我不是程序员,我编辑指标是为了自己的方便。我没有在测试器中检查,而是在实时中检查。

顺便说一句,没有心灵感应者

如果你知道这里有哪些指标使用这个功能,请告诉我,也许这样我就能自己想出办法。

谢谢

我们拥有一切。

Клуб Телепатов
Клуб Телепатов
  • 2011.05.08
  • www.mql5.com
Клуб телепатов Вас послали сюда? Тогда давайте знакомиться! Как же такое могло случиться со мной...
 
Artyom Trishkin:

你在局部范围内 声明一个结构类型的变量,它就是你发送给函数的东西。在同一个局部范围内。

问题是,当你在字段中为一个结构创建一个变量时,它的范围是在整个函数上,而不是在一个局部区域。下面是一个例子。

int OnInit()
  {
{int In=8;
 MyPoint qr;}
qr - видна здесь
In - здесь не видна
   return(INIT_SUCCEEDED);
  }

void OnDeinit(const int reason){}

struct MyPoint
{
    int x[5];
    int y;
};

事实证明,在当地工作已经不可能了。

 

试图在一个脚本中从csv文件中读取数据。没有运气,我完全不明白为什么。

我使用一个简单的程序来阅读它。

bool GetBiFromFile(string InFNam,int& alBars,double& xClose[],datetime& xTime[])
{  int  InHndl,nBars;
   bool fset;
   double aval;
   
   InHndl = FileOpen(InFNam+".csv",FILE_READ|FILE_CSV,",");
   if (InHndl==INVALID_HANDLE) {
       Print("File "+InFNam+" does not open. Error: ", GetLastError()); 
       return(false); 
   } else {
      fset = FileSeek(InHndl,0,SEEK_SET);
      ArrayResize(xClose,alBars);      
      ArrayInitialize(xClose,0.0);  
      ArrayResize(xTime,alBars);       
      ArrayInitialize(xTime,0);  
      nBars = 0;
      while (!FileIsEnding(InHndl)) {
         nBars++;
         xTime[nBars-1]  = FileReadDatetime(InHndl);;
         xClose[nBars-1] = FileReadDouble(InHndl);
         aval = FileReadDouble(InHndl);
         if (nBars>=alBars) break;
      }
   }
   Print("nBars = ",nBars,"   allBars = ",alBars);
   Print("Start: ",xClose[0],"   " + TimeToString(xTime[0],TIME_DATE|TIME_SECONDS));
   Print("End: ",xClose[nBars-1],"   " + TimeToString(xTime[nBars-1],TIME_DATE|TIME_SECONDS));
   return(true);
}

载有数据的文件有以下形式。

2012.01.02 02:00:02,1.293240,1.293410

2012.01.02 02:00:52,1.293330,1.293500

2012.01.02 02:00:55,1.293810,1.293980

....

而该程序的Print()语句的结果是

nBars = 1000 alBars = 1000

开始:0.0 2020.01.29 01:00:00

结束:0.0 2020.01.29 01:00:00

也就是说,所有的行都在读循环中被处理了,但什么也没读到。而且没有错误信息

谁能向我解释一下这个问题?


 
Yurixx:

谁能向我解释一下这个问题?

二进制函数读取一个文本文件。

 
Alexey Viktorov:

我们拥有一切。

你是邪恶的!

 
MakarFX:

你真坏!

我是假装的。

如果你想了解编程,就开始尝试弄清楚它。如果你只是需要这样做,请到他们提供免费编写的主题,在那里发布你的指标并描述你的要求。


ps:我检查了一切。由于某些原因,Alert()即使放在PlaySound() 之前也不能播放所选择的声音。也许我的记忆力不好,但这不是重点。

你可以通过双击Alert()得到一个红叉来使其静音。


在这种情况下,Alert()或PlaySound()写在它前面并不重要。

 
Alexey Viktorov:

我是假装的。


在这种情况下,无论前面写的是Alert()还是PlaySound(),都没有区别。

在这种情况下,警报窗口并没有打开。

 
fxsaber:

你用二进制函数读取一个文本文件。

关于FileReadDouble() 函数,确实说过它是从二进制文件中读取的。

但关于FileReadDatetime(),它说:"从CSV文件中读取一个字符串,其格式为:"YYYY.MM.DD HH:MI:SS","YYYY.MM.DD "或 "HH:MI:SS" - 并将其转换为日期时间值。

另外,同样的图片是在我使用FileReadString(),然后自己将字符串转换为正确的类型

你认为我应该怎么做?


 
Yurixx:

你认为应该如何做?

void OnStart()
{
  datetime time;
  
  double PriceBid;
  double PriceAsk;
  
  string Str = "2012.01.02 02:00:02,1.293240,1.293410";
  string StrArray[];
  
  if (StringSplit(Str, ',', StrArray) > 2)
  {
    time = (datetime)StrArray[0];
    
    PriceBid = (double)StrArray[1];
    PriceAsk = (double)StrArray[2];
  }
}
原因: