Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools

Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools (http://www.expert-advisor.com/forum/index.php)
-   Programmierung MQL4 (http://www.expert-advisor.com/forum/forumdisplay.php?f=220)
-   -   Berechnung eines Basiswertes mit variablem Exponenten (http://www.expert-advisor.com/forum/showthread.php?t=5867)

piptrade 24.09.17 17:39

Berechnung eines Basiswertes mit variablem Exponenten
 
Hi, liebe Trader-Gemeinde,

um ein martingales MoneyManagement-System für einen kleinen EA zu erstellen, würde ich gern einen konstanten Wert mit einem variablen Exponenten (2², 2³, 2 hoch 4, 2 hoch 5 usw.) berechnen wollen.
Plus, Minus, Multiplizieren, oder Dividieren; - alles kein Problem. Wie aber kann ich einen fixen Basiswert mit einem variablen Exponenten berechnen ?
Hat da jemand eine zündende Idee, die mir weiterhelfen könnte?

LG. piptrade

traderdoc 24.09.17 17:47

Auszug aus der MetaEditor-Hilfe:

MathPow

The function raises a base to a specified power.

double MathPow(
double base, // base
double exponent // exponent value
);

Parameters:

base
[in] Base.

exponent
[in] Exponent value.

Return Value
Value of base raised to the specified power.

Note
Instead of MathPow() you can use pow().

traderdoc

piptrade 24.09.17 18:37

Hello traderdoc, Thanks für die promte Antwort.
Hatte mir den Hinweis bereits in der "MQL4_Reference" angesehen, war aber unsicher.
Könnte die praktische Anwendung ggf. "SO" aussehen, um mit fortschreitenden losses (1, 2, 3, 4, 5 ...) eine jeweilige Positions-Verdopplung (2, 4, 8, 16, 32 ...) zu erzielen ?

double MathPow(double base,double exponent); // als globale Deklaration
//---
//...
int base = 2;
int exponent = losses;
int pow;

lot = NormalizeDouble(lot *2 *(pow-1),1);
//...

Der kleine EA scheint es zumindest zu "schlucken"! - kein error, keine warnings !
Würde mich über ein kurzes Statement freuen; - DANKE !

LG. piptrade

traderdoc 24.09.17 19:35

Ne, keine Ahnung warum der Compiler da nicht würgt.
Evtl. mal ein #property strict den globalen Variablen voranstellen.

Was soll das werden?
double MathPow(double base,double exponent); // als globale Deklaration

Das Ergebnis dieser Funktion müsste natürlich einer Variablen zugeordnet werden, sonst nutzt die Funktion nix.

Und was soll das werden?
int base = 2;
int exponent = losses;
int pow;

lot = NormalizeDouble(lot *2 *(pow-1),1);

Welchen Wert besitzen denn eigentlich die Variablen losses und pow?

traderdoc

piptrade 24.09.17 20:16

MathPow(double base,double exponent);
---> ist die mathematische Festlegung "MathPow" für die Wertbasis ("base") = 2 und den Extonenten ("exponent") = losses

int base = 2; ---> hier wird "base" fix definiert
int exponent = losses; ---> hier wird der "exponent" variabel mit "losses" (Anzahl der letzten aufeinanderfolgenden VerlustTrades) definiert
int pow; ---> und wenn ich für "MathPow" auch "pow" verwenden kann , muss ich dieses doch deklarieren.

---> Und dann folgt der Algorithmus für "lot":
lot = NormalizeDouble(lot *2 *(pow-1),1);
---> die ursprünglich Lot-Größe muss also mit der "Verdoppler-Formel" multipliziert werden. Und diese Verdoppler-Formel ist gleich:
---> a(n) = 2 * 2 (hoch "n" - 1)

In so weit sollte sich schon ein schlüssiger Sinn ergeben und der Compiler sollte "sich nicht getäuscht" haben.

LG. piptrade

traderdoc 24.09.17 21:25

Zitat:

Zitat von piptrade (Beitrag 39813)
MathPow(double base,double exponent);
---> ist die mathematische Festlegung "MathPow" für die Wertbasis ("base") = 2 und den Extonenten ("exponent") = losses

MathPow ist bereits eine MQL-Basisfunktion und wird nicht doppelt deklariert.
Das Ergebnis dieser Funktion wird nach wie vor keiner Variablen zugeordnet.


int base = 2; ---> hier wird "base" fix definiert
int exponent = losses; ---> hier wird der "exponent" variabel mit "losses" (Anzahl der letzten aufeinanderfolgenden VerlustTrades) definiert
int pow; ---> und wenn ich für "MathPow" auch "pow" verwenden kann , muss ich dieses doch deklarieren.

pow wird bisher kein Wert zugewiesen.

---> Und dann folgt der Algorithmus für "lot":
lot = NormalizeDouble(lot *2 *(pow-1),1);
---> die ursprünglich Lot-Größe muss also mit der "Verdoppler-Formel" multipliziert werden. Und diese Verdoppler-Formel ist gleich:
---> a(n) = 2 * 2 (hoch "n" - 1)

In so weit sollte sich schon ein schlüssiger Sinn ergeben und der Compiler sollte "sich nicht getäuscht" haben.

LG. piptrade

Das Verständnisproblem liegt sicherlich darin, dass diese Codeteile eben nur in der Luft hängende Teile sind, die so in dieser Form nicht zu einem sinnvollen Ergebnis führen werden. Daher wäre es notwendig, dass der lauffähige Code hier reingestellt wird, an dem dann weitere Diskussionen geführt werden können.

traderdoc

piptrade 24.09.17 22:25

Note
Instead of MathPow() you can use pow().

Darüber waren wir uns zu Beginn der Disskusion doch einig. Somit wird die Variable "MathPow" durch die Variable "pow" ersetzt und eindeutig für die Berechnung der Variablen "lot" verwendet.
So weit mein Widerspruch.

Richtig hingegen ist:
"MathPow ist bereits eine MQL-Basisfunktion und wird nicht doppelt deklariert."
Dem entsprechend konnte ich die ehemalige Dopplung deaktivieren; - das hat funktioniert. Tadellos !

Insoweit konnte die eine Sache vereinfacht werden; - sehr gut ! Die oben gestellte Frage allerdings hat mich nicht erleuchtet, sondern eher gezeigt, dass man mich nicht ganz versteht.

LG. piptrade

piptrade 24.09.17 22:42

Thanks, Lieber traderdoc,

ich werde den eben disskutierten Codeschnipsel morgen live testen und denke, dass er tadellos funktioniert.

Dennoch beschäftigen mich mehrere Fragen, was meinen kleinen EA angeht. Hierzu hatte ich bereits meine konkrete Auftragserteilung avisiert, an der ich nach wie vor festhalte. Hier wäre ein konkreter EA lediglich im Code zu vereinfachen und in seiner Reaktionszeit zu beschleunigen.(Allerdings unter bewusst falsch deklarierten Parameter-Einstellungen ! - Sorry!) Was würde mich ein solcher "Spass" kosten ?

Ein offizielles Angebot würde ich auch gern unter meiner privaten eMail-Adresse entgegennehmen.
Soweit nochmals herzlichen Dank und

LG. Euer piptrade

traderdoc 24.09.17 22:46

Zitat:

Zitat von piptrade (Beitrag 39815)
Note
Instead of MathPow() you can use pow().

Darüber waren wir uns zu Beginn der Disskusion doch einig. Somit wird die Variable "MathPow" durch die Variable "pow" ersetzt und eindeutig für die Berechnung der Variablen "lot" verwendet.
So weit mein Widerspruch.
MathPow ist aber keine Variable, sondern eine Funktion, die einen Wert zurückgibt, der in eine Variable gespeichert werden kann. Das ist ein riesengroßer Unterschied. Dass pow auch MathPow() sein kann, kann eben nicht sein! Weil erstens das pow in den ersten Posts keine Funktion, sondern eine Variable war, deklariert als int. Und zweitens, wenn nun schon pow die wertaufnehmende Variable von MathPow() sein soll, dann müsste pow mit double deklariert werden. Und drittens wäre pow() wiederum eine Funktion und keine Variable, die auch nicht mit int zu deklarieren wäre.

Richtig hingegen ist:
"MathPow ist bereits eine MQL-Basisfunktion und wird nicht doppelt deklariert."
Dem entsprechend konnte ich die ehemalige Dopplung deaktivieren; - das hat funktioniert. Tadellos !

Insoweit konnte die eine Sache vereinfacht werden; - sehr gut ! Die oben gestellte Frage allerdings hat mich nicht erleuchtet, sondern eher gezeigt, dass man mich nicht ganz versteht.

LG. piptrade

Richtig, im obigen Teil besteht nach wie vor eine Unverständlichkeit. Deshalb ja auch meine Bitte, den gesamten Code in seiner logischen Abfolge hier reinzustellen.

traderdoc

piptrade 25.09.17 10:30

Oh-Ha! Sorry traderdoc, - die Unterscheidung von "Funktion" und "Variablen" ist natürlich "So", wie von Dir beschrieben, richtig. Ebenso die Unterscheidung in der Deklaration. Hier der gesamte CodeSchnipsel, in welchem sicher noch zusätzliche Korrekturen von Nöten sind:
Code:

double LotsOptimized()
  {
  double lot=Lots;
  int    orders=HistoryTotal();
  int    OpenPositions=0;
 
//--- select lot size
  lot=NormalizeDouble(AccountFreeMargin() *MaximumRisk / 100, 2);
 
//--- calculate number of OpenPositions without a break
  if(ProfitFactor>0)
    {
      for(int i=orders; i>=0; i++)
        {
        if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==true)
          {
        if(OrderProfit()>0 ) break;
        if(OrderProfit()<=0) OpenPositions++;
          }
        }                           
      if(OpenPositions>0)
       
//    double MathPow(double base,double exponent);  //  Funktion !,
//    in welche "base" und "exponent" einfließen (globale Deklaration)
int    base = 2;
int    exponent = OpenPositions;
double pow();
//      Formel für Zahlenreihe der Verdopplung: a(n) = 2 *2(hoch OpenPositions - 1)
        lot = NormalizeDouble(lot *2 *(pow()-1),2);
    } 
//--- return lot size
  if(lot<0.01) lot=0.01;
  return(lot);
  }

Das "Teil" soll eigentlich nur prüfen, wieviele Order noch offen sind und (die Anzahl der offenen Order - Minus "1") in der Formel als Exponenten verwenden.
In der Hoffnung, dass wenigstens einige Dinge richtig sind, erwarte ich mit Spannung den nächsten Kommentar.
LG. piptrade


Alle Zeitangaben in WEZ +2. Es ist jetzt 22:28 Uhr.

Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.6.1
Powered by vBCMS® 2.7.0 ©2002 - 2024 vbdesigns.de
Copyright ©2009 - 2023 by Expert-Advisor.com - Das Metatrader Forum