[存档]任何菜鸟问题,为了不使论坛变得杂乱无章。专业人士,不要路过。没有你就无处可去 - 3. - 页 309

 
artmedia70:

这就对了:整理自己的垃圾是一种好的礼仪......

但在这种情况下,你怎么能说 "垃圾 "现在需要清理,或者反过来说:它不是垃圾--它是进一步计算的必要数据。

按照我的理解,deinit()应该用来清理垃圾,但...它不仅在交易工具的图表被删除、专家顾问被移除时执行,而且在TF被改变时也执行。在这种情况下,TF的所有累积数据都会丢失,当专家顾问回到上一个时间框架时,它将以零数组重新开始工作。如果我们改变专家顾问的任何参数,也会发生同样的情况。

事实证明,在某些情况下,"垃圾收集 "是一个复杂的逻辑过程,而不是简单的改变数组大小。


嗯,这并不复杂。在循环中,用数值初始化数组。然后,我们对产生的数组进行处理。当工作完成后,我们使其长度为零。如果有疑问,你可以在代码末尾的return(0)之前进行。
 

请建议使用下面的代码来读取日志文件。按日期自动读取当前的日志文件并输出到打印机。

在哪里?

while (result>0) {

文件是由零件组装而成的。但我不需要整个文件,只需要最后一行。请帮助纠正。

void ReadWrite() {
   string tekTime=TimeStr1(CurTime(),1);
   string path=TerminalPath()+"\\logs\\"+tekTime+".log";
   string title="Чтение из файла";
   string msg;
   int result;
   int handle=_lopen(path,4);
   if (handle<0) {
      msg="Ошибка открытия файла";
      //MessageBox(msg,title,MB_OK|MB_ICONERROR);
      Print(msg);
      return;
   }
   result=_llseek (handle,0,0);
   string buffer="";
   //string char="x                      ";
   string char="x                                                                                                                                                                                                                                                         ";
   int count=0;
   result=_lread (handle,char,250);
   while (result>0) {
      buffer=buffer+char;
      char="x                                                                                                                                                                                                                                                         ";
      count++;
      result=_lread (handle,char,250);
   }
   result=_lclose (handle);
   msg=StringTrimRight(buffer);
   //MessageBox(msg,title,MB_OK|MB_ICONINFORMATION);
   Print(msg);
}

//------------------расчет времени----------------
string TimeStr1(int taim,int tip)
{
   string sTaim;
   string sTaim1,sTaim2,sTaim3;
   if (tip==1) 
   {
      int GD=TimeYear(taim);                  
      int MN=TimeMonth(taim);                  
      int DD=TimeDay(taim);  
      
      sTaim1 = DoubleToStr(GD,0);
      if (MN<10) sTaim2 = StringConcatenate(sTaim2,"0"+DoubleToStr(MN,0));
      else sTaim2 = StringConcatenate(sTaim2,DoubleToStr(MN,0));
      if (DD<10) sTaim3 = StringConcatenate("0",DoubleToStr(DD,0));
      else sTaim3 = DoubleToStr(DD,0);
      sTaim=sTaim1+sTaim2+sTaim3;
   }
   return(sTaim);
}
 
drknn:

嗯,这并不难。在循环中,数组被初始化为数值。然后,我们对产生的数组进行处理。当工作结束后,我们把它变成一个零长度的阵列。如果有疑问,你可以在代码末尾的return(0)之前进行。

我被误解了。

在对话的背景下(如果我正确理解这次对话的前提),循环是EA本身。毕竟,每次打勾时,数组要么增加,要么保持不变,这取决于是否需要向其写入一个新的值。

我们怎么能知道工作已经完成,而不仅仅是例如一个人改变了时间框架?即使是意外...在这种情况下,deinit()将被调用,所有数据都将丢失。专家顾问将根据新的时间框架(新的周期)中获得的数值,开始重新存储(在动态数组 中写入)它们。

这就是我的意思。

 
artmedia70:

我没有被理解。

在我们讨论的背景下(如果我对这次讨论的前提理解正确的话),周期是专家顾问本身的工作。毕竟,每次打勾时,数组要么增加,要么保持不变,这取决于是否需要向其写入一个新的值。

例如,你如何判断一项工作是否已经完成,而不仅仅是一个人在改变时间框架?即使是意外...在这种情况下,deinit()将被调用,所有数据都将丢失。专家顾问将根据在新的时间框架(新的周期)中获得的价值,开始重新积累它们(将它们写入一个动态数组)。

我的观点是这样的。

如果你深入了解细节,你可以使用这个功能。它将告诉你取消初始化的原因是什么。
 

我注意到终端的一个具体特征。由于订单利润计算不考虑OrderSwap(),我希望它能一次性关闭订单。


这意味着我们应该使用这个公式来关闭订单并获得利润。

(OrderProfit()+OrderSwap()+OrderCommission())>0

我从来没有使用过佣金,佣金也没有在演示中使用,这就是为什么我不能在账户上检查它。

我的计算方法是否正确?

 
Zhunko:
如果你深入了解细节,你可以使用这个功能。它将告诉你取消初始化的原因。

相当正确...:)

忘了它。现在,以我使用 "万无一失 "的习惯,我们将使用它...

 
artmedia70:

ObjectGetValueByShift()来帮助你

你将如何与之合作--只有你自己知道......


谢谢你,好心人!
 
两个问题。

1.如何在数组 double abc[10] 中写入/输入第一个和后续变量 doubleab=a*b?
2.如何将第11个变量写进数组,去掉第一个变量?

变量在数组中的书写顺序(向前或向后)并不重要。数组中的变量需要用来确定算术平均值。
 
我可以改变挂单 的手数吗?
 
Parn25:
我可以改变挂单的手数吗?


不,你不能。

你能改变的一切都在这里解释了https://docs.mql4.com/ru/trading/OrderModify