Ist es möglich die Funktion die in einer Bibliothek deklariert werden in der selben Bibliothek zu nutzen?

 

Wie schon im Betreff beschrieben stehe ich vor folgendem Problem. 

Ist es möglich die Funktion die in einer Bibliothek deklariert werden in der selben Bibliothek zu nutzen? 

Wenn ich die Bibliothek kompiliere zeigt es mir kein Fehler. Aber sobald ich ich meinen EA im Tester testen will stoppt er einfach und zeigt keine Fehlermeldung an. 


Meine Bibliothek: 

#property library
#include<Trade\Trade.mqh>
CTrade trade; 

//TRADE CHECK ----------------------------------------------------------------------------------------------------------------------------------------------------
void CheckForTrade(string Signal, int StopLoss, int TakeProfit, int MaximalePositionen, double PositionsGroesse) export
{
   double Ask = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits); 
   double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits); 
   
   
   int iPositionsanzahl = GetPositionsAnzahlDieseWaehrung(); 
   
   if(Signal == "buy" && MaximalePositionen >= iPositionsanzahl) {
   trade.Buy(PositionsGroesse,NULL,Ask,(Ask - StopLoss * _Point),(Ask + TakeProfit * _Point),NULL);
   }
   
   if(Signal == "sell" && MaximalePositionen >= iPositionsanzahl) {
   trade.Sell(PositionsGroesse,NULL,Bid,(Bid + StopLoss * _Point),(Bid - TakeProfit * _Point),NULL);
   }
}

//Positionsanzahl aktuelles Währungpaar ------------------------------------------------------------------------------------------------------------------------
int GetPositionsAnzahlDieseWaehrung() export
{
   int iPositionsanzahl = 0, i = 0; 
   for ( i = PositionsTotal()-1; i <= 0; i-- )
   {
      string sSymbol = PositionGetSymbol(i);
   if (sSymbol == Symbol()) {
      iPositionsanzahl++; 
   }
   }

return iPositionsanzahl;
}

Mein EA: 

#import "FrameworkLib.ex5"
void CheckForTrade(string Signal, int StopLoss, int TakeProfit, int MaximalePositionen, double PositionsGroesse);
int GetPositionsAnzahlDieseWaehrung();
#import

#include "BollingerBands.mq5";

input int StopLoss = 20000; 
input int TakeProfit = 150; 
input double PositionsGroesse = 0.40; 
input int BerechnungKerzenBoll = 10; 
input int MaximalePositionen = 2; 

void OnTick()
{
   
   string Signal = CheckEntry(BerechnungKerzenBoll);
   CheckForTrade(Signal, StopLoss, TakeProfit, MaximalePositionen, PositionsGroesse);

}
 

Ich würde vielleicht einmal einen anderen Ansatz wählen!

Eine eigene Bibliothek nur mit den eigenen Funktionen.

Dann beide Bibliotheken einbinden:

#include <Trade\Trade.mqh>
#include myBib

Wieso bindest Du den Indikator "BollingerBands.mq5" wie eine Bibliothek ein.

Schau Dir an, wie ein EA einen Indikator aufruft und ausliest!!

Such Dir ein EA der die BB verwendet und kopiere die relevanten Codezeilen - ist schneller als alle Fehler beim Lernen durchzudeklinieren ;)

 
Carl Schreiber:

Ich würde vielleicht einmal einen anderen Ansatz wählen!

Eine eigene Bibliothek nur mit den eigenen Funktionen.

Dann beide Bibliotheken einbinden:

Wieso bindest Du den Indikator "BollingerBands.mq5" wie eine Bibliothek ein.

Schau Dir an, wie ein EA einen Indikator aufruft und ausliest!!

Such Dir ein EA der die BB verwendet und kopiere die relevanten Codezeilen - ist schneller als alle Fehler beim Lernen durchzudeklinieren ;)

Erstmal viel Dank für deine Antwort!!

Also funktioniert das mit nur einer Bibliothek nicht so wie ich mir das gedacht habe? 


Mit den Bollinger Bänder passt alles so wie es ist, der Fehler liegt auf jeden Fall in der Bibliothek an der Funktion. Weil wenn ich die Funktion: 

void CheckForTrade(string Signal, int StopLoss, int TakeProfit, int MaximalePositionen, double PositionsGroesse) export
{
   double Ask = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits); 
   double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits); 
   
   
   //int iPositionsanzahl1 = GetPositionsAnzahlDieseWaehrung(); 
   
   if(Signal == "buy" && MaximalePositionen >= iPositionsanzahl1) {
   trade.Buy(PositionsGroesse,NULL,Ask,(Ask - StopLoss * _Point),(Ask + TakeProfit * _Point),NULL);
   }
   
   if(Signal == "sell" && MaximalePositionen >= iPositionsanzahl1) {
   trade.Sell(PositionsGroesse,NULL,Bid,(Bid + StopLoss * _Point),(Bid - TakeProfit * _Point),NULL);
   }
}

die ich auskommentiert habe raus nehme (Zeile 7), und selbst eine PositionsAnzahl festlege funktioniert alles vom feinsten. 

 
Iloyd:

Erstmal viel Dank für deine Antwort!!

Also funktioniert das mit nur einer Bibliothek nicht so wie ich mir das gedacht habe? 

Ich hab das noch nie so probiert, weil ich es nie so machen würde - es wird unübersichtlich.

Und wegen der auskommentierten Funktion, schreib sie in den EA (machen viele so!!), eine eigene Bibliothek dafür lohnt sich nicht.

Ich würde diese Funktion eher so schreiben

int GetPositionsAnzahlDieseWaehrung(const string sym) 
{
   int n=0, p = PositionsTotal();
   while(p-->0) 
   {
      if (sym != PositionGetSymbol(p) continue;
      n++; 
   }

return(n);
}
  1. Die Prüfung "!=" ist schneller als "==", weil "==" alles prüfen muss, "!=" prüft nur bis zum ersten 'Fehler'. Spielt zwar heute aber wohl fast keine Rolle mehr.
  2. Ich machen alle Ausschluss-Prüfungen am Anfang der Schleife, dann kommt all das, was in der Schleife passieren soll - ist meist übersichtlicher. Ist aber eine Geschmacksfrage.
 
Hat vielleicht noch irgendjemand anders Erfahrung damit? Ich möchte den eigentlichen EA so kurz wie möglich halten und möglichst alles in der Bibliothek machen... 
 
Iloyd:
Hat vielleicht noch irgendjemand anders Erfahrung damit? Ich möchte den eigentlichen EA so kurz wie möglich halten und möglichst alles in der Bibliothek machen... 

Da sitzt ein Wurm drin:

int GetPositionsAnzahlDieseWaehrung() export
{
   int iPositionsanzahl = 0, i = 0; 
   for ( i = PositionsTotal()-1; i <= 0; i-- )
   {
      string sSymbol = PositionGetSymbol(i);
   if (sSymbol == Symbol()) {
      iPositionsanzahl++; 
   }
   }

return iPositionsanzahl;
}

So geht's:

int GetPositionsAnzahlDieseWaehrung() export
{
   int iPositionsanzahl = 0, i = 0;
   string sSymbol;
   for (i = PositionsTotal()-1; i >= 0; i--)
   {
      sSymbol = PositionGetSymbol(i);
      if (sSymbol == Symbol())
         iPositionsanzahl++;
   }

   return iPositionsanzahl;
}

Die Fehler sitzen oft ganz woanders als man es vermutet ;)



 
Otto Pauser:

Da sitzt ein Wurm drin:

So geht's:

Die Fehler sitzen oft ganz woanders als man es vermutet ;)



Danke für deine Antwort!! Da lag der Fehler! Du hast Recht! Tausend dank!! 

Grund der Beschwerde: