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

Einloggen oder registrieren, um einen Kommentar zu schreiben
Iloyd
22
Iloyd  

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);

}
Carl Schreiber
Moderator
7927
Carl Schreiber  

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 ;)

Iloyd
22
Iloyd  
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. 

Carl Schreiber
Moderator
7927
Carl Schreiber  
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.
Iloyd
22
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... 
Otto Pauser
1451
Otto Pauser  
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 ;)



Iloyd
22
Iloyd  
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!! 

Einloggen oder registrieren, um einen Kommentar zu schreiben