Fufik,
тут надо у автора спросить. почему?
я вижу так:
extern double AutoMM = 20.0; //--- ММ включается если AutoMM> 0. Процент риска. При RecoveryMode = FALSE, менять нужно только это значение.
//--- При AutoMM = 20 и депозите в 1000$, лот будет равен 0,2. Далее лот будет увеличиваться исходя из свободных средств, то есть уже при депозите в 2000$ лот будет равен 0,4.
extern double MultiLotPercent = 1.1; //--- Коэффициент умножение лота (Используется при RecoveryMode = True)
функция мартина рабочая и выглядит так:
Код
//--- Если ММ включен, то
if (MultiLotPercent> 0.0 && AutoMM> 0.0) {
//--- Обнуляем значения
SumProfit = 0;
OldOrdersCount = 0;
loss = 0;
LossOrdersCount = 0;
pr = 0;
ProfitOrdersCount = 0;
//---
//--- Выбираем закрытие ранее ордера
for (int i = OrdersHistoryTotal() - 1; i>= 0; i--) {
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) {
OldOrdersCount++; //--- Считаем ордера
SumProfit += OrderProfit(); //--- и суммарный профит
//--- Если суммарный профит больше pr (для начала больше 0)
if (SumProfit> pr) {
//--- Инициализируем профит и счетчик прибыльных ордеров
pr = SumProfit;
ProfitOrdersCount = OldOrdersCount;
}
//--- Если суммарный профит меньше loss (для начала больше 0)
if (SumProfit < loss) {
//--- Инициализируем просадку и счетчик убыточных ордеров
loss = SumProfit;
LossOrdersCount = OldOrdersCount;
}
//--- Если текущее кол-во подсчитанных ордеров больше или равно MaxAnalizCount (50), то в будущем считаем только свеженькие ордера а старые вычитаем.
if (OldOrdersCount>= MaxAnalizCount) break;
}
}
} //--- Закрытие for (int i = OrdersHistoryTotal() - 1; i>= 0; i--) {
//--- Если число прибыльных ордеров меньше или равно числу лосей, то расчитываем значение умножения лота MultiLot
if (ProfitOrdersCount <= LossOrdersCount) MultiLot = MathPow(MultiLotPercent, LossOrdersCount);
//--- Если нет, то
else {
//--- Инициализируем параметры по профиту
SumProfit = pr;
OldOrdersCount = ProfitOrdersCount;
LastPr = pr;
LastCount = ProfitOrdersCount;
//--- Выбираем закрытие ранее ордера (минус число прибыльных ордеров)
for (i = OrdersHistoryTotal() - ProfitOrdersCount - 1; i>= 0; i--) {
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) {
//--- Если выбрано более 50 ордеров прекразщаем выбирать
if (OldOrdersCount>= MaxAnalizCount) break;
//---
OldOrdersCount++; //--- Считаем кол-во ордеров
SumProfit += OrderProfit(); //--- и профит
//--- Если новый профит меньше предыдущего (LastPr), то
if (SumProfit < LastPr) {
//--- Переинициализируем значения профита и кол-во ордеров
LastPr = SumProfit;
LastCount = OldOrdersCount;
}
}
}
} //--- Закрытие for (i = OrdersHistoryTotal() - ProfitOrdersCount - 1; i>= 0; i--) {
//--- Если значение счетчика LastCount равно счетчику прибыльных ордеров или прошлый профит равен текщему, то
if (LastCount == ProfitOrdersCount || LastPr == pr) MultiLot = MathPow(MultiLotPercent, LossOrdersCount); //--- расчитываем значение умножения лота MultiLot
//--- Если нет, то
else {
//--- Делим положительный (loss - pr) на положительный (LastPr - pr) и сравниваем с риском, после расчитываем умножение лота MultiLot
if (MathAbs(loss - pr) / MathAbs(LastPr - pr)>= (Risk + 100.0) / 100.0) MultiLot = MathPow(MultiLotPercent, LossOrdersCount);
else MultiLot = MathPow(MultiLotPercent, LastCount);
}
}
} //--- Закрытие if (MultiLotPercent> 0.0 && AutoMM> 0.0) {
может автор этим хотел что-то сказать?