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)
-   -   Digits, Ticksize, Normalize Double (http://www.expert-advisor.com/forum/showthread.php?t=6290)

MA-EA 02.01.19 15:15

Digits, Ticksize, Normalize Double ?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo.

In meinen EAs werden SL, Trailing Stop und TP berechnet, in dem einfach die Werte der GV oben mit NormalizeDouble(...*Point,Digits) von Ask/Bid abgezogen, bzw. dazu gerechnet werden, je nach dem ob Buy oder Sell. Aber bei z.B. FX WP mit 3 Stellen nach dem Komma, sind SL und TP irgendwie nur wenige Punkte von den Einstiegskursen entfernt. Eigentlich müsste Normalize Double doch reichen, um SL, Trailing Stop und TP ins richtige Format zu bringen. :confused: Aber anscheinend ist es wohl nötig, die int Werte mit 10 zu multiplizieren, wenn Digits==3 oder ==5?

Wer Ahnung vom Multiplizieren und Dividieren von double Werten hat, kann mir vielleicht mit der automatischen Lotsize helfen. ;) :rolleyes: Die Rechenwege müssten eigentlich richtig sein, bloß ob * oder / weiß ich nicht so richtig.
Code:

extern string ALSZ="Auto Lotsize?";
extern bool Percent_of_Balance=false;//
extern double Auto_Lotsize_Perc=2.5;// Zum Testen 2,5%

Code:

Lots=MathMax(MathMin(Lots,MarketInfo(Symbol(),MODE_MAXLOT)),MarketInfo(Symbol(),MODE_MINLOT));
double Min_L=MarketInfo(Symbol(),MODE_MINLOT);//Mindest_Lot_Einsatz
  double Max_L=MarketInfo(Symbol(),MODE_MAXLOT);//Maximaler_Lot_Einsatz

Code:

  if(Percent_of_Balance==true){
 
    double M_REQ=MarketInfo(Symbol(),MODE_MARGINREQUIRED);//nötige Margin für 1 Lot (100.000 Units)
    double A_BAL=AccountBalance();//momentaner Kontostand
 
//  "1 Lot" geteilt durch Mindest-Lot, um später raus zu finden, wie viel Margin für Mindest-Lot gebraucht wird.
//  z.B.: 1 Lot * 0.01 L = 0.01
    double OneL_MinL = 1 / Min_L;
 
 
//  Margin_für_1_Lot geteilt durch Ergebnis, um raus zu finden, wie viel Margin für Mindest_Lot benötigt wird.
//  z.B.:  €1000,00 * 0.01 L = €10,00
    double MREQ_MinL = M_REQ / OneL_MinL;

//////////////////////////////////////////////////////////////////////////////////////////////////////////////

//  1% von Kontostand ausrechnen
//  z.B.: €1000,00 / 100% = €10,00
    double OnePercAccBal = A_BAL / 100;//  / oder * ?

//  1% des Kontostands * Prozent, für die Lots gekauft werden sollen
//  z.B.: €10,00 * 2,5% = €25,00
    double OnePercAccBal_AutoLotPerc = OnePercAccBal * Auto_Lotsize_Perc;

//  Theoretisch muss das Ergebnis mit Mindest-Lot multipliziert werden (?)
//  z.B.: €25,00 * 0.01L = 0.025L (?)
    Lots = OnePercAccBal_AutoLotPerc * Min_L;}


AVT 03.01.19 23:36

1. x Prozent von etwas geht am schnellsten mit mal 0.xx
-. 100% sind x 1 (also 100€ x 1 = 100€ = 100% von 100€ oder alles)
-. 10% sind x 0.10 (also 100€ x 0.25 = 25€ =25% von 100€ oder 1/4)
-. 1% sind x 0.01 (also 100€ x 0.02 = 2€ =2% von 100€)

2. um die erforderliche Margin für einen Kauf zu finden
Code:

req_margin=AccountFreeMarginCheck( Symbol(),                        // für dieses Symbol/Markt
                                  OP_BUY,                          // zum Kauf
                                  MarketInfo(Symbol(),MODE_MINLOT) // für die kleinste Menge

3. Nebenbei bemerkt, bei vielen Brokern wird die Margin nicht mit dem AccountBalance verglichen, sondern ist eine Mischkalkulation. Das findest Du raus mit AccountFreeMarginMode() und AccountStopoutMode().

4. Für die OrderSend() und Trailingstops gilt
-. kalkulierte Werte sollen immer vor Benutzung mit NormalizeDouble umgewandelt werden
Ich gebe z.B. die SL und TP immer als Ganzzahlen ein (bei Forex z.B. 50, bei Index z.B. 1000).
Danach wird umgerechnet und zum jeweils erforderlichen Preis dazu/davon gerechnet
Code:

  SL=NormalizeDouble(SL*_Point,_Digits)    // anpassen
  OrderModify(... OrderOpenPrice()+-SL ...) // zum/vom Eröffnungspreis addieren

Wenn ich Dich richtig verstanden habe, willst Du das alles so ausrechnen, daß Deine Margin nur 1% des Kontostandes ausmacht.
Code:

double Min_L = MarketInfo(Symbol(),MODE_MINLOT);  //Mindest_Lot_Einsatz

 double OnePercAccBal = A_BAL * 0.01;                                  // 1% vom Kontostand
 double MarPerMinLotB = AccountFreeMarginCheck(Symbol(),OP_BUY,Min_L);  // Mindest Margin buy
 double MarPerMinLotS = AccountFreeMarginCheck(Symbol(),OP_SELL,Min_L); // Mindest Margin sell
 double MarPerMinLot  = MathMax(MarPerMinLotB,MarPerMinLotS);          // die größere
 
 // === wieviel mal Du multiplizieren darfst
 double AllowedMult = OnePercAccBal / MargPerMinLot;  // kann krumm sein, darum:
 int LotMultiplier = (double)MathFloor(AllowedLots);  // nächst untere Zahl

 double AllowedLots = Min_L * LotMultiplier;          // Min Lots multipliziert

Das wäre mein Ansatz. AVT

MA-EA 05.01.19 08:52

Zitat:

Zitat von AVT (Beitrag 41953)
Wenn ich Dich richtig verstanden habe, willst Du das alles so ausrechnen, daß Deine Margin nur 1% des Kontostandes ausmacht.

Nö. Allgemein soll man einen double Wert eintragen, bzw. diesen dann eben in % vom Kontostand verwenden können. Also sozusagen entsprechende % von AccountBalance in Lot umrechnen. Aber irgendwie weiß ich nicht, was der/die letzten Formel-Schritt/e ist/sind. Jedenfalls kommt am Taschenr. und beim EA-Test nur Quatsch raus. :confused:
Code:

Lots=MathMax(MathMin(Lots,MarketInfo(Symbol(),MODE_MAXLOT)),MarketInfo(Symbol(),MODE_MINLOT));
double Min_L=MarketInfo(Symbol(),MODE_MINLOT);//Mindest_Lot_Einsatz
double Max_L=MarketInfo(Symbol(),MODE_MAXLOT);//Maximaler_Lot_Einsatz

//---------------------------------------------------------------------------------------------

  if(Percent_of_Balance==true){
 
    double M_REQ=MarketInfo(Symbol(),MODE_MARGINREQUIRED);//nötige Margin für 1 Lot (100.000 Units)
    double A_BAL=AccountBalance();//momentaner Kontostand
 
//  "1 Lot" geteilt durch Mindest-Lot, um später raus zu finden, wie viel Margin für Mindest-Lot gebraucht wird.
//  z.B.: 1 Lot * 0.01 L = 0.01
    double OneL_MinL = 1 * Min_L;
 
 
//  Margin_für_1_Lot geteilt durch Ergebnis, um raus zu finden, wie viel Margin für Mindest_Lot benötigt wird.
//  z.B.:  €1000,00 * 0.01 L = €10,00
    double MREQ_MinL = M_REQ * OneL_MinL;

//////////////////////////////////////////////////////////////////////////////////////////////////////////////

//  1% von Kontostand ausrechnen
//  z.B.: €1000,00 / 100% = €10,00
    double OnePercAccBal = A_BAL * 100;//  / oder * ?

//  1% des Kontostands * Prozent, für die Lots gekauft werden sollen
//  z.B.: €10,00 * 2,5% = €25,00
    double OnePercAccBal_AutoLotPerc = OnePercAccBal * Auto_Lotsize_Perc;

//  Theoretisch muss das Ergebnis mit Mindest-Lot multipliziert werden (?)
//  z.B.: €25,00 * 0.01L = 0.025L (?)
    Lots = OnePercAccBal_AutoLotPerc * Min_L;


AVT 05.01.19 17:53

Zitat:

Zitat von MA-EA (Beitrag 41961)
Nö. Allgemein soll man einen double Wert eintragen, bzw. diesen dann eben in % vom Kontostand verwenden können.

Kurz was ich vermute.
Code:

// === Benutzereingaben
extern double PercOfAccount = 2.5; // wieviel % vom Kontostand

// === wenn Prozente wie im tägl. Leben eingegeben wurden, hier 2.5%
double PercDivider=100; // macht aus 2.5% den Multiplizierwert 0.025

// === wieviel % vom Kontostand in Währung
double CashPercOfAccount=AccountBalance() *          // Kontostand *
                        (PercOfAccount/PercDivider) ; // 0.025

Zitat:

Zitat von MA-EA (Beitrag 41961)
Also sozusagen entsprechende % von AccountBalance in Lot umrechnen.

Wenn Du mit Cash Beträgen rechnest, brauchst Du einen Bezug zu Deiner Lotanzahl, also
- die Margin darf x % vom Konto nicht überschreiten
- das Risiko darf x % vom Konto nicht überschreiten
- der Gewinn soll mindestens x % vom Konto sein
- kein Trade mehr, wenn x % vom Konto verloren ist
Einfach nur die % AccountBalance in Lot umrechnen bringt Dir nix, wenn Du es nicht in Bezug zu irgendwas setzt (außer daß Du sagen kannst, ich hab grade 30,7 Lots aufm Konto). AVT

MA-EA 20.01.19 16:35

Danke, aber das scheint ein mathematisches Problem zu sein. Und ich habs mit Mathe nun echt nicht so am Hut. :rolleyes:

Schaun wir noch mal mit Taschenrechner durch.

Ein paar dafür wichtige Deklarationen.
Code:

double M_REQ=MarketInfo(Symbol(),MODE_MARGINREQUIRED); // nötige Margin für 1 Lot (100.000 Units)
 double A_BAL=AccountBalance();

Erst mal ausrechnen, wie viel Mindest-Lot in ein ganzes Lot passen.
In meinem Fall 0.01, also einfach 1 * 0,01 = (man sehe und staune) 0,01.
Code:

double OneL_MinL = 1 * Min_L;
Bei nem Hebel von 100 brauch ich theoretisch 1000 Euro für nen ganzes Lot. Also nötige Margin für 1 Lot / 0,01 oben = 10,00. Die brauch ich wohl fürs Mindest-Lot 0.01.
Code:

MREQ_MinL = M_REQ * OneL_MinL;
Dann weiter mit 1.0% vom Kontostand. Sagen wir mal € 1275,25 / 100 = € 12,75
Code:

double OnePercAccBal = A_BAL / 100;
Jetzt will ich mal vom Kontostand pro Order 1,25% einsetzen.
€ 12,75 * 1,25% = € 15,93(75)
Code:

double OnePercAccBal_AutoLotPerc = OnePercAccBal * Auto_Lotsize_Perc;
Das mal diesen Mindest-Lot 0.01 ergibt irgendwie Quatsch.
15,93 * 0.01 = 0,1593 L
Code:

Lots = OnePercAccBal_AutoLotPerc * Min_L
Das müsste 0.01 oder 0.02 Lot ergeben, aber nie über 0.1 Lot. :eek:

Hilft da NormalizeDouble oder *Point?


Oder bin ich hier irgendwie ganz auf dem Holzweg? :confused:

AVT 20.01.19 20:45

Zitat:

Zitat von MA-EA (Beitrag 42075)
Danke, aber das scheint ein mathematisches Problem zu sein. Und ich habs mit Mathe nun echt nicht so am Hut. :rolleyes:

Schaun wir noch mal mit Taschenrechner durch.
Erst mal ausrechnen, wie viel Mindest-Lot in ein ganzes Lot passen.
In meinem Fall 0.01, also einfach 1 * 0,01 = (man sehe und staune) 0,01.

Wenn Deine kleinste Lotgröße 0,01 ist und Du willst die x-mal zusammenpacken bis es eine Lotgröße von 1,00 ergibt - da Du alles mit dem Taschenrechner machen willst, kannst Du ja mal durchzählen 0,01+0,01+0,01.... solange bis das Ergebnis 1 ist. (Oder Du teilst die 1 einfach durch 0,01 = 100, Gegenprobe: 100 x 0,01=1). AVT

MA-EA 28.01.19 19:22

Ich und Mathe. :rolleyes:

Vermutlich hab ich ne Berechnung vergessen. Und zwar

Betrag, der in Lot verwendet werden soll / Margin für Mindest-Lot

Ergebnis mal Mindest-Lot müsste dann den richtigen Lot-Wert ergeben.

Aber wie gesagt, ich und Mathe. :rolleyes:


Alle Zeitangaben in WEZ +2. Es ist jetzt 01:50 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