Подскажите пжлст рабочий скрипт визуализации сделок из отчета тестера ?

 

Нужно отобразить на графике стрелки открытия-закрытия ордеров (и желательно стопы) загрузив данный из отчета тестера.


Прошу помочь со скриптом.


Пробовал вот этот скрипт, он на графике отображает кол-вол позиций, а стредки не рисуются !



Код скрипта:

/+----------------------------------------------------------------------------+
//|                                                        fromRepOnGraph.mq4  |
//|                                                                            |
//|                              Ким Игорь В. aka KimIV,  http://www.kimiv.ru  |
//|                                                                            |
//|  17.02.2006  Скрипт для переноса сделок из отчёта на график.               |
//|              Carrying the Deals from Report on Graph.                      |
//|  Скрипт выполняет чтение сделок из файла стандарного отчёта тестера и      |
//|  отображает их в виде разноцветных прямоугольников или линий.              |
//|  16.06.2007  Поддержка билда 204 МТ4.                                      |
//|  02.01.2011  Поддержка билдов МТ4 от 205 до 409.                           |
//|  23.01.2011  Поддержка файлов типа Statement.htm.                          |
//+----------------------------------------------------------------------------+
#property copyright "Ким Игорь В. aka KimIV"
#property link      "http://www.kimiv.ru"
#property show_inputs

extern string FileName         = "StrategyTester.htm";
extern bool   DeleteOldObjects = True;      // Удалять старые объекты
extern string _P_Objects = "---------- Параметры объектов";
extern int    TypeObjects      = 1;         // Тип объектов (0-прямоуг. 1-линия)
extern color  clObjBuy         = Aqua;      // Цвет прибыльных покупок
extern color  clObjBuyLoss     = Blue;      // Цвет убыточных покупок
extern color  clObjSell        = Salmon;    // Цвет прибыльных продаж
extern color  clObjSellLoss    = Red;       // Цвет убыточных продаж
extern string _P_Arrows = "---------- Параметры указателей";
extern bool   ShowArrow        = True;      // Показывать указатели
extern int    KodArrowBuy      = 241;       // Код указателя покупки
extern int    OffSetArrowBuy   = -20;       // Смещение указателя покупки
extern color  clArrowBuy       = Blue;      // Цвет указателя покупки
extern int    KodArrowSell     = 242;       // Код указателя продажи
extern int    OffSetArrowSell  = 20;        // Смещение указателя продажи
extern color  clArrowSell      = Red;       // Цвет указателя продажи
extern string _P_Text = "---------- Параметры текста";
extern bool   ShowTextBalance  = True;      // Показывать текст баланса
extern int    OffSetText       = 100;       // Смещение текста
extern int    SizeText         = 9;         // Размер текста
extern color  clTextProfit     = Green;     // Цвет суммы прибыли
extern color  clTextLoss       = Red;       // Цвет суммы убытка
extern color  clTextBalans     = Green;     // Цвет суммы баланса

//------- Глобальные переменные -----------------------------------------------+
bool   frogPrevOP[];                   // Тип предыдущей операции
int    frogBalance     = 0;
string frogNameObjLine = "LDeal";      // Наименования объектов ЛИНИЯ
string frogNameObjRect = "RDeal";      // Наименования объектов ПРЯМОУГОЛЬНИК


//+----------------------------------------------------------------------------+
//|  script program start function                                             |
//+----------------------------------------------------------------------------+
void start()
{
  string st;
  int fh=FileOpen(FileName, FILE_CSV|FILE_READ);
  if (fh>0)
  {
    FileReadString(fh);
    FileReadString(fh);
    FileReadString(fh);
    st=FileReadString(fh);
    FileClose(fh);
    if (StringFind(st, "Strategy Tester")>0) ReadStrategyTester();
    else if (StringFind(st, "Statement")>0) ReadStatement();
  } else Comment("Ошибка открытия файла отчёта "+FileName);
}

//+----------------------------------------------------------------------------+
//|  Извлекает цену из строки HTML                                             |
//|  Параметры:                                                                |
//|    str - строка                                                            |
//|    pos - номер позиции символа в строке                                    |
//+----------------------------------------------------------------------------+
double GetPrice(string& str, int& pos)
{
  if (StringFind(Symbol(), "JPY")<0)
  {
    pos=StringFind  (str, ":0\.0000;\">");
    str=StringSubstr(str, pos+11);
    if (pos<0)
    {
      pos=StringFind  (str, ":0\.00000;\">");
      str=StringSubstr(str, pos+12);
    }
  }
  else
  {
    pos=StringFind  (str, ":0\.00;\">");
    str=StringSubstr(str, pos+9);
    if (pos<0)
    {
      pos=StringFind  (str, ":0\.000;\">");
      str=StringSubstr(str, pos+10);
    }
  }
  pos=StringFind  (str, "</td><td");
  return(StrToDouble (StringSubstr(str, 0, pos)));
}


//+----------------------------------------------------------------------------+
//|  Заполняет строку до 250 символов                                          |
//|  Параметры:                                                                |
//|    fh  - хэндл файла                                                       |
//|    str - строка                                                            |
//|    pos - номер позиции символа в строке                                    |
//+----------------------------------------------------------------------------+
void GetString(int& fh, string& str, int& pos)
{
  str=str+GetStringFromFile(fh, 250-StringLen(str));
  if (pos>125)
  {
    str=StringSubstr(str, 125);
    str=str+GetStringFromFile(fh, 125);
    pos-=125;
  }
}

//+----------------------------------------------------------------------------+
//|  Читает строковый блок из файла                                            |
//|  Параметры:                                                                |
//|    fh - хэндл файла                                                        |
//|    ks - количество символов                                                |
//+----------------------------------------------------------------------------+
string GetStringFromFile(int& fh, int ks)
{
  string str="", s;
  while (StringLen(str)<ks && !FileIsEnding(fh))
  {
    s=FileReadString(fh, 1);
    if (StringGetChar(s, 0)>31) str=str+s;
  }
  return(str);
}

//+----------------------------------------------------------------------------+
//|  Чтение стейтмента                                                         |
//+----------------------------------------------------------------------------+
void ReadStatement()
{
  datetime do, dc;           // Дата открытия/закрытия
  double   po, pc, sl, tp;   // Цена открытия/закрытия/StopLoss/TakeProfit
  int      ko, or, pos;
  string   op, str;
  string   sy;               // Наименование торгового инструмента
//int p=0; // номер отладочного прохода

  int fh=FileOpen(FileName, FILE_BIN|FILE_READ);
  if (fh>0)
  {
    if (DeleteOldObjects) ObjectsDeleteAll();
    while (!FileIsEnding(fh))
    {
      pos=StringFind(str, "<td class=msdate nowrap>");
      if (pos>0)
      {
        or++;
        GetString(fh, str, pos);
        str=StringSubstr(str, pos+24);
        do =StrToTime(StringSubstr(str, 0, 16));      // Дата открытия
        str=StringSubstr(str, 25);
        pos=StringFind  (str, "</td><td class=mspt>");
        op =StringSubstr(str, 0, pos);                // Тип операции
        str=StringSubstr(str, pos+20);
        pos=StringFind  (str, "</td><td>");
        str=StringSubstr(str, pos+9);
        sy =StringSubstr(str, 0, pos+2);              // Наименование торгового инструмента
        str=StringSubstr(str, pos+2);
        po =GetPrice(str, pos);                       // Цена открытия
        str=StringSubstr(str, pos);
        GetString(fh, str, pos);
        sl =GetPrice(str, pos);                       // StopLoss
        str=StringSubstr(str, pos);
        tp =GetPrice(str, pos);                       // TakeProfit
        str=StringSubstr(str, pos);
        str=StringSubstr(str, pos+22);
        dc =StrToTime(StringSubstr(str, 0, 16));      // Дата закрытия
        str=StringSubstr(str, 25);
        pc =GetPrice(str, pos);                       // Цена закрытия
        str=StringSubstr(str, pos);
//if (p==12) {
//  Print(TimeToStr(do, TIME_DATE|TIME_MINUTES), " ", TimeToStr(dc, TIME_DATE|TIME_MINUTES));
//  Print(DoubleToStr(po, 5), " ", DoubleToStr(pc, 5));
//  Print(or, " ", op);
//  Print(str);
//}

        ko=ArraySize(frogPrevOP);
        if (ko<or) ko=ArrayResize(frogPrevOP, or);
        Comment("Позиция: "+ko);
        switch (TypeObjects)
        {
          case 0: SetPropRectangle(do, op, or, po); SetPropRectangle(dc, "", or, pc); break;
          default: SetPropLines(do, op, or, po); SetPropLines(dc, "", or, pc); break;
        }
        if (ShowArrow) SetPropArrow(do, op, or, po);
//        if (ShowTextBalance) SetPropText(dc, op, or, pc);
        
        str=str+GetStringFromFile(fh, 250-StringLen(str));
      } else {
        str=StringSubstr(str, 125);
        str=str+GetStringFromFile(fh, 125);
      }
//      p++;
    }
    FileClose(fh);
  } else Comment("Ошибка открытия файла отчёта "+FileName);
}

//+----------------------------------------------------------------------------+
//|  Чтение отчёта тестера                                                     |
//+----------------------------------------------------------------------------+
void ReadStrategyTester()
{
  datetime dt;
  double   pp;
  int      ko, or, pos;
  string   op, str;

  int fh=FileOpen(FileName, FILE_BIN|FILE_READ);
  if (fh>0)
  {
    if (DeleteOldObjects) ObjectsDeleteAll();
    while (!FileIsEnding(fh))
    {
      pos=StringFind(str, "<td class=msdate>");
      if (pos>0)
      {
        GetString(fh, str, pos);
        str=StringSubstr(str, pos+17);
        dt =StrToTime(StringSubstr(str, 0, 16));      // Дата/время открытия/закрытия
        str=StringSubstr(str, 25);
        pos=StringFind  (str, "</td><td>");
        op =StringSubstr(str, 0, pos);                // Тип операции
        str=StringSubstr(str, pos+9);
        pos=StringFind  (str, "</td><td>");
        or =StrToInteger(StringSubstr(str, 0, pos));  // Порядковый номер ордера
        GetString(fh, str, pos);
        pp =GetPrice(str, pos);                       // Цена открытия/закрытия

        ko=ArraySize(frogPrevOP);
        if (ko<or) ko=ArrayResize(frogPrevOP, or);
        Comment("Позиция: "+ko);
        switch (TypeObjects)
        {
          case 0: SetPropRectangle(dt, op, or, pp); break;
          default: SetPropLines(dt, op, or, pp); break;
        }
        if (ShowArrow) SetPropArrow(dt, op, or, pp);
        if (ShowTextBalance) SetPropText(dt, op, or, pp);
        
        str=str+GetStringFromFile(fh, 250-StringLen(str));
      } else {
        str=StringSubstr(str, 125);
        str=str+GetStringFromFile(fh, 125);
      }
    }
    FileClose(fh);
  } else Comment("Ошибка открытия файла отчёта "+FileName);
}

//+----------------------------------------------------------------------------+
//|  Установка свойств объекта УКАЗАТЕЛЬ                                       |
//|  Параметры:                                                                |
//|    dt - дата, время                                                        |
//|    op - операция                                                           |
//|    or - номер ордера (объекта)                                             |
//|    pp - цена                                                               |
//+----------------------------------------------------------------------------+
void SetPropArrow(datetime dt, string op, int or, double pp)
{
  string no="ADeal";

  if (op=="buy" || op=="sell")
  {
    if (ObjectFind(no+or)<0) ObjectCreate(no+or, OBJ_ARROW, 0, 0,0);
    ObjectSet(no+or, OBJPROP_TIME1, dt);
    if (op=="buy")
    {
      ObjectSet(no+or, OBJPROP_PRICE1   , pp+OffSetArrowBuy*Point);
      ObjectSet(no+or, OBJPROP_COLOR    , clArrowBuy);
      ObjectSet(no+or, OBJPROP_ARROWCODE, KodArrowBuy);
    }
    if (op=="sell")
    {
      ObjectSet(no+or, OBJPROP_PRICE1   , pp+OffSetArrowSell*Point);
      ObjectSet(no+or, OBJPROP_COLOR    , clArrowSell);
      ObjectSet(no+or, OBJPROP_ARROWCODE, KodArrowSell);
    }
  }
}

//+----------------------------------------------------------------------------+
//|  Установка свойств объекта ЛИНИЯ ТРЕНДА                                    |
//|  Параметры:                                                                |
//|    dt - дата, время                                                        |
//|    op - операция                                                           |
//|    or - номер ордера (объекта)                                             |
//|    pp - цена                                                               |
//+----------------------------------------------------------------------------+
void SetPropLines(datetime dt, string op, int or, double pp)
{
  double p1, p2;
  string no=frogNameObjLine;

  if (op=="buy" || op=="sell")
  {
    if (ObjectFind(no+or)<0) ObjectCreate(no+or, OBJ_TREND, 0, 0,0, 0,0);
    ObjectSet(no+or, OBJPROP_TIME1 , dt);
    ObjectSet(no+or, OBJPROP_PRICE1, pp);
    if (op=="buy") frogPrevOP[or-1]=True; else frogPrevOP[or-1]=False;
  } else {
    ObjectSet(no+or, OBJPROP_TIME2 , dt);
    ObjectSet(no+or, OBJPROP_PRICE2, pp);
  }
  if (op=="buy") ObjectSet(no+or, OBJPROP_COLOR, clObjBuy);
  if (op=="sell") ObjectSet(no+or, OBJPROP_COLOR, clObjSell);
  ObjectSet(no+or, OBJPROP_RAY , False);

  p1=ObjectGet(no+or, OBJPROP_PRICE1);
  p2=ObjectGet(no+or, OBJPROP_PRICE2);
  if (p1!=0 && p2!=0)
  {
    if (frogPrevOP[or-1])
    {
      if (p1>p2) ObjectSet(no+or, OBJPROP_COLOR, clObjBuyLoss);
    }
    if (!frogPrevOP[or-1])
    {
      if (p1<p2) ObjectSet(no+or, OBJPROP_COLOR, clObjSellLoss);
    }
  }
}

//+----------------------------------------------------------------------------+
//|  Установка свойств объекта ПРЯМОУГОЛЬНИК                                   |
//|  Параметры:                                                                |
//|    dt - дата, время                                                        |
//|    op - операция                                                           |
//|    or - номер ордера (объекта)                                             |
//|    pp - цена                                                               |
//+----------------------------------------------------------------------------+
void SetPropRectangle(datetime dt, string op, int or, double pp)
{
  double p1, p2;
  string no=frogNameObjRect;

  if (op=="buy" || op=="sell")
  {
    if (ObjectFind(no+or)<0) ObjectCreate(no+or, OBJ_RECTANGLE, 0, 0,0, 0,0);
    ObjectSet(no+or, OBJPROP_TIME1 , dt);
    ObjectSet(no+or, OBJPROP_PRICE1, pp);
    if (op=="buy") frogPrevOP[or-1]=True; else frogPrevOP[or-1]=False;
  } else {
    ObjectSet(no+or, OBJPROP_TIME2 , dt);
    ObjectSet(no+or, OBJPROP_PRICE2, pp);
  }
  if (op=="buy") ObjectSet(no+or, OBJPROP_COLOR, clObjBuy);
  if (op=="sell") ObjectSet(no+or, OBJPROP_COLOR, clObjSell);
  ObjectSet(no+or, OBJPROP_BACK , True);

  p1=ObjectGet(no+or, OBJPROP_PRICE1);
  p2=ObjectGet(no+or, OBJPROP_PRICE2);
  if (p1!=0 && p2!=0)
  {
    if (frogPrevOP[or-1])
    {
      if (p1>p2) ObjectSet(no+or, OBJPROP_COLOR, clObjBuyLoss);
    }
    if (!frogPrevOP[or-1])
    {
      if (p1<p2) ObjectSet(no+or, OBJPROP_COLOR, clObjSellLoss);
    }
  }
}

//+----------------------------------------------------------------------------+
//|  Установка свойств объектов ТЕКСТ                                          |
//|  Параметры:                                                                |
//|    dt - дата, время                                                        |
//|    op - операция                                                           |
//|    or - номер ордера (объекта)                                             |
//|    pp - цена                                                               |
//+----------------------------------------------------------------------------+
void SetPropText(datetime dt, string op, int or, double pp)
{
  color  clText;
  double p1, p2, ss;
  string no, no1="T1Deal", no2="T2Deal";

  if (TypeObjects==0) no=frogNameObjRect; else no=frogNameObjLine;
  if (op=="buy" || op=="sell") if (op=="buy") frogPrevOP[or-1]=True; else frogPrevOP[or-1]=False;

  p1=ObjectGet(no+or, OBJPROP_PRICE1);
  p2=ObjectGet(no+or, OBJPROP_PRICE2);

  if (p1!=0 && p2!=0)
  {
    if (ObjectFind(no1+or)<0) ObjectCreate(no1+or, OBJ_TEXT, 0, 0,0);
    if (ObjectFind(no2+or)<0) ObjectCreate(no2+or, OBJ_TEXT, 0, 0,0);
    ObjectSet(no1+or, OBJPROP_TIME1 , dt);
    ObjectSet(no2+or, OBJPROP_TIME1 , dt);
    ObjectSet(no1+or, OBJPROP_PRICE1, pp+OffSetText*Point);
    ObjectSet(no2+or, OBJPROP_PRICE1, pp-OffSetText*Point);
    if (frogPrevOP[or-1])
    {
      ss=(p2-p1)/Point;
      frogBalance+=ss;
      if (ss<0) clText=clTextLoss; else clText=clTextProfit;
      ObjectSetText(no1+or, DoubleToStr(ss, 0), SizeText, "", clText);
      ObjectSetText(no2+or, DoubleToStr(frogBalance, 0), SizeText, "", clTextBalans);
    }
    if (!frogPrevOP[or-1])
    {
      ss=(p1-p2)/Point;
      frogBalance+=ss;
      if (ss<0) clText=clTextLoss; else clText=clTextProfit;
      ObjectSetText(no1+or, DoubleToStr(ss, 0), SizeText, "", clText);
      ObjectSetText(no2+or, DoubleToStr(frogBalance, 0), SizeText, "", clTextBalans);
    }
  }
}
//+----------------------------------------------------------------------------+

Если кто-то поможет, спасибо вам большое !

Причина обращения: