Один ордер на одном баре
При разработке торговых роботов в 70% случаев нужно, чтобы на одном баре было открыто не больше одного ордера. Самое оптимальное решение этой проблемы, на мой взгляд, дает уважаемый мной программист Kimiv (нажмите на одну из иконок соцсетей и функция станет доступна):
[sociallocker]
//+----------------------------------------------------------------------------+
//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Версия : 19.02.2008 |
//| Описание : Возвращает номер бара открытия последней позиции или -1. |
//+----------------------------------------------------------------------------+
//| Параметры: |
//| sy - наименование инструмента ("" или NULL - текущий символ) |
//| tf - таймфрейм ( 0 - текущий таймфрейм) |
//| op - операция ( -1 - любая позиция) |
//| mn - MagicNumber ( -1 - любой магик) |
//+----------------------------------------------------------------------------+
int NumberOfBarOpenLastPos(string sy="0", int tf=0, int op=-1, int mn=-1) {
datetime t;
int i, k=OrdersTotal();
if (sy=="" || sy=="0") sy=Symbol();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderSymbol()==sy) {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (op<0 || OrderType()==op) {
if (mn<0 || OrderMagicNumber()==mn) {
if (t<OrderOpenTime()) t=OrderOpenTime();
}
}
}
}
}
}
return(iBarShift(sy, tf, t, True));
}
[/sociallocker]
Для правильной работы функции, нужно вызывать ее так (передаваемые значения по Вашему усмотрению):
if(NumberOfBarOpenLastPos(Symbol(), 0, -1, Magic) != 0)
{
Здесь требуемые операции типа открытия ордеров или еще что-то;
}
Что значит, «если позиция открыта не на 0 баре», продолжаем работать.
Вот и все. Желаю успехов!