//--------------------------------------------------------------------- // Открыть позицию в заданное время. //--------------------------------------------------------------------- #property copyright "© RickD 2006-2007" #property link "www.e2e-fx.net" //--------------------------------------------------------------------- // Очень полезная функция split и пример ее использования. // split - разделяет элементы строки и возвращает их в виде массива. // Параметры: // [OUT] string& arr[] - возвращаемый массив строк. // [IN] string str - входная строка. // [IN] string sym - разделитель. // Предположим советник должен открывать позицию в указанный промежуток времени. // Этот промежуток можно записать в следующем виде: "12:00-12:03". // Таких временных интервалов может быть несколько. // Удобно будет записать их в виде одной строки-параметра: // "12:00-12:03; 13:00-13:05; 15:20-15:21". // Это дает нам возможность указывать неограниченное количество временных интервалов. //--------------------------------------------------------------------- extern string OpenTime = "10:00-10:05; 12:20-12:31; 13:40-13:55"; void OpenPosition() { string OTA[]; string OTI[]; split(OTA, OpenTime, ";"); datetime tm0 = CurTime(); datetime tm1, tm2; bool cond = false; int cnt = ArraySize(OTA); for (int i=0; i < cnt; i++) { split(OTI, OTA[i], "-"); if (ArraySize(OTI) != 2) continue; tm1 = StrToTime(TimeToStr(CurTime(), TIME_DATE) + " " + OTI[0]); tm2 = StrToTime(TimeToStr(CurTime(), TIME_DATE) + " " + OTI[1]); cond = cond || (tm1 <= tm0 && tm0 < tm2); } if (cond) { // Открываем позицию либо выполняем иные действия. } } void split(string& arr[], string str, string sym) { ArrayResize(arr, 0); string item; int pos, size; int len = StringLen(str); for (int i=0; i < len;) { pos = StringFind(str, sym, i); if (pos == -1) pos = len; item = StringSubstr(str, i, pos-i); item = StringTrimLeft(item); item = StringTrimRight(item); size = ArraySize(arr); ArrayResize(arr, size+1); arr[size] = item; i = pos+1; } }