任何菜鸟问题,为了不给论坛添乱。专业人士,不要路过。没有你就无处可去 - 6. - 页 1022

 

或者让我问一个更简单的问题。

OnCalculate()函数 中,插入了一个循环,所以它只经过一次迭代,下一次迭代只在图形被更新时进行....。

 
ara66676:

或者让我问一个更简单的问题。

在OnCalculate()函数中,插入了一个循环,所以它只经过一次迭代,下一次迭代只在图形被更新时进行....。

看起来你需要一个通灵者或一个代码来研究。
 
bistreevseh:
非常感谢您!它的工作原理很奇怪,我有管理权限,特别是对于终端文件夹,我把所有的破坏都给了所有者,这很有帮助,但后来就不工作了。然后试图用FileReadStrArrayW(如果我没有记错名字的话)读取日志文件的空行,脚本在ansi模式下挂起。只有FileReadCharArr能够读取安氏代码。也许你有一些如何用你的库解析日志文件的例子?我将非常感激!

是的,现在阅读日志时有一个问题。以前是比较容易的。

问题是,文件本身是ANSI编码的,但现在的字符串是UNICODE。

这里是这样的脚本工程。

#property strict
#property script_show_inputs

#include <FileFunctions.mqh>

input int NumLines = 10;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
 {
  string sName = TimeToString(TimeLocal(), TIME_DATE);
  StringReplace(sName, ".", "");
  string sPath = TerminalPath() + "\\MQL4\\Logs\\" + sName + ".log";
  Print(sPath);
  
  if (!FileCheckW(sPath))
   {
    Print("Файл отсутствует!");
    return;
   }
    
  int hFile = FileOpenExistingW(sPath, GENERIC_READ, SHARE_READ);
  if (hFile == NULL)
   {
    Print("Файл не открыт!");
    return;
   }

  string asArray[];
  ArrayResize(asArray, NumLines);
  Print("hFile = ", hFile);
  for (int i = 0; i < NumLines; i++) asArray[i] = string(i) + "                                                                                                                                                                                                                                                          ";
  FileReadStrArrayMW(hFile, asArray, ArraySize(asArray), 0, NumLines);
  FileCloseHandle(hFile);
  for (int i = 0; i < NumLines; i++) Alert(asArray[i]);
 }

但是,只有当日志文件首先以UNICODE格式保存时,它才会起作用。

也就是说,库的工作是正确的。我们需要想一个简单的方法,将文件的ANSI编码转换为UNICODE字符串数组,或者我应该在库中添加一个函数,在读取文件时转换字符串的编码。

=====================

选项1:你不需要处理数组。读取整个文件为ANSI,转换为UNICODE,然后用MQL进行解析。

变体2。以ANSI方式读取,将其写入终端的当前目录,并使用CSV文件的MQL函数读取它。

选择3。使用同一库中的函数在沙盒中创建一个符号 链接到日志文件,并使用处理CSV文件的MQL函数来读取它。

#property strict
#include <FileFunctions.mqh>
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
 {
  string sName = TimeToString(TimeLocal(), TIME_DATE);
  StringReplace(sName, ".", "");
  sName += ".log";
  
  string sPathLogs = TerminalPath() + "\\MQL4\\Logs\\" + sName;
  string sPathFiles = TerminalPath() + "\\MQL4\\Files\\" + sName;
  
  Print(sPathLogs);
  Print(sPathFiles);
  
  if (!FileCheckW(sPathLogs))
   {
    Print("Файл отсутствует!");
    return;
   }
  
  if (!FileCheckW(sPathFiles) && !FileSymbolicLinkW(sPathLogs, sPathFiles))
   {
    Print("Символьная ссылка не создана!");
    return;
   }
  
  int hFile = FileOpen(sName, FILE_READ|FILE_CSV|FILE_ANSI, '\t');
  if (hFile == INVALID_HANDLE)
   {
    Print("Файл не открыт!");
    return;
   }
  
  while (!FileIsEnding(hFile)) Alert(FileReadString(hFile));
  FileClose(hFile);
 }

在我看来,这是最美好和最简单的选择。

 

我正试图编写一个通道指标。我计算了用于在图表上绘图的数值,并将它们放入双tob[]和双tos[]数组中,但当我试图将它们连接到用于在图表上绘图的缓冲区时--在第25和26行。

SetIndexBuffer(0, tob);
SetIndexBuffer(1, tos);

,这些数组代替了所需的值,例如。

0/1.424/1.3679
1/1.42/1.3639

被填上数字2147483647,像这样。
0/2147483647/2147483647
1/2147483647/2147483647
2/2147483647/2147483647

这怎么能治好呢?

附加的文件:
channel1.mq4  7 kb
 
是否有任何热键可以在不同时期快速切换?
按D,H1切换到M15,按U,切换到H1。
 

帮我找一个MT4的模板,把白天和黑夜分开。

比方说,从00:00到8:00的图表是一种颜色,从8:00到00:00是另一种颜色。

 

向大家问好。

面对这个问题。

一个机器人代码的片段。

int per=Period();
if(per = 60)
{

Print("如果句号不是H1,这一行不应该出现在日志中")。

评论(...)。

...// 这里是机器人的身体

...

...

}

意味着如果在图表上启用了H1以外的周期,机器人主体、Print(...)行和屏幕上的Comment(...)都不会被执行。

然而,一切都在任何时期执行。为什么?

如何正确书写,即如果图表上的周期与指定的不一致--将控制权返回给终端。(顺便说一下,我试过RETURN(0)--无济于事--仍然打印一切...)

 
Dikons:

向大家问好。

面对这个问题。

机器人代码片段。

int per=Period()。
如果(per = 60)
{

Print("如果时期不是H1 - 这一行不应该出现在日志中")。

评论(...)。

...//然后是机器人的身体

...

...

}

意味着如果图表中H1以外的周期被启用,机器人的主体、Print(...)字符串以及屏幕上的Comment(...)都不会被执行。

然而,一切都在任何时期执行。为什么?

如何正确注册,如果时间框架与设定的不一致--将控制权返回给终端。(顺便说一下,我试过RETURN(0)--它不起作用--仍然打印一切...)

你在做作业,你需要比较 if(per== 60)
 
Trader76:
你在做赋值,而你需要比较 if(per== 60)

谢谢你,同志...我的大脑已经完全沸腾了......我在编程方面有一个重大的突破--我已经忘记了很多我所知道的一点东西......

---

还有一个问题...按终端搜索一天中最大/最小前8小时的片段。

int h=TimeHour(TimeCurrent()); //找出当前的终端小时(0...23)
if (h<8) return(0); //如果没有一天中前8根蜡烛的H1 = leave...

double Maxi=High[iHighest(NULL,PERIOD_H1,MODE_HIGH,8,h-7)]; // 确定一天中最大的前8根蜡烛。

double Mini=Low[iLowest(NULL,PERIOD_H1,MODE_LOW,8,h-7)] 。


如果图表周期被设置为H1以外的其他内容,最后两行就不能正常工作。为什么?因为机器人已经被明确分配了一个计算周期...

例如,如果你把H4放在图表上,机器人将使用H4蜡烛进行重新平衡(其他时间段也是如此)。

 
Dikons:

谢谢你,同志...我的大脑已经完全沸腾了......我在编程方面有一个重大的突破--我已经忘记了很多我所知道的一点东西......

---

还有一个问题...按终端搜索一天中最大/最小前8小时的片段。

int h=TimeHour(TimeCurrent()); //找出当前的终端小时(0...23)
if (h<8) return(0); //如果没有一天中前8根蜡烛的H1 = leave...

double Maxi=High[iHighest(NULL,PERIOD_H1,MODE_HIGH,8,h-7)]; // 确定一天中最大的前8根蜡烛。

double Mini=Low[iLowest(NULL,PERIOD_H1,MODE_LOW,8,h-7)] 。


如果图表周期被设置为H1以外的其他内容,最后两行就不能正常工作。为什么?因为机器人已经被明确分配了一个计算周期...

例如,如果你把H4放在图表上,机器人将使用H4蜡烛进行重新平衡(其他时间段也是如此)。

这里你可以得到最大/最小条数:iHighest(NULL,PERIOD_H1,MODE_HIGH,8,h-7)

然后你插入例如第2条,得到:High[2],在另一个时间框架上你会得到一个与H1不同的值。阅读关于高。

iHigh(NULL,PERIOD_H1, iHighest(NULL,PERIOD_H1,MODE_HIGH,8,h-7))