求解答关于使用数组的错误

 

代码如下:

int ticket_buy[];

int ticket_sell[];  //定义2个整型数组,用作存储持有的买单和卖单订单号

double ticket_buy_lots[];

double ticket_sell_lots[];//定义2个双精度数组,用作存储对应单号的手数

extern int order_buy;

extern int order_sell;//定义2个整型数,记录持有买单和卖单的数量。 

int OnInit()

  {

      IndicatorBuffers(4);

      SetIndexBuffer(0, ticket_buy); // 第1个指标线指标值的缓冲区

      SetIndexBuffer(1, ticket_sell); // 第2个指标线指标值的缓冲区

      SetIndexBuffer(2, ticket_buy_lots); // 第3个指标线指标值的缓冲区

      SetIndexBuffer(3, ticket_sell_lots); // 第4个指标线指标值的缓冲区

   return(INIT_SUCCEEDED);

  }

void OnDeinit(const int reason)

  {  }

void OnTick()

{

      order_buy=0;

      order_sell=0;

      if(OrdersTotal()>0)//如果有持仓

         for(int i=0;i<OrdersTotal();i++)//通过这个循环找出持有的买单和卖单的订单号和对应手数

            {

               if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)

                     if(OrderType()==OP_BUY)

                     {

                        ticket_buy[order_buy]=OrderTicket();//用数组存储买单的订单号**************

                        ticket_buy_lots[order_buy]=OrderLots();//用数组存储这张买单的手数*********

                        order_buy++;

                     }

                      else if(OrderType()==OP_SELL)

                      {

                        ticket_buy[order_sell]=OrderTicket();

                        ticket_sell_lots[order_sell]=OrderLots();

                        order_sell++;

                      }

            }   

……后略

 

错误提示:'SetIndexBuffer' - no one of the overloads can be applied to the function call 实验2.mq4(注释里面带星号的那两行都犯了这个错误)

请问错误是什么意思?怎么改正? 

 

SetIndexBuffer 函数不支持整数型数组,把 int 改成 double 即可。

 
tsliuliang:

代码如下:

int ticket_buy[];

int ticket_sell[];  //定义2个整型数组,用作存储持有的买单和卖单订单号

double ticket_buy_lots[];

double ticket_sell_lots[];//定义2个双精度数组,用作存储对应单号的手数

extern int order_buy;

extern int order_sell;//定义2个整型数,记录持有买单和卖单的数量。 

int OnInit()

  {

      IndicatorBuffers(4);

      SetIndexBuffer(0, ticket_buy); // 第1个指标线指标值的缓冲区

      SetIndexBuffer(1, ticket_sell); // 第2个指标线指标值的缓冲区

      SetIndexBuffer(2, ticket_buy_lots); // 第3个指标线指标值的缓冲区

      SetIndexBuffer(3, ticket_sell_lots); // 第4个指标线指标值的缓冲区

   return(INIT_SUCCEEDED);

  }

void OnDeinit(const int reason)

  {  }

void OnTick()

{

      order_buy=0;

      order_sell=0;

      if(OrdersTotal()>0)//如果有持仓

         for(int i=0;i<OrdersTotal();i++)//通过这个循环找出持有的买单和卖单的订单号和对应手数

            {

               if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)

                     if(OrderType()==OP_BUY)

                     {

                        ticket_buy[order_buy]=OrderTicket();//用数组存储买单的订单号**************

                        ticket_buy_lots[order_buy]=OrderLots();//用数组存储这张买单的手数*********

                        order_buy++;

                     }

                      else if(OrderType()==OP_SELL)

                      {

                        ticket_buy[order_sell]=OrderTicket();

                        ticket_sell_lots[order_sell]=OrderLots();

                        order_sell++;

                      }

            }   

……后略

 

错误提示:'SetIndexBuffer' - no one of the overloads can be applied to the function call 实验2.mq4(注释里面带星号的那两行都犯了这个错误)

请问错误是什么意思?怎么改正? 

 

   IndicatorBuffers(4);

      SetIndexBuffer(0, ticket_buy); // 第1个指标线指标值的缓冲区

      SetIndexBuffer(1, ticket_sell); // 第2个指标线指标值的缓冲区

      SetIndexBuffer(2, ticket_buy_lots); // 第3个指标线指标值的缓冲区

      SetIndexBuffer(3, ticket_sell_lots); // 第4个指标线指标值的缓冲区

这是指标才有的代码, 主函数 是OnTick()说明是EA程序,EA中是不存在这种SetINdexBuffer函数的用法。

另外你的数组是动态数组,使用前必须先申请空间。 用ArrayResize()

 
//+------------------------------------------------------------------+
//|                                                         test.mq4 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict


int ticket_buy[];
int ticket_sell[];  //定义2个整型数组,用作存储持有的买单和卖单订单号

double ticket_buy_lots[];
double ticket_sell_lots[];//定义2个双精度数组,用作存储对应单号的手数

extern int order_buy;
extern int order_sell;//定义2个整型数,记录持有买单和卖单的数量。 


//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---   
     order_buy=0;
     order_sell=0;  

         for(int i=0;i<OrdersTotal();i++)//通过这个循环找出持有的买单和卖单的订单号和对应手数
            {
               if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)

                     if(OrderType()==OP_BUY)
                     {
                        order_buy++;                        
                        ArrayResize(ticket_buy,order_buy);
                        ArrayResize(ticket_buy_lots,order_buy);
                        ticket_buy[order_buy-1]=OrderTicket();//用数组存储买单的订单号**************
                        ticket_buy_lots[order_buy-1]=OrderLots();//用数组存储这张买单的手数*********                    

                     }
                      else if(OrderType()==OP_SELL)
                      {
                        order_sell++;
                        ArrayResize(ticket_sell,order_sell);
                        ArrayResize(ticket_sell_lots,order_sell);
                        ticket_sell[order_sell-1]=OrderTicket();
                        ticket_sell_lots[order_sell-1]=OrderLots();
                      }

            } 
  }
//+------------------------------------------------------------------+
 
Ziheng Zhuang:

按照你这个改正后,可以编译通过。不过在测试2015.12.1-2016.1.29的数据时只开了一单,而且在日志sheet里看不到开单记录。我往前调整了一下测试时间,开始时间调整为2015.1.1,结果是一单都没开。

无论在什么历史时段测试,日志的输出都是这样的:

 

2016.03.12 16:40:58.500 There were 1 passes done during optimization

2016.03.12 16:40:58.499 实验2: optimization finished in

2016.03.12 16:40:54.456 实验2: optimization started 

 

这是什么意思?哪里没有作对?难道是我的开仓算法有问题? 


 
Ziheng Zhuang:
我在onTick()函数的一开始就添加了一条print语句,可是这条语句在日志中没有看到执行显示,在函数的其他位置,包括被调用的自定义函数里面的print语句也没有在日志中看到被执行显示,可为什么会在测试2015.12.1-2016.1.29的历史数据时开仓呢?奇怪的是开仓记录也没有在日志中显示,这些问题到底是咋回事?每次测试都出现在日志中的那三句话是啥意思?
原因: