что значит парсится ? преобразовать строку в массив со значениями?
HIDDEN >>:
Есть ли готовая реализация?
Желательно в виде функции в которую передаём текстовый символ и по этому символу парсится строка.
Есть ли готовая реализация?
Желательно в виде функции в которую передаём текстовый символ и по этому символу парсится строка.
С год-полтора назад кто-то выкладывал индикатор, в котором в одной строке задавалась сразу группа параметров. Строка разбиралась, естессно. Вспомнить пока не получается.
Мне кажется проще самому написать. Под конкретную задачу несложно. Вот если универсальную делать - много проверок будет, и вообще с типизацией гемморой.
// А что значит "в функцию передаётся текстовый символ, и по этому символу парсится"? Не смог однозначно проинтерпретировать.
на mql у меня готовых "болванок" пока нет, а вот на delphi уже собралось, посмотри может разберешься сам:
var
Text: string;
s: array of string;
begin
x:=1;
i:=1;
tmp:='';
repeat
repeat
tmp:=tmp+Text[x];
inc(x);
until Text[x]<>';';
s[i]:=tmp;
tmp:='';
inc(i);
until x<Length(Text)
end;
nn
var
Text: string;
s: array of string;
begin
x:=1;
i:=1;
tmp:='';
repeat
repeat
tmp:=tmp+Text[x];
inc(x);
until Text[x]<>';';
s[i]:=tmp;
tmp:='';
inc(i);
until x<Length(Text)
end;
nn
int pos=StringFind(out,",",0); in[i][x]=StrToDouble(StringSubstr(out,0,pos+1)); out=StringSubstr(out,pos+1,0);Вместо запятой, ставьте ваш разделитель и в цикл его - пока строка не закончиться
Вот я себе в инклудники файл такой помаленьку собираю - часть из общих источников, часть сам писал - там вроде есть, то что нужно - называется StringExplode.
Файлы:
strings.mqh
4 kb
Не помню у кого содрал но вот работает :
//+----------------------------------------------------------------------------+ //| Чтение лотов | //+----------------------------------------------------------------------------+ int ReadLots(){ int i=0, np; string st, tmp=lotsStr; ArrayResize(lot, 0); while (StringLen(tmp)>0) { np=StringFind(tmp, ";"); if (np<0) { st=tmp; tmp=""; } else { st=StringSubstr(tmp, 0, np); tmp=StringSubstr(tmp, np+1); } st=StringTrim(st); if(st=="") break; ArrayResize(lot, i+1); lot[i]=StrToDouble(st); i++; } return(i); }
extern string PercentsLots="50/30/10/5/5";// последовательность процентов дробления лота ордера extern string LevelsSbrosa="50/100/150/200/250";// последовательность уровней сброса лотов string NameExpert="Мой советник"; // -------- лотовые массивы ------------------------------------------- double PercentLotsMass[1]; double RealLotsMass[1]; int LevelsMass[1]; int RealStopLoss[1]; bool DobroSbrosa[1]; // ----------------- int SkolkoLotov,SkolkoTeikov; int start (){ if(!ProverkaStroki(PercentsLots) && PercentsLots!=""){ Alert("Перезагрузите советника - его работа остановлена"); Alert("Ошибка! В параметре PercentsLots - введён некорректный символ!"); Alert("================= ",NameExpert," ================="); return(0); } if(!ProverkaStroki(LevelsSbrosa) && LevelsSbrosa!=""){ Alert("Перезагрузите советника - его работа остановлена"); Alert("Ошибка! В параметре LevelsSbrosa - введён некорректный символ!"); Alert("================= ",NameExpert," ================="); return(0); } SkolkoLotov=SchChisel_v_Str(PercentsLots);// на сколько частей нужно дробить лот SkolkoTeikov=SchChisel_v_Str(LevelsSbrosa);// сколько уровней для сброса лотов if(SkolkoLotov!=SkolkoTeikov && PercentsLots!=""){ Alert("Перезагрузите советника - его работа остановлена"); Alert("Ошибка! В PercentsLots должно быть столько же чисел, сколько в LevelsSbrosa"); Alert("================= ",NameExpert," ================="); Dobro=false; return(0); } // --------- меняем размерность массивов --------------- ArrayResize(PercentLotsMass,SkolkoLotov+1); ArrayResize(RealLotsMass,SkolkoLotov+1); ArrayResize(LevelsMass,SkolkoLotov+1); ArrayResize(RealStopLoss,SkolkoLotov+1); ArrayResize(DobroSbrosa,SkolkoLotov+1); Initsialize_2_Array(); } // ------------ Пользовательские подпрограммы ----------------- // ------------------- Initsialize_2_Array() ------------------------------------------------------- //функция инициализирует все массивы значениями // --------------------------------------------- void Initsialize_2_Array(){ int Symbolov,i,Sch; string Temp="",Temp1=""; // -------- сначала лоты ------------- Symbolov=StringLen(PercentsLots); Sch=0; Temp=""; Temp1=""; for(i=0;i<=Symbolov-1;i++){ // проходим до разделителя, накапливая символы в переменную Temp Temp=StringSubstr(PercentsLots,i,1); Temp1=Temp1+StringSubstr(PercentsLots,i,1); if(Temp=="/" || i==Symbolov-1){//это разделитель, или последний символ Sch++; PercentLotsMass[Sch]=StrToDouble(Temp1); Temp1=""; } } // -------- теперь уровни профита ---------- Symbolov=StringLen(LevelsSbrosa); Sch=0; Temp=""; Temp1=""; for(i=0;i<=Symbolov-1;i++){ // проходим до разделителя, накапливая символы в переменную Temp Temp=StringSubstr(LevelsSbrosa,i,1); Temp1=Temp1+StringSubstr(LevelsSbrosa,i,1); if(Temp=="/" || i==Symbolov-1){//это разделитель, или последний символ Sch++; LevelsMass[Sch]=StrToInteger(Temp1); Temp1=""; if(Sch==1){ RealStopLoss[1]=0; } else{ RealStopLoss[Sch]=LevelsMass[Sch-1]; } } } } // ------------------- SchChisel_v_Str() ----------------------------------------------------------- // функция подсчитывает количество чисел в строке // ------------------------------------------------ int SchChisel_v_Str(string Text){ int Symbolov=(-1),Chisel=(0); string Temp=""; Symbolov=StringLen(Text); for(int i=0;i<=Symbolov-1;i++){ Temp=StringSubstr(Text,i,1); if(Temp=="/" || i==Symbolov-1){//это разделитель, или последний символ Chisel++; } } return(Chisel); } // ----------------------------- ProverkaStroki() -------------------------------------------------- // функция проверяет корректность использованных в строке символов // АЛЕРТЫ В ЭТОЙ ФУНКЦИИ НЕ ТРОГАТЬ!!!! ОНИ ЗАВЯЗАНЫ НА ПРОВЕРКУ!!!!! // --------------------------------------------------------------- bool ProverkaStroki(string Text){ string NameFunction="ProverkaStroki()",Temp; int Skolko_v_Stroke=(-1); Skolko_v_Stroke=StringLen(Text); //Alert("Строка ",Text," состоит из ",Skolko_v_Stroke," символов"); for(int i=0;i<=Skolko_v_Stroke-1;i++){ Temp=StringSubstr(Text,i,1); //Alert("на итерации ",i," Temp = ",Temp); if(Temp!="0" && Temp!="1" && Temp!="2" && Temp!="3" && Temp!="4" && Temp!="5" && Temp!="6" && Temp!="7" && Temp!="8" && Temp!="9" && Temp!="/" && Temp!="."){ Alert("В переменной ",Text," присутствует некорректный символ ",Temp); Alert("================= ",NameFunction," ================="); return(false); } } return(true); }Не судите строго если что-то не так. Код я привёл лишь для примера, чтоб человек мог понять принцип.
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Желательно в виде функции в которую передаём текстовый символ и по этому символу парсится строка.
Пример строки:
1271548800;20;5;25;15;75;-140;0.098;0.3;26;100;0;16;-22;-90;2010.4.12;2010.4.18;
Написать не проблема, но пиво блин уже не лезит, а без пива не программируется ))))))
Если есть хотябы приблизительный код на основе