Автоматическая смена контракта на FORTS

 

В настоящий момент в МТ5 автоматически происходит смена контрактов после их экспирации. Т.е. к примеру, вчера было открыто два графика RTS-3.12 (дата экспиры - 18.03), сегодня при открытии МТ5 на всех этих графиках контракт автоматически сменился на RTS-6.21. Это отлично.


Но возможно ли сделать (может быть разработчики добавят это в следующих обновлениях) так, чтобы пользователь выбирал день смены контракта опционально. К примеру, не на следующий день после экспиры как сейчас, а на утро дня экспиры? Или может оповещалки какие за день-два до экспиры?

 
Anton Polkovnikov:

В настоящий момент в МТ5 автоматически происходит смена контрактов после их экспирации. Т.е. к примеру, вчера было открыто два графика RTS-3.12 (дата экспиры - 18.03), сегодня при открытии МТ5 на всех этих графиках контракт автоматически сменился на RTS-6.21. Это отлично.


Но возможно ли сделать (может быть разработчики добавят это в следующих обновлениях) так, чтобы пользователь выбирал день смены контракта опционально. К примеру, не на следующий день после экспиры как сейчас, а на утро дня экспиры? Или может оповещалки какие за день-два до экспиры?

Ищите на форуме, был такой код (https://www.mql5.com/ru/users/serj_che писал)

Писать по FORTS лучше в "Биржевой раздел"

https://www.mql5.com/ru/forum/95549

Sergey Chalyshev
Sergey Chalyshev
  • 2020.07.20
  • www.mql5.com
Профиль трейдера
 
prostotrader:

Ищите на форуме, был такой код (https://www.mql5.com/ru/users/serj_che писал)

https://www.mql5.com/ru/forum/95549

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

//+------------------------------------------------------------------+
void OnTick()
  {
   New_Contract();
  }
//+------------------------------------------------------------------+
void New_Contract()
  {
   MqlDateTime dt;
   TimeCurrent(dt);
   static int hour = 0;
   if(dt.hour != hour)
     {
      hour = dt.hour;

      string name = StringSubstr(_Symbol, 0, StringFind(_Symbol, "-"));
      string Curr = CurrFutures(name);
      string Next = NextFutures(name);

      double CurrVolumes = IsVolumes(Curr);
      double NextVolumes = IsVolumes(Next);


      if(NextVolumes > CurrVolumes)
         if(Next != _Symbol)
            ChartSetSymbolPeriod(0, Next, 0);
     }
  }
//+------------------------------------------------------------------+
double IsVolumes(string short_name)
  {
   double Volumes[];
   int handle = iVolumes(short_name, PERIOD_D1, VOLUME_REAL);
   if(CopyBuffer(handle, 0, 0, 1, Volumes) < 0)
     {
      PrintFormat("Не удалось скопировать данные из индикатора, код ошибки %d", GetLastError());
      return(0);
     }
   return(Volumes[0]);
  }
//+------------------------------------------------------------------+
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);
      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);
  }
//+------------------------------------------------------------------+