如何为Build 600+升级指标? - 页 2

 
因为某些原因(可能是个错误),数组没有被初始化
 
qjol:
因为某些原因(可能是一个错误),数组没有被初始化。


到目前为止,我还没有得到 "T3MA "和 "HMA "的值。

可能这就是为什么这个EA没有打开任何订单的原因,因为这两个指数都在其中使用。

还是我在EA中犯了什么错误?

附加的文件:
xxp.mq4  5 kb
 
Arav007:


到目前为止,我还没有得到 "T3MA "和 "HMA "的值。

我已经告诉你了

qjol:
因为某些原因(可能是一个错误),数组没有被初始化

可能这就是为什么这个EA没有开出任何订单的原因,因为这两个指标都在其中使用。

我不知道也许,可能,也许,可能,可能,合理。

还是我在EA中做错了什么?

我不这么认为

 
Arav007:


是的,你是对的。但为什么呢?

我已经按照SDC说的方法编译了它们,发现有 "0 "错误或警告。

那我该怎么做才能把它们升级到B-600+?

HMA.mq4有一个错误,改变init()中的这一行。

   if(!SetIndexBuffer(0,ind_buffer0) && !SetIndexBuffer(1,ind_buffer1))

   if(!SetIndexBuffer(0,ind_buffer0) || !SetIndexBuffer(1,ind_buffer1))
 
qjol:



即使在 "T3MA "和 "HMA "都工作正常的Build 509中,该EA也没有打开任何交易。

那么会是什么原因呢?

 

在T3MA.mq4中也有类似的错误,改为.NET。

   if(
      !SetIndexBuffer(0,e7) ||
      !SetIndexBuffer(1,e2) ||
      !SetIndexBuffer(2,e3) ||
      !SetIndexBuffer(3,e4) ||
      !SetIndexBuffer(4,e5) ||
      !SetIndexBuffer(5,e6) ||
      !SetIndexBuffer(6,e1)
      )

这些是编译器无法捕捉的逻辑错误。

这些错误在Build 509中已经存在,但并没有导致问题,因为SetIndexBuffer很少有机会为假。现在由于这个变化,它成了一个问题。

Shortened conditions check is now used in logical operations, unlike the old MQL4 version where all expressions have been calculated and the check has been performed afterwards. Suppose there is a check of two conditions with the use of logical AND

  if(condition1 && condition2)
    {
     // some block of operations
    }

如果条件1 表达式是假的,那么条件2 表达式的计算就不会被执行,因为假& 结果仍然等于


 
angevoyageur:

在T3MA.mq4中也有类似的错误,改成了:

这些是编译器无法捕捉的逻辑错误。

非常感谢,先生。

是的,这些都是BUG,它们现在都在工作。)

你能不能看一下,为什么这些指标都在工作,但EA却没有开出任何订单?

谢谢

 
Arav007:


你能不能看一下为什么尽管这些指标都在工作,但EA却没有开出任何订单?



显示您的EA代码
 
qjol:

显示您的EA代码


就在这里。

extern double    LotSize=0.01;
extern double    StopLoss=15.0;
extern double    TakeProfit=20.0;
extern int       iMaxOrders=10;
extern int       Slippage=5;
extern int       MagicNumber=814;


extern int       iOrderType_Buy=0;
extern int       iOrderType_Sell=1;


int BuyOrder;
int SellOrder;

int iOpenOrders_Sell;
int iOpenOrders_Buy;

int iLastError;


double dPip;
double dStopLossPrice, dTakeProfitPrice;


//+------------------------------------------------------------------+
#define  MODE_DEMA    4
#define  MODE_TEMA    5
#define  MODE_T3MA    6
#define  MODE_JMA     7
#define  MODE_HMA     8
#define  MODE_DECEMA  9
#define  MODE_SALT    10
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
extern   int      MA_Period               = 34;
extern   int      MA_Type                 = MODE_HMA;
extern   int      MA_Applied              = PRICE_CLOSE;
extern   double   T3MA_VolumeFactor       = 0.8;
extern   double   JMA_Phase               = 0.0;
extern   int      Step_Period             = 3;
extern   int      BarsCount               = 100;
extern   bool     DebugMode               = false;
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
{

if(Digits==3){
        dPip = 0.01;
}else{
        dPip = 0.0001;
}

return(0);

}

int deinit()
{

Comment("");
return(0);

}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+



int start()
{

   double  signal = iCustom(NULL,0,"xpMA",MA_Period,MA_Type,MA_Applied ,T3MA_VolumeFactor,JMA_Phase,Step_Period,DebugMode,3,0);
   
   bool BuyCondition = false , SellCondition = false , CloseBuyCondition = false , CloseSellCondition = false; 
   
   if (signal==1)
       BuyCondition = true;
       
   if (signal==-1)
      SellCondition = true;

///////////////////////////// Checking Buying Condition
if(BuyCondition)
{               
                double OpenPrice=Ask;

                
                dStopLossPrice = NormalizeDouble(OpenPrice - StopLoss * dPip,Digits);
                dTakeProfitPrice = NormalizeDouble(OpenPrice + TakeProfit * dPip,Digits);
                

                BuyOrder=OrderSend(Symbol() , iOrderType_Buy , LotSize,OpenPrice,Slippage ,dStopLossPrice ,dTakeProfitPrice , "Buy Order",MagicNumber , 0,Blue);
                
                
                 if(BuyOrder>0) {
                                Print("Buy Order was Opened");
                                iLastError = 0;
                        }
                        else
                        {                       
                                iLastError = GetLastError();                    
                        
                        }
        
}
        

if(SellCondition)
{       
                OpenPrice=Bid;
                
                dStopLossPrice = NormalizeDouble(OpenPrice + StopLoss * dPip,Digits);
                dTakeProfitPrice = NormalizeDouble(OpenPrice - TakeProfit * dPip,Digits);

                SellOrder=OrderSend(Symbol() , iOrderType_Sell , LotSize,OpenPrice,Slippage ,dStopLossPrice ,dTakeProfitPrice , "Sell Order",MagicNumber , 0,Red);
                
                
                if(SellOrder>0) {
                                Print("Sell Order was opened");
                                iLastError = 0;
                        }else{
                                iLastError = GetLastError();
                        
                        }               
        }
                


return (0);

}
 

自定义

计算指定的自定义指标并返回其值。

double iCustom(
string symbol, // symbol
int timeframe, // timeframe
string name, // 自定义指标编译程序的路径/名称
... // 自定义指标的输入参数(如果需要)
int mode, // line index
int shift // shift
);

参数

符号

[in] 符号名称,将计算该指标的数据。NULL表示当前符号。

时间范围

[in] 时间框架。它可以是ENUM_TIMEFRAMES的任何一个枚举值。0表示当前图表的时间框架

名称

[in] 自定义指标的编译程序名称,相对于根指标目录(MQL4/Indicators/)。如果指标位于子目录中,例如,在MQL4/Indicators/Examples,其名称必须指定为 "Examples/indicator_name"(必须指定双反斜杠"\\"作为分隔符,而不是单一的)。

...

[in] 自定义指标输入参数,用逗号分隔。

传递的参数和它们的顺序必须与自定义指标的声明顺序和外部变量的类型一致。如果没有指定输入参数的值,将使用默认值。