critical runtime Error 565

Claudius Marius Walter  

Hallo zusammen,

ich wollte meinen Multiymbol EA backtesten und erhielt schon mehrfach diesen runtime Error 565. Seltsamerweise tritt er manchmal nur bei einem 1m OHLC Durchlauf auf und beim anderen mal nur bei der OpenPrice Methode. Wenn ich den visuellen Modus wähle, läuft er einwandfrei. Manchmal kommt es vor, dass er den Fehler plötzlich garnicht mehr anzeigt und alles funktioniert makellos.

der Error scheint nirgends gelistet zu sein. Ich hoffe ihr könnt mir in dieser Sache helfen. Der Fehler scheint in der OnInit Fkt. zu liegen.


int OnInit()
{

  if(TradeSymbols == "CURRENT")  //Override TradeSymbols input variable and use the current chart symbol only
  {
    NumberOfTradeableSymbols = 1;

    ArrayResize(SymbolArray, 1);
    SymbolArray[0] = Symbol();

    Print("EA will process ", SymbolArray[0], " only");
  }
  else
  {
    string TradeSymbolsToUse = "";

    if(TradeSymbols == "ALL")
      TradeSymbolsToUse = AllSymbolsString;
    else
      TradeSymbolsToUse = TradeSymbols;

    //CONVERT TradeSymbolsToUse TO THE STRING ARRAY SymbolArray
    NumberOfTradeableSymbols = StringSplit(TradeSymbolsToUse, '|', SymbolArray);

    Print("EA will process: ", TradeSymbolsToUse);
  }

//RESIZE OPEN TRADE ARRAYS (based on how many symbols are being traded)
  ResizeCoreArrays();

//RESIZE INDICATOR HANDLE ARRAYS
  ResizeIndicatorHandleArrays();

  Print("All arrays sized to accomodate ", NumberOfTradeableSymbols, " symbols");

//INITIALIZE ARAYS
  for(int SymbolLoop = 0; SymbolLoop < NumberOfTradeableSymbols; SymbolLoop++)
  {
    OpenTradeOrderTicket1[SymbolLoop] = 0;
    OpenTradeOrderTicket2[SymbolLoop] = 0;
    sellOrder[SymbolLoop] = 0;
    buyOrder[SymbolLoop] = 0;
    openOrders[SymbolLoop] = 0;
    currentAtr[SymbolLoop] = 0;
    triggerLong1[SymbolLoop] = 0;
    triggerShort1[SymbolLoop] = 0;
    slOldBuy[SymbolLoop] = 0;
    slOldSell[SymbolLoop] = 0;
    tradeOpenTime[SymbolLoop] = 0;
    tradeClosuretime[SymbolLoop]  = 0;
  }

//INSTANTIATE INDICATOR HANDLES
  if(!SetUpIndicatorHandles())
    return(INIT_FAILED);

  return(INIT_SUCCEEDED);
}

Ich denke aber nicht, dass der Fehler hier zu finden ist, da schon beim Aufruf der Onitit (--> line 1, col 1) der Fehler auftritt...

Claudius Marius Walter  

Update:

Wenn ich den Tester im visuellen Modus in dem OpenPrice Modus laufen lassen will, erscheint folgender Fehler

ich vermute, hierfür sind die folgenden Zeilen relevant:

Das ist einer Header Datei. Die jeweiligen Funktionen werden in der Oninit aufgerufen:

void ResizeCoreArrays()
  {
   ArrayResize(currentAtr, NumberOfTradeableSymbols);
   ArrayResize(OpenTradeOrderTicket1, NumberOfTradeableSymbols);
   ArrayResize(OpenTradeOrderTicket2, NumberOfTradeableSymbols);
   ArrayResize(sellOrder, NumberOfTradeableSymbols);
   ArrayResize(openOrders, NumberOfTradeableSymbols);
   ArrayResize(buyOrder, NumberOfTradeableSymbols);
   ArrayResize(triggerLong1, NumberOfTradeableSymbols);
   ArrayResize(triggerShort1, NumberOfTradeableSymbols);
   ArrayResize(slOldBuy, NumberOfTradeableSymbols);
   ArrayResize(slOldSell, NumberOfTradeableSymbols);
   ArrayResize(tradeOpenTime, NumberOfTradeableSymbols);
   ArrayResize(tradeClosuretime, NumberOfTradeableSymbols);
  }

//+------------------------------------------------------------------+
//| Resize Handle Arrays                                             |
//+------------------------------------------------------------------+
void ResizeIndicatorHandleArrays()
  {
//Indicator Handles
   ArrayResize(vhfHandle, NumberOfTradeableSymbols);
   ArrayResize(atrHandle, NumberOfTradeableSymbols);
   ArrayResize(dssHandle, NumberOfTradeableSymbols);
  }

//+------------------------------------------------------------------+
//| SET UP REQUIRED INDICATOR HANDLES                                |
//+------------------------------------------------------------------+
bool SetUpIndicatorHandles()
  {
   for(int SymbolLoop = 0; SymbolLoop < NumberOfTradeableSymbols; SymbolLoop++)
     {
      //Reset any previous error codes so that only gets set if problem setting up indicator handle
      ResetLastError();
      //"AAA_EA_Indicators\\Trigger\\Bands_Fill"

      vhfHandle[SymbolLoop] = iCustom(SymbolArray[SymbolLoop],FilterTf,"AAA_EA_Indicators\\Filter\\Step VHF adaptive VMA",inpPeriod,inpPeriod2,inpPriceVhf,inpStepSize);
      dssHandle[SymbolLoop] = iCustom(SymbolArray[SymbolLoop], TriggerTf, "AAA_EA_Indicators\\Trigger\\Stoch\\DSS",inpStoPeriod,inpSmtPeriod,inpSigPeriod,inpPrice);
      atrHandle[SymbolLoop] = iATR(SymbolArray[SymbolLoop], TriggerTf, 14);




      if(atrHandle[SymbolLoop] == INVALID_HANDLE ||  dssHandle[SymbolLoop] == INVALID_HANDLE || vhfHandle[SymbolLoop] == INVALID_HANDLE)
        {
         string outputMessage = "";

und die CopyBuffer fkt. (in einer anderen Header Datei)

bool tlamCopyBuffer(int ind_handle,            // handle of the indicator
                    int buffer_num,            // for indicators with multiple buffers
                    double &localArray[],      // local array
                    int numBarsRequired,       // number of values to copy
                    string symbolDescription,
                    string indDesc)
{

  int availableBars;
  bool success = false;
  int failureCount = 0;

//Sometimes a delay in prices coming through can cause failure, so allow 3 attempts
  while(!success)
  {
    availableBars = BarsCalculated(ind_handle);

    if(availableBars < numBarsRequired)
    {
      failureCount++;

      if(failureCount >= 3)
      {
        Print("Failed to calculate sufficient bars in tlamCopyBuffer() after ", failureCount, " attempts (", symbolDescription, "/", indDesc, " - Required=", numBarsRequired, " Available=", availableBars, ")");
        return(false);
      }

      Print("Attempt ", failureCount, ": Insufficient bars calculated for ", symbolDescription, "/", indDesc, "(Required=", numBarsRequired, " Available=", availableBars, ")");

      //Sleep for 0.1s to allow time for price data to become usable
      Sleep(100);
    }
    else
    {
      success = true;

      if(failureCount > 0) //only write success message if previous failures registered
        Print("Succeeded on attempt ", failureCount + 1);
    }
  }


Das sollten sämtliche Funktionen sein, welche in der Oninit aufgerufen werden.

Vielen Dank für Eure Hilfe :)

Carl Schreiber  

Windows kennt den Fehler 565: https://docs.microsoft.com/en-us/windows/win32/debug/system-error-codes--500-999-

ERROR_TOO_MANY_THREADS

565 (0x235)

Indicates a process has too many threads to perform the requested action. For example, assignment of a primary token may only be performed when a process has zero or one threads.

Vielleicht liegt es daran? Dann könnte Dein EA zuviele Threads aufmachen.

Tobias Johannes Zimmer  
steyr6155: 

Das sollten sämtliche Funktionen sein, welche in der Oninit aufgerufen werden.

Vielen Dank für Eure Hilfe :)

Da ArrayResizes wahrscheinlich öfters durchgeführt werden müssen: Was passiert wenn Du den Resizekram in der OnTick laufen lässt?
Claudius Marius Walter  
pennyhunter:
Da ArrayResizes wahrscheinlich öfters durchgeführt werden müssen: Was passiert wenn Du den Resizekram in der OnTick laufen lässt?
Werde ich mal ausprobieren und Bericht erstatten.


Carl Schreiber:

Windows kennt den Fehler 565: https://docs.microsoft.com/en-us/windows/win32/debug/system-error-codes--500-999-

Vielleicht liegt es daran? Dann könnte Dein EA zuviele Threads aufmachen.

Was is denn in bezug auf den MT5 mit "Thread" gemeint?

hab gerade einen weiteren Test am laufen. Diesmal tritt ein anderer Fehlern auf. Villeicht hängt es mit dem oben ganannten zusammen...( witzigerweise läuft der trest trotzdem weiter, ich schätze nur, dass die jeweilige iteration nicht ausgeführt wurde)

Carl Schreiber  
steyr6155:
Werde ich mal ausprobieren und Bericht erstatten.


Was is denn in bezug auf den MT5 mit "Thread" gemeint?

hab gerade einen weiteren Test am laufen. Diesmal tritt ein anderer Fehlern auf. Villeicht hängt es mit dem oben ganannten zusammen...( witzigerweise läuft der trest trotzdem weiter, ich schätze nur, dass die jeweilige iteration nicht ausgeführt wurde)

OnInit wird nicht mit INIT_SUCCEEDED beendet.

Christian  
steyr6155:
wenn ich das mache, bekomme ich nen 502 er runtime Error



an der vom tester angegebenen Stelle befinden sich meine Arrays, welche resized werden. scheint wohl nicht in der ontick zu laufen...

Schlechte Idee mit Arrays.

Resize MUSS einmal mindestens nach dem Definieren der Arrays aufgerufen werden. OnInit() ist da schon richtig.

Danach nur bei bedarf. Eher gar nicht mehr.

Raus damit aus OnTick()

Christian  
steyr6155:
Werde ich mal ausprobieren und Bericht erstatten.


Was is denn in bezug auf den MT5 mit "Thread" gemeint?

hab gerade einen weiteren Test am laufen. Diesmal tritt ein anderer Fehlern auf. Villeicht hängt es mit dem oben ganannten zusammen...( witzigerweise läuft der trest trotzdem weiter, ich schätze nur, dass die jeweilige iteration nicht ausgeführt wurde)

Da die Threads vom MT5 intern verwaltet werden kannst du das verwerfen.

Der Fehlercode vom Carl ist auf das Windows Kernel bezogen.

Christian  
steyr6155:

Update:

Wenn ich den Tester im visuellen Modus in dem OpenPrice Modus laufen lassen will, erscheint folgender Fehler

ich vermute, hierfür sind die folgenden Zeilen relevant:

Das ist einer Header Datei. Die jeweiligen Funktionen werden in der Oninit aufgerufen:

und die CopyBuffer fkt. (in einer anderen Header Datei)


Das sollten sämtliche Funktionen sein, welche in der Oninit aufgerufen werden.

Vielen Dank für Eure Hilfe :)

Die OpenPrice Einstellung ist eigentlich ein Relikt von damals. Wird auch kaum noch Fehlerbereinigt.

Nutze Ticks oder RealTicks und teste nochmal.

OpenPrice dient nur zur "schnellen" Analyse. Hat aber null Aussagekraft da später eben doch Ticks genutzt werden.


Teste die anderen beiden Modi und berichte.

Claudius Marius Walter  
Christian:

Die OpenPrice Einstellung ist eigentlich ein Relikt von damals. Wird auch kaum noch Fehlerbereinigt.

Nutze Ticks oder RealTicks und teste nochmal.

OpenPrice dient nur zur "schnellen" Analyse. Hat aber null Aussagekraft da später eben doch Ticks genutzt werden.


Teste die anderen beiden Modi und berichte.

Danke für deine tollen Ratschläge. Das mit den Openprices ist mir bewusst. ich habe mittlerweile auch eine Bedingung bei dem 1mOHLC Setup eingebaut, welche lediglich den Close Price der M1 kerze durch lässt. Ist meiner Meinung nach am realistischsten. Leider braucht mein programm dafür dann relativ lange..
Grund der Beschwerde: