DailyLinesBoxes

DailyLinesBoxes最新版

官方版无广告177

更新日期:2022-03-02分类标签: 语言:中文平台:没限制

12 人已下载 手机查看

//+——————————————————————+
//| Daily LinesBoxes.mq4 |
//+——————————————————————+

#property indicator_chart_window

#import “kernel32.dll”
void OutputDebugStringA(string msg);
#import

extern int LookbackDays = 20;
extern double StartHours = -1;
extern double EndHours = 6;
extern double ExtendHours = 23;
extern string UniqueID = “DLB#1”;
extern color BoxColor = C’0,64,0′;
extern color LineColor = Green;
extern string Properties = “FTH2”;
extern string TextProperties = “Arial,9,White,4,7”;
extern string SymbolProperties = “2,White,108,10”;
extern string DaysOfWeek = “Mon,Tue,Wed,Thu,Fri”;
extern string Visibility = “M1,M5,M15,M30,H1,H4”;
extern string TimeFrame = “M5”;
extern bool CandlesMustExist = false;
extern double ClearancePips = 0;
extern int RefreshEveryXMins = 1;

int tscale;

datetime prev_time;
string sym, arr[5];
double pnt;
int dig;

//+——————————————————————+
int init() {
//+——————————————————————+

if (RefreshEveryXMins > 240) RefreshEveryXMins = 240;
if (RefreshEveryXMins > 60 && RefreshEveryXMins < 240) RefreshEveryXMins = 60;
if (RefreshEveryXMins > 30 && RefreshEveryXMins < 60) RefreshEveryXMins = 30;
if (RefreshEveryXMins > 15 && RefreshEveryXMins < 30) RefreshEveryXMins = 15;
if (RefreshEveryXMins > 5 && RefreshEveryXMins < 15) RefreshEveryXMins = 5;
if (RefreshEveryXMins > 1 && RefreshEveryXMins < 5) RefreshEveryXMins = 1;

prev_time = -9999;
del_obj();
plot_obj();
return(0);
}

//+——————————————————————+
int deinit() {
//+——————————————————————+
del_obj();
return(0);
}

//+——————————————————————+
int start() {
//+——————————————————————+
sym = Symbol();
if (RefreshEveryXMins < 0)
return(0);
if (RefreshEveryXMins == 0) {
del_obj();
plot_obj();
}
else {
if(prev_time != iTime(sym,RefreshEveryXMins,0)) {
del_obj();
plot_obj();
prev_time = iTime(sym,RefreshEveryXMins,0);
} }
return(0);
}

//+——————————————————————+
void del_obj() {
//+——————————————————————+
int k=0;
while (k<ObjectsTotal()) {
string objname = ObjectName(k);
if (StringSubstr(objname,0,StringLen(UniqueID)) == UniqueID)
ObjectDelete(objname);
else
k++;
}
return(0);
}

//+——————————————————————+
void plot_obj() {
//+——————————————————————+
if (TimeFrame == “”)
tscale = Period();
else
tscale = StrToTF(TimeFrame);
sym = Symbol();
pnt = MarketInfo(sym,MODE_POINT);
dig = MarketInfo(sym,MODE_DIGITS);
if (dig == 3 || dig == 5) {
pnt *= 10;
}

DaysOfWeek = StringUpper(DaysOfWeek) + “,”;
Visibility = StringUpper(Visibility) + “,”;
string test_vis[9] = {“M1″,”M5″,”M15″,”M30″,”H1″,”H4″,”D1″,”W1″,”MN”};
int vis = 0, inc = 1;
for (int i=0; i<9; i++) {
if (StringFind(Visibility,test_vis[i]+”,”) >= 0) vis+=inc;
inc*=2;
}

datetime tc = TimeCurrent();
for (i=0; i<LookbackDays; i++) {
int shifted = tc-i*86400;
if (shifted < Time[Bars-1]) break;
if (StringFind(DaysOfWeek,StringUpper(DateToStr(shifted,”w”))+”,”) < 0) continue;
datetime dt1 = StrToTime(DateToStr(shifted,”Y.M.D”)) + 3600 * StartHours;
datetime dt2 = StrToTime(DateToStr(shifted,”Y.M.D”)) + 3600 * EndHours;
datetime dt3 = StrToTime(DateToStr(shifted,”Y.M.D”)) + 3600 * ExtendHours;

int exist1 = iBarShift(NULL,tscale,dt1,true);
// if (exist1 >= 0 && Time[exist1] != dt1) exist1 = -1;
int exist2 = iBarShift(NULL,tscale,dt2,true);
// if (exist2 >= 0 && Time[exist2] != dt1) exist2 = -1;
int exist3 = iBarShift(NULL,tscale,dt3,true);
// if (exist3 >= 0 && Time[exist3] != dt1) exist3 = -1;

double hi = 0, lo = 999999;
double hivol = 0, lovol = 999999, vol = 0;
double hirng = 0, lorng = 999999, rng = 0;
double hivtr = 0, lovtr = 999999, vtr = 0;
double hivdr = 0, lovdr = 999999, vdr = 0;
int bar1 = iBarShift(NULL,tscale,dt1,false);
int bar2 = iBarShift(NULL,tscale,dt2,false);
for (int j=bar1; j>bar2; j–) {
hi = MathMax(hi,iHigh(NULL,tscale,j));
lo = MathMin(lo,iLow(NULL,tscale,j));
double range = iHigh(NULL,tscale,j) – iLow(NULL,tscale,j);
double vtrtmp = range * iVolume(NULL,tscale,j);
double vdrtmp = DivZero(iVolume(NULL,tscale,j), range);
if (range > rng) { rng = range; hirng = iHigh(NULL,tscale,j); lorng = iLow(NULL,tscale,j); }
if (vtrtmp > vtr) { vtr = vtrtmp; hivtr = iHigh(NULL,tscale,j); lovtr = iLow(NULL,tscale,j); }
if (vdrtmp > vdr) { vdr = vdrtmp; hivdr = iHigh(NULL,tscale,j); lovdr = iLow(NULL,tscale,j); }
if (iVolume(NULL,tscale,j) > vol) { vol = iVolume(NULL,tscale,j); hivol = iHigh(NULL,tscale,j); lovol = iLow(NULL,tscale,j); }
}
string prop = StringUpper(Properties);
if (StringFind(prop,”E”,0) >= 0) { hi = hivol; lo = lovol; } else
if (StringFind(prop,”R”,0) >= 0) { hi = hirng; lo = lorng; } else
if (StringFind(prop,”M”,0) >= 0) { hi = hivtr; lo = lovtr; } else
if (StringFind(prop,”D”,0) >= 0) { hi = hivdr; lo = lovdr; }
hi += ClearancePips * pnt;
lo -= ClearancePips * pnt;
int width = StrToNumber(Properties);
int style = STYLE_SOLID;
if (StringFind(prop,”-..”,0) >= 0) style = STYLE_DASHDOTDOT; else
if (StringFind(prop,”-.”,0) >= 0) style = STYLE_DASHDOT; else
if (StringFind(prop,”.”,0) >= 0) style = STYLE_DOT; else
if (StringFind(prop,”–“,0) >= 0) style = STYLE_DASH;

if (StringFind(prop,”<“,0) >= 0) hi = iOpen(NULL,tscale,bar1);
if (StringFind(prop,”>”,0) >= 0) lo = iOpen(NULL,tscale,bar1);

// Plot box…….
if (StringFind(prop,”F”,0) >= 0 || StringFind(prop,”B”,0) >= 0 || StringFind(prop,”T”,0) >= 0) {
string objname = UniqueID+”-“+i+”-r”;
if (StringFind(prop,”T”,0) >= 0) {
datetime dt4 = dt2;
int exist4 = exist2;
} else {
dt4 = dt3;
exist4 = exist3;
}
if (!CandlesMustExist || (exist1 >= 0 && exist4 >= 0)) {
ObjectCreate(objname,OBJ_RECTANGLE,0,dt1,hi,dt4,lo);
ObjectSet(objname,OBJPROP_COLOR,BoxColor);
ObjectSet(objname,OBJPROP_BACK,false);
ObjectSet(objname,OBJPROP_TIMEFRAMES,vis);
if (StringFind(prop,”F”,0) >= 0) ObjectSet(objname,OBJPROP_BACK,true);
if (StringFind(prop,”P”,0) >= 0) ObjectSetText(objname,DoubleToStr((hi-lo)/pnt,0));
} }

// Plot horizontal lines……….
if (StringFind(prop,”H”,0) >= 0) {
if (!CandlesMustExist || (exist1 >= 0 && exist3 >= 0)) {
objname = UniqueID+”-“+i+”-hi”;
ObjectCreate(objname,OBJ_TREND,0,dt1,hi,dt3,hi);
ObjectSet(objname,OBJPROP_RAY,0);
if (StringFind(prop,”X”,0) >= 0) ObjectSet(objname,OBJPROP_RAY,true);
ObjectSet(objname,OBJPROP_COLOR,LineColor);
ObjectSet(objname,OBJPROP_WIDTH,width);
ObjectSet(objname,OBJPROP_STYLE,style);
ObjectSet(objname,OBJPROP_TIMEFRAMES,vis);
objname = UniqueID+”-“+i+”-lo”;
ObjectCreate(objname,OBJ_TREND,0,dt1,lo,dt3,lo);
ObjectSet(objname,OBJPROP_RAY,0);
if (StringFind(prop,”X”,0) >= 0) ObjectSet(objname,OBJPROP_RAY,true);
ObjectSet(objname,OBJPROP_COLOR,LineColor);
ObjectSet(objname,OBJPROP_WIDTH,width);
ObjectSet(objname,OBJPROP_STYLE,style);
ObjectSet(objname,OBJPROP_TIMEFRAMES,vis);
} }

if (StringFind(prop,”C”,0) >= 0) {
if (!CandlesMustExist || (exist1 >= 0 && exist3 >= 0)) {
objname = UniqueID+”-“+i+”-cl”;
double price = iClose(NULL,tscale,bar1);
ObjectCreate(objname,OBJ_TREND,0,dt1,price,dt3,price);
ObjectSet(objname,OBJPROP_RAY,0);
if (StringFind(prop,”X”,0) >= 0) ObjectSet(objname,OBJPROP_RAY,true);
ObjectSet(objname,OBJPROP_COLOR,LineColor);
ObjectSet(objname,OBJPROP_WIDTH,width);
ObjectSet(objname,OBJPROP_STYLE,style);
ObjectSet(objname,OBJPROP_TIMEFRAMES,vis);
} }

if (StringFind(prop,”O”,0) >= 0) {
if (!CandlesMustExist || (exist1 >= 0 && exist3 >= 0)) {
objname = UniqueID+”-“+i+”-op”;
price = iOpen(NULL,tscale,bar1);
ObjectCreate(objname,OBJ_TREND,0,dt1,price,dt3,price);
ObjectSet(objname,OBJPROP_RAY,0);
if (StringFind(prop,”X”,0) >= 0) ObjectSet(objname,OBJPROP_RAY,true);
ObjectSet(objname,OBJPROP_COLOR,LineColor);
ObjectSet(objname,OBJPROP_WIDTH,width);
ObjectSet(objname,OBJPROP_STYLE,style);
ObjectSet(objname,OBJPROP_TIMEFRAMES,vis);
} }

// Plot vertical lines…….
if (StringFind(prop,”V”,0) >= 0) {
if (!CandlesMustExist || exist1 >= 0) {
objname = UniqueID+”-“+i+”-va”;
ObjectCreate(objname,OBJ_VLINE,0,dt1,0);
ObjectSet(objname,OBJPROP_COLOR,LineColor);
ObjectSet(objname,OBJPROP_WIDTH,width);
ObjectSet(objname,OBJPROP_STYLE,style);
ObjectSet(objname,OBJPROP_TIMEFRAMES,vis);
if (StringFind(prop,”^”,0) >= 0) ObjectSet(objname,OBJPROP_BACK,true);
}
if (StringFind(prop,”VV”,0) >= 0) {
if (!CandlesMustExist || exist3 >= 0) {
objname = UniqueID+”-“+i+”-vb”;
ObjectCreate(objname,OBJ_VLINE,0,dt3,0);
ObjectSet(objname,OBJPROP_COLOR,LineColor);
ObjectSet(objname,OBJPROP_WIDTH,width);
ObjectSet(objname,OBJPROP_STYLE,style);
ObjectSet(objname,OBJPROP_TIMEFRAMES,vis);
if (StringFind(prop,”^”,0) >= 0) ObjectSet(objname,OBJPROP_BACK,true);
} } }
// Display box height……
if (TextProperties > “”) {
StrToStringArray(TextProperties,arr);
double prc = StrToNumber(arr[3]);
prc = (hi+prc*pnt)*(prc>=0) + (lo+prc*pnt)*(prc<0);
objname = UniqueID+”-“+i+”-t”;
ObjectCreate(objname,OBJ_TEXT,0,dt1,prc);
ObjectSetText(objname,NumberToStr((hi-lo)/pnt,arr[4]),StrToInteger(arr[1]),arr[0],StrToColor(arr[2]));
}
// Display Wingdings symbol……
if (StringFind(prop,”W”,0) >= 0 && SymbolProperties > “”) {
if (!CandlesMustExist || exist1 >= 0) {
int bar = iBarShift(NULL,0,dt1,true);
double high = iHigh(NULL,0,bar);
double low = iLow(NULL,0,bar);
StrToStringArray(SymbolProperties,arr);
prc = StrToNumber(arr[3]);
prc = (high+prc*pnt)*(prc>=0) + (low+prc*pnt)*(prc<0);
objname = UniqueID+”-“+i+”-wa”;
ObjectCreate(objname,OBJ_ARROW,0,dt1,prc);
ObjectSet(objname,OBJPROP_ARROWCODE,StrToInteger(arr[2]));
ObjectSet(objname,OBJPROP_COLOR,StrToColor(arr[1]));
ObjectSet(objname,OBJPROP_WIDTH,StrToInteger(arr[0]));
ObjectSet(objname,OBJPROP_TIMEFRAMES,vis);
}
if (StringFind(prop,”WW”,0) >= 0 && SymbolProperties > “”) {
if (!CandlesMustExist || exist3 >= 0) {
bar = iBarShift(NULL,0,dt3,true);
high = iHigh(NULL,0,bar);
low = iLow(NULL,0,bar);
prc = StrToNumber(arr[3]);
prc = (high+prc*pnt)*(prc>=0) + (low+prc*pnt)*(prc<0);
objname = UniqueID+”-“+i+”-wb”;
ObjectCreate(objname,OBJ_ARROW,0,dt3,prc);
ObjectSet(objname,OBJPROP_ARROWCODE,StrToInteger(arr[2]));
ObjectSet(objname,OBJPROP_COLOR,StrToColor(arr[1]));
ObjectSet(objname,OBJPROP_WIDTH,StrToInteger(arr[0]));
ObjectSet(objname,OBJPROP_TIMEFRAMES,vis);
} } } }
return(0);
}

