У вас не стоит Flash Player
Настройки
#2540 - Tue Mar 02 2010 11:10 AM Пример скрипта торгового алгоритма в доках
gmother Offline
journeyman

Registered: Wed Jan 20 2010
Записи: 79
Пример скрипта вводит в заблуждение не только отсутствием отступов, но и неодинаковым исполнением на истории и в реале.

1. Судя по всему, в конструкции:
Code:
for (int i = 0; (i < barsCount); i++) {
  IPosition le = source.Positions.GetLastActiveForSignal("LE");
  if (le == null) {
    //...
  } else {
    //...
  }
}

GetLastActiveForSignal не зависит от номера бара, и на реальном счёте, в случае открытой позиции, всегда возвращает открытую позу, т.е. условие else выполняется при каждой итерации цикла, от 0 и до упора, в отличие от истории, где Positions "живёт" в течение цикла и условие будет срабатывать только на барах с открытыми позициями.

2. Похоже, IPosition.CloseAtProfit сначала проверяет второй аргумент (цену), а только потом первый аргумент (номер бара), если вообще его учитывает. Подозрение возникло потому, что этот метод ошибочно закрывал у меня позицию по рынку при каждом выполнении скрипта, причём до того, как цикл дойдёт до последнего бара (на истории всё рисовалось как надо).

обе проблемы пока что решил заменой
Code:
for (int i = 0; (i < barsCount); i++) {

на
Code:
for (int i = source.Positions.IsRealtime? barsCount - 1: 0; (i < barsCount); i++) {



Отредактировано gmother (Tue Mar 02 2010 11:11 AM)

Наверх
#2558 - Wed Mar 03 2010 12:09 PM Re: Пример скрипта торгового алгоритма в доках [Re: gmother]
Nektodron Offline

Carpal Tunnel

Registered: Thu Oct 23 2008
Записи: 5492
Да, так и есть. Нужно смотреть EntryBar и возвращенной позиции.
Более того, нельзя открыть новую позицию для i-го бара, если уже открыта позиция для более позднего бара, такие позиции будут проигнорированы.

Скрипты, генерируемые из квадратиков учитывают это, вот пример сгенеренного кода:
Code:
                LE = Source1.Positions.GetLastActiveForSignal("LE");
                if ((LE == null))
                {
                    Source1.Positions.BuyIfGreater(i+1, 1, high[i], "LE");
                }
                else
                {
                    if ((LE.EntryBarNum <= i))
                    {
                        LE.CloseAtStop(i+1, low[i], "LX");
                    }
                }

Наверх


Moderator:  ViL, sar