Ошибки, баги, вопросы - страница 2634

 
Petros Shatakhtsyan:

Нет, не для других целей.

Я не думал что в выходные дни TimeLocal работает и сделал так: на TimeCurrent прибавил несколько часов и проверил день недели. Если это суббота, то начать оптимизацию.

С этим конечно точно определить начало субботы нельзя, поскольку рынок в пятницу или в праздничные дни по разному закрывается.

Также нигде не нашел средство, чтобы определить: рынок закрыт или нет.

Пробовали ?

SymbolInfoSessionTrade

или

SymbolInfoInteger(SYMBOL_TRADE_MODE)

Что-то из них помню должно годится

 
Aleksey Mavrin:

Пробовали ?

SymbolInfoSessionTrade

или

SymbolInfoInteger(SYMBOL_TRADE_MODE)

Что-то из них помню должно годится

Нет, не пробовал. В справочнике конкретно не написано как определить рынок открыт или нет.

Дело в том, что когда в понедельник рынок "открывается", например у одного брокера котировки начинаются приходить 02ч.05 минут, но сделки не принимаются еще несколько минут, выдает "Market closed".

Не знаю вот это поможет или нет.

SYMBOL_START_TIME

Дата начала торгов по инструменту (обычно используется для фьючерсов)

 
Petros Shatakhtsyan:

Нет, не пробовал. В справочнике конкретно не написано как определить рынок открыт или нет.

Дело в том, что когда в понедельник рынок "открывается", например у одного брокера котировки начинаются приходить 02ч.05 минут, но сделки не принимаются еще несколько минут, выдает "Market closed".

Не знаю вот это поможет или нет.

SYMBOL_START_TIME

Дата начала торгов по инструменту (обычно используется для фьючерсов)

нет это не оно, SymbolInfoSessionTrade же  и показывает когда торги а SymbolInfoSessionQuote когда котировки приходят. в праздники только проверять надо, не проверял.

ап: вот это должно помочь

bool  IsTradeAllowed(
  const string symbol       // символ
  datetime     tested_time  // время
   );

Документация по MQL5: Получение рыночной информации / SymbolInfoSessionQuote
Документация по MQL5: Получение рыночной информации / SymbolInfoSessionQuote
  • www.mql5.com
Получение рыночной информации / SymbolInfoSessionQuote - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Roman:

Как всегда велосипеды.

Тут вопрос, почему не проходит такая запись.
Ведь переменные из параметров, имеют начальные значения.

А если размер измерений указать числами

То компилятор пропускает, в чём прикол?

Разработчик как то прокомментирует?

Роман, вы второй раз попадаете на элементарном нежелании почитать документацию.

Индексом массива может быть только целое число. Допускаются не более чем четырехмерные массивы. Нумерация элементов массива начинается с 0. Последний элемент одномерного массива имеет номер на 1 меньший, чем размер массива, то есть обращение к последнему элементу массива из 50 целых чисел будет выглядеть как a[49]. То же самое относится и к многомерным массивам – индексация одного измерения производится от 0 до размер измерения-1. Последний элемент двумерного массива из примера будет выглядеть как m[6][49].

Статические массивы не могут быть представлены в виде таймсерий, то есть к ним не применима функция ArraySetAsSeries(), которая устанавливает доступ к элементам массива от конца массива к его началу. Если требуется обеспечить доступ к массиву как в таймсериях, используйте объект динамического массива.

При доступе за пределы массива исполняющая подсистема сгенерирует критическую ошибку и выполнение программы будет остановлено.

А в документации mql4, если мне память не совсем изменила было, чётко сказано о недопустимости применения переменных в качестве размера массива.

Документация по MQL5: Основы языка / Переменные
Документация по MQL5: Основы языка / Переменные
  • www.mql5.com
Переменные должны быть объявлены перед их использованием. Для идентификации переменных используются уникальные имена. Описания переменных используются для их определения и объявления типов. Описание не является оператором. Индексом массива может быть только целое число. Допускаются не более чем четырехмерные массивы. Нумерация элементов...
[Удален]  
Roman:

Как всегда велосипеды.

Тут вопрос, почему не проходит такая запись.
Ведь переменные из параметров, имеют начальные значения.

А если размер измерений указать числами

То компилятор пропускает, в чём прикол?

Разработчик как то прокомментирует?

Я не разработчик, но прокомментирую.

Для статического массива компилятор должен, уже при компиляции, выделить определённое количество байт в памяти.

Сколько памяти должен выделить компилятор, если row и col во время компиляции неизвестно?

Начальные значения используются только, если при вызове параметры опущены. Реальные параметры известны только во время выполнения.

Так что, никаких приколов, учите язык.

 
Aleksey Mavrin:

нет это не оно, SymbolInfoSessionTrade же  и показывает когда торги а SymbolInfoSessionQuote когда котировки приходят. в праздники только проверять надо, не проверял.

ап: вот это должно помочь

bool  IsTradeAllowed(
  const string symbol       // символ
  datetime     tested_time  // время
   );

Думаю что это не то. Вот тут есть специальная тема : https://www.mql5.com/ru/forum/40295

Не посмотрел до конца, тем более что это для MQL4.

Я думаю что сервер не должен отправить котировки символа, если рынок закрыт. 

На мой робот это не очень-то влияет, поскольку после "открытия" рынка, когда приходят тики, он анализирует тренд, их развороты, а для этого необходимо некоторое время. За это время рынок открывается.

Но это мешает, если мы хотим в это время вручную совершить какие-то сделки. И если исполнение рыночное, то запрос висит, пока не откроется рынок и естественно исполняется с текущей цены.

Явно не хватает прямая функция, которая получила-бы имя символа и вернула true/false, (рынок открыт/закрыт).

Как правильно выяснить, что рынок закрыт? (mql4)
Как правильно выяснить, что рынок закрыт? (mql4)
  • 2015.01.31
  • www.mql5.com
Перевел советника в режим работы OnTimer() теперь когда рынок закрыт он этого не понимает и пытается торговать, в общем обращается к серверу и естественно получает ошибки и забивает логи журнала.
 

  Это платформа (МТ5) создана для торговли на финансовых рынках или цирк какой то? Что надо каждый раз переделывать коды под ваши обновления? Достало.

 
Aleksandr Prishenko:

  Это платформа (МТ5) создана для торговли на финансовых рынках или цирк какой то? Что надо каждый раз переделывать коды под ваши обновления? Достало.

хм.... 

а что именно переделывали? может и мне надо? 

Вроде ничего по обновлениям не переделывал......... 

 
#include <MovingAverages.mqh>
//--- indicator settings
#property indicator_separate_window
#property indicator_buffers 6
#property indicator_plots   4
//--- plot Value
#property indicator_label1  "Volume;Volume1"
#property indicator_type1   DRAW_FILLING
#property indicator_color1  clrBlue,clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  2
//--- plot Middle
#property indicator_label2  "Middle line"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrMediumOrchid
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1
//--- plot OverBought
#property indicator_label3  "Bands upper"
#property indicator_type3   DRAW_LINE
#property indicator_color3  clrDeepPink
#property indicator_style3  STYLE_SOLID
#property indicator_width3  1
//--- plot OverSold
#property indicator_label4  "Bands lower" //нижняя линия
#property indicator_type4   DRAW_LINE
#property indicator_color4  clrDeepPink
#property indicator_style4  STYLE_SOLID
#property indicator_width4  1
//---
enum OSCILLATOR_NAME {
   MACD,             // MACD
   MOMENTUM,         // Momentum
   RSI,              // RSI
   MFI,               // MFI 
   AC                // AC
};
//---
enum LEVEL_MODE {
   CONST_VALUE_MODE, // Constant level value mode
   MA_MODE,          // Moving Average mode
   BB_MODE           // Bollinger Bands Mode
};
//---
enum DRAW_MODE {
   LINE,             // Line
   FILLING,          // Filling
   HISTOGRAM         // Histogram
};
//--- input parameters
input ENUM_TIMEFRAMES      TF_Oscillator = PERIOD_CURRENT;                        // TIMEFRAMES Oscillator
input OSCILLATOR_NAME      InpOscillator = MACD;                         // Oscillator
input int                  InpOscPeriod1 = 1;                          // MACD Fast EMA / Period for: RSI,MFI,Momentum 
input int                  InpOscPeriod2 = 34;                           //  MACD Slow EMA
input int                  InpOscPeriod3 = 1;                           //  MACD Signal
input ENUM_APPLIED_PRICE   InpAppliedPrice = PRICE_CLOSE;               // Applied price
input  ENUM_APPLIED_VOLUME InpVOLUME = VOLUME_TICK;                    //Applied Volume for MFI
input DRAW_MODE            InpDrawMode = LINE;                       // Draw Mode 
input int                  InpLevelsPeriod = 40;                        // Levels Period Upper
input int                  InpLevelsPeriod1 = 35;                        // Levels Period  Lower
input double               InpLevelsIndent = 3.0;                       // Deviation Upper
input double               InpLevelsIndent1 = 4.0;                       //  Deviation Lower

 LEVEL_MODE           InpLevelsMode = BB_MODE;                     // Levels Mode
bool                 InpIndentAutoCorrection = true;              // Levels Auto Correction
//input string               InpDivider = "---For Stochastic or MACD---"; // Just Divider NOT Parameter 
//input ENUM_STO_PRICE       InpStochPrice = STO_LOWHIGH;                 // Stochastic Price

//--- indicator buffers
double         ExtBuffer1[]; //Line
double         ExtBuffer2[];//Middle
double         ExtBuffer3[];//Upper
double         ExtBuffer4[];//Lowe
double         ExtBuffer5[];
double         ExtBuffer6[];
//--- global variables
int            oscPeriod1;
int            levelsPeriod;
int            levelsPeriod1;
int            minRequiredBars;
int            oscHandle;
int            oscPeriod2;
int            oscPeriod3;
double         midValue;
double         addValue;
double         levelsIndent,levelsIndent1 ;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit() {
//---
   if ( InpOscPeriod1 < 1 ) {
      oscPeriod1 = 14;
      printf("Incorrected input parameter InpOscPeriod1 = %d. Indicator will use value %d.", InpOscPeriod1, oscPeriod1);
   } else {
      oscPeriod1 = InpOscPeriod1;
   }
   
   if ( InpLevelsPeriod < 1 ) {
      levelsPeriod = 10;
      printf("Incorrected input parameter InpLevelsPeriod = %d. Indicator will use value %d.", InpLevelsPeriod, levelsPeriod);
   } else {
      levelsPeriod = InpLevelsPeriod;
   }
   if ( InpLevelsPeriod1 < 1 ) {
      levelsPeriod = 10;
      printf("Incorrected input parameter InpLevelsPeriod = %d. Indicator will use value %d.", InpLevelsPeriod, levelsPeriod);
   } else {
      levelsPeriod1 = InpLevelsPeriod1;
   }
   
   if ( InpOscPeriod2 < 1 ) {
      oscPeriod2 = 3;
      printf("Incorrected input parameter InpOscPeriod2 = %d. Indicator will use value %d.", InpOscPeriod2, oscPeriod2);
   } else {
      oscPeriod2 = InpOscPeriod2;
   }
   
   if ( InpOscPeriod3 < 1 ) {
      oscPeriod3 = 3;
      printf("Incorrected input parameter InpOscPeriod3 = %d. Indicator will use value %d.", InpOscPeriod3, oscPeriod3);
   } else {
      oscPeriod3 = InpOscPeriod3;
   }
   
   levelsIndent = MathAbs(InpLevelsIndent);// Levels Indent / Deviation
   levelsIndent1 = MathAbs(InpLevelsIndent1);// Levels Indent / Deviation
//---
   minRequiredBars = 20; // oscPeriod1 + oscPeriod2 + oscPeriod3 + levelsPeriod - 1;
//--- indicator buffers mapping
   SetIndexBuffer(0, ExtBuffer1, INDICATOR_DATA);
   SetIndexBuffer(1, ExtBuffer2, INDICATOR_DATA);
   SetIndexBuffer(2, ExtBuffer3, INDICATOR_DATA);
   SetIndexBuffer(3, ExtBuffer4, INDICATOR_DATA);
   SetIndexBuffer(4, ExtBuffer5, INDICATOR_DATA);
   SetIndexBuffer(5, ExtBuffer6, INDICATOR_DATA);
//---
   string shortname = "Oscillator For BBS: ";
//---
   switch ( InpOscillator ) {
 
      case MACD:
         oscHandle = iMACD(_Symbol, TF_Oscillator, oscPeriod1, oscPeriod2, oscPeriod3, InpAppliedPrice);
         midValue = 0.0;
         shortname += "MACD (" + (string)oscPeriod1 + ", " + (string)oscPeriod2 + ", " + (string)oscPeriod3 + ")";
         break;
         
      case MOMENTUM:
         oscHandle = iMomentum(_Symbol, TF_Oscillator, oscPeriod1, InpAppliedPrice);
         midValue = 100.0;
         levelsAutoCorrect(0.03, 5.0, 0.5);
         shortname += "Momentum (" + (string)oscPeriod1 + ")";
         break;
         
      case RSI:
         oscHandle = iRSI(_Symbol, TF_Oscillator, oscPeriod1, InpAppliedPrice);
         midValue = 50.0;
         levelsAutoCorrect(5.0, 50.0, 20.0);
         shortname += "RSI (" + (string)oscPeriod1 + ")";
         break;
      case MFI:
         oscHandle = iMFI(_Symbol, TF_Oscillator, oscPeriod1, InpVOLUME);
         midValue = 50.0;
         levelsAutoCorrect(5.0, 50.0, 20.0);
         shortname += "MFI (" + (string)oscPeriod1 + ")";
         break;
         
       case AC:
         oscHandle = iAC(_Symbol,0);
         midValue = 0.0;
         levelsAutoCorrect(5.0, 50.0, 20.0);
         shortname += "AC";
         break; 
               
      default:
         oscHandle = INVALID_HANDLE;
         Print("Unknown Oscillator!");
         return(-1);
   }
//---
   switch ( InpDrawMode ) {
      case FILLING:
         SetIndexBuffer(2, ExtBuffer3, INDICATOR_DATA);
         PlotIndexSetInteger(0, PLOT_DRAW_TYPE, DRAW_FILLING);
         break;
         
      case HISTOGRAM:
         SetIndexBuffer(2, ExtBuffer3, INDICATOR_COLOR_INDEX);
         PlotIndexSetInteger(0, PLOT_DRAW_TYPE, DRAW_COLOR_HISTOGRAM2);
         break;
         
      case LINE:
      default:
         SetIndexBuffer(2, ExtBuffer3, INDICATOR_DATA);
         PlotIndexSetInteger(0, PLOT_DRAW_TYPE, DRAW_LINE);
         break;
   }
//---
   IndicatorSetString(INDICATOR_SHORTNAME, shortname); 
//---
   return(0);
}
//+------------------------------------------------------------------+
//| Levels indent / deviation correction function                    |
//+------------------------------------------------------------------+
void levelsAutoCorrect(double minIndent, double maxIndent, double correctIndent)
 {
//---
   if ( InpLevelsMode == BB_MODE ) {
      if ( levelsIndent > 4.0   ) {
         levelsIndent = 2.0;
         printf("Incorrected deviation input parameter InpLevelsIndent = %f. Indicator will use value %f.", 
            InpLevelsIndent, levelsIndent);
      }
      if ( levelsIndent1 > 4.0  ) {
         levelsIndent1 = 2.0;
         printf("Incorrected deviation input parameter InpLevelsIndent = %f. Indicator will use value %f.", 
            InpLevelsIndent, levelsIndent1);
      }
   } else {
      if ( levelsIndent < minIndent || levelsIndent > maxIndent ) {
         levelsIndent = correctIndent;
         printf("Incorrected indent input parameter InpLevelsIndent = %f. Indicator will use value %f.", 
            InpLevelsIndent, levelsIndent);
      }
      
      if ( levelsIndent1 < minIndent || levelsIndent1 > maxIndent ) {
         levelsIndent1 = correctIndent;
         printf("Incorrected indent input parameter InpLevelsIndent = %f. Indicator will use value %f.", 
            InpLevelsIndent, levelsIndent1);
      } 
      
   }
//---
}
//+------------------------------------------------------------------+
//| 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 startBar, calculated, toCopy;
//---
   if ( rates_total < minRequiredBars ) {
      Print("Not enough bars for calculation.");
      return(0);
   }
//---
   calculated = BarsCalculated(oscHandle);
   if ( calculated < rates_total ) {
      Print("Not all data of oscHandle is calculated (", calculated, " bars. Error #", GetLastError());
      return(0);
   }
//---
   if ( prev_calculated > rates_total || prev_calculated <= 0 ) {
      startBar = minRequiredBars;
      toCopy = rates_total;
   } else {
      startBar = prev_calculated - 1;
      toCopy = rates_total - prev_calculated;
      if ( prev_calculated > 0 ) {
         toCopy += 1;
      }
   }
//---
   if ( CopyBuffer(oscHandle, 0, 0, toCopy, ExtBuffer1) <= 0 ) {
      Print("Getting Oscillator is failed. Error #", GetLastError());
      return(0);
   }
//---
   if ( InpLevelsMode != CONST_VALUE_MODE ) { //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
      SimpleMAOnBuffer(rates_total, prev_calculated, oscPeriod1+levelsPeriod, levelsPeriod, ExtBuffer1, ExtBuffer2);
   }
//---   
   for ( int bar = startBar; bar < rates_total; bar++ ) {
      double value, sum = 0.0, sum1 = 0.0;
      double middleLine, indent, indent1;
      //---
      switch ( InpLevelsMode ) {
         case MA_MODE:
            middleLine = ExtBuffer2[bar];
            indent = levelsIndent;
            indent1 = levelsIndent1;
            break;
         case BB_MODE:          //просмотреть формулу
            middleLine = value = ExtBuffer2[bar];
            for ( int i = bar - levelsPeriod + 1; i <= bar; i++ ) {
               sum += MathPow(ExtBuffer1[i]-value, 2);
            }
            indent = levelsIndent * MathSqrt(sum/levelsPeriod); 
            for ( int k = bar - levelsPeriod1 + 1; k <= bar; k++ ) {
               sum1 += MathPow(ExtBuffer1[k]-value, 2);
            }
            indent1 = levelsIndent1 * MathSqrt(sum/levelsPeriod1);            
            break;
         case CONST_VALUE_MODE:
         default:
            middleLine = ExtBuffer2[bar] = midValue;
            indent = levelsIndent;
            indent1 = levelsIndent1;
            break;
      }
      //---
      switch ( InpDrawMode ) {
         case LINE:
            ExtBuffer3[bar] = middleLine + indent; //Upper
            ExtBuffer4[bar] = middleLine - indent1; //Lowe
            break;
         case FILLING:
            ExtBuffer3[bar] = middleLine;
            ExtBuffer4[bar] = middleLine + indent;
            ExtBuffer5[bar] = middleLine - indent1;
            break;
         case HISTOGRAM:
            if ( ExtBuffer1[bar] >= ExtBuffer2[bar] ) {
               ExtBuffer3[bar] = 0;
            } else {
               ExtBuffer3[bar] = 1;
            }
            ExtBuffer4[bar] = middleLine;
            ExtBuffer5[bar] = middleLine + indent;
            ExtBuffer6[bar] = middleLine - indent1;
            break;
      }
   }
//--- return value of prev_calculated for next call
   return(rates_total);
}
//+------------------------------------------------------------------+

Какая тут ошибка?  Пару билдов тому подобной ошибки небыло.

         case BB_MODE:
            middleLine = value = ExtBuffer2[bar];
            for ( int i = bar - levelsPeriod + 1; i <= bar; i++ ) {
               sum += MathPow(ExtBuffer1[i]-value, 2);
2020.02.05 10:56:13.220 Core 1 2017.11.01 00:00:00   array out of range in 'Oscillator For BBS.mq5' (308,41)

 
Aleksandr Prishenko:

Какая тут ошибка?  Пару билдов тому подобной ошибки небыло.

2020.02.05 10:56:13.220 Core 1 2017.11.01 00:00:00   array out of range in 'Oscillator For BBS.mq5' (308,41)

А... ясно...

Ну это не с обновлениями связано наверное. Надо разбирать, почему.....