OrderSend открывает позицию и возвращает -1? - страница 2

 
Правильно говорит Ники_кр. У тебя до Слип деле не доходит, если открывается ордер, а сразу в начало. А там, если условие сохраняется (а ты, как я понял, не проверяешь количество открытых ордеров перед циклом) у иебя может открыться сколь угодно ордеров.
 
Просто ситуевина видится такой:
попали в цикл тикет получили естественно sleepА не было..... и опять п оновой на след тике.....

Проверил файл тиков. Действительно, в эту минуту было два тика с одинаковым бидом.
Но.

Во-первых, эксперт может иметь строго одну открытую позицию
Во-вторых, старт работает только на первом тике бара, по крайней мере, если OrderSend возвращает валидный тикет.
int start()
{
    int positions = 0;
    if (!IsTesting())
    {
        datetime ct = Time[0];
        
        if (PrevBarTime == ct)
        {
            return (0);
        }
        PrevBarTime = ct;
    }
    
    total = OrdersTotal();

    for (cnt = total - 1; cnt >= 0; cnt--)
    {
        if (!OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
        {
            PrintError("OrderSelect", GetLastError());
            continue;
        }

        if (OrderSymbol() != Symbol())
        {
            continue;
        }

        positions++;
    }

    if (positions == 0)
    {
        for (int j = TRADE_ITERATIONS; j > 0 && !IsStopped(); j--)
        {
            ticket = OrderSend(Symbol(), operation, lots, openPrice, 4, stopLoss, profit, "", MagicNumber , 0, Green);
            
            if (ticket >= 0)
                break;
            
            Sleep(TRADE_TIMEOUT);
        }
 
        if (ticket == -1)
        {
            Alert("OrderSend(", Symbol(), Period(), ", ", lots, ", ", openPrice, ", 4, ", stopLoss, ", ", profit, ", ", MagicNumber, ") failed: ", 
                  PrintError(StringConcatenate("OrderSend(", Symbol(), Period(), ", ", lots, ", ", openPrice, ", 4, ", stopLoss, ", ", profit, ", ", MagicNumber, ")"), GetLastError()));
            PrevBarTime = -1;
        }
    }
    return(0);
}
 
Просмотрел вскольз ветку,могу вставить только одно:
при бек-тестинге Sleep() игнорируется. Только благодаря, этому советник прогоняемый в тестере в режиме ОпенПрайс (я другие не использую) ведет себя практически также и в он-лайне. Поэтому, я могу в советнике закладывать любые циклы торговых операций со Слипом.
Возможно, собака здесь порылась.
 
А переменную positions, ты где инициализируешь?
 
Просмотрел вскольз ветку,могу вставить только одно:
при бек-тестинге Sleep() игнорируется. Только благодаря, этому советник прогоняемый в тестере в режиме ОпенПрайс (я другие не использую) ведет себя практически также и в он-лайне. Поэтому, я могу в советнике закладывать любые циклы торговых операций со Слипом.
Возможно, собака здесь порылась.

Это реальная торговая ситуация, произошедшая этим утром на реальном счету. Две идентичные позиции до сих пор открыты. Хорошо, хоть, не убыточны :))
 
А переменную positions, ты где инициализируешь?


в начале старта. Всю торговую логику я, естественно, убрал. Инициализация попала под метлу случайно.
Добавил инициализацию в пример
 
После ОрдерСенд ставь тоже Слип.....
------------------------
if (!OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
{
PrintError("OrderSelect", GetLastError());<---------
continue;
}
-------------------------
если ПринтЕррор промолчал значить ОрдерсТотал не успел закаунтится на рядом стоящих тиках....

думаю так.....
 
То есть, Вы полагаете, что после того, как OrderSend возвращает валидный тикет, список ордеров может быть еще не проапдейтен.
Подобные вещи, очевидно, должны быть синхронизированы на уровне торгового движка терминала.
Воркараунд с таймаутом может, конечно, помочь. Не может дать гарантии.

У меня в экспертах уже 5 или 6 воркараундов для разных ловушек. Выяснение причин и их обход занимает непозволительно много времени.

Хоть бы разработчики подсказывали, что ли.
 
Посмотрел файл тиков.
За минуту, во время которой были открыты две идентичные позиции, было три тика (экперт работает на минутке):

2005/09/29 10:35:09, 87.26
2005/09/29 10:35:37, 87.25
2005/09/29 10:35:54, 87.26


Как могли сработать первый и третий, и быть проигнорированным второй?
Опять же, старт вываливается на всех тиках, кроме первого. OrdersTotal здесь ни причем
 
А переменную positions, ты где инициализируешь?


в начале старта. Всю торговую логику я, естественно, убрал. Инициализация попала под метлу случайно.
Добавил инициализацию в пример

Убери инициализацию в начало программы. Эта переменная из цикла выходит с нулем.