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

 
Yedelkin:
Причины-то ведь могут быть разные.. Самые известные - деление на ноль, выход за пределы массива.

Спасибо.

Что такое выход за пределами массива? Извиняюсь за мое незнание.

У меня только 3 деления:

TradeLot=AccountInfoDouble(ACCOUNT_BALANCE)*(PercentSize/100)/(100); 
MaxLotAllowed=MathFloor((MeansFree/MeansOneLot)*100)/100;
(PositionVolume()+Volume())*(100)*(100))/AccountInfoDouble(ACCOUNT_BALANCE)
 
G001: У меня только 3 деления:

Вот здесь потенциально м.б. деление на ноль:

/AccountInfoDouble(ACCOUNT_BALANCE)

Нужна элементарная проверка.

G001: Что такое выход за пределами массива? Извиняюсь за мое незнание. 

Это когда, например:

double array[3];
for (int i=0; i<=3; i++) array[i];

На последней итерации будет выход за пределы массива

 
Yedelkin:

Вот здесь потенциально м.б. деление на ноль:

Нужна элементарная проверка.

Это когда, например:

На последней итерации будет выход за пределы массива. 

Спасибо.

Круто, надо проверять если функция работает правильно?

AccountInfoDouble(ACCOUNT_BALANCE)

 

 
G001: Круто, надо проверять если функция работает правильно?
Ну а что произойдёт, когда баланс уйдёт в ноль, а функция сработает правильно? :)
 

 В таком счетчике нет проблем?

int TotalBullStopOrders()
{
  int BullCounter=0;
  int Total = OrdersTotal();
  for(i = 0; i < Total; i++)
  {
    if(OrderSelect(OrderGetTicket(i)))
    {
      if(OrderGetString(ORDER_SYMBOL)==Symbol() && OrderGetInteger(ORDER_MAGIC)==Magic)
      {
        if(OrderGetInteger(ORDER_TYPE)==ORDER_TYPE_BUY_STOP)
        {
          BullCounter++;
        }
      }
    }
  }
  return(BullCounter);
}
 
Yedelkin:
Ну а что произойдёт, когда баланс уйдёт в ноль, а функция сработает правильно? :)
Вы правы, исправлю там.
Но сейчас у меня баланс не ноль, а советник улыбается по зеленому, но прекращает работу, Абнормально и без никаких предупреждений, лучше бы и не улыбался... :)
 
G001: В таком счетчике нет проблем?

У оператора for не указан тип переменной i. Переменная Magic не определена. В строчке

if(OrderSelect(OrderGetTicket(i)))
функция OrderSelect() - лишняя. Больше ничего не заметил.
Документация по MQL5: Основы языка / Операторы / Оператор цикла for
Документация по MQL5: Основы языка / Операторы / Оператор цикла for
  • www.mql5.com
Основы языка / Операторы / Оператор цикла for - Документация по MQL5
 
AndreyS:

вопрос с ошибкой (Ошибка CopyBuffer - номер ошибки: 4806) - снимаю, излечиваю его задержкой  Sleep(1000); - списываю на то что индикатор не успевает создатся.

Вопрос с ошибкой (4194304 bytes not available), остаётся. 

Создаться-то он скорее всего создался. Только перед копированием данных надо бы проверить наличие получаемых данных (а индикатор успел расчитаться?). Функция BarsCalculated должна помочь.

Далее вы запрашиваете все таймфреймы по символу. Если эти данные готовы - они поднимаются с диска в память, если нет - начинают строиться (тоже память расходуется) + 100 индикаторов с разным периодом на каждый ТФ и все это в памяти. Данные из памяти выгружаются не сразу (а вдруг вы еще раз запросите их)...

Уменьшите кол-во баров на чарте.

Документация по MQL5: Доступ к таймсериям и индикаторам / BarsCalculated
Документация по MQL5: Доступ к таймсериям и индикаторам / BarsCalculated
  • www.mql5.com
Доступ к таймсериям и индикаторам / BarsCalculated - Документация по MQL5
 
Yedelkin:

У оператора for не указан тип переменной i. Переменная Magic не определена. В строчке

функция OrderSelect() - лишняя. Больше ничего не заметил.

 

Спасибо.

Есть вне оператора.

input int    Magic          = 55;

 

MqlTradeRequest request={0};
MqlTradeResult result={0};
MqlTradeCheckResult check={0};
//-----
int LotsDigits;
int Indicator;
double IndicatorVal[5];
double Ask;
double Bid;
int i;
int pos;
double TradeLot;
ulong StopLevel;
double MeansFree;
double MaxLotAllowed;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
 
alexvd:

Создаться-то он скорее всего создался. Только перед копированием данных надо бы проверить наличие получаемых данных (а индикатор успел расчитаться?). Функция BarsСalculated должна помочь.

Далее вы запрашиваете все таймфреймы по символу. Если эти данные готовы - они поднимаются с диска в память, если нет - начинают строиться (тоже память расходуется) + 100 индикаторов с разным периодом на каждый ТФ и все это в памяти. Данные из памяти выгружаются не сразу (а вдруг вы еще раз запросите их)...

Уменьшите кол-во баров на чарте.

 

        while(BarsCalculated(m_handle)==-1 && !IsStopped()) Sleep(1); // Спасибо alexvd - откоректировал строку с учётом замечаний

Количество баров ничего не меняет,

проблема спрятана в периодах, для варианта

for(int iperiod=5; iperiod<=19; iperiod++) 

не работает, 19-5=14 - разных периодов,

если их уменьшить до 4- то все работает, например:

for(int iperiod=16; iperiod<=19; iperiod++)

 Хотя фу-я IndicatorRelease(m_handle) - дествительно некорректно используется.

Думаю даже если не освобождать дескрипторы функцией  IndicatorRelease, всеравно должно работать,

получается проблема в количестве разных периодов.

Или... 

Причина обращения: