ScreenShotOptimization

Author: Copyright 2021, MetaQuotes Ltd.
0 Views
0 Downloads
0 Favorites
ScreenShotOptimization
ÿþ//+------------------------------------------------------------------+

//|                                       ScreenShotOptimization.mq5 |

//|                                  Copyright 2021, MetaQuotes Ltd. |

//|                                             https://www.mql5.com |

//+------------------------------------------------------------------+

#property copyright "Copyright 2021, MetaQuotes Ltd."

#property link      "https://www.mql5.com/ru/users/s22aa"

#property version   "1.00"

#property script_show_inputs



#include <Graphics\Graphic.mqh>

//--- input parameters

input int widthL = 3;        // B>;I8=0 ;8=89 3@0D8:0

input bool lineR = false;    // @8A>20BL ;8=8N @53@5AA88

sinput bool delArray = true; // C40;OBL D09;K 40==KE ?>A;5 A>E@0=5=8O A:@8=H>B>2.



double            Balance[];

double            Equity[];

//+------------------------------------------------------------------+

//| Script program start function                                    |

//+------------------------------------------------------------------+

void OnStart()

  {

   if(!MQLInfoInteger(MQL_TESTER) && !MQLInfoInteger(MQL_OPTIMIZATION))

     {

      // C40;O5< ?@54K4CI85 D09;K A:@8=>2

      string _LR_Name = "";

      long _LR_search_handle = FileFindFirst("*", _LR_Name);

      do

        {

         if(StringFind(_LR_Name, "_LR_", 0) > -1)

            FileDelete(_LR_Name);

        }

      while(FileFindNext(_LR_search_handle, _LR_Name));

      FileFindClose(_LR_search_handle);

      //---



      string Name = "";

      long search_handle = FileFindFirst("*", Name, FILE_COMMON);

      do

        {

         if(StringFind(Name, "B_LR_", 0) > -1)

           {

            ArrayFree(Balance);

            ArrayFree(Equity);

            

            FileLoad(Name, Balance, FILE_COMMON);

            if(delArray)

               FileDelete(Name, FILE_COMMON);



            StringReplace(Name, "B", "E");

            FileLoad(Name, Equity, FILE_COMMON);

            if(delArray)

               FileDelete(Name, FILE_COMMON);



            double  LRBalance[];

            if(lineR)

               Line_regress(ArraySize(Balance), Balance, LRBalance);



            // 5G0B05< 3@0D8: 10;0=A0 8 M:28B8.

            string ObjName = GraphPlot(Balance, Equity, LRBalance, "Balance", "Equity", "LineR");

            //!>E@0=5=85 Bitmap->1J5:B0 2 bmp/gif/png/jpg-D09;5

            StringReplace(Name, "E", "");

            if(!BitmapObjectToFile(ObjName, Name + ".jpg", true))

               PrintFormat("5 C40;>AL A45;0BL A:@8=H>B 3@0D8:0,  %d  %s", GetLastError(), Name + ".jpg");

           }

        }

      while(FileFindNext(search_handle, Name));

      FileFindClose(search_handle);

      ObjectDelete(0, "Graphic");

     }

  }

//+------------------------------------------------------------------+

//| Create graphic of one curve and return resource name             |

//+------------------------------------------------------------------+

string GraphPlot(const double & y1[],

                 const double & y2[],

                 const double & y3[],

                 string name1 = NULL,

                 string name2 = NULL,

                 string name3 = NULL,

                 string objname = NULL)

  {

   CGraphic graphic;



   ulong    width = TerminalInfoInteger(TERMINAL_SCREEN_WIDTH);//ChartGetInteger(0, CHART_WIDTH_IN_PIXELS);

   ulong    height = TerminalInfoInteger(TERMINAL_SCREEN_HEIGHT);//ChartGetInteger(0, CHART_HEIGHT_IN_PIXELS);

//--- create graphic

   bool res = false;

   objname = (objname == NULL) ? "Graphic" : objname;

   if(ObjectFind(0, objname) >= 0)

      res = graphic.Attach(0, objname);

   else

      res = graphic.Create(0, objname, 0, 0, 0, (int)(0.8 * width), (int)(0.6 * height));

   if(!res)

      return(NULL);

//--- add curves

   ENUM_CURVE_TYPE type = CURVE_POINTS_AND_LINES;

   if(ArraySize(y1) > 100)

      type = CURVE_LINES;



   CCurve *curve = graphic.CurveAdd(y1, ColorToARGB(clrBlue), type, name1);

   curve.LinesWidth(widthL);

   if(type == CURVE_POINTS_AND_LINES)

      curve.PointsSize(widthL + 2);



   CCurve *curve1 = graphic.CurveAdd(y2, ColorToARGB(clrRed), CURVE_LINES, name2);

   curve1.LinesWidth(widthL);



   if(lineR)

     {

      CCurve *curve2 = graphic.CurveAdd(y3, ColorToARGB(clrBlack), CURVE_LINES, name3);

      curve2.LinesWidth(widthL + 1);

     }



//--- plot curves

   graphic.CurvePlotAll();

   graphic.Update();

//--- return resource name

   return graphic.ChartObjectName();

  }

//+------------------------------------------------------------------+

// !>E@0=5=85 Bitmap->1J5:B0 2 bmp/gif/png/jpg-D09;5 (?@>7@0G=>ABL =5 CG8BK205BAO)

bool BitmapObjectToFile(const string ObjName, const string FileName, const bool FullImage = false)

  {

   const ENUM_OBJECT Type = (ENUM_OBJECT)ObjectGetInteger(0, ObjName, OBJPROP_TYPE);

   bool Res = (Type == OBJ_BITMAP_LABEL) || (Type == OBJ_BITMAP);



   if(Res)

     {

      const string Name = __FUNCTION__ + (string)MathRand();



      ObjectCreate(0, Name, OBJ_CHART, 0, 0, 0);

      ObjectSetInteger(0, Name, OBJPROP_XDISTANCE, -5e3);



      const long chart = ObjectGetInteger(0, Name, OBJPROP_CHART_ID);



      Res = ChartSetInteger(chart, CHART_SHOW, false) && ObjectCreate(chart, Name, OBJ_BITMAP_LABEL, 0, 0, 0) &&

            ObjectSetString(chart, Name, OBJPROP_BMPFILE, ObjectGetString(0, ObjName, OBJPROP_BMPFILE)) &&

            (FullImage || (ObjectSetInteger(chart, Name, OBJPROP_XSIZE, ObjectGetInteger(0, ObjName, OBJPROP_XSIZE)) &&

                           ObjectSetInteger(chart, Name, OBJPROP_YSIZE, ObjectGetInteger(0, ObjName, OBJPROP_YSIZE)) &&

                           ObjectSetInteger(chart, Name, OBJPROP_XOFFSET, ObjectGetInteger(0, ObjName, OBJPROP_XOFFSET)) &&

                           ObjectSetInteger(chart, Name, OBJPROP_YOFFSET, ObjectGetInteger(0, ObjName, OBJPROP_YOFFSET)))) &&

            ChartScreenShot(chart, FileName, (int)ObjectGetInteger(chart, Name, OBJPROP_XSIZE), (int)ObjectGetInteger(chart, Name, OBJPROP_YSIZE));

      ObjectDelete(0, Name);

     }



   return(Res);

  }

//+------------------------------------------------------------------+

void Line_regress(int _sise, double & Array[], double & LRBuffer[])    //LR ;8=59=0O @53@5A8O

  {

   double sumX, sumY, sumXY, sumX2, a, b, S;

   int X;

   S = 0.0;

   sumX = 0.0;

   sumY = 0.0;

   sumXY = 0.0;

   sumX2 = 0.0;

   X = 0;

   ArrayResize(LRBuffer, ArraySize(Array));

   for(int i = 0; i < _sise; i++)

     {

      sumX += X;

      sumY += Array[i];

      sumXY += X * Array[i];

      sumX2 += MathPow(X, 2);

      X++;

     }



   if(MathPow(sumX, 2) - _sise * sumX2 == 0 || _sise == 0)

      return;



   a = (sumX * sumY - _sise * sumXY) / (MathPow(sumX, 2) - _sise * sumX2);

   b = (sumY - a * sumX) / _sise;

   X = 0;



   for(int i = 0; i < _sise; i++)

     {

      LRBuffer[i] = b + a * X;

      X++;

     }

  }

//+------------------------------------------------------------------+

Comments