//--------------------------------------------------------------------- // Функция для динамического расчета рабочего лота. //--------------------------------------------------------------------- #property copyright "© RickD 2006-2007" #property link "www.e2e-fx.net" //--------------------------------------------------------------------- // Функция для расчета рабочего лота по следующим условиям. // uplot - вкл/выкл динамический расчет величины лота. // lotmin - стартовый размер лота. // lotmax - верхнее ограничение на размер лота. // lastprofit - принимает значения -1/1. // -1 - увеличение лота после минусовой сделки до первой плюсовой. // 1 - увеличение лота после плюсовой сделки до первой минусовой. // Лот увеличиваем на величину lotstep до lotmax. // Т.е. при наступлении серии положительных/отрицательных сделок // мы увеличиваем нагрузку на лот. Затем возвращаемся к lotmin. // Будем использовать функцию GetLastOrderHist, описанную в предыдущих примерах. //--------------------------------------------------------------------- // --- Параметры управления капиталом --- extern bool uplot = true; extern int lastprofit = 1; extern double lotmin = 0.1; extern double lotmax = 0.5; extern double lotstep = 0.1; double GetLots() { double lot = lotmin; if (!uplot) return (lot); int ticket = GetLastOrderHist(); if (ticket == -1) return (lot); if (!OrderSelect(ticket, SELECT_BY_TICKET, MODE_HISTORY)) return (lot); if (OrderProfit()*lastprofit < 0) return (lot); lot = MathMin(OrderLots() + lotstep, lotmax); return (lot); } int GetLastOrderHist(int type = -1) { int ticket = -1; datetime dt = 0; int cnt = HistoryTotal(); for (int i=0; i < cnt; i++) { if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) continue; //if (OrderSymbol() != Symbol()) continue; //if (OrderMagicNumber() != Magic) continue; if (type != -1 && OrderType() != type) continue; if (OrderCloseTime() > dt) { dt = OrderCloseTime(); ticket = OrderTicket(); } } return (ticket); }