单个顾问程序中有多个缓冲区。 CopyBuffer返回错误4806

问题描述 投票:1回答:1

在顾问中使用3移动平均线,每个MA都有其自己的缓冲区,但是CopyBuffer永远不会为第二个MA返回请求的小节计数器。只有第一个MA ExtFastBuffer获得了缓冲区值,其他所有内容均保持为空,并且它们的CopyBuffer返回错误4806。我的错误是什么?

#property indicator_buffers 3

input ENUM_TIMEFRAMES ma_fast_timeframe = PERIOD_M1;
input int ma_fast_period = 2;
input ENUM_APPLIED_PRICE ma_fast_price_type = PRICE_MEDIAN;

input ENUM_TIMEFRAMES ma_middle_timeframe = PERIOD_M1;
input int ma_middle_period = 15;
input ENUM_APPLIED_PRICE ma_middle_price_type = PRICE_MEDIAN;

input ENUM_TIMEFRAMES ma_slow_timeframe = PERIOD_M1;
input int ma_slow_period = 30;
input ENUM_APPLIED_PRICE ma_slow_price_type = PRICE_MEDIAN;

int ExtFastHandle;
int ExtMiddleHandle;
int ExtSlowHandle;

double ExtFastBuffer[];
double ExtMiddleBuffer[];
double ExtSlowBuffer[];

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   SetIndexBuffer(0, ExtFastBuffer, INDICATOR_CALCULATIONS);
   SetIndexBuffer(1, ExtMiddleBuffer, INDICATOR_CALCULATIONS);
   SetIndexBuffer(2, ExtSlowBuffer, INDICATOR_CALCULATIONS);

   IndicatorSetInteger(INDICATOR_DIGITS,_Digits+1);

   ExtFastHandle = iMA(NULL, ma_fast_timeframe, ma_fast_period, 0, MODE_SMA, ma_fast_price_type);
   ExtMiddleHandle = iMA(NULL, ma_middle_timeframe, ma_middle_period, 0, MODE_SMA, ma_middle_price_type);
   ExtSlowHandle = iMA(NULL, ma_slow_timeframe, ma_slow_period, 0, MODE_SMA, ma_slow_price_type);

   if(ExtFastHandle == INVALID_HANDLE || ExtMiddleHandle == INVALID_HANDLE || ExtSlowHandle == INVALID_HANDLE)
     {
      Print("Error creating MA indicator-----------------------------------------------------------------------");
      return(INIT_FAILED);
     }

   return(INIT_SUCCEEDED);
  }


//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {
   int startFromIndex = 0;
   int bufferSize = 2;

//---------------- Fast MA
   if(CopyBuffer(ExtFastHandle, 0, startFromIndex, bufferSize, ExtFastBuffer) < 2)
     {
      Print("Loading ExtFastHandle failed ", GetLastError());
     }
   ENUM_ORDER_TYPE fastDir = ExtFastBuffer[0] == ExtFastBuffer[1] ? NULL : (ExtFastBuffer[0] < ExtFastBuffer[1] ? ORDER_TYPE_BUY : ORDER_TYPE_SELL);

//---------------- Middle MA
   if(CopyBuffer(ExtMiddleHandle, 1, startFromIndex, bufferSize, ExtMiddleBuffer) < 2)
     {
      Print("Loading ExtMiddleHandle failed ", GetLastError());
     }
   ENUM_ORDER_TYPE middleDir = ExtMiddleBuffer[0] == ExtMiddleBuffer[1] ? NULL : (ExtMiddleBuffer[0] < ExtMiddleBuffer[1] ? ORDER_TYPE_BUY : ORDER_TYPE_SELL);

//---------------- Slow MA
   if(CopyBuffer(ExtSlowHandle, 2, startFromIndex, bufferSize, ExtSlowBuffer) < 2)
     {
      Print("Loading ExtSlowHandle failed ", GetLastError());
     }
   ENUM_ORDER_TYPE slowDir = ExtSlowBuffer[0] == ExtSlowBuffer[1] ? NULL : (ExtSlowBuffer[0] < ExtSlowBuffer[1] ? ORDER_TYPE_BUY : ORDER_TYPE_SELL);

   string fast = fastDir == NULL ? "EMPTY" : fastDir == ORDER_TYPE_BUY ? "BUY" : "SELL";
   string middle = middleDir == NULL ? "EMPTY" : middleDir == ORDER_TYPE_BUY ? "BUY" : "SELL";
   string slow = slowDir == NULL ? "EMPTY" : slowDir == ORDER_TYPE_BUY ? "BUY" : "SELL";
   Comment("Fast: ", fast, " Middle: ", middle, " Slow: ", slow);
  }
//+------------------------------------------------------------------+
mql5
1个回答
0
投票

[看一下示例EA之类的EMA或MACD。

  1. 不需要在EA中的SetIndexBuffer呼叫中,它们在指标中使用。
  2. CopyBuffer中的第二个参数是指标缓冲区的编号。因此,如果MA仅具有一个缓冲区,则始终使用0。如果指标有两个缓冲区,如MACD,则主线的索引为0,信号线的索引为1。

    //---------------- Middle MA
    if(CopyBuffer(ExtMiddleHandle, 0, startFromIndex, bufferSize, ExtMiddleBuffer) < 2)  
      {  
       Print("Loading ExtMiddleHandle failed ", GetLastError());
      }  
    ENUM_ORDER_TYPE middleDir = ExtMiddleBuffer[0] == ExtMiddleBuffer[1] ? NULL : (ExtMiddleBuffer[0] < ExtMiddleBuffer[1] ? ORDER_TYPE_BUY : ORDER_TYPE_SELL);
    
    //---------------- Slow MA  
    if(CopyBuffer(ExtSlowHandle, 0, startFromIndex, bufferSize, ExtSlowBuffer) < 2)  
      {  
       Print("Loading ExtSlowHandle failed ", GetLastError());
      }  
    ENUM_ORDER_TYPE slowDir = ExtSlowBuffer[0] == ExtSlowBuffer[1] ? NULL : (ExtSlowBuffer[0] < ExtSlowBuffer[1] ? ORDER_TYPE_BUY : ORDER_TYPE_SELL);
    
© www.soinside.com 2019 - 2024. All rights reserved.