Скомпилирован в билде 890. Операционка Win XP 32-bit. Допустимо ли объявлять динамические массивы как static? Ведь работало. На 840 билде работает.
Скомпилирован в билде 890. Операционка Win XP 32-bit. Допустимо ли объявлять динамические массивы как static? Ведь работало. На 840 билде работает.
Build 890:
//+------------------------------------------------------------------+ //| test_script.mq4 | //| Copyright 2015, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2015, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" #property strict //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { static int a[]; ArrayResize(a,1); } //+------------------------------------------------------------------+Ошибки нет.
Попробуйте то же самое скомпилировать в эксперте. Там появляется эта ошибка на втором тике или сразу.
Странно все это.
Попробуйте то же самое скомпилировать в эксперте. Там появляется эта ошибка на втором тике или сразу.
Странно все это.
И в советнике работает без ошибок:
//+------------------------------------------------------------------+ //| Test.mq4 | //| Copyright 2015, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2015, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" #property strict //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { static int count=0; static int a[]; ResetLastError(); int rezult=ArrayResize(a,1); if(rezult==-1) { Print("Error ",GetLastError()); return; } Print("Count ",count); count++; } //+------------------------------------------------------------------+ //| ChartEvent function | //+------------------------------------------------------------------+ void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam) { //--- } //+------------------------------------------------------------------+
Вы точно других операций и вычислений не выполняете?
Спасибо за сообщение, ошибку воспроизвели. Исправим.
От операционки, вероятно, не зависит. На рабочей машине мне тоже удалось получить эту ошибку.
Ребята из Сервисдеска взяли на карандаш. Владмимр, попробуйте запустить вот такой код, и у вас, скорее всего, будет
Access violation write to 0x00000008
bool EquityGain(int gain=40) { static int GainData[]; //создаем массив учета достижения такой прибыли int buffer_reserve=1000; // задаем размер резерва для буфера //и создаем массив для буфера без размера. //данные будт храниться после каждого вызова функции static double EquityBuffer[]; //если в буфере уже есть что-то, то сдвигаем на один индекс право все что есть. //чтобы освободить нулевой индекс для свежих данных //общий размер массива при копировании автоматически увеличивается //освобождается нулевая позиция: if(ArrayRange(EquityBuffer,0)>0) ArrayCopy(EquityBuffer,EquityBuffer,1,0); // если буфер еще пустой, то делаем ему начальный размер. В пустой ничего не положишь else ArrayResize(EquityBuffer,1,buffer_reserve); //в любом случае начальная позиция подготовлена //и мы кладем в нее величину текущих средств EquityBuffer[0]=MathRound(AccountEquity()); // выясняем максимальное значение в буфере (не требуется) double buffer_max=EquityBuffer[ArrayMaximum(EquityBuffer,WHOLE_ARRAY,0)]; // выясняем минимальное значение double buffer_min=EquityBuffer[ArrayMinimum(EquityBuffer,WHOLE_ARRAY,0)]; double top_threshold=buffer_min+gain; // вычисляем верхнюю границу Comment("equity top:"+(string)top_threshold); // напишем на экране на каком уровне состоится отскок //если самые свежие данные в буфере достигли верхней границы if(EquityBuffer[0]>=top_threshold) { //We prepare GainData array the same way. see above if(ArrayRange(GainData,0)>0) ArrayCopy(GainData,GainData,1,0); else ArrayResize(GainData,1,buffer_reserve); //и положим в него например информацию о размере буфера, //i.e. number of records in the buffer //т.е. number of ticks for which Equity has rebounded from the bottom GainData[0]=ArrayRange(EquityBuffer,0); //zero out the main buffer to start all over again. //Zero dimension also zeros out with ArrayFree ArrayFree(EquityBuffer); //and return function true return(true); } //GainData may not be ready when the function is called for the first time //so we have to check if the array is accecible. otherwise it will be system critical error //if the size of array is undefined than skip if(ArrayRange(GainData,0)>0) Comment("ticks:"+(string)GainData[0]); //write on the screen how many ticks have passed return(false); // if the new data is still below the threshold than return false }
Ошибку даёт функция ArrayCopy, если массив назначения имеет резерв. Пожалуйста, уберите его для работы в текущем билде.
int buffer_reserve=0; // задаем размер резерва для буфера
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
В новом билде не позволяет работать с массивом, объявленным внутри функции как static.
Например
Компилятор ошибки не выдает. Но ошибка возникает в терминале (4.00 билд 890, 32-bit)
Раньше работало и рассчет был на то, что при каждом новом вызове функции, массив сохранял данные.