Страница 1 из 2

закрытие позиции

Добавлено: 14 авг 2016, 10:15
magnaut
здравствуйте подскажите пожалуйста можно ли прописать в роботе что бы позиция закрывалась через минуту? спасибо
:shock:

Re: закрытие позиции

Добавлено: 14 авг 2016, 11:36
evge
Здравствуйте.

От таймфрейма зависит.

Если ТФ > 1 минуты, то нет, т.к. сигналы приходят на закрытии бара. Т.е. каждый следующий бар будет всегда закрытием позиции в данном случае и будут > 1 (кратно таймфрейму).

Если ТФ <= 1 минуте, то запоминаем индекс или время бара открытия позиции и на каждом следующем вычисляем разницу времени бара открытия и текущего бара BarTime().TotalMinutes - OpenPositionTime.TotalMinutes >= 1, т.е. если >= 1 минуты закрываем позицию. Здесь OpenPositionTime - это глобальная переменная, содержащая дату\время открытия позиции, сохраненную в момент открытия позиции OpenPositionTime = BarTime().

Re: закрытие позиции

Добавлено: 14 авг 2016, 12:19
evge
Пример реализации с сохранением индекса бара.

Стратегия - пример, т.е. это не рабочая стратегия. Для демонстрации открывается позиция в лонг при условии, что бар падающий и позиция текущая не открыта.

Здесь M - параметр стратегии, определяющий количество минут до закрытия позиции (по умолчанию 1)

Если разница времени открытия позиции и времени текущего бара отрицательная (перенос на след день), позиция так же закрывается.

Код: Выделить всё

/**ClosePositionMinute
Developed by evge;**/

function Initialize()
{
   StrategyName = "ClosePositionMinute";
   AddParameter("M", 1, "", 1);
   AddInput("Input1", Inputs.Candle, -15, true, "SBER=МБ ЦК");
   LongLimit = 1;
   ShortLimit = -1;

   AddGlobalVariable("OpenPosition", Types.Int, 0);
}

function OnUpdate()
{

   if (CurrentPosition() != 0 && OpenPosition == 0 )
      OpenPosition = CurrentIndex - 1;
   if (CurrentPosition() == 0 && OpenPosition != 0)
      OpenPosition = 0;

   /// ПРАВИЛО 1
   if ( (Input1.Open > Input1.Close) && (CurrentPosition() == 0) )
   {
      EnterLong();      
   }

   /// ПРАВИЛО 2
   TimeSpan iM = BarTime() - BarTime(CurrentIndex - OpenPosition);
   if ( (CurrentPosition() != 0) && iM.TotalMinutes >= M || iM.TotalMinutes < 0)
   {
      ClosePosition();
   }

}


ClosePositionMunute-01.png
ClosePositionMunute-01.png (33.33 КБ) 22631 просмотр

ClosePositionMunute-02.png
ClosePositionMunute-02.png (42.24 КБ) 22631 просмотр

Re: закрытие позиции

Добавлено: 14 авг 2016, 12:26
magnaut
нашёл робота в ватс лабе 4 показатели фантастические но как я понял там язык паскаль тяму не хватает в альфу перенести жалко очень((

Re: закрытие позиции

Добавлено: 14 авг 2016, 12:35
evge
чуть поправил выше мой код. т.к. там перенос на след день не учтен был, когда разница времени текущего бара и открытия бара отрицательная.

Re: закрытие позиции

Добавлено: 14 авг 2016, 12:42
evge
и ещё

было

Код: Выделить всё

OpenPosition = CurrentIndex;


стало

Код: Выделить всё

OpenPosition = CurrentIndex - 1;


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

Re: закрытие позиции

Добавлено: 14 авг 2016, 12:45
magnaut
МОЖНО Я СКИНУ СТРАДЕГИЮ С ВАТ ЛАБА И ВЫ ПОСМОТРИТЕ НА СКОЛЬКО ОНА ЭФЕКТИВНА?

Re: закрытие позиции

Добавлено: 14 авг 2016, 12:47
evge
можно, но мне проще описать алгоритм входа выхода и я подумаю, можно ли такое реализовать в АД4.

Разбирать код WealthLab чужой не хочется :)

Проще и быстрее будет описать алгоритм словами. Я попробую, по возможности, накидать код для АД4, если это быстро получится.

Re: закрытие позиции

Добавлено: 14 авг 2016, 12:49
magnaut
КОД НЕ ЧУЖОЙ ОН В СВОБОДНОМ ДОСТУПЕ А ОПИСАТЬ НЕ МОГУ НЕ ДО КОНЦА ПОНЯЛ ЕГО

Re: закрытие позиции

Добавлено: 14 авг 2016, 12:51
magnaut

Код: Выделить всё

{#OptVar1 1;1;10;1}
// Eager Beaver 2 with PeekChecker
// by DrKoch 2003-09
{$I 'Gaussian'}
{$I 'PeekChecker'}

var BAR, P: integer;
var z: float;
var exit_f: float;
var ema_per, atr_per: integer;
var ma, C: float;
var exit_limit, exit_dist: float;
var uptrend: boolean;
var timeout: integer;

// Parameter

ema_per := 130;  // period of MA
atr_per := 6;
exit_f := 0.6;   // factor * Range for exit
timeout := 1;

// Graphics

EnableTradeNotes( false, false, true );
PlotSeries( GaussianSeries( #Close, ema_per, 4), 0, #red, #Thin );
DrawLabel( 'Gaussian( Close, ' + IntToStr(ema_per) + ')', 0 );

// Trading System
StartPeekCheck(1, 0);
InstallTimeBasedExitR( timeout );

for Bar := 30 to BarCount() - 1 do begin
  ApplyAutoStopsR( Bar );
 
  // intermediate values
  z := ATR(Bar, atr_per);
  C := PriceCloseR(Bar);                      // most recent close
  ma := Gaussian(Bar, #Close, ema_per, 4);   // moving average

  uptrend := (C > ma);                       // what is the trend?
 
  exit_dist  := z * exit_f;     // exit price rel. close
  if uptrend then exit_limit := C + exit_dist
  else            exit_limit := C - exit_dist;

  // Exit Rules
  if ActivePositionCount() > 0 then begin
    for p:= 0 to PositionCount -1 do begin
      if not PositionActive( p ) then continue;
      if PositionLong(p) then SellAtLimitR( Bar+1, exit_limit, p, 'Sell')
      else                    CoverAtLimitR(Bar+1, exit_limit, p, 'Cover');
    end;
  end;
   
  // Entry Rules
  // enter a new position at Open of each Bar
  if uptrend then  BuyAtMarketR(Bar+1,   '' )
  else             ShortAtMarketR(Bar+1, '' );
end;