Funktionsrückgabewerte im Strategietester

 

Hallo, Otto, ich beiß mich weiter durch.. erstmal einen Ausschnitt von letztens..

ich möchte während des Testens/Debuggens den Rückgabewert einer Funktion testen, hier bspw:

// global scope

enum SIGNAL
  {
   SIG_NONE,
   SIG_BUY,
   SIG_SELL,
  };
  
   MqlRates          PriceInfo[];   // Kerzendaten(bars)
   int               handleSMA;     // Handle für den SMA
   double            bufferSMA[];   // Buffer für den SMA
   int               toCopy;        // Anzahl der zu kopierenden Kerzen(bars)

int OnInit()
  {
    ArraySetAsSeries(PriceInfo,true);                     
    ArraySetAsSeries(bufferSMA,true);
    toCopy=3;
    handleSMA = iMA(_Symbol,_Period,20,0,MODE_SMA,PRICE_CLOSE); // Handle für den iMA erzeugen
    return(INIT_SUCCEEDED);
  }
  
void OnTick()
  {
 CopyRates(_Symbol,_Period,0,toCopy,PriceInfo);
 CopyBuffer(handleSMA,0,   0,toCopy,bufferSMA);
     
Signal();
  }

SIGNAL Signal(void)
  {
   if((PriceInfo[1].close < bufferSMA[1]) && (PriceInfo[0].close > bufferSMA[0]))
      return(SIG_BUY);

   if((PriceInfo[1].close > bufferSMA[1]) && (PriceInfo[0].close < bufferSMA[0]))
      return(SIG_SELL);

   return(SIG_NONE);
  }

ob SIG_SELL, SIG_BUY oder SIG_NONE returniert wird.

Sobald ich den Test starte, bekommt man im Metaeditor unten rechts das Fenster, um die Werte der Ausdrücke prüfen zu können. Hier kann ich bspw. sehen, dass/wenn

(PriceInfo[1].close < bufferSMA[1]) && (PriceInfo[0].close > bufferSMA[0])

= true ist. Aber wie kann ich das Signal sehen? Signal, Signal(), SIGNAL Signal() usw. tun es nicht.

Vielen Dank & Gruß,

Christian

 

lindomatic:

Aber wie kann ich das Signal sehen? Signal, Signal(), SIGNAL Signal() usw. tun es nicht.

Du musst den Funktionswert einer Variablen zuweisen!
 
lindomatic:

Hallo, Otto, ich beiß mich weiter durch.. erstmal einen Ausschnitt von letztens..

ich möchte während des Testens/Debuggens den Rückgabewert einer Funktion testen, hier bspw:

ob SIG_SELL, SIG_BUY oder SIG_NONE returniert wird.

Sobald ich den Test starte, bekommt man im Metaeditor unten rechts das Fenster, um die Werte der Ausdrücke prüfen zu können. Hier kann ich bspw. sehen, dass/wenn

= true ist. Aber wie kann ich das Signal sehen? Signal, Signal(), SIGNAL Signal() usw. tun es nicht.

Vielen Dank & Gruß,

Christian

bin mir jetzt nicht sicher, aber das sollte doch so dastehen



int Signal()
  {
   if((PriceInfo[1].close < bufferSMA[1]) && (PriceInfo[0].close > bufferSMA[0]))
      return(SIG_BUY);

   if((PriceInfo[1].close > bufferSMA[1]) && (PriceInfo[0].close < bufferSMA[0]))
      return(SIG_SELL);

   return(SIG_NONE);
  }



 
amando:

bin mir jetzt nicht sicher, aber das sollte doch so dastehen




nöö....SIGNAL ist ein enum

passt schon

 
amando:

bin mir jetzt nicht sicher, aber das sollte doch so dastehen




Du musst wenn du die Funktion Signal() aufrufst den Rückgabewert auch speichern.

So geht er verloren.


SIGNAL Signalnow = Signal();  // Signalnow ist ein ENUM vom Typ SIGNAL

Etwas viel Signal in dem Getümmel auf den ersten Blick.

Ich hätte die Funktion nicht Signal() genannt, sondern CreateSignal();

Geschmacksache

 
Christian:

Du musst wenn du die Funktion Signal() aufrufst den Rückgabewert auch speichern.

So geht er verloren.


Etwas viel Signal in dem Getümmel auf den ersten Blick.

Ich hätte die Funktion nicht Signal() genannt, sondern CreateSignal();

Geschmacksache

so sehe ich mehr, wenn ich den Rückgabewert in einer Variablen speichere =)

super, jetzt komme ich erstmal weiter.. sicherlich nicht sehr viel, aber etwas.


Danke Euch!

 
Carl Schreiber:
Du musst den Funktionswert einer Variablen zuweisen!

=) 


danke!

 

Ihr seht, dass jeweils die Bedingungen zum SIG_SELL und SIG_BUY true sind, wieso liefert die Funktion stets SIG_NONE?

1000 Dank

PS: Der Tester erkennt auch den Typ mit "int" nicht richtig, mag aber egal sein.


Update Std. später: das war wohl das (void) in SIGNAL signal(void).. habe das rausgenommen zu signal(), jetzt scheint es zu funktionieren.

Dateien:
wtf.JPG  137 kb
wtf2.JPG  113 kb
 

Das Signal wird nicht sauber und zuverlässig geliefert, zwischendurch mal, aber dann direkt wieder "SIG_NONE".

Die Bedingungen stehen auf true, aber es wird nicht das entsprechende Signal geliefert, wie kann das?

Hier ist der Code:

#include <Tester\StopAtDate.mqh>

//
enum SIGNAL
  {
   SIG_NONE,
   SIG_BUY,
   SIG_SELL,
  };

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
MqlRates          PriceInfo[];   // Kerzendaten(bars)
int               handleSMA;     // Handle für den SMA
double            bufferSMA[];   // Buffer für den SMA
int               toCopy;        // Anzahl der zu kopierenden Kerzen(bars)


//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   ArraySetAsSeries(PriceInfo,true);                           // Zugriffsart einstellen. Hier wird nix sortiert wie Herr R.B. behauptet
   ArraySetAsSeries(bufferSMA,true);
   toCopy=3;
   handleSMA = iMA(_Symbol,_Period,20,0,MODE_SMA,PRICE_CLOSE); // Handle für den iMA erzeugen
   if(HandleError(handleSMA,"iMA"))                            // Handle überprüfen 1
      return(false);
   return(INIT_SUCCEEDED);
//---

  }

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(StopAtDate.Check("2020.04.01", "00:42"))  // prüfen der Zeit
      DebugBreak();                             // hier hält das Programm an

   CopyRates(_Symbol,_Period,0,toCopy,PriceInfo);
   CopyBuffer(handleSMA,0,   0,toCopy,bufferSMA);

   SIGNAL signalnow = Signal();
  }

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
SIGNAL Signal()
  {
   if((PriceInfo[1].close < bufferSMA[1]) && (PriceInfo[0].close > bufferSMA[0]))
      return(SIG_BUY);

   if((PriceInfo[1].close > bufferSMA[1]) && (PriceInfo[0].close < bufferSMA[0]))
      return(SIG_SELL);

   return(SIG_NONE);
  }


//+------------------------------------------------------------------+
//| Hilfsfunktionen                                                  |
//+------------------------------------------------------------------+
bool HandleError(int aHandle, string aName)
  {
   if(aHandle==INVALID_HANDLE)
     {
      Alert("*ERROR* creating ",aName," handle.");
      return(true);
     }
   return(false);
  }
//+------------------------------------------------------------------+

 
lindomatic:

Das Signal wird nicht sauber und zuverlässig geliefert, zwischendurch mal, aber dann direkt wieder "SIG_NONE".

Die Bedingungen stehen auf true, aber es wird nicht das entsprechende Signal geliefert, wie kann das?

Hier ist der Code:

Bei einer solchen Situation starte ich immer das Debuggen mit historischen Daten.
 
Carl Schreiber:
Bei einer solchen Situation starte ich immer das Debuggen mit historischen Daten.

Dabei fällt es mir ja auf; hierbei sehe ich ja, dass die Bedingung korrekt auf true springt, wenn die Kerze den MA durchbricht, aber das entsprechende Signal nicht returned wird. Da müsste ich eine Haube aufschrauben, wo ich nichtmal weiß, wo die Schrauben sind.