Бывают случаи когда фьючерс заканчивается, уходить в базовый актив не хочется, а сделка еще не завершена.
Как в роботе автоматически программно, не дожидаясь экспирации фьючерса перейти на торговлю следующим по сроку фьючерсом?
Есть у кого алгоритмы определения ближайшего по сроку экспирации фьючерса и алгоритм перехода без потерь на новый?
Как в роботе автоматически программно, не дожидаясь экспирации фьючерса перейти на торговлю следующим по сроку фьючерсом?
Алгоритм может быть только один - старую позицию закрыть, новую открыть.
Ок. Если нужно учесть прибыль-убыток по старому фьючерсу, можно отфильтровать по названию, магику или комментарию.
Как выбрать программно, новый фьючерс с ближайшим сроком экспирации? По идее нужно открыть все доступные инструменты и у каждого проверить срок экспирации. Тогда возникает вопрос, как открыть программно все доступные инструменты. Или есть более простой способ?
Вбить имя инструмента в код заранее. Либо искать похожий инструмент в списке символов ,анализируя 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!"); }
Но печалька в том, что сам эксперт не "перескочит" на новый чарт :)
Но печалька в том, что сам эксперт не "перескочит" на новый чарт :)
Сдается, что сам чарт можно сменить на другой инструмент. Доки надо глянуть.
ЗЫ
Меняет значения символа и периода указанного графика |
Но печалька в том, что сам эксперт не "перескочит" на новый чарт :)
Как уже выяснилось (побочный эффект), советнику без разницы на каком чарте торговать.
int NextFutMonth=3;
Этот параметр тоже не хотелось бы задавать жестко вручную. Например BR каждый месяц новый фьючерс.
И перед тем как проверять параметры нужно выбрать инструмент SymbolSelect ?
С текущим функционалом MQL, для удобства автоматического перехода на новый фьючерс, думаю нужны две универсальные функции типа:
string CurrFutures(string short_name) { ..... } string NextFutures(string short_name) { ..... }
Подумаю над наполнением.
Может есть варианты проще?
Как уже выяснилось (побочный эффект), советнику без разницы на каком чарте торговать.
Этот параметр тоже не хотелось бы задавать жестко вручную. Например 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; }
Вам и "карты" в руки.
Не забудьте поделится изысканиями.
Буду признателен
Кстати, несложно сделать проверку на 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 (можно мелким шрифтом).
На выходе полное наименование прошедшего, текущего и следующего.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Бывают случаи когда фьючерс заканчивается, уходить в базовый актив не хочется, а сделка еще не завершена.
Как в роботе автоматически программно, не дожидаясь экспирации фьючерса перейти на торговлю следующим по сроку фьючерсом?
Есть у кого алгоритмы определения ближайшего по сроку экспирации фьючерса и алгоритм перехода без потерь на новый?