//===========================================================================
// FUNCTIONS LIBRARY
//===========================================================================

//+——————————————————————+
void log(string s1, string s2=””, string s3=””, string s4=””, string s5=””, string s6=””, string s7=””, string s8=””) {
//+——————————————————————+
string out = StringTrimRight(StringConcatenate(WindowExpertName(), “.mq4 “, Symbol(), ” “, s1, ” “, s2, ” “, s3, ” “, s4, ” “, s5, ” “, s6, ” “, s7, ” “, s8));
OutputDebugStringA(out);
}

//+——————————————————————+
int BarConvert(int bar, string FromTF, string ToTF, string ccy=””) {
//+——————————————————————+
// Usage: returns bar# on ToTF that matches same time of bar# on FromTF
// e.g. bar = BarConvert(40,”M15″,”H4″,Symbol());
// will find the bar# on H4 chart whose time matches bar# 40 on M15 chart
if (ccy == “”) ccy = Symbol();
return(iBarShift(ccy,StrToTF(ToTF),iTime(ccy,StrToTF(FromTF),bar)));
}

//+——————————————————————+
int StrToColor(string str)
//+——————————————————————+
// Returns the numeric value for an MQL4 color descriptor string
// Usage: int x = StrToColor(“Aqua”) returns x = 16776960
// or: int x = StrToColor(“0,255,255”) returns x = 16776960
// i.e. StrToColor(“<red>,<green>,<blue>”)
// or: int x = StrToColor(“0xFFFF00”) returns x = 16776960
// i.e. StrToColor(“0xbbggrr”)
// or: int x = StrToColor(“r0g255b255”) returns x = 16776960
// i.e. StrToColor(“r<nnn>g<nnn>b<nnn>”)
{
str = StringLower(str);
if (str == “aliceblue”) return(0xFFF8F0);
if (str == “antiquewhite”) return(0xD7EBFA);
if (str == “aqua”) return(0xFFFF00);
if (str == “aquamarine”) return(0xD4FF7F);
if (str == “beige”) return(0xDCF5F5);
if (str == “bisque”) return(0xC4E4FF);
if (str == “black”) return(0x000000);
if (str == “blanchedalmond”) return(0xCDEBFF);
if (str == “blue”) return(0xFF0000);
if (str == “blueviolet”) return(0xE22B8A);
if (str == “brown”) return(0x2A2AA5);
if (str == “burlywood”) return(0x87B8DE);
if (str == “cadetblue”) return(0xA09E5F);
if (str == “chartreuse”) return(0x00FF7F);
if (str == “chocolate”) return(0x1E69D2);
if (str == “coral”) return(0x507FFF);
if (str == “cornflowerblue”) return(0xED9564);
if (str == “cornsilk”) return(0xDCF8FF);
if (str == “crimson”) return(0x3C14DC);
if (str == “darkblue”) return(0x8B0000);
if (str == “darkgoldenrod”) return(0x0B86B8);
if (str == “darkgray”) return(0xA9A9A9);
if (str == “darkgreen”) return(0x006400);
if (str == “darkkhaki”) return(0x6BB7BD);
if (str == “darkolivegreen”) return(0x2F6B55);
if (str == “darkorange”) return(0x008CFF);
if (str == “darkorchid”) return(0xCC3299);
if (str == “darksalmon”) return(0x7A96E9);
if (str == “darkseagreen”) return(0x8BBC8F);
if (str == “darkslateblue”) return(0x8B3D48);
if (str == “darkslategray”) return(0x4F4F2F);
if (str == “darkturquoise”) return(0xD1CE00);
if (str == “darkviolet”) return(0xD30094);
if (str == “deeppink”) return(0x9314FF);
if (str == “deepskyblue”) return(0xFFBF00);
if (str == “dimgray”) return(0x696969);
if (str == “dodgerblue”) return(0xFF901E);
if (str == “firebrick”) return(0x2222B2);
if (str == “forestgreen”) return(0x228B22);
if (str == “gainsboro”) return(0xDCDCDC);
if (str == “gold”) return(0x00D7FF);
if (str == “goldenrod”) return(0x20A5DA);
if (str == “gray”) return(0x808080);
if (str == “green”) return(0x008000);
if (str == “greenyellow”) return(0x2FFFAD);
if (str == “honeydew”) return(0xF0FFF0);
if (str == “hotpink”) return(0xB469FF);
if (str == “indianred”) return(0x5C5CCD);
if (str == “indigo”) return(0x82004B);
if (str == “ivory”) return(0xF0FFFF);
if (str == “khaki”) return(0x8CE6F0);
if (str == “lavender”) return(0xFAE6E6);
if (str == “lavenderblush”) return(0xF5F0FF);
if (str == “lawngreen”) return(0x00FC7C);
if (str == “lemonchiffon”) return(0xCDFAFF);
if (str == “lightblue”) return(0xE6D8AD);
if (str == “lightcoral”) return(0x8080F0);
if (str == “lightcyan”) return(0xFFFFE0);
if (str == “lightgoldenrod”) return(0xD2FAFA);
if (str == “lightgray”) return(0xD3D3D3);
if (str == “lightgreen”) return(0x90EE90);
if (str == “lightpink”) return(0xC1B6FF);
if (str == “lightsalmon”) return(0x7AA0FF);
if (str == “lightseagreen”) return(0xAAB220);
if (str == “lightskyblue”) return(0xFACE87);
if (str == “lightslategray”) return(0x998877);
if (str == “lightsteelblue”) return(0xDEC4B0);
if (str == “lightyellow”) return(0xE0FFFF);
if (str == “lime”) return(0x00FF00);
if (str == “limegreen”) return(0x32CD32);
if (str == “linen”) return(0xE6F0FA);
if (str == “magenta”) return(0xFF00FF);
if (str == “maroon”) return(0x000080);
if (str == “mediumaquamarine”) return(0xAACD66);
if (str == “mediumblue”) return(0xCD0000);
if (str == “mediumorchid”) return(0xD355BA);
if (str == “mediumpurple”) return(0xDB7093);
if (str == “mediumseagreen”) return(0x71B33C);
if (str == “mediumslateblue”) return(0xEE687B);
if (str == “mediumspringgreen”) return(0x9AFA00);
if (str == “mediumturquoise”) return(0xCCD148);
if (str == “mediumvioletred”) return(0x8515C7);
if (str == “midnightblue”) return(0x701919);
if (str == “mintcream”) return(0xFAFFF5);
if (str == “mistyrose”) return(0xE1E4FF);
if (str == “moccasin”) return(0xB5E4FF);
if (str == “navajowhite”) return(0xADDEFF);
if (str == “navy”) return(0x800000);
if (str == “none”) return(C’0x00,0x00,0x00′);
if (str == “oldlace”) return(0xE6F5FD);
if (str == “olive”) return(0x008080);
if (str == “olivedrab”) return(0x238E6B);
if (str == “orange”) return(0x00A5FF);
if (str == “orangered”) return(0x0045FF);
if (str == “orchid”) return(0xD670DA);
if (str == “palegoldenrod”) return(0xAAE8EE);
if (str == “palegreen”) return(0x98FB98);
if (str == “paleturquoise”) return(0xEEEEAF);
if (str == “palevioletred”) return(0x9370DB);
if (str == “papayawhip”) return(0xD5EFFF);
if (str == “peachpuff”) return(0xB9DAFF);
if (str == “peru”) return(0x3F85CD);
if (str == “pink”) return(0xCBC0FF);
if (str == “plum”) return(0xDDA0DD);
if (str == “powderblue”) return(0xE6E0B0);
if (str == “purple”) return(0x800080);
if (str == “red”) return(0x0000FF);
if (str == “rosybrown”) return(0x8F8FBC);
if (str == “royalblue”) return(0xE16941);
if (str == “saddlebrown”) return(0x13458B);
if (str == “salmon”) return(0x7280FA);
if (str == “sandybrown”) return(0x60A4F4);
if (str == “seagreen”) return(0x578B2E);
if (str == “seashell”) return(0xEEF5FF);
if (str == “sienna”) return(0x2D52A0);
if (str == “silver”) return(0xC0C0C0);
if (str == “skyblue”) return(0xEBCE87);
if (str == “slateblue”) return(0xCD5A6A);
if (str == “slategray”) return(0x908070);
if (str == “snow”) return(0xFAFAFF);
if (str == “springgreen”) return(0x7FFF00);
if (str == “steelblue”) return(0xB48246);
if (str == “tan”) return(0x8CB4D2);
if (str == “teal”) return(0x808000);
if (str == “thistle”) return(0xD8BFD8);
if (str == “tomato”) return(0x4763FF);
if (str == “turquoise”) return(0xD0E040);
if (str == “violet”) return(0xEE82EE);
if (str == “wheat”) return(0xB3DEF5);
if (str == “white”) return(0xFFFFFF);
if (str == “whitesmoke”) return(0xF5F5F5);
if (str == “yellow”) return(0x00FFFF);
if (str == “yellowgreen”) return(0x32CD9A);

int t1 = StringFind(str,”,”,0);
int t2 = StringFind(str,”,”,t1+1);
if (t1>0 && t2>0) {
int red = StrToInteger(StringSubstr(str,0,t1));
int green = StrToInteger(StringSubstr(str,t1+1,t2-1));
int blue = StrToInteger(StringSubstr(str,t2+1,StringLen(str)));
return(blue*256*256+green*256+red);
}

if (StringSubstr(str,0,2) == “0x”) {
string cnvstr = “0123456789abcdef”;
string seq = “234567”;
int retval = 0;
for(int i=0; i<6; i++) {
int pos = StrToInteger(StringSubstr(seq,i,1));
int val = StringFind(cnvstr,StringSubstr(str,pos,1),0);
if (val < 0) return(val);
retval = retval * 16 + val;
}
return(retval);
}

string cclr = “”, tmp = “”;
red = 0;
blue = 0;
green = 0;
if (StringFind(“rgb”,StringSubstr(str,0,1)) >= 0) {
for(i=0; i<StringLen(str); i++) {
tmp = StringSubstr(str,i,1);
if (StringFind(“rgb”,tmp,0) >= 0)
cclr = tmp;
else {
if (cclr == “b”) blue = blue * 10 + StrToInteger(tmp);
if (cclr == “g”) green = green * 10 + StrToInteger(tmp);
if (cclr == “r”) red = red * 10 + StrToInteger(tmp);
} }
return(blue*256*256+green*256+red);
}

return(0);
}

