romanzif
Местный
Команда форума
Администратор
- Монет
- 127,610
Если ваш советник торгует динамическим лотом, то рекомендую перед открытием ордера проверять его корректность по спецификации счета.
На самом деле это лучше всегда делать, даже когда торгуете фиксированным лотом заданным в настройках.
Так, например, если в настройках объем = 0.01 лота, а счет на которые поставили советник поддерживает минимальный 0.1, то сделка не будет открыта.
Здесь можно либо вообще не открывать ордер, либо выводить предупреждение, либо советник будет автоматически брать минимально допустимое значение - решать вам, я приведу общую функции проверки.
Так же без такой проверки ваш робот не примут на маркет mql5
Вызывайте эту функцию перед OrderSend() в параметрах передаём объём который надо проверить.
На самом деле это лучше всегда делать, даже когда торгуете фиксированным лотом заданным в настройках.
Так, например, если в настройках объем = 0.01 лота, а счет на которые поставили советник поддерживает минимальный 0.1, то сделка не будет открыта.
Здесь можно либо вообще не открывать ордер, либо выводить предупреждение, либо советник будет автоматически брать минимально допустимое значение - решать вам, я приведу общую функции проверки.
Так же без такой проверки ваш робот не примут на маркет mql5
Код:
//+------------------------------------------------------------------+
//| Проверяет объем ордера на корректность |
//+------------------------------------------------------------------+
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);
}
//+------------------------------------------------------------------+
Вызывайте эту функцию перед OrderSend() в параметрах передаём объём который надо проверить.