|
Startseite | Registrieren | Hilfe | Benutzerliste | Kalender | Suchen | Heutige Beiträge | Alle Foren als gelesen markieren |
Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4. |
|
Themen-Optionen | Thema durchsuchen | Ansicht |
|
|||
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;} |
|
|||
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 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 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 |
|
|||
Zitat:
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; |
|
|||
Zitat:
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 - 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 |
|
|||
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(); In meinem Fall 0.01, also einfach 1 * 0,01 = (man sehe und staune) 0,01. Code:
double OneL_MinL = 1 * Min_L; Code:
MREQ_MinL = M_REQ * OneL_MinL; Code:
double OnePercAccBal = A_BAL / 100; € 12,75 * 1,25% = € 15,93(75) Code:
double OnePercAccBal_AutoLotPerc = OnePercAccBal * Auto_Lotsize_Perc; 15,93 * 0.01 = 0,1593 L Code:
Lots = OnePercAccBal_AutoLotPerc * Min_L Hilft da NormalizeDouble oder *Point? Oder bin ich hier irgendwie ganz auf dem Holzweg? |
|
|||
Zitat:
|
|
|||
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. |
Lesezeichen |
Themen-Optionen | Thema durchsuchen |
Ansicht | |
|
|