В настоящий момент в МТ5 автоматически происходит смена контрактов после их экспирации. Т.е. к примеру, вчера было открыто два графика RTS-3.12 (дата экспиры - 18.03), сегодня при открытии МТ5 на всех этих графиках контракт автоматически сменился на RTS-6.21. Это отлично.
Но возможно ли сделать (может быть разработчики добавят это в следующих обновлениях) так, чтобы пользователь выбирал день смены контракта опционально. К примеру, не на следующий день после экспиры как сейчас, а на утро дня экспиры? Или может оповещалки какие за день-два до экспиры?
Ищите на форуме, был такой код (https://www.mql5.com/ru/users/serj_che писал)
Писать по FORTS лучше в "Биржевой раздел"
Хороший у него код получился, пользуюсь им. Я только в советник добавил переход на новый контракт не в день экспиры, а когда объёмы на новом контракте становятся больше чем на текущем.
//+------------------------------------------------------------------+ 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); } //+------------------------------------------------------------------+
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
В настоящий момент в МТ5 автоматически происходит смена контрактов после их экспирации. Т.е. к примеру, вчера было открыто два графика RTS-3.12 (дата экспиры - 18.03), сегодня при открытии МТ5 на всех этих графиках контракт автоматически сменился на RTS-6.21. Это отлично.
Но возможно ли сделать (может быть разработчики добавят это в следующих обновлениях) так, чтобы пользователь выбирал день смены контракта опционально. К примеру, не на следующий день после экспиры как сейчас, а на утро дня экспиры? Или может оповещалки какие за день-два до экспиры?