Да я понял, понял. "Средний" - понятие относительное, мы ж его можем експонентой усреднить, так что после броска все вернется на круги своя. Идея ясна.
Только это не решение - "лишние" сделки, как мне кажется, появляются именно из-за якобы многопоточной обработки, т.е. ордер ушел, а от ДЦ ни ответа ни привета и уходит второй, третий, деятый ордер, а потом это безобразие всем скопом исполняется.
Можно попробовать такой вариант:
int OrdersCur; int OrdersCur1; bool OpOrder=false;// глобальные переменные
OrdersCur1=OrdersTotalMagic(Magic);
if (OrdersCur<=OrdersCur1)
{
OrdersCur=OrdersCur1;
OpOrder=true;
}
Функция подсчета открытых ордеров:
int OrdersTotalMagic(int Magic)
{
int j=0;
int r;
for (r=0;r<OrdersTotal();r++)
{
if(OrderSelect(r,SELECT_BY_POS,MODE_TRADES))
{
if (OrderMagicNumber()==Magic) j++;
}
}
return(j);
}
- возвращает количество ордеров по меджику
и, соответственно вводим саму проверку на открытие в строках 129 и 141:
if((fOpenBuy || fOpenBuy1) && OpOrder)...
if((fOpenSell || fOpenSell1) && OpOrder)...
а после 132 и 144 строк обновляем количество ордеров:
if(numorder > -1) {OrdersCur=OrdersCur+1; OpOrder=false;}
после 287-й строки вводим
OrdersCur=OrdersCur-1;
Если нигде не ошибся, то будет работать так: если была послана команда на открытие ордера, то увеличивается переменная OrdersCur на 1, и при следующем тике идет проверка, есть ли новый ордер уже в работе -
OrdersCur1=OrdersTotalMagic(Magic);
и при закрытии ордера переменная OrdersCur уменьшается на 1 соответственно, а переменная OrdersCur1 всегда имеет знаычение количества открытых ордеров по меджику.
если есть (OrdersCur<=OrdersCur1), то переменная OpOrder=true и дальше по алгоритму ордера будут открываться, а глюки по посланному запросу на открытие и новые команды на открытие ордеров будут исключены.