Я так понимаю сообщения проверяются уже раз выкладывал выложу еще раз, предлагаю добавить динамический лот в сову, сегодня закодил но на выходных доделаю,
суть в следующем:
добовляем переменную глобальную в процентах, (можно в цифре) тоесть обьем допустимой просадки от депо, в зависимости от выстовляемого стоплоса, ( хотя я доконца не понял выстовляется ли он, если нет то тогда можно задать переменную риск, тоесть процент от депо которым мы работаем)
пока просто в зависимости от переменной риск:
//+------------------------------------------------------------------+
extern double Lots =0.0; // Жестко заданное колич. лотов
extern string переменная_риска = " Ввод данных в % от 1 до 100 ";
extern double Risk =30; // Процент свободных средств
extern int StopLoss = 0; // Жестко заданный стоп лос
extern int SizeLewel = 20; // расстояние между уровнями
bool Work = true; // Эксперт будет работать
//+------------------------------------------------------------------+
int init()
{
Alert ("Сработала ф-ия init() при запуске"); // Сообщение
return; // Выход из init()
}
int start(){
//============================Блок предварительной обработки ======================================================
RefreshRates(); // Обновление данных
if(Work==false){ // Критическая ошибка
Alert("Критическая ошибка. Эксперт не работает."); return; }// Выход из start()
string SMB=Symbol(), // Название инструмента
SMB1, // Базовая валюта
SMB2; // Валюта котировки
int
Zalog = MarketInfo(SMB,MODE_MARGINREQUIRED), // Размер залоговых средств для открытия на 1 лот
MinLevel=MarketInfo(SMB,MODE_STOPLEVEL), // Минимальн допустимый уровень стоп лоса
SL, // Расчетный стоплосс
TipInstrumenta=10000;
double
Depo = AccountEquity(), // Размер свободных средств на счете
MinLot = MarketInfo(SMB,MODE_MINLOT), // Минимальный лот
MaxLot = MarketInfo(SMB,MODE_MAXLOT), // Максимальный лот
LotStep= MarketInfo(SMB,MODE_LOTSTEP), // Шаг изменения размера
Lot, // Колич. лотов в выбран.ордере
Lts, // Колич. лотов в открыв.ордере - конечный
PointPrise = 0, // Стоимость пункта
BazCours = 0, // Курс базовой валюты по отношению к долару
normRisk = 0; // Содержит нормализованный риск
//---------------------- Защита от дурака --------------------------------------------------------------------------
if(Risk<=0){Alert(" Ошибка! Risk должен быть больше нуля."); return(0);}
if(Lots>0 && Lots<MinLot){ Alert(" Ошибка! Lots не должен быть меньше ",MinLot); return(0);}
if(Lot>MaxLot){ Alert(" Ошибка! Lots не должен быть больше ",MaxLot); return(0);}
// if(StopLoss<MinLevel){ Alert(" Ошибка! StopLoss не должен быть меньше ",MinLevel," пунктов"); return(0);}
//----------------------конец защиты-------------------------------------------------------------------------------
//################### РАСЧЕТ СТОПЛОСА ###############################################################################
if (StopLoss > 0)SL = StopLoss; else SL = SizeLewel; // Если задан стоплос, то с ним и работаем //
if (SL < MinLevel) SL = MinLevel; // Если стоплос меньше допустимого, то допустимый //
//###################################################################################################################
//###################### расчет расчетного лота #####################################################################
normRisk=Risk/100; //
if (Lots > 0.0) Lts = Lots; // Если задан лот, то с ним и работаем //
else Lts=MathFloor(Depo*normRisk/Zalog/LotStep)*LotStep; // Процент свободных средств для открытия //
if (Lts < MinLot) Lts=MinLot; // Лот не меньше минимального //
if (Lts*Zalog > Depo){Alert(" Не хватает денег на ", Lts," лотов"); return;} // Выход из start() //
// #################### возратили рабочий лот #######################################################################
// #################### Расчитываем стоимость пункта ################################################################
// Вычисляем какая пара (прямая, обратная, кросс) //
TipInstrumenta=StringFind( SMB,"USD",0); //
// Извлекаем имя первой валютной пары //
SMB1=StringSubstr(SMB,0,3); //
// Текущая котировка базовой валюты к долару США //
BazCours=MarketInfo(SMB1+"USD",MODE_BID); //
if(TipInstrumenta==3)PointPrise=1000000*Lts/10*Point; // Пара прямая например EurUsd //
if(TipInstrumenta==0)PointPrise=1000000*Lts/10*Point/Bid; // Пара обратная например UsdJpy //
if(TipInstrumenta==-1)PointPrise=1000000*Lts/10*Point*BazCours/Bid; // Кросс-пара например EurJpy //
// Нормализуем полученную стоимость пункта //
PointPrise=NormalizeDouble(PointPrise,2); //
//################### возратили стоимость пункта ####################################################################
Здесь уже закодирована функция расчета стоимости пункта