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

 
MetaDriver:

95% спорадических ошибок связаны с ошибками инициализации, либо отсутствием таковой.  Так что фрагмент кода не поможет, а весь он не даст, ибо паранойя.  ;-)

Причину следует искать очень далеко от места проявления, а афтару влом - проще потребовать расстрела для разработчиков. Это ведь наверняка поможет. 

//  Ведь правда поможет, falkov ?  :)

Супер! Кажется, это должно помочь! :)

Инициализацию делаю тупо ВЕЗДЕ И ВСЕГДА! Даже, если через пару строк присваиваю значение переменной. Просто установил для себя железное правило - при объявлении переменной тупо ее инициализировать нулем или пустой строкой :)

Про паранойю абсолютно точно!

Метадрайвер, ты Шаман!

Документация по MQL5: Основы языка / Переменные
Документация по MQL5: Основы языка / Переменные
  • www.mql5.com
Основы языка / Переменные - Документация по MQL5
 
falkov:

Супер! Кажется, это должно помочь! :)

:)

Инициализацию делаю тупо ВЕЗДЕ И ВСЕГДА!

А не верю!  Вот на этот раз пропустил, наверняка.  :)

// Реально проверь ещё раз, просмотри весь код под этим углом. 

//  Именно вера в своё "ВЕЗДЕ И ВСЕГДА", может фильтровать восприятие собственного зевка, ибо "я же ВСЕГДА...!!"  :))

 
MetaDriver:
:)

А не верю!  Вот на этот раз пропустил, наверняка.  :)

// Реально проверь ещё раз, просмотри весь код под этим углом. 

//  Именно вера в своё "ВЕЗДЕ И ВСЕГДА", может фильтровать восприятие собственного зевка, ибо "я же ВСЕГДА...!!"  :))

Я же говорю - Шаман! В выходные проверил все файлы советника (несколько тысяч строк). И правда, нашел две или три неинициалированных переменных в старых библиотеках.

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

Сам себя чайником не считаю - написано больше сотни всяких разных индиков/скриптов/советников :)

А тут бьюсь как рыба об лед - не могу локализовать! Вот хоть застрелись!

Документация по MQL5: Основы языка / Функции
Документация по MQL5: Основы языка / Функции
  • www.mql5.com
Основы языка / Функции - Документация по MQL5
 

Вот код, кстати:

//Найти первое adblArray_Short х adblArray_Long  ПОСЛЕ (позже) intShift_PastSearch (поиск от intShift_PastSearch до нулевого бара)
void FindCrossArrays_PastThisShift(structS & structSled) {
    datetime adtmDTM[];
    int intShift=0;
   
    if(structSled.intShift_PastSearch>_cintBarsAmountForCalc) {return;}
    else if(structSled.intShift_PastSearch<=0) {return;}
   
    ArrayResize(adtmDTM,structSled.intBarsAmountForCalc);
    ArrayInitialize(adtmDTM,0);
    ArraySetAsSeries(adtmDTM,true);
   
    CopyTime(structSled.strSymbol,structSled.enumTF,0,structSled.intShift_PastSearch+1,adtmDTM);

    intShift=structSled.intShift_PastSearch;
   

                                    ▼ - вот здесь ошибка - array out of range in '_indMyAO_from_SetPeriod.mq5' (390,37)
    while(structSled.adblArray_Short[intShift]==structSled.adblArray_Long[intShift] && intShift>1) {intShift--;}


    if(structSled.adblArray_Short[intShift]>structSled.adblArray_Long[intShift]) {
        while(structSled.adblArray_Short[intShift]>structSled.adblArray_Long[intShift] && intShift>0) {intShift--;}
       
        if(intShift>0) {
            structSled.intRet_FindingDirection=-1;
            structSled.intRet_FindingShift=intShift;
        }
        else {
            structSled.intRet_FindingDirection=0;
            structSled.intRet_FindingShift=intShift;
        }
    }   
    else if(structSled.adblArray_Short[intShift]<structSled.adblArray_Long[intShift]) {
        while(structSled.adblArray_Short[intShift]<structSled.adblArray_Long[intShift] && intShift>0) {intShift--;}
       
        if(intShift>0) {
            structSled.intRet_FindingDirection=1;
            structSled.intRet_FindingShift=intShift;
        }
        else {
            structSled.intRet_FindingDirection=0;
            structSled.intRet_FindingShift=intShift;
        }
    }   
    structSled.dtmRet_FindingDTM=adtmDTM[structSled.intRet_FindingShift];
    return;
}
//-------------------------------------------------------------------------------------------------

 
falkov:Вот код, кстати:

хм, а почему не проверяете на выход за пределы массива intShift=structSled.intShift_PastSearch;

если у Вас intShift окажется за переделами массива, то   while(structSled.adblArray_Short[intShift]==structSled.adblArray_Long[intShift] && intShift>1) {intShift--;}

сразу же вызовет ошибку, т.к. код будет выполняться слева на право и обращение к structSled.adblArray_Short[intShift] произойтет раньше чем  && intShift>1

поставьте проверку  после  intShift=structSled.intShift_PastSearch; и затем вывод если выход за пределы массива тогда Print(Ура!Заработало!);

кактотак 

 
Добрый вечер! Скажите, а могла бы существовать примерно такая функция   
void  PositionModify( int PositionTicket= PositionGetInteger(POSITION_IDENTIFIER), double price, double stoploss, double takeprofit, datetime expiration, color arrow_color=CLR_NONE)
      {  MqlTradeRequest request;
         MqlTradeResult result;
        request.action= TRADE_ACTION_SLTP; 
        request.order= PositionTicket; 
        request.price= price;
        request.symbol= Symbol();
        request.sl= stoploss;
        request.tp= takeprofit;
        return (OrderSend( request,   result    ));   
      }
Нужно ли в данном случае обнулять структуры при обьявлении?
 
СПАСИБО!!!   
 

Вы знаете, попробовал компиллировать имено в таком виде, страшно ругается.

 'PositionGetInteger' - constant expected ордерній.mq5 65 44 Вижу слово константа. Но что ему надо??   Это на функцию в первой строке.

 

А вот так на все остальные обьявления переменных, но я же обьявлял функцию согласно справке?

'price' - missing default value for parameter ордерній.mq5 65 92
 

 
Спасибо, я щас компилирую.
 
Причина обращения: