Каталог файлов форума

Список вложений в сообщениях, оставленных на этой конференции.

Все файлы форума: 1230

Добавлено: evge » 01 мар 2017, 22:32

Тема: Re: Нужно написать робота по Мартингейлу

Текст сообщения:

Пример стратегии Мартингейла.

E_MARTIN.ads
(1.57 КБ) 2189 скачиваний


E_MARTIN-02.png
E_MARTIN-02.png (37.43 КБ) 22627 просмотров


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

/**E_MARTIN
Developed by evge;
Algorithm = Усреднение;**/

function Initialize()
{
   StrategyName = "E_MARTIN";
   AddParameter("StartPos", 100, "", 1);
   AddParameter("TP", 0.1, "", 1);
   AddParameter("SL", -10, "", 1);
   AddParameter("PeriodSMA", 13, "", 1);
   AddParameter("PeriodEMA", 8, "", 1);
   AddInput("Input1", Inputs.Candle, 5, true, "SBER=МБ ЦК");
   LongLimit = 1000;
   ShortLimit = -1000;

   AddGlobalVariable("Dir", Types.Int, 0);  // Текущее направление
}

function OnUpdate()
{

// пример стратегии с усреднением
// evge 01.03.2017 http://alfadirect4.ru

   var S = SMA(Input1.Close, PeriodSMA);
   var E = EMA(Input1.Close, PeriodEMA);
   
   var Pos = CurrentPosition();
   var Lot = (Pos == 0) ? (int)StartPos : Math.Abs(Pos);

   // Условие входа в лонг
   var isLong = E[1] < S[1] && E[0] > S[0] && Dir >= 0;

   // Условие входа в шорт
   var isShort =  E[1] > S[1] && E[0] < S[0] && Dir <= 0;

   if (isLong) Dir = 1;
   if (isShort) Dir = -1;

   // Вход
   if (Pos == 0)
   {
      if ( isLong )
      {
         EnterLong(Lot);
      }
      else
      if ( isShort )
      {
         EnterShort(Lot);
      }
   }
 
   // Усреднение
   if ( Pos != 0 && CurrentPLper() < 0 )
   {
      if ( isLong && Pos > 0 )
      {
         EnterLong(Lot);
      }
      else
      if ( isShort && Pos < 0 )
      {
         EnterShort(Lot);
      }
   }

   // Выход по Take
   if ( (CurrentPLper() > TP) )
   {
      ClosePosition();
      Dir = 0;
   }

   // Стоп :(
   if ( (CurrentPLper() < SL) )
   {
      ClosePosition();
      Dir = 0;
   }
}


Скачать код

E_MARTIN-01.png
E_MARTIN-01.png (44.66 КБ) 22627 просмотров


Данный пример каждый следующий лот входа при убытке ставит равным по размеру текущей открытой позиции, т.е. это мартингейл (1, 2, 4, 8, 16, 32, 64....)

Если нужно просто усреднение, то нужно

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

   var Lot = (Pos == 0) ? (int)StartPos : Math.Abs(Pos);

заменить на

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

   var Lot = (int)StartPos;