错误、漏洞、问题 - 页 1141

 

大家好!

这样的问题。

我成功地获得了Bands和MA指标的值。

Bands_handle=iBands(NULL,0,BP_var_s,0,BDev_var_s,PRICE_CLOSE)。
CopyBuffer(Bands_handle,0,0,1,Base)。
CopyBuffer(Bands_handle,1,0,1,Upper)。
CopyBuffer(Bands_handle,2,0,1,Lower)。
B_med_s=Base[0]。
B_up_s=Upper[0]。
B_low_s=Lower[0]。

MA_handle=iMA(NULL,0,MA_var_b,0,MODE_SMA,PRICE_TYPICAL) 。
CopyBuffer(MA_handle,0,0,1,MAv)。
M_av_s=MAv[0]。

然后打印:B_up_s = 1.264249475876921 M_av_s = 1.2595

然后我尝试进行矩阵运算B_up_s-M_av_s,得到的结果是0.00000000。

奇迹是什么?

 
Alvin1976:

大家好!

这样的问题。

我成功地获得了Bands和MA指标的值。

Bands_handle=iBands(NULL,0,BP_var_s,0,BDev_var_s,PRICE_CLOSE);
   CopyBuffer(Bands_handle,0,0,1,Base);
   CopyBuffer(Bands_handle,1,0,1,Upper);
   CopyBuffer(Bands_handle,2,0,1,Lower);
   B_med_s=Base[0];
   B_up_s=Upper[0];
   B_low_s=Lower[0];
   
   MA_handle=iMA(NULL,0,MA_var_b,0,MODE_SMA,PRICE_TYPICAL);
   CopyBuffer(MA_handle,0,0,1,MAv);
   M_av_s=MAv[0];  

然后打印:B_up_s = 1.264249475876921 M_av_s = 1.2595

然后我尝试进行B_up_s-M_av_s交配操作,结果得到0.00000000。

有什么好奇怪的?

1) 如何插入代码

2) 你在什么类型的 变量中存储操作的结果?或者更好的是,请给我代码中产生输出的部分。

 
MigVRN:

1) 你如何插入代码

2) 你将操作的结果存储在什么类型 的变量中?更好的是,给出代码中产生输出的部分。

所有的变量都是双倍的类型。

我不明白为什么Bands有很多数字,而MA只有4位小数。根本就不应该有一个零的结果。这就是为什么该算法不起作用。

在MQL4中,一切都那么简单。现在你需要更高的优化速度和多币种检查。我必须把所有东西都转移到MQL5(去他妈的))。

 double q=B_up_s-M_av_s;
 Print( B_up_s-M_av_s=", DoubleToString(q));
 
Alvin1976:

所有的变量都是双倍的类型。

不清楚为什么Bands有很多数字,而MA只有4位小数。而零结果根本就不应该出现。这就是该算法不起作用的原因。

在MQL4中,一切都那么简单。现在你需要优化速度和多币种检查。我必须把所有东西都转移到MQL5(去他妈的))。

它应该是有效的。下面是一个基于你的代码的脚本和它的结果。

void OnStart()
  {
  
  double Base[1];
  double Upper[1];
  double Lower[1];  
  
  int BP_var_s = 20;
  int BDev_var_s = 30;
  int MA_var_b = 10;
  
  double M_av_s = 0;
  double MAv[1];
  
  double B_med_s, B_up_s, B_low_s;
  
  
   //---Далее Ваш код
   int Bands_handle=iBands(NULL,0,BP_var_s,0,BDev_var_s,PRICE_CLOSE);
   CopyBuffer(Bands_handle,0,0,1,Base);
   CopyBuffer(Bands_handle,1,0,1,Upper);
   CopyBuffer(Bands_handle,2,0,1,Lower);
   
   B_med_s=Base[0];
   B_up_s=Upper[0];
   B_low_s=Lower[0];
   
   int MA_handle=iMA(NULL,0,MA_var_b,0,MODE_SMA,PRICE_TYPICAL);
   
   CopyBuffer(MA_handle,0,0,1,MAv);
   M_av_s=MAv[0]; 
   
    double q = B_up_s - M_av_s;
    
    Print("B_up_s-M_av_s=", DoubleToString(q));
   
  }

 
Alvin1976:

所有的变量都是双倍的类型。

不清楚为什么Bands有很多数字,而MA只有4位小数。0的结果根本就不应该出现。这就是为什么该算法不起作用。

在MQL4中,一切都那么简单。现在你需要更高的优化速度和多币种检查。我必须把所有东西都转移到MQL5(去他妈的))。

在进行 "减法 "操作之前,打印 变量的,看看缓冲区里有什么。
Print("B_up_s= ",B_up_s,"; M_av_s=",M_av_s);
double q=B_up_s-M_av_s;
 
MigVRN:

它应该是有效的。下面是根据你的代码编写的脚本和它的结果。

是的,这个脚本是有效的。

即使是这个例子的EA也是有效的。

另一方面,我的EA却顽固地给出了零分。让我们来寻找一个错误......

 

大家好!

问题,如何使一个变量值在一分钟内的每一个刻度 上被更新,然后这个和被写入一个单独的值,当下一分钟关闭时,这个和的值被新的值所取代?

int t = TimeSeconds()。

while (t !=0)

double b - 变量,在每分钟的每一个刻度上都会更新。

double b1 - 变量b在前一个刻度上的值。

double s - 一分钟内的所有刻度的金额。

double s1 - 前一分钟内的所有点位的金额。

b1=b。

s=b1+b。

如果(t=0)s1=s。

如何使数据在每一个刻度上进行汇总,以及如何在一般情况下正确书写?

 
Alvin1976:

是的,这个脚本是有效的。

即使是这个例子的EA也是有效的。

但我的专家顾问给出的是零。让我们来寻找错误......

以下是已检测到的情况。

如果你只是运行EA,它工作得很好,但在策略测试器中,它在一开始就产生了零值。但在下一行,0神奇地变成了一个正常的指标数据。我不明白发生了什么事.....

以下是代码。

这就是测试员的报告。

CJ 0 19:40:47.022 Core 1 EURUSD,M15 (Alpari-Ltd-Demo): OHLC条形状态正在生成。仅在条形图开始时执行OnTick
IJ 0 19:40:47.022 核心 1 EURUSD,M15: 测试 experts\tmp.ex5 从 2004.01.07 00:00 到 2004.02.02 00:00 开始
LK 0 19:40:47.022 核心 1 2004.01.07 00:00:00 B_up_s=0.0 M_av_s=0.0
IM 0 19:40:47.022 核心 1 2004.01.07 00:00:00 sbl_top=true B_up_s=0.0 M_av_s=0.0 B_up_s-M_av_s=0.00000000
OQ 0 19:40:47.022 核心 1 2004.01.07 00:15:00 B_up_s=1.279208140152992 M_av_s=1.2718
OI 0 19:40:47.022 核心 1 2004.01.07 00:15:00 sel=true B_up_s=1.279208140152992 M_av_s=1.2718 B_up_s-M_av_s=0.00740814
CJ 0 19:40:47.022 核心 1 2004.01.07 00:30:00 B_up_s=1.279239651523307 M_av_s=1.2721
LN 0 19:40:47.022 核心 1 2004.01.07 00:45:00 B_up_s=1.279382808470771 M_av_s=1.2714
DS 0 19:40:47.022 核心 1 2004.01.07 01:00:00 B_up_s=1.279407737043184 M_av_s=1.2719
OD 0 19:40:47.022 核心 1 2004.01.07 01:15:00 B_up_s=1.279398917431485 M_av_s=1.2727
NI 0 19:40:47.022 核心 1 2004.01.07 01:30:00 B_up_s=1.279380702214008 M_av_s=1.2731
IM 0 19:40:47.022 核心 1 2004.01.07 01:45:00 B_up_s=1.279440208228416 M_av_s=1.2723
LE 0 19:40:47.022 核心 1 2004.01.07 02:00:00 B_up_s=1.279473515350084 M_av_s=1.272
DK 0 19:40:47.022 核心 1 2004.01.07 02:15:00 B_up_s=1.279515146590278 M_av_s=1.2715
FL 0 19:40:47.022 核心 1 2004.01.07 02:30:00 B_up_s=1.279601656250741 M_av_s=1.2709
IQ 0 19:40:47.022 核心 1 2004.01.07 02:45:00 B_up_s=1.279656914787522 M_av_s=1.2709
CE 0 19:40:47.022 Core 1 2004.01.07 03:00:00 B_up_s=1.279579626541548 M_av_s=1.2707

//#property link      "http://www.mql5.com"
//#property version   "1.00"

//+------------------------------------------------------------------+

 double
   BDev_var_b=2,       
   BDev_var_s=2,       
   B_up_s=0, 
   B_low_s=0,
   B_med_s=0,
   M_av_s=0, 
   Base[1],
   Upper[1],
   Lower[1],
   MAv[1],   
   Dist_c=0.0015,
   Dist_d=0.002;
   
  bool 
    selord=false,  
    baiord=false,
    New_Bar=false, 
    sbl_top=false,    
    sbl_bot=false, 
    bai=false,  
    sel=false;
   
   int
    Bands_handle,    
    MA_handle,   
    MA_var_s=1,   
    BP_var_s=50;  

    
//=============================================================================================================
int OnInit()
  {

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {


   Bands_handle=iBands(NULL,0,BP_var_s,0,BDev_var_s,PRICE_CLOSE);
   CopyBuffer(Bands_handle,0,0,1,Base);
   CopyBuffer(Bands_handle,1,0,1,Upper);
   CopyBuffer(Bands_handle,2,0,1,Lower);
   B_med_s=Base[0];
   B_up_s=Upper[0];
   B_low_s=Lower[0];
   
   MA_handle=iMA(NULL,0,MA_var_s,0,MODE_SMA,PRICE_TYPICAL);
   CopyBuffer(MA_handle,0,0,1,MAv);
   M_av_s=MAv[0];
   
   
  Print(" B_up_s=",B_up_s, "   M_av_s=", M_av_s);  

   
   // установка флагов
  if (sbl_top==false && (B_up_s-M_av_s)<Dist_c) 
     {
       sbl_top=true;
       Print("sbl_top=true   ","  B_up_s=",B_up_s, "  M_av_s=", M_av_s, "  B_up_s-M_av_s=", DoubleToString(B_up_s-M_av_s));
     }
  if (sbl_top==true && (B_up_s-M_av_s)>Dist_d)
       {
       sbl_top=false;
       Print("sel=true  ","  B_up_s=",B_up_s, "  M_av_s=", M_av_s, "  B_up_s-M_av_s=", DoubleToString(B_up_s-M_av_s));
       }
    


    return;                                   
   }


 
Alvin1976:

以下是已经发现的情况。

1) 不要在每个tick上创建指标!

2) 在访问指标值之前,检查指标是否被创建。

3) 检查要求的值是否从指标中复制出来。

4)在专家完成后,一定要删除指标的计算部分,否则可能在某些时候耗尽内存。

这个问题是因为你试图从尚未创建的指标中复制数值。让它成为一条规则--检查你所调用的函数的结果。

附加的文件:
 

请告知错误在哪里。

Ekpert正在运行演示,3对。这里是日志。

PUSD,M15)       AUDUSD Request executed: delete buy Ticket: #729600  Price = 0.94794 Lots = 0.1 StopLoss = 0 TakeProfit = 0 Comment = BuyTP(4)
LH      0       08:45:05.881    Serendipity5.0 (GBPUSD,M15)     AUDUSD Request executed: delete buy Ticket: #729598  Price = 0.94514 Lots = 0.42 StopLoss = 0 TakeProfit = 0 Comment = BuyTP(4)
KM      0       08:45:06.053    Serendipity5.0 (GBPUSD,M15)     Error: AUDUSD Action: delete buy : Requested Volume: 0.42, Requested StopLoss:0, Requested TakeProfit:0, Requested Price:0.94514 Error:10013
OE      0       08:45:06.053    Serendipity5.0 (GBPUSD,M15)     Sleep() for 1 second, retry
LO      0       08:45:07.145    Serendipity5.0 (GBPUSD,M15)     DeletePendings(): AUDUSD Error deleting pending order: Error Code: 4756
CQ      0       08:45:07.145    Serendipity5.0 (GBPUSD,M15)     SendOrder(); OrderCheck() Error = 10013 Sleep() for 1 second, retry
GP      0       08:45:08.237    Serendipity5.0 (GBPUSD,M15)     DeletePendings(): AUDUSD Error deleting pending order: Error Code: 4756
PL      0       08:45:08.237    Serendipity5.0 (GBPUSD,M15)     SendOrder(); OrderCheck() Error = 10013 Sleep() for 1 second, retry

以下是代码。

bool SendTradeRequest(string symb,ENUM_ORDER_TYPE type,ENUM_TRADE_REQUEST_ACTIONS tradeAction,double price, 
   double lot,double stopLoss,double takeProfit,long const magic, string comment,ulong ticket){
//--- prepare a request
   MqlTradeRequest request={0};
   //ZeroMemory(request);
   
   request.action=tradeAction;        
   request.magic=magic;              
   request.symbol=symb;                 
   request.volume=lot;                         
   request.sl=stopLoss;                             
   request.tp=takeProfit;                                 
   request.type=type;              
   request.price=price;
   request.comment=comment;
   if(tradeAction==TRADE_ACTION_MODIFY || tradeAction==TRADE_ACTION_REMOVE)request.order=ticket;
      
//--- send a trade request
   MqlTradeResult result={0};
   MqlTradeCheckResult checkresult={0};
   //ZeroMemory(result);
   //ZeroMemory(checkresult);
   bool isSuccessful;
   isSuccessful=OrderCheck(request,checkresult);
   if(checkresult.retcode!=0 && checkresult.retcode!=10009 && checkresult.retcode!=10008){
      Print("SendOrder(); OrderCheck() Error = ",checkresult.retcode, " Sleep() for 1 second, retry"); 
      Sleep(1000); return(0);                                      
      }       
      
   isSuccessful=OrderSend(request,result);        
   if( (result.retcode == 10009 || result.retcode == 10008 || result.retcode == 0) ){
      //--- write the server reply to log  
      //Print(__FUNCTION__,":",result.comment);
      Print(symb," "+result.comment+": "+ConvertTradeActionToString(request.action)+" ",(string)ConvertOrderTypeToString(request.type)," Ticket: #",(string)result.order," Price = ",(string)request.price," Lots = ",(string)request.volume,
         " stopLoss = ",(string)request.sl," takeProfit = ",(string)request.tp," Comment = ",(string)request.comment);
      
      if(tradeAction==TRADE_ACTION_PENDING)   
         arrow_cntr=CreateSignalArrow("Open "+(string)ConvertOrderTypeToString(request.type)+" "+request.comment+" Ticket "+(string)result.order+
            " Lots "+DoubleToString(request.volume,2)+" Time "+TimeToString(TimeCurrent(),TIME_MINUTES),arrow_cntr,request.price,216,clrDarkViolet,symb);
      
      if(tradeAction==TRADE_ACTION_MODIFY)   
         arrow_cntr=CreateSignalArrow("OrderModify "+request.comment+" Ticket "+(string)request.order+" Lots "+DoubleToString(request.volume,2)+
            " Time "+TimeToString(TimeCurrent(),TIME_MINUTES),arrow_cntr,request.price,251,clrSilver,symb); 
      
      if(tradeAction==TRADE_ACTION_REMOVE)
         arrow_cntr=CreateSignalArrow("OrderDelete "+request.comment+" Ticket "+(string)request.order+" Lots "+DoubleToString(request.volume,2)+
            " Time "+TimeToString(TimeCurrent(),TIME_MINUTES),arrow_cntr,Close(1,symb),158,Red,symb);      
      
      CheckErrorMessage("SendTradeRequest():");
      return(1);  
      }  

专家试图执行OrderDelete(),出现错误,SendTradeRequest()在while循环中,ekspert相应地进行循环。也许在我提交订单时,价格已经改变了?我是否需要RefreshRates()以及如何正确处理它? 我在论坛上搜索了一下,但没有发现任何例子......

提前感谢大家