错误、漏洞、问题 - 页 1699

 
Karputov Vladimir:
你不能把每一个错误的编程风格都归咎于bug。

这算哪门子的惊喜啊?我指出了一个明显的错误,而我得到了关于 "风格 "的废话。

我离A100和Meat的距离就像月亮一样远。他们给你看虫子,尽管我不理解它们。但我不打算把我的 "风格 "带入其中。

 
fxsaber:
它不起作用。

以下是完整的代码。

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1

double Buffer[];

int handle=INVALID_HANDLE;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnInit()
  {
   SetIndexBuffer(0,Buffer,INDICATOR_DATA);

   handle=ChartIndicatorGet(0,1,ChartIndicatorName(0,1,0));
  }

#define  TOSTRING(A) #A + " = " + (string)A + "\n"
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//if(handle!=INVALID_HANDLE)
   if(prev_calculated!=0)
     {
      Buffer[rates_total-1]=MathRand();

      double BufferCopy[];
      Print(__FUNCTION__);
      if(CopyBuffer(handle,0,0,1,BufferCopy)>0)
         Print(TOSTRING(BufferCopy[0])+TOSTRING(Buffer[rates_total-1]));
     }

   return(rates_total);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int Reason)
  {
   Print("#1 OnDeinit");
   if(handle!=INVALID_HANDLE)
     {
      Print("#2 OnDeinit");
      IndicatorRelease(handle);
      Print("#3 OnDeinit");
     }
   Print("#4 OnDeinit");
   return;
  }
//+------------------------------------------------------------------+

和一份打印件。

2016.09.23 12:34:03.318 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:34:03.318 2 (SBRF-12.16,M1)       BufferCopy[0] = 265.0
2016.09.23 12:34:03.319 2 (SBRF-12.16,M1)       Buffer[rates_total-1] = 18992.0
2016.09.23 12:34:03.319 2 (SBRF-12.16,M1)       
2016.09.23 12:34:03.502 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:34:03.502 2 (SBRF-12.16,M1)       BufferCopy[0] = 265.0
2016.09.23 12:34:03.502 2 (SBRF-12.16,M1)       Buffer[rates_total-1] = 12498.0
2016.09.23 12:34:03.502 2 (SBRF-12.16,M1)       
... экономия бумаги :)
2016.09.23 12:34:31.804 2 (SBRF-12.16,M1)       
2016.09.23 12:34:33.159 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:34:33.159 2 (SBRF-12.16,M1)       BufferCopy[0] = 614.0
2016.09.23 12:34:33.159 2 (SBRF-12.16,M1)       Buffer[rates_total-1] = 5343.0
2016.09.23 12:34:33.159 2 (SBRF-12.16,M1)       
2016.09.23 12:34:36.870 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:34:36.870 2 (SBRF-12.16,M1)       BufferCopy[0] = 614.0
2016.09.23 12:34:36.870 2 (SBRF-12.16,M1)       Buffer[rates_total-1] = 17815.0
2016.09.23 12:34:36.870 2 (SBRF-12.16,M1)       
2016.09.23 12:34:38.445 2 (SBRF-12.16,M1)       #1 OnDeinit
2016.09.23 12:34:38.445 2 (SBRF-12.16,M1)       #2 OnDeinit
2016.09.23 12:34:38.445 2 (SBRF-12.16,M1)       #3 OnDeinit
2016.09.23 12:34:38.445 2 (SBRF-12.16,M1)       #4 OnDeinit
附加的文件:
2.mq5  3 kb
 
Karputov Vladimir:

以下是完整的代码。

和一份打印件。

它对我不起作用--它甚至没有进入OnDeinit。

并注意到我的数字在日志中是吻合的,但你的却不是。我的日志

PP      0       12:41:08.169    Test3 (RTS-12.16,H1)    OnCalculate
FE      0       12:41:08.169    Test3 (RTS-12.16,H1)    BufferCopy[0] = 13573.0
IQ      0       12:41:08.169    Test3 (RTS-12.16,H1)    Buffer[rates_total-1] = 13573.0
CF      0       12:41:08.169    Test3 (RTS-12.16,H1)    
JO      0       12:41:08.169    Test3 (RTS-12.16,H1)    OnCalculate
QI      0       12:41:08.169    Test3 (RTS-12.16,H1)    BufferCopy[0] = 25434.0
NM      0       12:41:08.169    Test3 (RTS-12.16,H1)    Buffer[rates_total-1] = 25434.0
MJ      0       12:41:08.169    Test3 (RTS-12.16,H1)    
DJ      0       12:41:08.187    Test3 (RTS-12.16,H1)    OnCalculate
QO      0       12:41:08.187    Test3 (RTS-12.16,H1)    BufferCopy[0] = 9469.0
HK      0       12:41:08.187    Test3 (RTS-12.16,H1)    Buffer[rates_total-1] = 9469.0
CM      0       12:41:08.187    Test3 (RTS-12.16,H1)    
JF      0       12:41:08.187    Test3 (RTS-12.16,H1)    OnCalculate
OS      0       12:41:08.187    Test3 (RTS-12.16,H1)    BufferCopy[0] = 1887.0
NG      0       12:41:08.187    Test3 (RTS-12.16,H1)    Buffer[rates_total-1] = 1887.0
我的终端中没有任何一个指标或EA在运行。
 
fxsaber:

它对我不起作用--它甚至没有进入OnDeinit。

并注意到我的数字在日志中是吻合的,但你的却不是。我的日志

我的终端中没有运行任何指标或专家顾问。

我有这样的配置。

2016.09.23 12:25:34.874 Terminal        MetaTrader 5 x64 build 1430 started (MetaQuotes Software Corp.)
2016.09.23 12:25:34.876 Terminal        Windows 10 Pro (x64 based PC), IE 11.00, UAC, Intel Core i3-3120 M  @ 2.50 GHz, RAM: 2446 / 8077 Mb, HDD: 40118 / 233310 Mb, GMT+02:00
2016.09.23 12:25:34.876 Terminal        C:\Users\KVN\AppData\Roaming\MetaQuotes\Terminal\D0E8209F77C8CF37AD8BF550E51FF075

(重新启动热机后,日志标签,前三行)

 
Karputov Vladimir:

我有这样的配置。

(重新启动热机后,日志标签,前三行)

2016.09.23 12:42:22.405 Terminal        C:\Program Files\BCS Broker MetaTrader 5 Terminal
2016.09.23 12:42:22.405 Terminal        Windows 7 Ultimate (x64 based PC), IE 09.00, Intel Core i7-2700 K  @ 3.50 GHz, RAM: 8098 / 16301 Mb, HDD: 6387 / 30000 Mb, GMT+02:00
2016.09.23 12:42:22.405 Terminal        BCS Broker MetaTrader 5 Terminal x64 build 1430 started (BCS Broker)
 
fxsaber:

含糊不清。在X32机器上。

2016.09.23 13:23:55.052 Terminal        C:\Users\barab\AppData\Roaming\MetaQuotes\Terminal\D0E8209F77C8CF37AD8BF550E51FF075
2016.09.23 13:23:55.052 Terminal        Windows 10 Home (X86 based PC), IE 11.00, UAC, Intel Atom  Z3740 @ 1.33 GHz, RAM: 607 / 1931 Mb, HDD: 20500 / 49784 Mb, GMT+02:00
2016.09.23 13:23:55.049 Terminal        MetaTrader 5 build 1430 started (MetaQuotes Software Corp.)


不起作用。

 
Andrey Barinov:
他们 "退出 "了,但在试图调用他们时,会出现编译错误

我不需要这样,我想做很多工作,使我今后的生活更轻松。

我已经用这种方式解决了我的问题,在父类中,所有的protec和继承都在protec之下,然后是override。

 
Karputov Vladimir:

含糊不清。在X32机器上。


不起作用。

已经提出了申请,尽管我已经厌倦了经常这样做。
 
fxsaber:

如何在一个指标中知道我在图表上的手柄?ChartIndicatorName不合适,因为它返回的是一个短名称而同名的指标可能已经在运行,输入参数不同。

我需要它能够从图表和计算中删除指标。

你可能已经想明白了,但我还是要澄清一下,以防万一。指标的句柄实际上只是对创建该指标的程序(即专家顾问、指标、脚本)内的描述的引用,我们可以把它看作是一种 "数字"。这意味着这个 "数字 "在创建指标的程序(获得其句柄)之外没有任何意义。即使是调用ChartIndicatorGet()函数的 程序也没有得到一些全局性的指标句柄,它只是创建了这个指标的描述,并分配了它的 "编号 "供寻址。 没有全局性的指标手柄,在整个终端内是唯一的。

在例子中可以看到短名称的使用。你可以这样做。

   string short_name="unknown ma";
   switch(InpMAMethod)
     {
      case MODE_EMA :  short_name="EMA";  break;
      case MODE_LWMA : short_name="LWMA"; break;
      case MODE_SMA :  short_name="SMA";  break;
      case MODE_SMMA : short_name="SMMA"; break;
     }
   IndicatorSetString(INDICATOR_SHORTNAME,short_name+"("+string(InpMAPeriod)+")");

这就解决了" 同一个指标已经用不同的输入参数运行过了 "的问题。

而且从视觉上看,哪个指标起作用更清楚。


 
Anton:

你可能已经想明白了,但我还是要澄清一下,以防万一。指标句柄实际上只是创建该指标的程序(即专家顾问、指标、脚本)中对该指标描述的一个地址,我们可以把它看作是一种 "数字"。这意味着这个 "数字 "在创建指标的程序(获得其句柄)之外没有任何意义。即使是调用ChartIndicatorGet()函数的 程序也没有得到一些全局性的指标句柄,它只是创建了这个指标的描述,并分配了它的 "编号 "供寻址。 没有全局性的指标手柄,在整个终端内是唯一的。

你可以在例子中看到ShortName的使用。你可以这样做。

这就解决了" 同一个指标已经用不同的输入参数运行过了 "的问题。

而且从视觉上看,更容易理解哪个指标的作用。

谢谢,这就是前段时间stringo向我解释的情况。我找到了几种方法来确定这个手柄属于 "我"。

  1. 我改变了指标缓冲区的极端值,并与相应的CopyBuffer值进行比较。如果匹配,就是 "我"。这就是不可删除指标背后的想法。
  2. 我改变ShortName并与ChartIndicatorName进行比较。