Ich schicke vorweg: weder bin ich ein großer Trading-Experte, noch MQL-Spezialist! Aber ich programmiere seit über 30 Jahren und kann Dir daher ein paar allgemeine Tipps geben. (Kommentare im Code)
Code:
//+==================================================================================+
//| Calculate open positions |
//+==================================================================================+
int CalculateCurrentOrders(string symbol)
{
int buys=0,sells=0;
//---
for(int i=0;i<OrdersTotal();i++)
{
// OrderSelect ist schon boolean, das muss nicht mehr mit true oder false verglichen werden.
// (Das ! heißt ›not‹)
if( !OrderSelect(i,SELECT_BY_POS,MODE_TRADES) ) break;
// Wo ist die Variable ›OrderMagicNumber‹ deklariert? (Nicht in diesem Codestück!)
// Jedenfalls würde ich auf ›strict‹ schalten
if(OrderSymbol()==Symbol() && OrderMagicNumber()==OrderMagicNumber)
{
if(OrderType()==OP_BUY) buys++;
// Das if kann eingespart werden, falls OrderType()==OP_BUY war.
// Die Optimierung ist (vernachlässigbar) *winzig*, tritt aber immerhin in einer Schleife auf.
ELSE if(OrderType()==OP_SELL) sells++;
}
}
// wo ist openOrders deklariert? Wieso sollte es >0 sein? Bzw. wie wird es jemals >0?
if(openOrders>0) openOrders = buys+sells;
return (openOrders);
}
//+===================================================================================+
//| MoneyManagement - Calculate martingale lot size for open positiones |
//|===================================================================================+
double LotsOptimized()
{
double lot=Lots;
//--- select lot size
// Tipp: Leg Dir eine Systematik zurecht, welche Variablen mit Großbuchstaben beginnen.
// (bei mir: die Input-Parameter fangen mit Großbuchstaben an, alle lokalen Variablen klein.
// Mach klar, dass Du keine integer-Division willst (100.)
lot=NormalizeDouble(AccountFreeMargin() * MaximumRisk / 100., 2); // 2 = Digits for DAX
//--- calculate martingale steps
if(ProfitFactor>0)
{
//-- MathPow(double base,double exponent); = bereits im Editor implementiert
//-- Formel für Zahlenreihe der Verdopplung: a(openOrders) = 2 *2(hoch openOrders - 1)
lot = NormalizeDouble(lot *2 *MathPow(2,openOrders - 1),2);
}
//--- return lot size
if(lot<0.01) lot=0.01;
return(lot);
}
//+=======================================================================================+
Alles nur Vorschläge und Anregungen!
LG