#property copyright " * * * Lucifer * * * " #property link "https://youtu.be/A9p9RxFYHOQ" // УСТАНОВИТЕ СНАЧАЛА ЭТИ ПАРАМЕТРЫ: int Digits_now=5; // JPY=3 (on 5-Digits), JPY=2 (on 4-Digits), other SYM=5 (on 5-Digits) or other SYM=4 (on 4-Digits) int FIX_SPREAD=0; // 1-спред фиксированный, 0-спред плавающий bool Fresh_HIS=true; // True - свежая / False - старая история при урезании int StaticDataAlligment_in_Hours=800; // последние часы истории, принятые тестером во внимание //----^^^^^^^^^^^^^^^-------------------- double hand_point; void start() { int t_i, SWITH_INDEX, ot, vol_a0, vol_b0, vol_c0, xe, t_PP, now_spread0; string t_cat, t_wk, t_wk2, s2; int t_q1, t_q2, t_q3, t_z, IndexWrkMin, op; int t_IndexMax_D, t_IndexMax_D0; int History_End_Index; double ask1[], bid1[], ASK_DATA[20400], LG, SSZ, GLOBAL_HH, W, W_P, LG0; int spool[200]; int i, L, t, MMM0[200], lp; datetime THE_DATETIME, xxx, TEST_SECOND, DDT1[], std=StrToTime("1996.12.12 12:00:00"); bool what, mono, TPS_Agree, equ2, JUMP2, TPS_Agree2, rubbish=false, metric_complete, SPREAD_CONST; s2=Symbol(); if (StringSubstr(s2,3,3)=="ZAR") JUMP2=true; else JUMP2=false; t_cat=CharToStr(92)+"Recorder"+CharToStr(92); t_q3=-1; t_z=220; while (t_q3==-1 && t_z>0) {t_q3=FileOpen(t_cat+s2+".DAT",FILE_BIN|FILE_READ); t_z--;} if (t_q3<1) { Print ("файл ",s2+".DAT"," имеет нулевой размер"); Print ("не получилось открыть файлы тиков из папки - останов!"); return; } else { t_i=FileSize(t_q3); t_IndexMax_D=t_i/4; t=300; t_i=-1; while (t_i0) {t_i=ArrayResize(DDT1, t_IndexMax_D+1); t--;} if (t_i0) t_IndexMax_D--; t=0; while (DDT1[t]THE_DATETIME) { t_z--; if (TimeDayOfWeek(DDT1[t_z])==1) { while (TimeDayOfWeek(DDT1[t_z])==1 && DDT1[t_z]>THE_DATETIME) t_z--; if (TimeDayOfWeek(DDT1[t_z])!=1) xe++; } } GLOBAL_HH-=(xe*47); if (GLOBAL_HH<1) GLOBAL_HH=1; Print ("всего истории="+DoubleToStr(GLOBAL_HH,2)+" часов"); t_cat=CharToStr(92)+"Recorder"+CharToStr(92); t_q1=-1; t_z=220; while (t_q1==-1 && t_z>0) {t_q1=FileOpen(t_cat+s2+".ASK",FILE_BIN|FILE_READ); t_z--;} t_q2=-1; t_z=220; while (t_q2==-1 && t_z>0) {t_q2=FileOpen(t_cat+s2+".BID",FILE_BIN|FILE_READ); t_z--;} t_q3=-1; t_z=220; while (t_q3==-1 && t_z>0) {t_q3=FileOpen(t_cat+s2+".DAT",FILE_BIN|FILE_READ); t_z--;} mono=false; if (t_q1==-1 || t_q2==-1 || t_q3==-1) { if (t_q1<1) Print ("файл ",s2+".ASK"," имеет нулевой размер"); if (t_q2<1) {mono=true; Print ("файл ",s2+".BID"," имеет нулевой размер"); Print ("спред будет считаться фиксированным...");} if (t_q3<1) Print ("файл ",s2+".DAT"," имеет нулевой размер"); } if (t_q1<1 || t_q3<1) { Print ("не получилось открыть файлы тиков из папки - останов!"); if (t_q1>0) FileClose(t_q1); if (t_q2>0) FileClose(t_q2); if (t_q3>0) FileClose(t_q3); return; } t_i=FileSize(t_q1); L=t_i/8; t_i=FileSize(t_q3); t_IndexMax_D=t_i/4; Print (""); if (L!=t_IndexMax_D) Print ("ошибка размеров тиковых файлов - ничего страшного..."); t_IndexMax_D0=t_IndexMax_D; Print ("подготовка и инициализация 3-х массивов для первого использования на ",t_IndexMax_D," элементов..."); t=300; t_i=-1; while (t_i0) {t_i=ArrayResize(ask1, t_IndexMax_D+1); t--;} ASK_DATA[1]=t_i; t=300; t_i=-1; while (t_i0) {t_i=ArrayResize(bid1, t_IndexMax_D+1); t--;} ASK_DATA[2]=t_i; t=300; t_i=-1; while (t_i0) {t_i=ArrayResize(DDT1, t_IndexMax_D+1); t--;} ASK_DATA[3]=t_i; if (ASK_DATA[1]+ASK_DATA[2]+ASK_DATA[3]t_IndexMax_D-1000; t_z--) { if (ask1[t_z]==0 || (!mono && bid1[t_z]==0) || DDT1[t_z]t_IndexMax_D-1000) break; } if (lp!=-1) {lp--; t_IndexMax_D=lp;} Print (""); Print ("необходимо пропылесосить..."); equ2=!JUMP2; TPS_Agree2=true; TPS_Agree=true; op=0; // NEW 2022 while (TPS_Agree2) { lp=-1; ot=-1; L=1; vol_a0=0; vol_b0=-1; for (t_z=op; t_z<=t_IndexMax_D; t_z++) { if (mono) vol_c0=FIX_SPREAD; else vol_c0=Point_DBL_to_INT(NormalizeDouble(ask1[t_z]-bid1[t_z],Digits_now)); if (DDT1[t_z]40000 || (vol_c0>5000 && equ2)) { if (lp!=-1) ot=t_z; else { vol_b0++; if (!mono && ask1[t_z]<=0 && bid1[t_z]<=0) vol_b0++; if (ask1[t_z]<=0) vol_b0+=10; if (!mono && bid1[t_z]<=0) vol_b0+=100; if (DDT1[t_z]0) { ot+=L; t_i=ot-lp; op=ot-t_i; // NEW 2022 for (t_z=ot; t_z<=t_IndexMax_D; t_z++) { ask1[t_z-t_i]=ask1[t_z]; if (!mono) bid1[t_z-t_i]=bid1[t_z]; DDT1[t_z-t_i]=DDT1[t_z]; } TPS_Agree=false; t_IndexMax_D-=t_i; if (vol_b0==0) t_wk="завышенном значении спреда="+DoubleToStr(vol_a0,Digits_now); if (vol_b0>=1 && vol_b0<10) t_wk="обеих нулевых ценах"; if (vol_b0>=10 && vol_b0<100) t_wk="нулевом значении цены ASK"; if (vol_b0>=100 && vol_b0<1000) t_wk="нулевом значении цены BID"; if (vol_b0>=1000 && vol_b0<10000) t_wk="нулевом значении времени"; if (vol_b0>=10000) t_wk="отрицательном значении спреда="+DoubleToStr(vol_a0,0); Print ("был найден мусор длиной в ",t_i-L," индексов на "+t_wk); } else TPS_Agree2=false; } if (vol_a0==0 && TPS_Agree) Print ("ПРОВЕРЕНО: мусора нет !!!"); if (!TPS_Agree) Print ("ВАЖНО: обратите внимание на дату: если она неправильная, то значит фалы истории были повреждены и нет смысла продолжать"); Print ("всего "+DoubleToStr(GLOBAL_HH,2)+" часов истории"); Print ("загружены исторические данные: ["+TimeToStr(DDT1[0],TIME_DATE|TIME_MINUTES|TIME_SECONDS)+" ... "+TimeToStr(DDT1[t_IndexMax_D],TIME_DATE|TIME_MINUTES|TIME_SECONDS)+"]"); Print (""); Print ("проверка на ёлочку..."); lp=0; for (t_z=0; t_zDDT1[t_z+1]) { ask1[t_z]=0; lp++; } } if (lp>0) { Print ("были найдены ошибки в количестве: ",lp); } else Print ("ошибок не обнаружено..."); Print (""); if (lp>0) Print ("поэтому необходимо повторно пропылесосить..."); else Print ("необходимо пропылесосить..."); t_PP=now_spread0*SSZ; equ2=!JUMP2; TPS_Agree2=true; TPS_Agree=true; op=0; // NEW 2022 while (TPS_Agree2) { lp=-1; ot=-1; L=1; vol_a0=0; vol_b0=-1; for (t_z=op; t_z<=t_IndexMax_D; t_z++) { if (mono) vol_c0=FIX_SPREAD; else vol_c0=Point_DBL_to_INT(NormalizeDouble(ask1[t_z]-bid1[t_z],Digits_now)); if (DDT1[t_z]40000 || (vol_c0>5000 && equ2)) { if (lp!=-1) ot=t_z; else { vol_b0++; if (!mono && ask1[t_z]<=0 && bid1[t_z]<=0) vol_b0++; if (ask1[t_z]<=0) vol_b0+=10; if (!mono && bid1[t_z]<=0) vol_b0+=100; if (DDT1[t_z]0) { ot+=L; t_i=ot-lp; op=ot-t_i; // NEW 2022 for (t_z=ot; t_z<=t_IndexMax_D; t_z++) { ask1[t_z-t_i]=ask1[t_z]; if (!mono) bid1[t_z-t_i]=bid1[t_z]; DDT1[t_z-t_i]=DDT1[t_z]; } TPS_Agree=false; t_IndexMax_D-=t_i; if (vol_b0==0) t_wk="завышенном значении спреда="+DoubleToStr(vol_a0,Digits_now); if (vol_b0>=1 && vol_b0<10) t_wk="обеих нулевых ценах"; if (vol_b0>=10 && vol_b0<100) t_wk="нулевом значении цены ASK"; if (vol_b0>=100 && vol_b0<1000) t_wk="нулевом значении цены BID"; if (vol_b0>=1000 && vol_b0<10000) t_wk="нулевом значении времени"; if (vol_b0>=10000) t_wk="отрицательном значении спреда="+DoubleToStr(vol_a0,0); Print ("был найден мусор длиной в ",t_i-L," индексов на "+t_wk); } else TPS_Agree2=false; } if (vol_a0==0 && TPS_Agree) Print ("ПРОВЕРЕНО: мусора нет !!!"); t_i=0; if (StaticDataAlligment_in_Hours>0 && StaticDataAlligment_in_Hours-1; t_z--) {if (DDT1[t_z]-1) break;}} } else { TEST_SECOND=DDT1[0]+lp; for (t_z=0; t_z<=t_IndexMax_D; t_z++) {if (DDT1[t_z]>TEST_SECOND) {t_i=t_z; if (t_z!=t_IndexMax_D) break;}} } if (Fresh_HIS) { t_wk="свежих (последних)"; if (t_i>0) { t_IndexMax_D-=t_i; for (t_z=0; t_z<=t_IndexMax_D; t_z++) { t=t_z+t_i; ask1[t_z]=ask1[t]; if (!mono) bid1[t_z]=bid1[t]; DDT1[t_z]=DDT1[t]; } } } if (!Fresh_HIS) { t_wk="старых (первых)"; if (t_i>0) { xe=t_IndexMax_D; t_IndexMax_D=t_i; t_i=xe-t_i; } } Print ("тестер будет использовать только "+DoubleToStr(StaticDataAlligment_in_Hours,Get_digits(StaticDataAlligment_in_Hours,1,2))+" "+t_wk+" часов истории"); if (t_i>0) Print ("поэтому обрезаем массив на ",t_i," элементов..."); } if (t_i==0) Print ("тестер будет использовать всю доступную историю"); Print (""); Print ("повторная проверка на ёлочку..."); lp=0; for (t_z=0; t_zDDT1[t_z+1]) { ask1[t_z]=0; lp++; } } if (lp>0) { Print ("были найдены ошибки в количестве: ",lp); Print ("по этой причине необходимо ещё раз пропылесосить..."); equ2=!JUMP2; TPS_Agree2=true; TPS_Agree=true; op=0; // NEW 2022 while (TPS_Agree2) { lp=-1; ot=-1; L=1; vol_a0=0; vol_b0=-1; for (t_z=op; t_z<=t_IndexMax_D; t_z++) { if (mono) vol_c0=FIX_SPREAD; else vol_c0=Point_DBL_to_INT(NormalizeDouble(ask1[t_z]-bid1[t_z],Digits_now)); if (DDT1[t_z]40000 || (vol_c0>5000 && equ2)) { if (lp!=-1) ot=t_z; else { vol_b0++; if (!mono && ask1[t_z]<=0 && bid1[t_z]<=0) vol_b0++; if (ask1[t_z]<=0) vol_b0+=10; if (!mono && bid1[t_z]<=0) vol_b0+=100; if (DDT1[t_z]0) { ot+=L; t_i=ot-lp; op=ot-t_i; // NEW 2022 for (t_z=ot; t_z<=t_IndexMax_D; t_z++) { ask1[t_z-t_i]=ask1[t_z]; if (!mono) bid1[t_z-t_i]=bid1[t_z]; DDT1[t_z-t_i]=DDT1[t_z]; } TPS_Agree=false; t_IndexMax_D-=t_i; if (vol_b0==0) t_wk="завышенном значении спреда="+DoubleToStr(vol_a0,Digits_now); if (vol_b0>=1 && vol_b0<10) t_wk="обеих нулевых ценах"; if (vol_b0>=10 && vol_b0<100) t_wk="нулевом значении цены ASK"; if (vol_b0>=100 && vol_b0<1000) t_wk="нулевом значении цены BID"; if (vol_b0>=1000 && vol_b0<10000) t_wk="нулевом значении времени"; if (vol_b0>=10000) t_wk="отрицательном значении спреда="+DoubleToStr(vol_a0,0); Print ("был найден мусор длиной в ",t_i-L," индексов на "+t_wk); } else TPS_Agree2=false; } if (vol_a0==0 && TPS_Agree) Print ("ПРОВЕРЕНО: мусора нет !!!"); } else Print ("ошибок не обнаружено..."); if (t_IndexMax_D0) {t_i=ArrayResize(ask1, t_IndexMax_D+1); t--;} ASK_DATA[1]=t_i; t=300; t_i=-1; while (t_i0) {t_i=ArrayResize(bid1, t_IndexMax_D+1); t--;} ASK_DATA[2]=t_i; t=300; t_i=-1; while (t_i0) {t_i=ArrayResize(DDT1, t_IndexMax_D+1); t--;} ASK_DATA[3]=t_i; if (ASK_DATA[1]+ASK_DATA[2]+ASK_DATA[3]27 && ((t==5 && lp!=5) || (t==6 && lp!=6))) { if (TimeDayOfWeek(TEST_SECOND)==6) t=24; else t=0; LG-=t; if (LG<1) LG=1; } GLOBAL_HH=LG; LG0=LG/24; W=NormalizeDouble(LG0/7,1); W_P=NormalizeDouble(W,0); if (W-W_P>0.4) W_P++; if (W>1.2) {LG0-=(W_P*2); GLOBAL_HH-=(W_P*48);} if (GLOBAL_HH<24) t_wk=""; else t_wk=", "+DoubleToStr(LG0,Get_digits(LG0,1,2))+" дней"; Tromb(rubbish, "длина истории: "+DoubleToStr(GLOBAL_HH,Get_digits(GLOBAL_HH,1,2))+" часов"+t_wk); Tromb(rubbish, "загружены исторические данные: ["+TimeToStr(TEST_SECOND,TIME_DATE|TIME_MINUTES|TIME_SECONDS)+" ... "+TimeToStr(THE_DATETIME,TIME_DATE|TIME_MINUTES|TIME_SECONDS)+"]"); xe=0; Print (""); Print ("проверка на спред..."); Print ("для того, чтобы сделать спред фиксированным, удалите файл ПАРА.BID"); if (FIX_SPREAD>0 && mono) {vol_c0=FIX_SPREAD; Print ("спред доводится до фиксированного уровня=",FIX_SPREAD," - придётся подождать...");} t=1; vol_a0=99999; vol_b0=-1; for (t_z=0; t_z<=t_IndexMax_D; t_z++) { if (mono) bid1[t_z]=ask1[t_z]-FIX_SPREAD*hand_point; else { vol_c0=Point_DBL_to_INT(NormalizeDouble(ask1[t_z]-bid1[t_z],Digits_now)); if (vol_c0!=xe && t>-100) t--; if (t<0 && vol_c0>0) { if (vol_c0vol_b0) vol_b0=vol_c0; if (t<-99 && metric_complete && FIX_SPREAD==0) t_z=t_IndexMax_D; } xe=vol_c0; } } if (t<0) t_wk="плавающий"; else t_wk="фиксированный"; Tromb(rubbish, "установленно: спред "+t_wk); if (t>=0) { Tromb(rubbish, "он равен "+DoubleToStr(vol_c0,0)); SPREAD_CONST=true; } else { SPREAD_CONST=false; Tromb(rubbish, "он находится в пределах ["+DoubleToStr(vol_a0,0)+"..."+DoubleToStr(vol_b0,0)+"]"); } Print ("Запись урезанного фрагмента в папку OUT..."); t_cat=CharToStr(92)+"OUT"+CharToStr(92); t_q1=-1; t_z=20; while (t_q1==-1 && t_z>0) {t_q1=FileOpen(t_cat+s2+".ASK",FILE_BIN|FILE_WRITE); t_z--;} t_q2=-1; t_z=20; while (t_q2==-1 && t_z>0) {t_q2=FileOpen(t_cat+s2+".BID",FILE_BIN|FILE_WRITE); t_z--;} t_q3=-1; t_z=20; while (t_q3==-1 && t_z>0) {t_q3=FileOpen(t_cat+s2+".DAT",FILE_BIN|FILE_WRITE); t_z--;} if (t_q1==-1 || t_q2==-1 || t_q3==-1) {Print ("не получилось записать файлы тиков из папки - останов!"); return;} FileWriteArray (t_q1,ask1,0,t_IndexMax_D); FileClose(t_q1); FileWriteArray (t_q2,bid1,0,t_IndexMax_D); FileClose(t_q2); FileWriteArray (t_q3,DDT1,0,t_IndexMax_D); FileClose(t_q3); return; } // ПОДПРОГРАММЫ: int Point_DBL_to_INT(double chk) { string st, sq; int sf, sl, sqt; st=DoubleToStr(chk, Digits_now); sf=StringFind(st, ".", 0)+1; sq=StringSubstr(st, 0, sf-1); sqt=StrToInteger(sq); if (sf==0) return (chk); sl=StringLen(st)-1; st=StringSubstr(st, sf, sl); if (sqt!=0) sf=StrToInteger(sq+st); else { sf=StrToInteger(st); if (chk<0) sf=-sf; } return (sf); } int Get_digits(double test, bool mwork, int max_dig) { int t_z0, len, uu, xe0; string vv, rr; if (max_dig==0) return (0); if (mwork) test=MathAbs(test); vv=DoubleToStr(test,8); len=StringLen(vv); for (t_z0=1; t_z0<=len; t_z0++) if (StringSubstr(vv, t_z0, 1)==".") {uu=t_z0; break;} rr=StringSubstr(vv, uu+1, len-uu-1); len=StringLen(rr)-1; for (t_z0=len; t_z0>-1; t_z0--) if (StringSubstr(rr, t_z0, 1)!="0") {xe0=t_z0+1; break;} if (xe0>max_dig) xe0=max_dig; return (xe0); } void Tromb(bool use_file, string teletype) { Print (teletype); return; }