Доброе время суток!
Я не программист, а только учусь… Поэтому частенько ищу помощи
Если не в тему то удалите сообщение
Суть «заказа» — проверить функцию. Так как приходиться частенько использовать 2 разные функции решил их объединить в одну.
1 Функция: расчет объема:
double LotsOptimized(string symbol)
{
//--- Инициализация переменых ----------------------------------------
double volume = (double) Lots;
double lot = Lots; //Значение первоначального лота
double exponent = LotExponent; //Коэффицент умножения первоначального лота
double count = CountOpenOrders(symbol); //Количество открытых ордеров
int digits = (int)2; //Количество символов лота после запятой
//--------------------------------------------------------------------
if (count > 0) volume = NormalizeDouble(lot * MathPow(exponent, count),digits);
//--------------------------------------------------------------------
return(volume);
}
2 функция: проверка корректности объема:
bool CheckVolumeValue(double volume)
{
string description;
double min_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN); //Минимально допустимый объем для торговых операций
if(volume<min_volume)
{
description=StringFormat("Объем меньше минимально допустимого SYMBOL_VOLUME_MIN=%.2f",min_volume);
return(FALSE);
}
double max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX); //Максимально допустимый объем для торговых операций
if(volume>max_volume)
{
description=StringFormat("Объем больше максимально допустимого SYMBOL_VOLUME_MAX=%.2f",max_volume);
return(FALSE);
}
double volume_step=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP); //Получим минимальную градацию объема
int ratio=(int)MathRound(volume/volume_step);
if(MathAbs(ratio*volume_step-volume)>0.0000001)
{
description=StringFormat("Объем не является кратным минимальной градации SYMBOL_VOLUME_STEP=%.2f, ближайший корректный объем %.2f",
volume_step,ratio*volume_step);
return(FALSE);
}
description="Корректное значение объема";
return(TRUE);
}
Пример использования выше перечисленных функций в коде:
...
iLots = LotsOptimized(symbol);
if (Signal(symbol) < 0 && CheckVolumeValue(iLots)==TRUE) ticket = OrderSend(symbol,OP_SELL,iLots,bid,3,0,0,"",MAGIC,0,Red);
...
Я решил объединить обе эти функции в одну, что бы она не только проверяла объем на корректность, но и выставляла корректные значения. в результате получилось это:
double LotsOptimized(string symbol)
{
//--------------------------------------------------------------------
//string symbol = Symbol();
double volume = (double) Lots;
double lot = Lots; //Значение первоначального лота
double exponent = LotExponent; //Коэффицент умножения первоначального лота
double count = CountOpenOrders(); //Количество открытых ордеров
int digits = (int)2; //Количество символов лота после запятой
//--------------------------------------------------------------------
string description;
double min_volume=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MIN); //Минимально допустимый объем для торговых операций
double max_volume=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MAX); //Максимально допустимый объем для торговых операций
double volume_step=SymbolInfoDouble(symbol,SYMBOL_VOLUME_STEP); //Получим минимальную градацию объема
int ratio=(int)MathRound(volume/volume_step);
double correct_volume;
//--------------------------------------------------------------------
if (count > 0) volume = NormalizeDouble(lot * MathPow(exponent, count),digits);
//--------------------------------------------------------------------
if(volume<min_volume)
{
description=StringFormat("Объем меньше минимально допустимого SYMBOL_VOLUME_MIN=%.2f",min_volume);
return(min_volume);
}
//--------------------------------------------------------------------
if(volume>max_volume)
{
description=StringFormat("Объем больше максимально допустимого SYMBOL_VOLUME_MAX=%.2f",max_volume);
return(max_volume);
}
//--------------------------------------------------------------------
if(MathAbs(ratio*volume_step-volume)>0.0000001)
{
description=StringFormat("Объем не является кратным минимальной градации SYMBOL_VOLUME_STEP=%.2f, ближайший корректный объем %.2f",
volume_step,ratio*volume_step);
correct_volume = NormalizeDouble(ratio*volume_step,digits);
return(correct_volume);
}
//--------------------------------------------------------------------
description="Корректное значение объема";
return(volume);
}
Прошу проверить новоиспеченую функцию и указать на ошибки и/или исправить их.
Спасибо!
Комментарии (3)
Редактирован: 4 декабря 2016, 11:18
35 AM2 Сообщений: 16266 - Андрей
8 Kudryashov Автор Сообщений: 129
Ларчик оказывается просто открывался
8 Kudryashov Автор Сообщений: 129
Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий