Как научить советника автоматически переходить на новый фьючерс?

 

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

Как в роботе автоматически программно, не дожидаясь экспирации фьючерса перейти на торговлю следующим по сроку фьючерсом?

Есть у кого алгоритмы определения ближайшего по сроку экспирации фьючерса и алгоритм перехода без потерь на новый?

 
Sergey Chalyshev:

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

Как в роботе автоматически программно, не дожидаясь экспирации фьючерса перейти на торговлю следующим по сроку фьючерсом?

Есть у кого алгоритмы определения ближайшего по сроку экспирации фьючерса и алгоритм перехода без потерь на новый?

Алгоритм может быть только один - старую позицию закрыть, новую открыть.
 
Sergey Chalyshev:

Как в роботе автоматически программно, не дожидаясь экспирации фьючерса перейти на торговлю следующим по сроку фьючерсом?

Вбить имя инструмента в код заранее. Либо искать похожий инструмент в списке символов ,анализируя SYMBOL_EXPIRATION_TIME
 
prostotrader:
Алгоритм может быть только один - старую позицию закрыть, новую открыть.

Ок. Если нужно учесть прибыль-убыток по старому фьючерсу, можно отфильтровать по названию, магику или комментарию.

Как выбрать программно, новый фьючерс с ближайшим сроком экспирации? По идее нужно открыть все доступные инструменты и у каждого проверить срок экспирации. Тогда возникает вопрос, как открыть программно все доступные инструменты. Или есть более простой способ?

 
Rashid Umarov:
Вбить имя инструмента в код заранее. Либо искать похожий инструмент в списке символов ,анализируя SYMBOL_EXPIRATION_TIME
Если инструмент отсутствует в "обзоре рынка", его параметры будут недоступны?
 
int NextFutMonth=3;
//+------------------------------------------------------------------+
string SetNewSymbol(const string a_symbol)
  {
   int str_tire=0;
   int str_tochka=0;
   ushort let_symbol;
   string str_month,str_year;
   long aYear;

   int str_size=StringLen(a_symbol);

   for(int i=0; i<str_size; i++)
     {
      let_symbol=StringGetCharacter(a_symbol,i);

      if(let_symbol=='-')
        {
         str_tire=i;
        }

      if(let_symbol=='.')
        {
         str_tochka=i;
         break;
        }
     }

   if(( str_tire!=0) && (str_tochka!=0))
     {
      str_month= StringSubstr(a_symbol,str_tire+1,str_tochka-str_tire-1);
      str_year = StringSubstr(a_symbol,str_tochka+1,str_size-str_tochka-1);
      //---    
      if(str_month=="12")
        {
         str_month=IntegerToString(NextFutMonth);

         aYear = StringToInteger( str_year );
         aYear = aYear + 1;
         str_year=IntegerToString(aYear);
        }
      else
        {
         long aMonth=StringToInteger(str_month);
         aMonth=aMonth+NextFutMonth;

         if(aMonth>12)
           {
            aMonth= aMonth-12;
            aYear = StringToInteger( str_year );
            aYear = aYear + 1;
            str_year=IntegerToString(aYear);
           }
         str_month=IntegerToString(aMonth);
        }
     }
//--- Set new symbol 
   return( StringSubstr( a_symbol, 0, str_tire + 1 ) + str_month + "." + str_year );
  }
 
string cur_symbol=Symbol();
cur_symbol = SetNewSymbol(cur_symbol);
if(SymbolSelect(cur_symbol, true))
{
  Print("Set new symbol done!");
}

 Но печалька в том, что сам эксперт не "перескочит" на новый чарт :)

 
prostotrader:

 Но печалька в том, что сам эксперт не "перескочит" на новый чарт :)

Сдается, что сам чарт можно сменить на другой инструмент. Доки надо глянуть.

ЗЫ 

ChartSetSymbolPeriod

Меняет значения символа и периода указанного графика

 
prostotrader:

 Но печалька в том, что сам эксперт не "перескочит" на новый чарт :)

Как уже выяснилось (побочный эффект), советнику без разницы на каком чарте торговать.

int NextFutMonth=3;

Этот параметр тоже не хотелось бы задавать жестко вручную. Например BR каждый месяц новый фьючерс.

И перед тем как проверять параметры нужно выбрать инструмент  SymbolSelect ? 

С текущим функционалом MQL, для удобства автоматического перехода на новый фьючерс, думаю нужны две универсальные функции типа:

string CurrFutures(string short_name)
  {
    .....
  }

string NextFutures(string short_name)
  {
    .....
  }

Подумаю над наполнением. 

Может есть варианты проще? 

 
Sergey Chalyshev:

Как уже выяснилось (побочный эффект), советнику без разницы на каком чарте торговать.

Этот параметр тоже не хотелось бы задавать жестко вручную. Например BR каждый месяц новый фьючерс.

И перед тем как проверять параметры нужно выбрать инструмент  SymbolSelect ? 

С текущим функционалом MQL, для удобства автоматического перехода на новый фьючерс, думаю нужны две универсальные функции типа:

Подумаю над наполнением. 

Может есть варианты проще? 

Вам и "карты" в руки.

Не забудьте поделится изысканиями.

Буду признателен

Кстати, несложно сделать проверку на Brent в функции SetNewSymbol 

Добавлено

string s_info=StringSubstr(a_symbol, 0, str_tire); 
      int NextFutMonth;
      if(s_info=="BR")
      {
        NextFutMonth=1;
      }
      else
      {
       NextFutMonth=3; 
      }
 
prostotrader:

Вам и "карты" в руки.

Не забудьте поделится изысканиями.

Буду признателен

Кстати, несложно сделать проверку на Brent в функции SetNewSymbol 

Добавлено

Вот что получилось на данный момент:

#property script_show_inputs

input string name="";
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   Comment(
           "\n Last Futures: ",LastFutures(name),
           "\n Curr Futures: ",CurrFutures(name),
           "\n Next Futures: ",NextFutures(name),
           "");
  }
//+------------------------------------------------------------------+
string CurrFutures(string short_name)
  {
   StringToUpper(short_name);
   string long_name;
   MqlDateTime time;
   TimeCurrent(time);
   int year=time.year;
   int mon=time.mon;
   for(int i=0; i<12; i++)
     {
      if(mon>12) { mon=1; year++; }
      StringConcatenate(long_name,short_name,"-",mon,".",year%100);
      if(SymbolSelect(long_name,true))
        {
         if(SymbolInfoInteger(long_name,SYMBOL_EXPIRATION_TIME)>TimeCurrent()) break;
        }
      mon++;
      long_name="";
     }
   return(long_name);
  }
//+------------------------------------------------------------------+
string NextFutures(string short_name)
  {
   StringToUpper(short_name);
   string long_name;
   MqlDateTime time;
   TimeCurrent(time);
   int year=time.year;
   int mon=time.mon;
   datetime currtime=0;
   for(int i=0; i<12; i++)
     {
      if(mon>12) { mon=1; year++; }
      StringConcatenate(long_name,short_name,"-",mon,".",year%100);
      //Print(long_name);
      if(SymbolSelect(long_name,true))
        {
         int expirat=(int)SymbolInfoInteger(long_name,SYMBOL_EXPIRATION_TIME);
         Print("expirate: ",(datetime)expirat);
         
         if(currtime==0)
           if(expirat>TimeCurrent()) { currtime=expirat; mon++; continue; }
         if(currtime!=0) if(expirat>currtime) break;
        }
      mon++;
      long_name="";
     }
   return(long_name);
  }
//+------------------------------------------------------------------+
string LastFutures(string short_name)
  {
   StringToUpper(short_name);
   string long_name;
   MqlDateTime time;
   TimeCurrent(time);
   int year=time.year;
   int mon=time.mon;
   for(int i=0; i<12; i++)
     {
      if(mon<1) { mon=12; year--; }
      StringConcatenate(long_name,short_name,"-",mon,".",year%100);
      if(SymbolSelect(long_name,true))
        {
         if(SymbolInfoInteger(long_name,SYMBOL_EXPIRATION_TIME)<TimeCurrent()) break;
        }
      long_name="";
      mon--;
     }
   return(long_name);
  }
//+------------------------------------------------------------------+

Готовый скрипт с тремя независимыми функциями.

В параметрах вводится короткое наименование фьючерса, например br (можно мелким шрифтом).

На выходе полное наименование прошедшего, текущего и следующего.

Причина обращения: