SetIndexBuffer 函数不支持整数型数组,把 int 改成 double 即可。
代码如下:
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(); } } } //+------------------------------------------------------------------+
按照你这个改正后,可以编译通过。不过在测试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
这是什么意思?哪里没有作对?难道是我的开仓算法有问题?
代码如下:
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(注释里面带星号的那两行都犯了这个错误)
请问错误是什么意思?怎么改正?