Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools  
Zurück   Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools > Metatrader 4 > Programmierung MQL4

Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4.

Login
Benutzername:
Kennwort:


Statistik
Themen: 4245
Beiträge: 39284
Benutzer: 6.551
Aktive Benutzer: 258
Links: 80
Wir begrüßen unseren neuesten Benutzer: Jonnes
Mit 483 Benutzern waren die meisten Benutzer gleichzeitig online (21.04.16 um 17:12).
Neue Benutzer:
vor 2 Tagen
- Jonnes
vor 2 Tagen
- bluesdd
vor 4 Tagen
- KEY
vor 5 Tagen
- aliconii
vor einer Woche
- Matthias

Onlineuser
'Wer ist online' anzeigen Benutzer: 2
Gäste: 113
Gesamt: 115
Team: 0
Team:  
Benutzer:  fxnoob, traderdoc
Freunde anzeigen

Empfehlungen

Thema geschlossen
 
Themen-Optionen Thema durchsuchen Ansicht
  #1 (permalink)  
Alt 02.01.19
Elite Mitglied
 
Registriert seit: Sep 2015
Beiträge: 731
MA-EA befindet sich auf einem aufstrebenden Ast
Standard Digits, Ticksize, Normalize Double ?

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. 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. 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;}
Angehängte Dateien
Dateityp: mq4 Valerius_2MA_AutoLots_EA_MT4.mq4 (33,5 KB, 1x aufgerufen)
  #2 (permalink)  
Alt 03.01.19
AVT AVT ist offline
Mitglied
 
Registriert seit: Mar 2018
Ort: Hamburg
Beiträge: 160
AVT befindet sich auf einem aufstrebenden Ast
Standard

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
  #3 (permalink)  
Alt 05.01.19
Elite Mitglied
 
Registriert seit: Sep 2015
Beiträge: 731
MA-EA befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von AVT Beitrag anzeigen
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.
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;
  #4 (permalink)  
Alt 05.01.19
AVT AVT ist offline
Mitglied
 
Registriert seit: Mar 2018
Ort: Hamburg
Beiträge: 160
AVT befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von MA-EA Beitrag anzeigen
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 anzeigen
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
  #5 (permalink)  
Alt 20.01.19
Elite Mitglied
 
Registriert seit: Sep 2015
Beiträge: 731
MA-EA befindet sich auf einem aufstrebenden Ast
Standard

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

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.

Hilft da NormalizeDouble oder *Point?


Oder bin ich hier irgendwie ganz auf dem Holzweg?
  #6 (permalink)  
Alt 20.01.19
AVT AVT ist offline
Mitglied
 
Registriert seit: Mar 2018
Ort: Hamburg
Beiträge: 160
AVT befindet sich auf einem aufstrebenden Ast
Standard

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

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
  #7 (permalink)  
Alt 28.01.19
Elite Mitglied
 
Registriert seit: Sep 2015
Beiträge: 731
MA-EA befindet sich auf einem aufstrebenden Ast
Standard

Ich und Mathe.

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.
Thema geschlossen

Lesezeichen


Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are aus
Pingbacks are aus
Refbacks are aus




Alle Zeitangaben in WEZ +2. Es ist jetzt 17:51 Uhr.


Der Wavesnode - Spam Firewall
-----------------------------------------------------------------------------------------------------------------------------
Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
Powered by vBCMS® 2.7.0 ©2002 - 2019 vbdesigns.de
SEO by vBSEO 3.6.1
Copyright ©2009 - 2017 by Expert-Advisor.com - Das Metatrader Forum
MetaTrader bzw. MetaTrader 4 und MetaTrader 5 sind eingetragene Marken der MetaQuotes Software Corp.
-----------------------------------------------------------------------------------------------------------------------------