Errori, bug, domande - pagina 823

 
MetaDriver:

Il 95% degli errori sporadici sono legati a errori di inizializzazione, o mancanza di essa. Quindi, un frammento di codice non aiuterà, e l'intero codice non lo farà, perché è paranoico ;-)

La ragione va cercata molto lontano dal luogo della manifestazione, ed è noioso per aphthar - è più facile chiedere il plotone d'esecuzione per gli sviluppatori. Aiuterà di sicuro.

// Aiuta davvero, vero, falkov? : )

Grande! Sembra che dovrebbe aiutare! :)

Faccio senza mezzi termini l'inizializzazione OVUNQUE e SEMPRE! Anche se assegno un valore a una variabile dopo un paio di righe. Ho appena fatto una regola di ferro - quando dichiari una variabile, inizializzala con null o con una stringa vuota :)

Sulla paranoia assolutamente giusto!

Metadriver, sei uno sciamano!

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

Grande! Sembra che dovrebbe aiutare! :)

:)

L'inizializzazione è stupida ovunque!

Non ci credo, devo essermelo perso questa volta :)

// Controllate davvero di nuovo, guardate l'intero codice da questa angolazione.

// È la convinzione del tuo "SEMPRE E SEMPRE" che può filtrare la percezione del tuo stesso sbadiglio, perché "IO SEMPRE...!!!" :))

 
MetaDriver:
:)

Non ci credo, questa volta mi è sfuggito di sicuro :)

// Controllate di nuovo, guardate l'intero codice da questa angolazione.

// È la convinzione del tuo "OVUNQUE e OVUNQUE" che può filtrare la percezione del tuo stesso sbadiglio, perché "IO SEMPRE...!!!" :))

Te lo dico io - Sciamano! Durante il fine settimana ho controllato tutti i file EA (diverse migliaia di righe). Ed è vero, ho trovato due o tre variabili non inizializzate nelle vecchie librerie.

La mia regola è dichiarare TUTTE le variabili all'inizio del corpo della funzione (è sempre stato così) e inizializzarle immediatamente (l'anno scorso, probabilmente)

Non mi considero uno stupido - ho scritto più di un centinaio di indici/script/consiglieri diversi :)

E qui sto lottando come un pesce sul ghiaccio - non riesco a localizzare! Potrei spararmi!

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

A proposito, ecco il codice:

//Найти первое 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: A proposito, ecco il codice:

hmm, perché non controllate l'overrun dell'array intShift=structSled.intShift_PastSearch;

se intShift è fuori dai confini dell'array allora while(structSled.adblArray_Short[intShift]==structSled.adblArray_Long[intShift] && intShift>1) {intShift--;}

causerà immediatamente un errore perché il codice sarà eseguito da sinistra a destra e il riferimento a structSled.adblArray_Short[intShift] avverrà prima di && intShift>1

impostare il controllo dopo intShift=structSled.intShift_PastSearch; e poi l'uscita se esce fuori dall'array allora Print(Hurray! Ha funzionato!)

come questo

 
Buona sera, potrebbe esserci una funzione come questa
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    ));   
      }
Le strutture devono essere azzerate quando si dichiarano in questo caso?
 
GRAZIE!!!
 

Ho provato a compilare in questa forma, mi fa paura.

'PositionGetInteger' - costante attesa.mq5 65 44 Vedo la parola costante. Ma di cosa ha bisogno? È nella prima riga della funzione.

Ed è così per tutte le altre dichiarazioni di variabili, ma ho dichiarato la funzione secondo l'aiuto, no?

'price' - valore predefinito mancante per il parametro order.mq5 65 92

 
Grazie, sto compilando ora.