Обсуждение статьи "Ограничения и проверки в экспертах" - страница 2

 
gumgum:

'SYMBOL_VOLUME_LIMIT' - undeclared identifier.............

'SymbolInfoDouble' - no one of the overloads can be applied to the function call............

Это только у меня так?

Как только выйдет новый билд - все станет нормально. Ждем билда.
 
Rosh:

а так можно?

lot_max=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MAX);

 

 

Ещё один вопрос по поводу функции SeriesInfoInteger().

При создании темы "AccountInfo... Актуальность информации"  узнал, что есть функции, которые используют данные, "кешируемые в программном окружении", и есть функции, всегда имеющие "прямой доступ к актуальным данным".

К какой категории функций относится  функция SeriesInfoInteger() ?

 

В функции CheckVolumeValue используется следующий код:

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);

}

 Но правильней будет: 

int ratio = (int)MathRound((volume-min_volume)/volume_step);

if (MathAbs(ratio*volume_step+min_volume-volume)>0.0000001)

{

description=StringFormat("Объем не является кратным минимальной градации SYMBOL_VOLUME_STEP=%.2f, ближайший корректный объем %.2f",

  volume_step,ratio*volume_step+min_volume);

return(false);

}

Поскольку минимальный шаг изменения объёма должен отсчитываться от минимального значения.

 

И, пожалуй, фрагмент кода:

//--- вычислим значение маржи

bool check=OrderCalcMargin(type,Symbol(),lots,last_tick.ask,margin);

 нужно заменить на:

//--- вычислим значение маржи

double price = (type == ORDER_TYPE_BUY || type == ORDER_TYPE_BUY_LIMIT || type == ORDER_TYPE_BUY_STOP || type == ORDER_TYPE_BUY_STOP_LIMIT) ? last_tick.ask : last_tick.bid;

bool check=OrderCalcMargin(type,Symbol(),lots,price,margin);