//+——————————————————————+
bool StrToBool(string str)
//+——————————————————————+
{
str = StringLower(StringSubstr(str,0,1));
if (str == “t” || str == “y” || str == “1”) return(true);
return(false);
}

//+——————————————————————+
string BoolToStr(bool bval)
//+——————————————————————+
// Converts the boolean value true or false to the string “true” or “false”
{
if (bval) return(“true”);
return(“false”);
}

//+——————————————————————+
int StrToTF(string str)
//+——————————————————————+
// Converts a timeframe string to its MT4-numeric value
// Usage: int x=StrToTF(“M15”) returns x=15
{
str = StringUpper(str);
if (str == “M1”) return(1);
if (str == “M5”) return(5);
if (str == “M15”) return(15);
if (str == “M30”) return(30);
if (str == “H1”) return(60);
if (str == “H4”) return(240);
if (str == “D1”) return(1440);
if (str == “W1”) return(10080);
if (str == “MN”) return(43200);
return(0);
}

//+——————————————————————+
string TFToStr(int tf)
//+——————————————————————+
// Converts a MT4-numeric timeframe to its descriptor string
// Usage: string s=TFToStr(15) returns s=”M15″
{
switch (tf) {
case 1 : return(“M1”);
case 5 : return(“M5”);
case 15 : return(“M15”);
case 30 : return(“M30”);
case 60 : return(“H1”);
case 240 : return(“H4”);
case 1440 : return(“D1”);
case 10080 : return(“W1”);
case 43200 : return(“MN”);
}
return(“”);
}

//+——————————————————————+
string err_msg(int e)
//+——————————————————————+
// Returns error message text for a given MQL4 error number
// Usage: string s=err_msg(146) returns s=”Error 0146: Trade context is busy.”
{
switch (e) {
case 0: return(“Error 0000: No error returned.”);
case 1: return(“Error 0001: No error returned, but the result is unknown.”);
case 2: return(“Error 0002: Common error.”);
case 3: return(“Error 0003: Invalid trade parameters.”);
case 4: return(“Error 0004: Trade server is busy.”);
case 5: return(“Error 0005: Old version of the client terminal.”);
case 6: return(“Error 0006: No connection with trade server.”);
case 7: return(“Error 0007: Not enough rights.”);
case 8: return(“Error 0008: Too frequent requests.”);
case 9: return(“Error 0009: Malfunctional trade operation.”);
case 64: return(“Error 0064: Account disabled.”);
case 65: return(“Error 0065: Invalid account.”);
case 128: return(“Error 0128: Trade timeout.”);
case 129: return(“Error 0129: Invalid price.”);
case 130: return(“Error 0130: Invalid stops.”);
case 131: return(“Error 0131: Invalid trade volume.”);
case 132: return(“Error 0132: Market is closed.”);
case 133: return(“Error 0133: Trade is disabled.”);
case 134: return(“Error 0134: Not enough money.”);
case 135: return(“Error 0135: Price changed.”);
case 136: return(“Error 0136: Off quotes.”);
case 137: return(“Error 0137: Broker is busy.”);
case 138: return(“Error 0138: Requote.”);
case 139: return(“Error 0139: Order is locked.”);
case 140: return(“Error 0140: Long positions only allowed.”);
case 141: return(“Error 0141: Too many requests.”);
case 145: return(“Error 0145: Modification denied because order too close to market.”);
case 146: return(“Error 0146: Trade context is busy.”);
case 147: return(“Error 0147: Expirations are denied by broker.”);
case 148: return(“Error 0148: The amount of open and pending orders has reached the limit set by the broker.”);
case 4000: return(“Error 4000: No error.”);
case 4001: return(“Error 4001: Wrong function pointer.”);
case 4002: return(“Error 4002: Array index is out of range.”);
case 4003: return(“Error 4003: No memory for function call stack.”);
case 4004: return(“Error 4004: Recursive stack overflow.”);
case 4005: return(“Error 4005: Not enough stack for parameter.”);
case 4006: return(“Error 4006: No memory for parameter string.”);
case 4007: return(“Error 4007: No memory for temp string.”);
case 4008: return(“Error 4008: Not initialized string.”);
case 4009: return(“Error 4009: Not initialized string in array.”);
case 4010: return(“Error 4010: No memory for array string.”);
case 4011: return(“Error 4011: Too long string.”);
case 4012: return(“Error 4012: Remainder from zero divide.”);
case 4013: return(“Error 4013: Zero divide.”);
case 4014: return(“Error 4014: Unknown command.”);
case 4015: return(“Error 4015: Wrong jump (never generated error).”);
case 4016: return(“Error 4016: Not initialized array.”);
case 4017: return(“Error 4017: DLL calls are not allowed.”);
case 4018: return(“Error 4018: Cannot load library.”);
case 4019: return(“Error 4019: Cannot call function.”);
case 4020: return(“Error 4020: Expert function calls are not allowed.”);
case 4021: return(“Error 4021: Not enough memory for temp string returned from function.”);
case 4022: return(“Error 4022: System is busy (never generated error).”);
case 4050: return(“Error 4050: Invalid function parameters count.”);
case 4051: return(“Error 4051: Invalid function parameter value.”);
case 4052: return(“Error 4052: String function internal error.”);
case 4053: return(“Error 4053: Some array error.”);
case 4054: return(“Error 4054: Incorrect series array using.”);
case 4055: return(“Error 4055: Custom indicator error.”);
case 4056: return(“Error 4056: Arrays are incompatible.”);
case 4057: return(“Error 4057: Global variables processing error.”);
case 4058: return(“Error 4058: Global variable not found.”);
case 4059: return(“Error 4059: Function is not allowed in testing mode.”);
case 4060: return(“Error 4060: Function is not confirmed.”);
case 4061: return(“Error 4061: Send mail error.”);
case 4062: return(“Error 4062: String parameter expected.”);
case 4063: return(“Error 4063: Integer parameter expected.”);
case 4064: return(“Error 4064: Double parameter expected.”);
case 4065: return(“Error 4065: Array as parameter expected.”);
case 4066: return(“Error 4066: Requested history data in updating state.”);
case 4067: return(“Error 4067: Some error in trading function.”);
case 4099: return(“Error 4099: End of file.”);
case 4100: return(“Error 4100: Some file error.”);
case 4101: return(“Error 4101: Wrong file name.”);
case 4102: return(“Error 4102: Too many opened files.”);
case 4103: return(“Error 4103: Cannot open file.”);
case 4104: return(“Error 4104: Incompatible access to a file.”);
case 4105: return(“Error 4105: No order selected.”);
case 4106: return(“Error 4106: Unknown symbol.”);
case 4107: return(“Error 4107: Invalid price.”);
case 4108: return(“Error 4108: Invalid ticket.”);
case 4109: return(“Error 4109: Trade is not allowed. Enable checkbox ‘Allow live trading’ in the expert properties.”);
case 4110: return(“Error 4110: Longs are not allowed. Check the expert properties.”);
case 4111: return(“Error 4111: Shorts are not allowed. Check the expert properties.”);
case 4200: return(“Error 4200: Object exists already.”);
case 4201: return(“Error 4201: Unknown object property.”);
case 4202: return(“Error 4202: Object does not exist.”);
case 4203: return(“Error 4203: Unknown object type.”);
case 4204: return(“Error 4204: No object name.”);
case 4205: return(“Error 4205: Object coordinates error.”);
case 4206: return(“Error 4206: No specified subwindow.”);
case 4207: return(“Error 4207: Some error in object function.”);
// case 9001: return(“Error 9001: Cannot close entire order – insufficient volume previously open.”);
// case 9002: return(“Error 9002: Incorrect net position.”);
// case 9003: return(“Error 9003: Orders not completed correctly – details in log file.”);
default: return(“Error ” + e + “: ??? Unknown error.”);
}
return(0);
}

//+——————————————————————+
string StringLeft(string str, int n=1)
//+——————————————————————+
// Returns the leftmost N characters of STR, if N is positive
// Usage: string x=StringLeft(“ABCDEFG”,2) returns x = “AB”
//
// Returns all but the rightmost N characters of STR, if N is negative
// Usage: string x=StringLeft(“ABCDEFG”,-2) returns x = “ABCDE”
{
if (n > 0) return(StringSubstr(str,0,n));
if (n < 0) return(StringSubstr(str,0,StringLen(str)+n));
return(“”);
}

//+——————————————————————+
string StringRight(string str, int n=1)
//+——————————————————————+
// Returns the rightmost N characters of STR, if N is positive
// Usage: string x=StringRight(“ABCDEFG”,2) returns x = “FG”
//
// Returns all but the leftmost N characters of STR, if N is negative
// Usage: string x=StringRight(“ABCDEFG”,-2) returns x = “CDEFG”
{
if (n > 0) return(StringSubstr(str,StringLen(str)-n,n));
if (n < 0) return(StringSubstr(str,-n,StringLen(str)-n));
return(“”);
}

//+——————————————————————+
string StringLeftPad(string str, int n=1, string str2=” “)
//+——————————————————————+
// Prepends occurrences of the string STR2 to the string STR to make a string N characters long
// Usage: string x=StringLeftPad(“ABCDEFG”,9,” “) returns x = ” ABCDEFG”
{
return(StringRepeat(str2,n-StringLen(str)) + str);
}

//+——————————————————————+
string StringRightPad(string str, int n=1, string str2=” “)
//+——————————————————————+
// Appends occurrences of the string STR2 to the string STR to make a string N characters long
// Usage: string x=StringRightPad(“ABCDEFG”,9,” “) returns x = “ABCDEFG ”
{
return(str + StringRepeat(str2,n-StringLen(str)));
}

//+——————————————————————+
string StringReverse(string str)
//+——————————————————————+
{
string outstr = “”;
for (int i=StringLen(str)-1; i>=0; i–)
outstr = outstr + StringSubstr(str,i,1);
return(outstr);
}

//+——————————————————————+
string StringLeftExtract(string str, int n, string str2, int m)
//+——————————————————————+
{
if (n > 0) {
int j = -1;
for(int i=1; i<=n; i++) j=StringFind(str,str2,j+1);
if (j > 0) return(StringLeft(str,j+m));
}
if (n < 0) {
int c = 0;
j = 0;
for (i=StringLen(str)-1; i>=0; i–) {
if (StringSubstr(str,i,StringLen(str2)) == str2) {
c++;
if (c==-n) {
j = i;
break;
} } }
if (j > 0) return(StringLeft(str,j+m));
}
return(“”);
}

//+——————————————————————+
string StringRightExtract(string str, int n, string str2, int m)
//+——————————————————————+
{
if (n > 0) {
int j = -1;
for(int i=1; i<=n; i++) j=StringFind(str,str2,j+1);
if (j > 0) return(StringRight(str,StringLen(str)-j-1+m));
}
if (n < 0) {
int c = 0;
j = 0;
for (i=StringLen(str)-1; i>=0; i–) {
if (StringSubstr(str,i,StringLen(str2)) == str2) {
c++;
if (c==-n) {
j = i;
break;
} } }
if (j > 0) return(StringRight(str,StringLen(str)-j-1+m));
}
return(“”);
}

//+——————————————————————+
int StringFindCount(string str, string str2)
//+——————————————————————+
// Returns the number of occurrences of STR2 in STR
// Usage: int x = StringFindCount(“ABCDEFGHIJKABACABB”,”AB”) returns x = 3
{
int c = 0;
for (int i=0; i<StringLen(str); i++)
if (StringSubstr(str,i,StringLen(str2)) == str2) c++;
return(c);
}

/*
//+——————————————————————+
string StringReplace(string str, int n, string str2, string str3)
//+——————————————————————+
// Replaces the Nth occurrence of STR2 in STR with STR3, working from left to right, if N is positive
// Usage: string s = StringReplace(“ABCDEFGHIJKABACABB”,2,”AB”,”XYZ”) returns s = “ABCDEFGHIJKXYZACABB”
//
// Replaces the Nth occurrence of STR2 in STR with STR3, working from right to left, if N is negative
// Usage: string s = StringReplace(“ABCDEFGHIJKABACABB”,-1,”AB”,”XYZ”) returns s = “ABCDEFGHIJKABACXYZB”
//
// Replaces all occurrence of STR2 in STR with STR3, if N is 0
// Usage: string s = StringReplace(“ABCDEFGHIJKABACABB”,0,”AB”,”XYZ”) returns s = “XYZCDEFGHIJKXYZACXYZB”
{

return(“”);
}
*/

//+——————————————————————+
string StringRightTrim(string str)
//+——————————————————————+
// Removes all trailing spaces from a string
// Usage: string x=StringRightTrim(” XX YY “) returns x = ” XX YY”
{
int pos = 0;
for(int i=StringLen(str)-1; i>=0; i–) {
if (StringSubstr(str,i,1) != ” “) {
pos = i;
break;
} }
string outstr = StringSubstr(str,0,pos+1);
return(outstr);
}

//+——————————————————————+
string ExpandCcy(string str)
//+——————————————————————+
{
str = StringTrim(StringUpper(str));
if (StringLen(str) < 1 || StringLen(str) > 2) return(str);
string str2 = “”;
for (int i=0; i<StringLen(str); i++) {
string char = StringSubstr(str,i,1);
if (char == “A”) str2 = str2 + “AUD”; else
if (char == “C”) str2 = str2 + “CAD”; else
if (char == “E”) str2 = str2 + “EUR”; else
if (char == “F”) str2 = str2 + “CHF”; else
if (char == “G”) str2 = str2 + “GBP”; else
if (char == “J”) str2 = str2 + “JPY”; else
if (char == “N”) str2 = str2 + “NZD”; else
if (char == “U”) str2 = str2 + “USD”; else
if (char == “H”) str2 = str2 + “HKD”; else
if (char == “S”) str2 = str2 + “SGD”; else
if (char == “Z”) str2 = str2 + “ZAR”;
}
return(str2);
}

//+——————————————————————+
double MathInt(double n, int d=0)
//+——————————————————————+
{
return(MathFloor(n*MathPow(10,d)+0.000000000001)/MathPow(10,d));
}

//+——————————————————————+
string DateToStr(datetime mt4date, string mask=””) {
//+——————————————————————+
// Special characters in mask are replaced as follows:
// Y = 4 digit year
// y = 2 digit year
// M = 2 digit month
// m = 1-2 digit Month
// N = full month name, e.g. November
// n = 3 char month name, e.g. Nov
// D = 2 digit day of Month
// d = 1-2 digit day of Month
// T or t = append ‘th’ to day of month, e.g. 14th, 23rd, etc
// W = full weekday name, e.g. Tuesday
// w = 3 char weekday name, e.g. Tue
// H = 2 digit hour (defaults to 24-hour time unless ‘a’ or ‘A’ included)
// h = 1-2 digit hour (defaults to 24-hour time unless ‘a’ or ‘A’ included)
// a = convert to 12-hour time and append lowercase am/pm
// A = convert to 12-hour time and append uppercase AM/PM
// I or i = minutes in the hour
// S or s = seconds in the minute
//
// All other characters in the mask are output ‘as is’
// You can output reserved characters ‘as is’, by preceding them with an exclamation Point
// e.g. DateToStr(StrToTime(“2010.07.30″),”(!D=DT N)”) results in output: (D=30th July)
//
// You can also embed any text inside single quotes at the far left, or far right, of the mask:
// e.g. DateToStr(StrToTime(“2010.07.30″),”‘xxx’w D n Y’yyy'”) results in output: xxxFri 30 Jul 2010yyy

string ltext = “”, rtext = “”;
if (StringSubstr(mask,0,1) == “‘”) {
for (int k1=1; k1<StringLen(mask); k1++) {
if (StringSubstr(mask,k1,1) == “‘”) break;
ltext = ltext + StringSubstr(mask,k1,1);
}
mask = StringSubstr(mask,k1+1);
}
if (StringSubstr(mask,StringLen(mask)-1,1) == “‘”) {
for (int k2=StringLen(mask)-2; k2>=0; k2–) {
if (StringSubstr(mask,k2,1) == “‘”) break;
rtext = StringSubstr(mask,k2,1) + rtext;
}
mask = StringSubstr(mask,0,k2);
}

if (mask == “”) mask = “Y.M.D H:I:S”;

string mth[12] = {“January”,”February”,”March”,”April”,”May”,”June”,”July”,”August”,”September”,”October”,”November”,”December”};
string dow[7] = {“Sunday”,”Monday”,”Tuesday”,”Wednesday”,”Thursday”,”Friday”,”Saturday”};

int dd = TimeDay(mt4date);
int mm = TimeMonth(mt4date);
int yy = TimeYear(mt4date);
int dw = TimeDayOfWeek(mt4date);
int hr = TimeHour(mt4date);
int min = TimeMinute(mt4date);
int sec = TimeSeconds(mt4date);

bool h12f = false;
if (StringFind(StringUpper(mask),”A”,0) >= 0) h12f = true;
int h12 = 12;
if (hr > 12) h12 = hr – 12; else
if (hr > 0) h12 = hr;
string ampm = “am”;
if (hr > 12)
ampm = “pm”;

switch (MathMod(dd,10)) {
case 1 : string d10 = “st”; break;
case 2 : d10 = “nd”; break;
case 3 : d10 = “rd”; break;
default : d10 = “th”; break;
}
if (dd > 10 && dd < 14) d10 = “th”;

string outdate = “”;
for(int i=0; i<StringLen(mask); i++) {
string char = StringSubstr(mask,i,1);
if (char == “!”) {
outdate = outdate + StringSubstr(mask,i+1,1);
i++;
continue;
}
if (char == “d”) outdate = outdate + StringTrim(NumberToStr(dd,”2″)); else
if (char == “D”) outdate = outdate + StringTrim(NumberToStr(dd,”Z2″)); else
if (char == “m”) outdate = outdate + StringTrim(NumberToStr(mm,”2″)); else
if (char == “M”) outdate = outdate + StringTrim(NumberToStr(mm,”Z2″)); else
if (char == “y”) outdate = outdate + StringTrim(NumberToStr(yy,”2″)); else
if (char == “Y”) outdate = outdate + StringTrim(NumberToStr(yy,”4″)); else
if (char == “n”) outdate = outdate + StringSubstr(mth[mm-1],0,3); else
if (char == “N”) outdate = outdate + mth[mm-1]; else
if (char == “w”) outdate = outdate + StringSubstr(dow[dw],0,3); else
if (char == “W”) outdate = outdate + dow[dw]; else
if (char == “h” && h12f) outdate = outdate + StringTrim(NumberToStr(h12,”2″)); else
if (char == “H” && h12f) outdate = outdate + StringTrim(NumberToStr(h12,”Z2″)); else
if (char == “h” && !h12f) outdate = outdate + StringTrim(NumberToStr(hr,”2″)); else
if (char == “H” && !h12f) outdate = outdate + StringTrim(NumberToStr(hr,”Z2″)); else
if (char == “i”) outdate = outdate + StringTrim(NumberToStr(min,”2″)); else
if (char == “I”) outdate = outdate + StringTrim(NumberToStr(min,”Z2″)); else
if (char == “s”) outdate = outdate + StringTrim(NumberToStr(sec,”2″)); else
if (char == “S”) outdate = outdate + StringTrim(NumberToStr(sec,”Z2″)); else
if (char == “a”) outdate = outdate + ampm; else
if (char == “A”) outdate = outdate + StringUpper(ampm); else
if (StringUpper(char) == “T”) outdate = outdate + d10; else
outdate = outdate + char;
}
return(ltext+outdate+rtext);
}

//+——————————————————————+
string NumberToStr(double n, string mask=””)
//+——————————————————————+
// Formats a number using a mask, and returns the resulting string
// Usage: string result = NumberToStr(number,mask)
//
// Mask parameters:
// n = number of digits to output, to the left of the decimal point
// n.d = output n digits to left of decimal point; d digits to the right
// -n.d = floating minus sign at left of output
// n.d- = minus sign at right of output
// +n.d = floating plus/minus sign at left of output
//
// These characters may appear anywhere in the string:
// ( or ) = enclose negative number in parentheses
// $ or ?or ?or € = include floating currency symbol at left of output
// % = include trailing % sign
// , = use commas to separate thousands, millions, etc
// Z or z = left fill with zeros instead of spaces
// * = left fill with asterisks instead of spaces
// R or r = round result in rightmost displayed digit
// B or b = blank entire field if number is 0
// ~ = show tilde in leftmost position if overflow occurs
// ; = switch use of comma and period (European format)
// L or l = left align final string
// T ot t = trim (remove all spaces from) end result

{

if (MathAbs(n) == 2147483647)
n = 0;

string ltext = “”, rtext = “”;
if (StringSubstr(mask,0,1) == “‘”) {
for (int k1=1; k1<StringLen(mask); k1++) {
if (StringSubstr(mask,k1,1) == “‘”) break;
ltext = ltext + StringSubstr(mask,k1,1);
}
mask = StringSubstr(mask,k1+1);
}
if (StringSubstr(mask,StringLen(mask)-1,1) == “‘”) {
for (int k2=StringLen(mask)-2; k2>=0; k2–) {
if (StringSubstr(mask,k2,1) == “‘”) break;
rtext = StringSubstr(mask,k2,1) + rtext;
}
mask = StringSubstr(mask,0,k2);
}

if (mask == “”) mask = “TR-9.2″;

mask = StringUpper(mask);
int dotadj = 0;
int dot = StringFind(mask,”.”,0);
if (dot < 0) {
dot = StringLen(mask);
dotadj = 1;
}

int nleft = 0;
int nright = 0;
for (int i=0; i<dot; i++) {
string char = StringSubstr(mask,i,1);
if (char >= “0” && char <= “9”) nleft = 10 * nleft + StrToInteger(char);
}
if (dotadj == 0) {
for (i=dot+1; i<=StringLen(mask); i++) {
char = StringSubstr(mask,i,1);
if (char >= “0” && char <= “9”) nright = 10 * nright + StrToInteger(char);
} }
nright = MathMin(nright,7);

if (dotadj == 1) {
for (i=0; i<StringLen(mask); i++) {
char = StringSubstr(mask,i,1);
if (char >= “0” && char <= “9”) {
dot = i;
break;
} } }

string csym = “”;
if (StringFind(mask,”$”,0) >= 0) csym = “$”;
if (StringFind(mask,”?,0) >= 0) csym = “?;
if (StringFind(mask,”€”,0) >= 0) csym = “€”;
if (StringFind(mask,”?,0) >= 0) csym = “?;

string leadsign = “”;
string trailsign = “”;
if (StringFind(mask,”+”,0) >= 0 && StringFind(mask,”+”,0) < dot) {
leadsign = ” “;
if (n > 0) leadsign = “+”;
if (n < 0) leadsign = “-“;
}
if (StringFind(mask,”-“,0) >= 0 && StringFind(mask,”-“,0) < dot)
if (n < 0) leadsign = “-“; else leadsign = ” “;
if (StringFind(mask,”-“,0) >= 0 && StringFind(mask,”-“,0) > dot)
if (n < 0) trailsign = “-“; else trailsign = ” “;
if (StringFind(mask,”(“,0) >= 0 || StringFind(mask,”)”,0) >= 0) {
leadsign = ” “;
trailsign = ” “;
if (n < 0) {
leadsign = “(“;
trailsign = “)”;
} }

if (StringFind(mask,”%”,0) >= 0) trailsign = “%” + trailsign;

if (StringFind(mask,”,”,0) >= 0) bool comma = true; else comma = false;
if (StringFind(mask,”Z”,0) >= 0) bool zeros = true; else zeros = false;
if (StringFind(mask,”*”,0) >= 0) bool aster = true; else aster = false;
if (StringFind(mask,”B”,0) >= 0) bool blank = true; else blank = false;
if (StringFind(mask,”R”,0) >= 0) bool round = true; else round = false;
if (StringFind(mask,”~”,0) >= 0) bool overf = true; else overf = false;
if (StringFind(mask,”L”,0) >= 0) bool lftsh = true; else lftsh = false;
if (StringFind(mask,”;”,0) >= 0) bool swtch = true; else swtch = false;
if (StringFind(mask,”T”,0) >= 0) bool trimf = true; else trimf = false;

if (round) n = MathFix(n,nright);
string outstr = n;

int dleft = 0;
for (i=0; i<StringLen(outstr); i++) {
char = StringSubstr(outstr,i,1);
if (char >= “0” && char <= “9”) dleft++;
if (char == “.”) break;
}

// Insert fill characters…….
string fill = ” “;
if (zeros) fill = “0”;
if (aster) fill = “*”;
if (n < 0)
outstr = “-” + StringRepeat(fill,nleft-dleft) + StringSubstr(outstr,1,StringLen(outstr)-1);
else
outstr = StringRepeat(fill,nleft-dleft) + StringSubstr(outstr,0,StringLen(outstr));

outstr = StringSubstr(outstr,StringLen(outstr)-9-nleft,nleft+1+nright-dotadj);

// Insert the commas…….
if (comma) {
bool digflg = false;
bool stpflg = false;
string out1 = “”;
string out2 = “”;
for (i=0; i<StringLen(outstr); i++) {
char = StringSubstr(outstr,i,1);
if (char == “.”) stpflg = true;
if (!stpflg && (nleft-i == 3 || nleft-i == 6 || nleft-i == 9))
if (digflg) out1 = out1 + “,”; else out1 = out1 + ” “;
out1 = out1 + char;
if (char >= “0” && char <= “9”) digflg = true;
}
outstr = out1;
}
// Add currency symbol and signs……..
outstr = csym + leadsign + outstr + trailsign;

// ‘Float’ the currency symbol/sign…….
out1 = “”;
out2 = “”;
bool fltflg = true;
for (i=0; i<StringLen(outstr); i++) {
char = StringSubstr(outstr,i,1);
if (char >= “0” && char <= “9”) fltflg = false;
if ((char == ” ” && fltflg) || (blank && n == 0) ) out1 = out1 + ” “; else out2 = out2 + char;
}
outstr = out1 + out2;

// Overflow……..
if (overf && dleft > nleft) outstr = “~” + StringSubstr(outstr,1,StringLen(outstr)-1);

// Left shift…….
if (lftsh) {
int len = StringLen(outstr);
outstr = StringLeftTrim(outstr);
outstr = outstr + StringRepeat(” “,len-StringLen(outstr));
}

// Switch period and comma…….
if (swtch) {
out1 = “”;
for (i=0; i<StringLen(outstr); i++) {
char = StringSubstr(outstr,i,1);
if (char == “.”) out1 = out1 + “,”; else
if (char == “,”) out1 = out1 + “.”; else
out1 = out1 + char;
}
outstr = out1;
}

// Trim output….
if (trimf) outstr = StringTrim(outstr);

return(ltext+outstr+rtext);
}

//+——————————————————————+
string StringRepeat(string str, int n=1)
//+——————————————————————+
// Repeats the string STR N times
// Usage: string x=StringRepeat(“-“,10) returns x = “———-”
{
string outstr = “”;
for(int i=0; i<n; i++) {
outstr = outstr + str;
}
return(outstr);
}

//+——————————————————————+
string StringLeftTrim(string str)
//+——————————————————————+
// Removes all leading spaces from a string
// Usage: string x=StringLeftTrim(” XX YY “) returns x = “XX YY ”
{
bool left = true;
string outstr = “”;
for(int i=0; i<StringLen(str); i++) {
if (StringSubstr(str,i,1) != ” ” || !left) {
outstr = outstr + StringSubstr(str,i,1);
left = false;
} }
return(outstr);
}

//+——————————————————————+
string StringUpper(string str)
//+——————————————————————+
// Converts any lowercase characters in a string to uppercase
// Usage: string x=StringUpper(“The Quick Brown Fox”) returns x = “THE QUICK BROWN FOX”
{
string outstr = “”;
string lower = “abcdefghijklmnopqrstuvwxyz”;
string upper = “ABCDEFGHIJKLMNOPQRSTUVWXYZ”;
for(int i=0; i<StringLen(str); i++) {
int t1 = StringFind(lower,StringSubstr(str,i,1),0);
if (t1 >=0)
outstr = outstr + StringSubstr(upper,t1,1);
else
outstr = outstr + StringSubstr(str,i,1);
}
return(outstr);
}

//+——————————————————————+
string StringLower(string str)
//+——————————————————————+
// Converts any uppercase characters in a string to lowercase
// Usage: string x=StringUpper(“The Quick Brown Fox”) returns x = “the quick brown fox”
{
string outstr = “”;
string lower = “abcdefghijklmnopqrstuvwxyz”;
string upper = “ABCDEFGHIJKLMNOPQRSTUVWXYZ”;
for(int i=0; i<StringLen(str); i++) {
int t1 = StringFind(upper,StringSubstr(str,i,1),0);
if (t1 >=0)
outstr = outstr + StringSubstr(lower,t1,1);
else
outstr = outstr + StringSubstr(str,i,1);
}
return(outstr);
}

//+——————————————————————+
string StringTrim(string str)
//+——————————————————————+
// Removes all spaces (leading, traing embedded) from a string
// Usage: string x=StringUpper(“The Quick Brown Fox”) returns x = “TheQuickBrownFox”
{
string outstr = “”;
for(int i=0; i<StringLen(str); i++) {
if (StringSubstr(str,i,1) != ” “)
outstr = outstr + StringSubstr(str,i,1);
}
return(outstr);
}

//+——————————————————————+
double MathFix(double n, int d=0)
//+——————————————————————+
// Returns N rounded to D decimals – works around a precision bug in MQL4
{
return(MathRound(n*MathPow(10,d)+0.000000000001*MathSign(n))/MathPow(10,d));
}

//+——————————————————————+
double DivZero(double n, double d)
//+——————————————————————+
// Divides N by D, and returns 0 if the denominator (D) = 0
// Usage: double x = DivZero(y,z) sets x = y/z
{
if (d == 0) return(0); else return(1.0*n/d);
}

//+——————————————————————+
int MathSign(double n)
//+——————————————————————+
// Returns the sign of a number (i.e. -1, 0, +1)
// Usage: int x=MathSign(-25) returns x=-1
{
if (n > 0) return(1);
else if (n < 0) return (-1);
else return(0);
}

//+——————————————————————+
int BaseToNumber(string str, int base=16)
//+——————————————————————+
// Returns the base 10 version of a number in another base
// Usage: int x=BaseToNumber(“DC”,16) returns x=220
{
str = StringUpper(str);
string cnvstr = “0123456789ABCDEF”;
int retval = 0;
for(int i=0; i<StringLen(str); i++) {
int val = StringFind(cnvstr,StringSubstr(str,i,1),0);
if (val < 0) return(val);
retval = retval * base + val;
}
return(retval);
}

//+——————————————————————+
string NumberToBase(int n, int base=16, int pad=4)
//+——————————————————————+
// Converts a base 10 number to another base, left-padded with zeros
// Usage: int x=BaseToNumber(220,16,4) returns x=”00DC”
{
string cnvstr = “0123456789ABCDEF”;
string outstr = “”;
while (n>0) {
int x = MathMod(n,base);
outstr = StringSubstr(cnvstr,x,1) + outstr;
n /= base;
}
x = StringLen(outstr);
if (x < pad)
outstr = StringRepeat(“0″,pad-x) + outstr;
return(outstr);
}

//+——————————————————————+
int YMDtoDate(int yy, int mm, int dd) {
//+——————————————————————+
string dt = NumberToStr(yy,”4”) + “.” + NumberToStr(mm,”2″) + “.” + NumberToStr(dd,”2″) + ” 00:00:00″;
return(StrToTime(dt));
}

//+——————————————————————+
string StringEncrypt(string str) {
//+——————————————————————+
for (int i=StringLen(str)-1; i>=0; i–) {
int x=StringGetChar(str,i);
string outstr = outstr + CharToStr(255-x);
}
return(outstr);
}

//+——————————————————————+
string StringDecrypt(string str) {
//+——————————————————————+
for (int i=StringLen(str)-1; i>=0; i–) {
int x=StringGetChar(str,i);
string outstr = outstr + CharToStr(255-x);
}
return(outstr);
}

//+——————————————————————+
string StringReplace(string str, string str1, string str2) {
//+——————————————————————+
// Usage: replaces every occurrence of str1 with str2 in str
string outstr = “”;
for (int i=0; i<StringLen(str); i++) {
if (StringSubstr(str,i,StringLen(str1)) == str1) {
outstr = outstr + str2;
i += StringLen(str1) – 1;
}
else
outstr = outstr + StringSubstr(str,i,1);
}
return(outstr);
}

//+——————————————————————+
string StrToStr(string str, string mask) {
//+——————————————————————+
string ltext = “”, rtext = “”;
if (StringSubstr(mask,0,1) == “‘”) {
for (int k1=1; k1<StringLen(mask); k1++) {
if (StringSubstr(mask,k1,1) == “‘”) break;
ltext = ltext + StringSubstr(mask,k1,1);
}
mask = StringSubstr(mask,k1+1);
}
if (StringSubstr(mask,StringLen(mask)-1,1) == “‘”) {
for (int k2=StringLen(mask)-2; k2>=0; k2–) {
if (StringSubstr(mask,k2,1) == “‘”) break;
rtext = StringSubstr(mask,k2,1) + rtext;
}
mask = StringSubstr(mask,0,k2);
}

if (mask == “”) mask = “L20”;

string outstr = “”;
int n = 0;
for (int i=0; i<StringLen(mask); i++) {
string s = StringSubstr(mask,i,1);
if (s == “!”) {
outstr = outstr + StringSubstr(mask,i+1,1);
i++;
continue;
}
if (s == “L” || s == “C” || s == “R” || s == “T”) {
string func = s;
i++;
while (i<StringLen(mask)) {
s = StringSubstr(mask,i,1);
if (s >= “0” && s <= “9”) {
n = n * 10 + StrToInteger(s);
i++;
continue;
}
else
break;
}
i–;
if (n<StringLen(str)) str = StringSubstr(str,0,n);
int lpad = 0, rpad = 0;
if (func == “L”) rpad = MathMax(0,n-StringLen(str));
if (func == “R”) lpad = MathMax(0,n-StringLen(str));
if (func == “C”) {
lpad = MathMax(0,n-StringLen(str))/2;
rpad = MathMax(0,n-StringLen(str)) – lpad;
}
outstr = outstr + StringRepeat(” “,lpad) + str + StringRepeat(” “,rpad);
}
else
outstr = outstr + s;
}
return(ltext+outstr+rtext);
}

//+——————————————————————+
double StrToNumber(string str) {
//+——————————————————————+
// Usage: strips all non-numeric characters out of a string
int dp = -1;
int sgn = 1;
double num = 0.0;
for (int i=0; i<StringLen(str); i++) {
string s = StringSubstr(str,i,1);
if (s == “-“) sgn = -sgn; else
if (s == “.”) dp = 0; else
if (s >= “0” && s <= “9”) {
if (dp >= 0) dp++;
if (dp > 0)
num = num + StrToInteger(s) / MathPow(10,dp);
else
num = num * 10 + StrToInteger(s);
}
}
return(num*sgn);
}

//+——————————————————————+
string ReduceCcy(string str)
//+——————————————————————+
{
str = StringTrim(StringUpper(str));
if (StringLen(str) !=3 && StringLen(str) < 6) return(“”);
string s = “”;
for (int i=0; i<StringLen(str); i+=3) {
string char = StringSubstr(str,i,3);
if (char == “AUD”) s = s + “A”; else
if (char == “CAD”) s = s + “C”; else
if (char == “EUR”) s = s + “E”; else
if (char == “CHF”) s = s + “F”; else
if (char == “GBP”) s = s + “G”; else
if (char == “JPY”) s = s + “J”; else
if (char == “NZD”) s = s + “N”; else
if (char == “USD”) s = s + “U”; else
if (char == “HKD”) s = s + “H”; else
if (char == “SGD”) s = s + “S”; else
if (char == “ZAR”) s = s + “Z”;
}
return(s);
}

//+——————————————————————+
string NumbersToStr(string mask, double n1=0, double n2=0, double n3=0, double n4=0, double n5=0, double n6=0, double n7=0, double n8=0, double n9=0) {
//+——————————————————————+
if (StringSubstr(mask,StringLen(mask)-1,1) != “_”) mask = mask + “_”;
string outstr = “”;
string maska[9] = {“<NULL>”,”<NULL>”,”<NULL>”,”<NULL>”,”<NULL>”,”<NULL>”,”<NULL>”,”<NULL>”,”<NULL>”};
int z=0;
for (int x=0; x<StringLen(mask); x++) {
if (maska[z] == “<NULL>”) maska[z] = “”;
string s = StringSubstr(mask,x,1);
if (s == “_”) {
if (StringLower(StringSubstr(maska[z],1,1)) == “@”) {
int yy = StrToNumber(StringSubstr(maska[z],0,1));
maska[z] = StringSubstr(maska[z],2);
for (int y=1; y<yy; y++) {
maska[z+1] = maska[z];
z++;
} }
z++;
}
else
maska[z] = maska[z] + s;
}
if (maska[0] != “<NULL>”) outstr = outstr + NumberToStr(n1,maska[0]);
if (maska[1] != “<NULL>”) outstr = outstr + NumberToStr(n2,maska[1]);
if (maska[2] != “<NULL>”) outstr = outstr + NumberToStr(n3,maska[2]);
if (maska[3] != “<NULL>”) outstr = outstr + NumberToStr(n4,maska[3]);
if (maska[4] != “<NULL>”) outstr = outstr + NumberToStr(n5,maska[4]);
if (maska[5] != “<NULL>”) outstr = outstr + NumberToStr(n6,maska[5]);
if (maska[6] != “<NULL>”) outstr = outstr + NumberToStr(n7,maska[6]);
if (maska[7] != “<NULL>”) outstr = outstr + NumberToStr(n8,maska[7]);
if (maska[8] != “<NULL>”) outstr = outstr + NumberToStr(n9,maska[8]);
return(outstr);
}

//+——————————————————————+
string DatesToStr(string mask, datetime d1=0, datetime d2=0, datetime d3=0, datetime d4=0, datetime d5=0, datetime d6=0, datetime d7=0, datetime d8=0, datetime d9=0) {
//+——————————————————————+
if (StringSubstr(mask,StringLen(mask)-1,1) != “_”) mask = mask + “_”;
string outstr = “”;
string maska[9] = {“<NULL>”,”<NULL>”,”<NULL>”,”<NULL>”,”<NULL>”,”<NULL>”,”<NULL>”,”<NULL>”,”<NULL>”};
int z=0;
for (int x=0; x<StringLen(mask); x++) {
if (maska[z] == “<NULL>”) maska[z] = “”;
string s = StringSubstr(mask,x,1);
if (s == “_”) {
if (StringLower(StringSubstr(maska[z],1,1)) == “@”) {
int yy = StrToNumber(StringSubstr(maska[z],0,1));
maska[z] = StringSubstr(maska[z],2);
for (int y=1; y<yy; y++) {
maska[z+1] = maska[z];
z++;
} }
z++;
}
else
maska[z] = maska[z] + s;
}
if (maska[0] != “<NULL>”) outstr = outstr + DateToStr(d1,maska[0]);
if (maska[1] != “<NULL>”) outstr = outstr + DateToStr(d2,maska[1]);
if (maska[2] != “<NULL>”) outstr = outstr + DateToStr(d3,maska[2]);
if (maska[3] != “<NULL>”) outstr = outstr + DateToStr(d4,maska[3]);
if (maska[4] != “<NULL>”) outstr = outstr + DateToStr(d5,maska[4]);
if (maska[5] != “<NULL>”) outstr = outstr + DateToStr(d6,maska[5]);
if (maska[6] != “<NULL>”) outstr = outstr + DateToStr(d7,maska[6]);
if (maska[7] != “<NULL>”) outstr = outstr + DateToStr(d8,maska[7]);
if (maska[8] != “<NULL>”) outstr = outstr + DateToStr(d9,maska[8]);
return(outstr);
}

//+——————————————————————+
string StrsToStr(string mask, string s1=””, string s2=””, string s3=””, string s4=””, string s5=””, string s6=””, string s7=””, string s8=””, string s9=””) {
//+——————————————————————+
if (StringSubstr(mask,StringLen(mask)-1,1) != “_”) mask = mask + “_”;
string outstr = “”;
string maska[9] = {“<NULL>”,”<NULL>”,”<NULL>”,”<NULL>”,”<NULL>”,”<NULL>”,”<NULL>”,”<NULL>”,”<NULL>”};
int z=0;
for (int x=0; x<StringLen(mask); x++) {
if (maska[z] == “<NULL>”) maska[z] = “”;
string s = StringSubstr(mask,x,1);
if (s == “_”) {
if (StringLower(StringSubstr(maska[z],1,1)) == “@”) {
int yy = StrToNumber(StringSubstr(maska[z],0,1));
maska[z] = StringSubstr(maska[z],2);
for (int y=1; y<yy; y++) {
maska[z+1] = maska[z];
z++;
} }
z++;
}
else
maska[z] = maska[z] + s;
}
if (maska[0] != “<NULL>”) outstr = outstr + StrToStr(s1,maska[0]);
if (maska[1] != “<NULL>”) outstr = outstr + StrToStr(s2,maska[1]);
if (maska[2] != “<NULL>”) outstr = outstr + StrToStr(s3,maska[2]);
if (maska[3] != “<NULL>”) outstr = outstr + StrToStr(s4,maska[3]);
if (maska[4] != “<NULL>”) outstr = outstr + StrToStr(s5,maska[4]);
if (maska[5] != “<NULL>”) outstr = outstr + StrToStr(s6,maska[5]);
if (maska[6] != “<NULL>”) outstr = outstr + StrToStr(s7,maska[6]);
if (maska[7] != “<NULL>”) outstr = outstr + StrToStr(s8,maska[7]);
if (maska[8] != “<NULL>”) outstr = outstr + StrToStr(s9,maska[8]);
return(outstr);
}

//+——————————————————————+
void ShellsortDoubleArray(double &a[], bool desc=false) {
//+——————————————————————+
int n=ArraySize(a);
int j,i,k,m;
double mid;
for(m=n/2; m>0; m/=2) {
for(j=m; j<n; j++) {
for(i=j-m; i>=0; i-=m) {
if (desc) {
if (a[i+m] <= a[i])
break;
else {
mid = a[i];
a[i] = a[i+m];
a[i+m] = mid;
} }
else {
if (a[i+m] >= a[i])
break;
else {
mid = a[i];
a[i] = a[i+m];
a[i+m] = mid;
} }
} } }
return(0);
}

//+——————————————————————+
void ShellsortIntegerArray(int &a[], bool desc=false) {
//+——————————————————————+
int n=ArraySize(a);
int j,i,k,m,mid;
for(m=n/2; m>0; m/=2) {
for(j=m; j<n; j++) {
for(i=j-m; i>=0; i-=m) {
if (desc) {
if (a[i+m] <= a[i])
break;
else {
mid = a[i];
a[i] = a[i+m];
a[i+m] = mid;
} }
else {
if (a[i+m] >= a[i])
break;
else {
mid = a[i];
a[i] = a[i+m];
a[i+m] = mid;
} }
} } }
return(0);
}

//+——————————————————————+
void ShellsortStringArray(string &a[], bool desc=false) {
//+——————————————————————+
int n=ArraySize(a);
int j,i,k,m;
string mid;
for(m=n/2; m>0; m/=2) {
for(j=m; j<n; j++) {
for(i=j-m; i>=0; i-=m) {
if (desc) {
if (a[i+m] <= a[i])
break;
else {
mid = a[i];
a[i] = a[i+m];
a[i+m] = mid;
} }
else {
if (a[i+m] >= a[i])
break;
else {
mid = a[i];
a[i] = a[i+m];
a[i+m] = mid;
} }
} } }
return(0);
}

//+——————————————————————+
void StrToDoubleArray(string str, double &a[], string delim=”,”) {
//+——————————————————————+
int z1=-1, z2=0;
for (int i=0; i<ArraySize(a); i++) {
z2 = StringFind(str,delim,z1+1);
a[i] = StrToNumber(StringSubstr(str,z1+1,z2-z1-1));
if (z2 >= StringLen(str)-1) break;
z1 = z2;
}
return(0);
}

//+——————————————————————+
void StrToIntegerArray(string str, int &a[], string delim=”,”) {
//+——————————————————————+
int z1=-1, z2=0;
for (int i=0; i<ArraySize(a); i++) {
z2 = StringFind(str,delim,z1+1);
a[i] = StrToNumber(StringSubstr(str,z1+1,z2-z1-1));
if (z2 >= StringLen(str)-1) break;
z1 = z2;
}
return(0);
}

//+——————————————————————+
void StrToStringArray(string str, string &a[], string delim=”,”) {
//+——————————————————————+
int z1=-1, z2=0;
for (int i=0; i<ArraySize(a); i++) {
z2 = StringFind(str,delim,z1+1);
a[i] = StringSubstr(str,z1+1,z2-z1-1);
if (z2 >= StringLen(str)-1) break;
z1 = z2;
}
return(0);
}

//+——————————————————————+
string DoubleArrayToStr(double a[], string mask=””, string delim=”,”) {
//+——————————————————————+
string str = “”;
for (int i=0; i<ArraySize(a); i++)
if (str == “”)
str = NumberToStr(a[i],mask);
else
str = str + delim + NumberToStr(a[i],mask);
return(str);
}

//+——————————————————————+
string IntegerArrayToStr(int a[], string mask=””, string delim=”,”) {
//+——————————————————————+
string str = “”;
for (int i=0; i<ArraySize(a); i++)
if (str == “”)
str = NumberToStr(a[i],mask);
else
str = str + delim + NumberToStr(a[i],mask);
return(str);
}

//+——————————————————————+
string StringArrayToStr(string a[], string mask=””, string delim=”,”) {
//+——————————————————————+
string str = “”;
for (int i=0; i<ArraySize(a); i++)
if (str == “”)
str = StrToStr(a[i],mask);
else
str = str + delim + StrToStr(a[i],mask);
return(str);
}

//+——————————————————————+
string DebugDoubleArray(double a[], string mask=””, string delim=”,”, int fromidx=0, int thruidx=0) {
//+——————————————————————+
if (thruidx == 0) thruidx = ArraySize(a);
string str = “”;
for (int i=MathMax(0,fromidx); i<MathMin(ArraySize(a),thruidx+1); i++)
if (str == “”)
str = NumberToStr(i,”‘[‘T4’]='”) + NumberToStr(a[i],mask);
else
str = str + delim + NumberToStr(i,”‘[‘T4’]='”) + NumberToStr(a[i],mask);
return(str);
}

//+——————————————————————+
string DebugIntegerArray(int a[], string mask=””, string delim=”,”, int fromidx=0, int thruidx=0) {
//+——————————————————————+
if (thruidx == 0) thruidx = ArraySize(a);
string str = “”;
for (int i=MathMax(0,fromidx); i<MathMin(ArraySize(a),thruidx+1); i++)
if (str == “”)
str = NumberToStr(i,”‘[‘T4’]='”) + NumberToStr(a[i],mask);
else
str = str + delim + NumberToStr(i,”‘[‘T4’]='”) + NumberToStr(a[i],mask);
return(str);
}

//+——————————————————————+
string DebugStringArray(string a[], string mask=””, string delim=”,”, int fromidx=0, int thruidx=0) {
//+——————————————————————+
if (thruidx == 0) thruidx = ArraySize(a);
string str = “”;
for (int i=MathMax(0,fromidx); i<MathMin(ArraySize(a),thruidx+1); i++)
if (str == “”)
str = NumberToStr(i,”‘[‘T4’]='”) + StrToStr(a[i],mask);
else
str = str + delim + NumberToStr(i,”‘[‘T4′]='”) + StrToStr(a[i],mask);
return(str);
}
//+——————————————————————+
string FileSort(string fname, bool desc=false) {
//+——————————————————————+
// Sorts the text file named fname, on a line by line basis
// (default is ascending sequence, unless desc=true)
string a[9999];
int h = FileOpen(fname,FILE_CSV|FILE_READ,’~’);
int i = -1;
while (!FileIsEnding(h) && i<9999) {
i++;
a[i] = FileReadString(h);
}
FileClose(h);
ArrayResize(a,i);
ShellsortStringArray(a,desc);
h = FileOpen(fname,FILE_CSV|FILE_WRITE,’~’);
for (i=0; i<ArraySize(a); i++) {
FileWrite(h,a[i]);
}
FileClose(h);
return(0);
}

// =========================================== DEBUGGING ===========================================

//+——————————————————————+
string d(string s1, string s2=””, string s3=””, string s4=””, string s5=””, string s6=””, string s7=””, string s8=””) {
//+——————————————————————+
// Outputs up to 8 values to the DEBUG.TXT file (after creating the file, if it doesn’t already exist)
string out = StringTrimRight(StringConcatenate(s1, ” “, s2, ” “, s3, ” “, s4, ” “, s5, ” “, s6, ” “, s7, ” “, s8));
int h = FileOpen(“debug.txt”,FILE_CSV|FILE_READ|FILE_WRITE,’~’);
FileSeek(h,0,SEEK_END);
FileWrite(h,out);
FileClose(h);
return(0);
}

//+——————————————————————+
string dd(string s1, string s2=””, string s3=””, string s4=””, string s5=””, string s6=””, string s7=””, string s8=””) {
//+——————————————————————+
// Deletes and re-creates the DEBUG.TXT file, and adds up to 8 values to it
string out = StringTrimRight(StringConcatenate(s1, ” “, s2, ” “, s3, ” “, s4, ” “, s5, ” “, s6, ” “, s7, ” “, s8));
int h = FileOpen(“debug.txt”,FILE_CSV|FILE_WRITE,’~’);
FileWrite(h,out);
FileClose(h);
return(0);
}

 

如果你对文件有了解,请帮助投票!

If you are familiar with the file, please help vote!

平均评分 0 / 5. 投票数: 0

到目前为止还没有投票!成为第一位投票人。

相关资源

暂无评论

暂无评论...
Ads Blocker Image Powered by Code Help Pro

检测到广告拦截程序!!!Ads Blocker Detected!!!

我们检测到您正在使用扩展来屏蔽广告。请通过禁用这些广告屏蔽程序或者把网站加入白名单来支持我们。

We have detected that you are using an extension to block advertisements. Please support us by disabling these advertising blocking programs or adding the website to the whitelist.