//+------------------------------------------------------------------+ //| Smart Gread.mq4 | //| Copyright 2014, cmillion@narod.ru | //| http://cmillion.ru | //+------------------------------------------------------------------+ #property copyright "Copyright 2014, cmillion@narod.ru" #property link "http://cmillion.ru" #property version "1.00" #property strict #property indicator_chart_window extern datetime StartTime=D'2014.09.01'; extern datetime EndTime=D'2014.09.26'; extern int Step=100; extern int TP=50; extern double Lot=1; extern double K=2; double Pb[100],Ps[100]; datetime Tb[100],Ts[100]; int I=0,Kb[100],Ks[100]; //+------------------------------------------------------------------+ void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam) { if(id==CHARTEVENT_OBJECT_CLICK) { string clickedChartObject=sparam; if (clickedChartObject=="kn Step up") { Step+=5; Sleep(100); if (ObjectGetInteger(0,"kn Step up",OBJPROP_STATE)) ObjectSetInteger(0,"kn Step up",OBJPROP_STATE,false); } if (clickedChartObject=="kn Step dn") { Step-=5;if (Step<5) Step=5; Sleep(100); if (ObjectGetInteger(0,"kn Step dn",OBJPROP_STATE)) ObjectSetInteger(0,"kn Step dn",OBJPROP_STATE,false); } if (clickedChartObject=="kn TP up") { TP+=5; Sleep(100); if (ObjectGetInteger(0,"kn TP up",OBJPROP_STATE)) ObjectSetInteger(0,"kn TP up",OBJPROP_STATE,false); } if (clickedChartObject=="kn TP dn") { TP-=5;if (TP<5) TP=5; Sleep(100); if (ObjectGetInteger(0,"kn TP dn",OBJPROP_STATE)) ObjectSetInteger(0,"kn TP dn",OBJPROP_STATE,false); } if (clickedChartObject=="kn K up") { K+=0.1; Sleep(100); if (ObjectGetInteger(0,"kn K up",OBJPROP_STATE)) ObjectSetInteger(0,"kn K up",OBJPROP_STATE,false); } if (clickedChartObject=="kn K dn") { K-=0.1;if (K<0.1) K=0.1; Sleep(100); if (ObjectGetInteger(0,"kn K dn",OBJPROP_STATE)) ObjectSetInteger(0,"kn K dn",OBJPROP_STATE,false); } LabelCreate(0,"Step" ,0 ,350,38,CORNER_RIGHT_UPPER,StringConcatenate("Step ",Step),"Arial",10,clrBlue,0,ANCHOR_CENTER,false,false,true,0); LabelCreate(0,"TP" ,0 ,450,38,CORNER_RIGHT_UPPER,StringConcatenate("TP ",TP),"Arial",10,clrBlue,0,ANCHOR_CENTER,false,false,true,0); LabelCreate(0,"K" ,0 ,550,38,CORNER_RIGHT_UPPER,StringConcatenate("K ",DoubleToStr(K,1)),"Arial",10,clrBlue,0,ANCHOR_CENTER,false,false,true,0); chek(); } } //+------------------------------------------------------------------+ int OnInit() { ButtonCreate(0,"lot",0,180,50,70,18,"лот","Arial",8,clrBlue,clrGray,clrLightGray,clrNONE,false); ButtonCreate(0,"колен",0,120,50,70,18,"колен","Arial",8,clrBlue,clrGray,clrLightGray,clrNONE,false); ButtonCreate(0,"колен b",0,55,50,50,18,"buy","Arial",8,clrBlue,clrGray,clrLightGray,clrNONE,false); ButtonCreate(0,"колен s",0,5,50,50,18,"sell","Arial",8,clrBlue,clrGray,clrLightGray,clrNONE,false); return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ void chek() { ObjectsDeleteAll(0,OBJ_TREND); ObjectsDeleteAll(0,OBJ_LABEL); ObjectsDeleteAll(0,OBJ_TEXT); LabelCreate(0,"Step" ,0 ,350,38,CORNER_RIGHT_UPPER,StringConcatenate("Step ",Step),"Arial",10,clrBlue,0,ANCHOR_CENTER,false,false,true,0); ButtonCreate(0,"kn Step up",0,290,20,18,18,CharToStr(217),"Wingdings",8,clrBlue,clrGray,clrLightGray,clrNONE,false); ButtonCreate(0,"kn Step dn",0,290,40,18,18,CharToStr(218),"Wingdings",8,clrBlue,clrGray,clrLightGray,clrNONE,false); LabelCreate(0,"TP" ,0 ,450,38,CORNER_RIGHT_UPPER,StringConcatenate("TP ",TP),"Arial",10,clrBlue,0,ANCHOR_CENTER,false,false,true,0); ButtonCreate(0,"kn TP up",0,390,20,18,18,CharToStr(217),"Wingdings",8,clrBlue,clrGray,clrLightGray,clrNONE,false); ButtonCreate(0,"kn TP dn",0,390,40,18,18,CharToStr(218),"Wingdings",8,clrBlue,clrGray,clrLightGray,clrNONE,false); LabelCreate(0,"K" ,0 ,550,38,CORNER_RIGHT_UPPER,StringConcatenate("K ",DoubleToStr(K,1)),"Arial",10,clrBlue,0,ANCHOR_CENTER,false,false,true,0); ButtonCreate(0,"kn K up",0,490,20,18,18,CharToStr(217),"Wingdings",8,clrBlue,clrGray,clrLightGray,clrNONE,false); ButtonCreate(0,"kn K dn",0,490,40,18,18,CharToStr(218),"Wingdings",8,clrBlue,clrGray,clrLightGray,clrNONE,false); //+------------------------------------------------------------------+ int i,j,b=0,s=0; int Speriod = iBarShift(NULL,0,StartTime); int Eperiod = iBarShift(NULL,0,EndTime); ArrayInitialize(Kb,0); ArrayInitialize(Ks,0); ArrayInitialize(Pb,0); ArrayInitialize(Ps,0); double OL,nl=0,lot=0,price=0; int MaxKolenB=0,MaxKolenS=0; for(i=Speriod; i>=Eperiod; i--) { if (Pb[0]==0 && I!=i) { Pb[0] = Open[i]; Tb[0] = Time[i]; if (ObjectGetInteger(0,"колен b",OBJPROP_STATE)) DrawText(StringConcatenate(" start b ",TimeToStr(Time[i],TIME_DATE|TIME_MINUTES)),DoubleToStr(Lot,2), Time[i], Pb[0], clrRed); } if (Ps[0]==0 && I!=i) { Ps[0] = Open[i]; Ts[0] = Time[i]; if (ObjectGetInteger(0,"колен s",OBJPROP_STATE)) DrawText(StringConcatenate(" start s ",TimeToStr(Time[i],TIME_DATE|TIME_MINUTES)),DoubleToStr(Lot,2), Time[i], Ps[0], clrRed); } //------------------------------------------------------------------------------------------------------------------------------------------- nl=0;lot=0;price=0; if (b==0) nl=Pb[b]; else { for(j=0; j=0; j--) DrawTrand(StringConcatenate(j," buy ",TimeToStr(Tb[j],TIME_DATE|TIME_MINUTES)," ",Pb[j]," ",nl+TP*Point), Tb[j], Pb[j], Time[i], nl+TP*Point, clrLime); Pb[0] = 0; Kb[b]++; b=0;I=i; } while (Pb[0]!=0 && Pb[b]-Step*Point>Low[i])//выставляем очередной buy { b++; if (b>MaxKolenB) MaxKolenB=b; if (b>99) { Pb[0] = Pb[b-1]-Step*Point; Tb[0] = Time[i]; b=0; break; } Pb[b]=Pb[b-1]-Step*Point; Tb[b]=Time[i]; if (ObjectGetInteger(0,"колен b",OBJPROP_STATE)) DrawText(StringConcatenate(b+1," lot ",TimeToStr(Time[i],TIME_DATE|TIME_MINUTES)), DoubleToStr(Lot*MathPow(K,b),2), Time[i], Pb[b], clrBlue); } //------------------------------------------------------------------------------------------------------------------------------------------- nl=0;lot=0;price=0; if (s==0) nl=Ps[s]; else { for(j=0; jLow[i]) //достигнут тейкпрофит серии sell { if (ObjectGetInteger(0,"колен s",OBJPROP_STATE)) for(j=s; j>=0; j--) DrawTrand(StringConcatenate(j," sell ",TimeToStr(Ts[j],TIME_DATE|TIME_MINUTES)), Ts[j], Ps[j], Time[i], nl-TP*Point, clrBlue); if (ObjectGetInteger(0,"колен s",OBJPROP_STATE)) DrawText(StringConcatenate(s," start lot ",TimeToStr(Time[i],TIME_DATE|TIME_MINUTES)), DoubleToStr(s,2), Time[i], Ps[0], clrBlue); Ps[0] = 0; Ks[s]++; s=0;I=i; } while (Ps[0]!=0 && Ps[s]+Step*PointMaxKolenS) MaxKolenS=s; if (s>99) { Ps[0] = Ps[s-1]+Step*Point; Ts[0] = Time[i]; s=0; break; } Ps[s]=Ps[s-1]+Step*Point; Ts[s]=Time[i]; if (ObjectGetInteger(0,"колен s",OBJPROP_STATE)) DrawText(StringConcatenate(s+1," lot ",TimeToStr(Time[i],TIME_DATE|TIME_MINUTES)), DoubleToStr(Lot*MathPow(K,s),2), Time[i], Ps[s], clrBlue); } } DrawLABEL("Итого", StringConcatenate(TimeToStr(StartTime,TIME_DATE), " - ",TimeToStr(EndTime,TIME_DATE)), 10, 10, clrBlue); i=0; while (i<=MathMax(MaxKolenB,MaxKolenS)) { DrawLABEL(StringConcatenate(i,"лот"), DoubleToStr(Lot*MathPow(K,i),2), 190, 70+i*15, clrRed); DrawLABEL(StringConcatenate(i,"колен"), DoubleToStr(i+1,0), 150, 70+i*15, clrRed); i++; } i=0; while (i<=MaxKolenB) { DrawLABEL(StringConcatenate(" колен B",i), DoubleToStr(Kb[i],0), 50, 70+i*15, clrRed); i++; } i=0; while (i<=MaxKolenS) { DrawLABEL(StringConcatenate(" колен S",i), DoubleToStr(Ks[i],0), 10, 70+i*15, clrRed); i++; } } //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { chek(); return(rates_total); } //+------------------------------------------------------------------+ void DrawTrand(string name, datetime t1, double P1, datetime t2, double P2, color clr) { if (ObjectFind(name)==-1) { ObjectCreate(name, OBJ_TREND, 0, t1, P1, t2, P2); ObjectSet(name, OBJPROP_COLOR, clr); ObjectSet(name, OBJPROP_RAY, false); } } //-------------------------------------------------------------------- void DrawLABEL(string name, string Name, int X, int Y, color clr) { if (ObjectFind(name)==-1) { ObjectCreate(name, OBJ_LABEL, 0, 0, 0); ObjectSet(name, OBJPROP_CORNER, 1); ObjectSet(name, OBJPROP_XDISTANCE, X); ObjectSet(name, OBJPROP_YDISTANCE, Y); } ObjectSetText(name,Name,10,"Arial",clr); } //-------------------------------------------------------------------- void DrawText(string name, string Name, datetime t, double p, color clr) { if (ObjectFind(name)==-1) { ObjectCreate(name, OBJ_TEXT, 0, t, p); ObjectSet(name, OBJPROP_ANCHOR,ANCHOR_CENTER); } ObjectSetText(name,Name,8,"Arial",clr); } //-------------------------------------------------------------------- bool ButtonCreate(const long chart_ID=0, // ID графика const string name="Button", // имя кнопки const int sub_window=0, // номер подокна const long x=0, // координата по оси X const long y=0, // координата по оси Y const int width=50, // ширина кнопки const int height=18, // высота кнопки const string text="Button", // текст const string font="Arial", // шрифт const int font_size=10, // размер шрифта const color clr=clrLime, // цвет текста const color clrON=clrLime, // цвет фона const color clrOFF=clrBlack, // цвет фона const color border_clr=clrNONE, // цвет границы const bool state=false) // нажата/отжата { if (ObjectFind(chart_ID,name)==-1) { ObjectCreate(chart_ID,name,OBJ_BUTTON,sub_window,0,0); ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width); ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height); ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,CORNER_RIGHT_UPPER); ObjectSetString(chart_ID,name,OBJPROP_FONT,font); ObjectSetInteger(chart_ID,name,OBJPROP_FONTSIZE,font_size); ObjectSetInteger(chart_ID,name,OBJPROP_BACK,0); ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,0); ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,0); ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,1); ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,0); ObjectSetInteger(chart_ID,name,OBJPROP_STATE,state); } ObjectSetInteger(chart_ID,name,OBJPROP_BORDER_COLOR,border_clr); color back_clr; if (ObjectGetInteger(chart_ID,name,OBJPROP_STATE)) back_clr=clrON; else back_clr=clrOFF; ObjectSetInteger(chart_ID,name,OBJPROP_BGCOLOR,back_clr); ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr); ObjectSetString(chart_ID,name,OBJPROP_TEXT,text); ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x); ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y); return(true); } //-------------------------------------------------------------------- bool RectLabelCreate(const long chart_ID=0, // ID графика const string name="RectLabel", // имя метки const int sub_window=0, // номер подокна const long x=0, // координата по оси X const long y=0, // координата по оси y const int width=50, // ширина const int height=18, // высота const color back_clr=clrNONE, // цвет фона const color clr=clrNONE, // цвет плоской границы (Flat) const ENUM_LINE_STYLE style=STYLE_SOLID, // стиль плоской границы const int line_width=1, // толщина плоской границы const bool back=false, // на заднем плане const bool selection=false, // выделить для перемещений const bool hidden=true, // скрыт в списке объектов const long z_order=0) // приоритет на нажатие мышью { ResetLastError(); if (ObjectFind(chart_ID,name)==-1) { ObjectCreate(chart_ID,name,OBJ_RECTANGLE_LABEL,sub_window,0,0); ObjectSetInteger(chart_ID,name,OBJPROP_BORDER_TYPE,BORDER_FLAT); ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,CORNER_RIGHT_UPPER); ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,ANCHOR_RIGHT_UPPER); ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style); ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,line_width); ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back); ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection); ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection); ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden); ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order); } ObjectSetInteger(chart_ID,name,OBJPROP_BGCOLOR,back_clr); ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr); ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width); ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height); ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x); ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y); return(true); } //-------------------------------------------------------------------- bool LabelCreate(const long chart_ID=0, // ID графика const string name="Label", // имя метки const int sub_window=0, // номер подокна const long x=0, // координата по оси X const long y=0, // координата по оси y const ENUM_BASE_CORNER corner=CORNER_LEFT_UPPER, // угол графика для привязки const string text="Label", // текст const string font="Arial", // шрифт const int font_size=10, // размер шрифта const color clr=clrNONE, const double angle=0.0, // наклон текста const ENUM_ANCHOR_POINT anchor=ANCHOR_LEFT_UPPER, // способ привязки const bool back=false, // на заднем плане const bool selection=false, // выделить для перемещений const bool hidden=true, // скрыт в списке объектов const long z_order=0) // приоритет на нажатие мышью { ResetLastError(); if (ObjectFind(chart_ID,name)==-1) { ObjectCreate(chart_ID,name,OBJ_LABEL,sub_window,0,0); ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner); ObjectSetString(chart_ID,name,OBJPROP_FONT,font); ObjectSetInteger(chart_ID,name,OBJPROP_FONTSIZE,font_size); ObjectSetDouble(chart_ID,name,OBJPROP_ANGLE,angle); ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor); ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back); ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection); ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection); ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden); ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order); } ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr); ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x); ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y); ObjectSetString(chart_ID,name,OBJPROP_TEXT,text); return(true); } //--------------------------------------------------------------------