Einzelnen Beitrag anzeigen
  #2 (permalink)  
Alt 03.01.19
AVT AVT ist offline
Elite Mitglied
 
Registriert seit: Mar 2018
Ort: Hamburg
Beiträge: 612
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