CopyBuffer Error
Why don't you process incoming quotes online?
You only fill the buffer once:
if( prev_calculated == 0 ) {
Where is the processing condition
int limit=prev_calculated-1; if(prev_calculated==0) limit=0; for(int i=limit; i<rates_total; i++) {
?
//+------------------------------------------------------------------+ //| MHI.mq5 | //| Copyright 2019, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2019, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" //--- funçoes proprias #import "funcoesTiagoEA.ex5" int CorCandle (const double open, const double close); #import //----------------------- #property indicator_chart_window #property indicator_buffers 1 #property indicator_plots 1 //--- plot wins #property indicator_label1 "wins" #property indicator_type1 DRAW_NONE #property indicator_color1 clrRed #property indicator_style1 STYLE_SOLID #property indicator_width1 1 //--- input parameters input int velas=120; //--- indicator buffers double winsBuffer[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- indicator buffers mapping SetIndexBuffer(0,winsBuffer,INDICATOR_DATA); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { //--- winsBuffer[0] = 99.0; //--- return value of prev_calculated for next call return(rates_total); } //+------------------------------------------------------------------+
I just want to pass the value on to the expert and I'm not getting it. Then I changed the code to the simplest possible to try
ERROR^
//--- funçoes proprias #import "funcoesTiagoEA.ex5" int CorCandle (const double open, const double close); #import
//+------------------------------------------------------------------+ //| funcoesTiagoEA.mq5 | //| Copyright 2019, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property library #property copyright "Copyright 2019, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" int CorCandle( const double open, const double close ) export { if( open < close ) //verde { return 1; } else if( open > close ) //vermelho { return -1; } else { return 0; //empate } }funcoesTiagoEA.ex5
Use right code.
Indicator: (located in the MQL5 \ Indicators \ Test folder)
//+------------------------------------------------------------------+ //| MHI.mq5 | //| Copyright 2019, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2019, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.000" #property indicator_separate_window #property indicator_buffers 1 #property indicator_plots 1 //--- plot wins #property indicator_label1 "wins" #property indicator_type1 DRAW_LINE #property indicator_color1 clrRed #property indicator_style1 STYLE_SOLID #property indicator_width1 1 //--- input parameters input int velas=120; //--- indicator buffers double winsBuffer[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- indicator buffers mapping SetIndexBuffer(0,winsBuffer,INDICATOR_DATA); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { //--- int limit=prev_calculated-1; if(prev_calculated==0) limit=0; for(int i=limit; i<rates_total; i++) { winsBuffer[i] = i; } //--- return value of prev_calculated for next call return(rates_total); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+
Expert: (located in the MQL5 \ Experts \ Tests folder)
//+------------------------------------------------------------------+ //| MHI EA.mq5 | //| Copyright 2020, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2020, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" //--- input parameters input int Input1=9; //--- int handle_iCustom; // variable for storing the handle of the iCustom indicator //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- create handle of the indicator iCustom handle_iCustom=iCustom(Symbol(),Period(),"Test\\MHI"); //--- if the handle is not created if(handle_iCustom==INVALID_HANDLE) { //--- tell about the failure and output the error code PrintFormat("Failed to create handle of the iCustom indicator for the symbol %s/%s, error code %d", Symbol(), EnumToString(Period()), GetLastError()); //--- the indicator is stopped early return(INIT_FAILED); } //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- string text=""; double mhi[]; ArraySetAsSeries(mhi,true); int start_pos=0,count=3; if(!iGetArray(handle_iCustom,0,start_pos,count,mhi)) { return; } for(int i=count-1; i>=0; i--) { text=text+"MHI"+"["+(string)i+"]"+" "+DoubleToString(mhi[i],2)+" | "+"\n"; } Comment(text); } //+------------------------------------------------------------------+ //| Get value of buffers | //+------------------------------------------------------------------+ bool iGetArray(const int handle,const int buffer,const int start_pos, const int count,double &arr_buffer[]) { bool result=true; if(!ArrayIsDynamic(arr_buffer)) { PrintFormat("ERROR! EA: %s, FUNCTION: %s, this a no dynamic array!",__FILE__,__FUNCTION__); return(false); } ArrayFree(arr_buffer); //--- reset error code ResetLastError(); //--- fill a part of the iBands array with values from the indicator buffer int copied=CopyBuffer(handle,buffer,start_pos,count,arr_buffer); if(copied!=count) { //--- if the copying fails, tell the error code PrintFormat("ERROR! EA: %s, FUNCTION: %s, amount to copy: %d, copied: %d, error code %d", __FILE__,__FUNCTION__,count,copied,GetLastError()); //--- quit with zero result - it means that the indicator is considered as not calculated return(false); } return(result); } //+------------------------------------------------------------------+
Result:
Files:
MHI.mq5
3 kb
MHI_EA.mq5
4 kb

I'm trying to import an indicator value but I'm not getting it. The print on the indicator has the right value but when I pull the expert, only 0.0 appears
2020.07.29 11:39:23.968 MHI (EURUSD,M1) WINS: -16.000000