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