错误、漏洞、问题 - 页 936

 
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
#property indicator_label1  "Label1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters
input string symbol1="AUDUSD";
input string symbol2="NZDUSD";
input double mass_of_symbol1=1;
input double mass_of_symbol2=1;


int i,r1,r2,j;
double S,prs,k1,k2,d1,d2;
//--- indicator buffers
double        ind1[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,ind1,INDICATOR_DATA);
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
//---
   ArraySetAsSeries(time,true);ArraySetAsSeries(open,true);ArraySetAsSeries(high,true);ArraySetAsSeries(low,true);
   ArraySetAsSeries(close,true);ArraySetAsSeries(tick_volume,true);ArraySetAsSeries(volume,true);ArraySetAsSeries(spread,true);

   ArraySetAsSeries(ind1,true);
   MqlRates rates1[]; ArraySetAsSeries(rates1,true);
   MqlRates rates2[]; ArraySetAsSeries(rates2,true);

   if(prev_calculated<rates_total)
     {
      for(i=0;i<rates_total;i++)
     // for(i=prev_calculated-1;i<rates_total;i++)
        {
         CopyRates(symbol1,0,time[i],1,rates1);
         CopyRates(symbol2,0,time[i],1,rates2);
         ind1[i]=mass_of_symbol1*rates1[0].close-mass_of_symbol2*rates2[0].close;
        }
     }



//--- return value of prev_calculated for next call
   return(rates_total);
 

以上是指标Spread_of_symbols的代码......我决定重写它以使其工作得更快....,代码出现了,见下图......数据没有被复制......如果你在代码中把数据从1复制到0,指标画得非常快,但是出现了超出范围的错误......代码中的问题见下图......?

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
#property indicator_label1  "Label1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters
input string symbol1="AUDUSD";
input string symbol2="NZDUSD";
input double mass_of_symbol1=1;
input double mass_of_symbol2=1;


int i,r1,r2,j;
double S,prs,k1,k2,d1,d2;
//--- indicator buffers
double        ind1[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,ind1,INDICATOR_DATA);
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
//---
   ArraySetAsSeries(time,true);ArraySetAsSeries(open,true);ArraySetAsSeries(high,true);ArraySetAsSeries(low,true);
   ArraySetAsSeries(close,true);ArraySetAsSeries(tick_volume,true);ArraySetAsSeries(volume,true);ArraySetAsSeries(spread,true);

   ArraySetAsSeries(ind1,true);
   MqlRates rates1[]; ArraySetAsSeries(rates1,true);
   MqlRates rates2[]; ArraySetAsSeries(rates2,true);
   
   int to_copy;
   if(prev_calculated>rates_total || prev_calculated<0) to_copy=rates_total;
   else
     {
      to_copy=rates_total-prev_calculated;
      if(prev_calculated>0) 
      to_copy++;   
     }
   if(CopyRates(symbol1,0,0,to_copy,rates1)<=0)
     {
      Print("Данные по первому символу не скопированы, ошибка  ",GetLastError());
      return(0);
     }
   if(CopyRates(symbol2,0,0,to_copy,rates2)<=0)
     {
      Print("Данные по второму символу не скопированы, ошибка ",GetLastError());
      return(0);
     }
   if(prev_calculated<rates_total)
     {
     int limit;
   if(prev_calculated==0)
      limit=0;
   else limit=prev_calculated-1;
   for(int i=limit;i<rates_total;i++)
        {
         ind1[i]=mass_of_symbol1*rates1[i].close-mass_of_symbol2*rates2[i].close;
        }
     }
   return(rates_total);
  }
 
FinEngineer:
MQL5参考指南/ 访问时间序列和指标/ 组织数据访问
 
FinEngineer: 但出现了超出范围的错误......代码中出现了什么问题,见下文......?
看to_copy和limit的值是否相互匹配。
 
在可视化模式下,当在两个符号上进行交易时,在同一时间关闭交易后,只有专家顾问正在运行的符号的数据出现在历史中。另一个符号的数据只有在打开进一步的交易后才会进入历史标签。因此,有一段时间,交易 和历史标签 上的数据是不同的。
 
JF 0 交易 19:31:10 '***': 取消订单 #3694236 买入止损 1.10 AUDJPY.m at 95.679<br / translate="no">DS 0 交易 19:31:10 '***': 取消订单 #3694238 买入限制 1.10 AUDJPY.m at 93.876
DH 0 交易 19:31:10 '***': 取消订单 #3694237 买进止损 0.36 AUDJPY.m at 95.679
FI 0 交易 19:31:10 '***': 取消订单 #3694239 买入限额0.36 AUDJPY.m,价格93.876
FP 0 交易 19:31:10 '***': 取消订单 #3694236 买入停止 1.10 AUDJPY.m 在 95.679 完成
QE 0 交易 19:31:11 '***': 取消订单 #3694238 买入限额 1.10 AUDJPY.m at 93.876 完成
CG 0 交易 19:31:11 '***': 取消订单 #3694237 买进止损 0.36 AUDJPY.m at 95.679 完成
OL 0 交易 19:31:11 '***': 取消订单 #3694239 买入限额0.36 AUDJPY.m 在93.876完成

根据日志,有四个待处理的订单,似乎很快就被删除了。但在TradeTransaction上,反应大约在15秒内出现,嘀嗒声在这期间出现。

KH 0 prp5 (EURUSD.m,M1) 19:31:23 TS=6 cancel sl _ OnTrade PENDING id=84 m=3 b/s=SELL Err=Bid done
***

JG 0 prp5 (EURUSD.m,M1) 19:31:26 TS=6 Delete tp _ OnTrade PENDING id=85 m=3 b/s=SELL Err=Bid completed
***
RL 0 prp5 (EURUSD.m,M1) 19:31:26 TS=6 Delete sl _ OnTrade PENDING id=86 m=3 b/s=SELL Err=Bid completed
***

HK 0 prp5 (EURUSD.m,M1) 19:31:26 TS=6 Delete tp _ OnTrade PENDING id=87 m=3 b/s=SELL Err=Order executed

虽然,这里也有一些奇怪的事情

IE 0 prp5 (EURUSD.m,M1) 19:31:26 TS=6 =O= 交易收盘/反向价格=95.648 m=3 b/s=SELL ...===订单发送前的时间
ES 0 prp5 (EURUSD.m,M1) 19:31:29 TS=6 case 8(real) m=3 b/s=SELL Err=Order placed ==>After OrderSendAsync, 3 sec seems be too long.

P.S. 看起来专家的执行出现了滞后,不过我想知道OnTradeTransaction的数据包可以在队列中停留多长时间。

 
fyords:

从参考资料来看。

MQL5 参考 /标准库/ 创建面板和对话框的类 / CWnd / StateFlagsSet

什么属性?

StateFlagsSet不是属性,而是状态。一个改变状态的团体方法。就在改变个别州旗的方法之上。

单独使用。

 

看了 "数据访问组织",看了抽出数据的样本脚本,了解了一切,出现了以下问题。

1.为什么我不能把这段代码写在指标的OnInit函数 中,这样在开始时指标就会下载自己的历史并准备时间序列?我可以在我的专家顾问中开出这样的支票吗?

2.我需要多长时间做一次这样的检查。1个用于专家顾问,2个用于指标?如果我只准备一次历史和时间序列的复制,那么在未来的复制中就不会出现错误?或者我必须每次或不时地检查历史和时间序列是否已经准备好?

3.是否只有使用多个时间段和符号的指标和专家顾问才需要这种检查,还是所有的都需要?

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Основы языка / Функции / Функции обработки событий - Документация по MQL5
 
交换过程是异步的,指标不允许等待数据。因此,可以在inite中进行查询,不需要等待或放慢速度,只需在oncalculate中检查可用性和计数。

请注意--该指标无权等待或循环,否则将扼杀后续指标的计算。
 
Renat:
交换过程是异步的,指标不允许等待数据。因此,你可以在inite中查询,决不要等待或放慢速度,只在oncalculate中检查可用性和计数。请注意--该指标无权等待或循环,否则将扼杀后续指标的计算。

1 那么,我应该在哪里分页数据呢?如果我想做一个有一篮子货币对的指标,很多符号......对于每一个货币对,我需要检查和交换数据......我应该从指标中运行一个脚本吗?为什么一个指标会扼杀后续指标的计算?在下一个指标中,通过BarsCalculated(indicator1_Handle)检查上一个指标的计算结果,让它计算并下载数据就可以了,还是我错了?

2 另一个问题,是另一种问题--当我在函数中声明指标句柄时,它开始计数?还是在我发出复制命令之前就开始计算?