Ok I've managed to hack down the code to almost nothing to try to isolate the issue, and remove the reference to the common function include file.
#property copyright "Copyright 2014, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" #property strict #property indicator_chart_window int OnInit() { int t = GetCustomPeriodMovingAverageTrend(Symbol(), 1, 1, 21, MODE_LWMA); return(INIT_SUCCEEDED); } 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[]) { return(rates_total); } void OnChartEvent(const int id, const long& lparam, const double& dparam, const string& sparam) { } void OnDeinit(const int reason) { } struct PriceTime { double price; datetime time; }; void GetCustomPeriodMovingAverage(string symbol, ENUM_TIMEFRAMES period, int periodMultiplier, int maPeriod, ENUM_MA_METHOD maMethod, PriceTime& values[], int startAt = 0, int count = 0) { if (count != 0) count += maPeriod; MqlRates rates[]; //GetCustomPeriodData(symbol, period, periodMultiplier, rates, startAt, count); CopyRates(symbol, period, startAt, count, rates); double tempValues[]; PrintFormat("Before resize - AsRates: %i, AsTemp: %i", ArraySize(rates), ArraySize(tempValues)); ArrayResize(tempValues, ArraySize(rates)); PrintFormat("After resize - AsRates: %i, AsTemp: %i", ArraySize(rates), ArraySize(tempValues)); for (int i = 0; i < ArraySize(rates); i++) tempValues[i] = (rates[i].high + rates[i].low) / 2; ArraySetAsSeries(tempValues, true); ArrayResize(values, ArraySize(rates) - maPeriod); for (int i = 0; i < ArraySize(rates) - maPeriod; i++) { values[i].price = iMAOnArray(tempValues, 0, maPeriod, 0, maMethod, i); values[i].time = rates[ArraySize(rates) - 1 - i].time; } } int GetCustomPeriodMovingAverageTrend(string symbol, ENUM_TIMEFRAMES period, int periodMultiplier, int maPeriod, ENUM_MA_METHOD maMethod, int startAt = 0) { int count = maPeriod * 2; PriceTime values[]; GetCustomPeriodMovingAverage(symbol, period, periodMultiplier, maPeriod, maMethod, values, startAt, count); if (ArraySize(values) == 0) return 0; if (values[0].price == values[1].price) return 0; else if (values[0].price > values[1].price) return 1; else return -1; return 0; }
As you can see, I've added Print statements to debug the ArrayResize issue. The output is as follows:
ArrayResize statement just has no effect. This was code that has been working for months prior to the latest update.
It's late and I'm tired, so hopefully I'm just missing something stupid here.
for (int i = 0; i < ArraySize(rates) - maPeriod; i++) { //values[i].price = iMAOnArray(tempValues, 0, maPeriod, 0, maMethod, i); values[i].time = rates[ArraySize(rates) - 1 - i].time; }
I don't know anything about structs.
If you comment out the line as above, then the array will be resized.
I don't know if that gives you a clue to the problem.
Thanks GumRai - isn't it strange though that commenting out a line of code after the resize statement can cause it to start working?
I also noticed the same myself when I commented out the last If statement in the GetCustomPeriodMovingAverageTrend method - the ArrayResize would suddenly work.
This makes me think this is some sort of compiler issue - I can't think of any other logical reason why commenting out code after the ArrayResize would have an effect on it.
- Can someone please advise where I send a Request for Support to Metaquotes. - MQL4 forum
- Get in touch with developers using Service Desk! - MQL5 forum
- Report it to the service desk. 'MQL5.community - User Memo' - an article about the algorithmic/automated trading in MetaTrader
- Report it to the Service Desk, not us users.
Excuse me for bringing this back up, but does anyone have any experience dealing with the helpdesk?
I raised the issue on Friday, no response, hasn't been picked up.
Thanks
- Free trading apps
- Over 8,000 signals for copying
- Economic news for exploring financial markets
You agree to website policy and terms of use
I've got a bunch of indis I wrote, not recompiled since my MT4 auto updated to 890, all working fine.
I needed to make some minor changes today, and recompiled against 890, and suddenly strange things are happening.
For one, an ArrayResize statement in a section of code is now completely failing to work. Debug statements confirm the array is the same size before and after the ArrayResize command is executed. This is code I haven't touched for months.
Additionally, during the process of trying to chop code around to find out what the issue was, I kept getting Access Violation write to 0x00000000 errors coming up in the Experts tab.
I use a include file of common functions for all my indis, which reference some of the Win32 DLLs - I half suspect the issues lies with this.
Has anyone else had similar problems?
It's going to be a nightmare to try and unpick all my code to try and find what specifically is causing the error - it seems completely non-deterministic. When I comment out a line simply declaring an integer variable after the ArrayResize command for instance, it works - when I put the line back in, the command fails.
Cheers