Графика - страница 2

 
Влад. Влад.:

Ох уж этот метод научного тыка при компиляции ошибки у меня

мне надо глобальную область ему(скрипту) написать прежде

А может скобку сначала поставить? 

void act(bool save) // true если сохраняем
 
Vitaly Muzichenko:

А может скобку сначала поставить? 

 void act(bool save // true если сохраняем
        )

Со скобками все в порядке просто в коде выше не указал извиняюсь может быть весь посмотрите только пожалуйста оБъясните что почем а то просто тыкать не то

//+------------------------------------------------------------------+
#property script_show_inputs
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+

void OnStart()
 
{
  void act(bool save // true если сохраняем
        )
{
   int hnd = FileOpen("info", save ? FILE_WRITE|FILE_BIN : FILE_READ|FILE_BIN);
   if(hnd == INVALID_HANDLE)
      return;

   long lp[33];
   double dp[23];
   ArrayInitialize(lp, 0);
   ArrayInitialize(dp, 0);
#define MYSETGETFN(PROP, MODIF, VAR, SW, SUF)  Object##SW##SUF(0,name,PROP,MODIF,VAR)
#define MYSETGET(SW)                                                             \
{                                                                                \
   MYSETGETFN(OBJPROP_TIME,       0, lp[1],  SW, Integer);                       \
   MYSETGETFN(OBJPROP_TIME,       1, lp[2],  SW, Integer);                       \
   MYSETGETFN(OBJPROP_TIME,       2, lp[3],  SW, Integer);                       \
   MYSETGETFN(OBJPROP_COLOR,      0, lp[4],  SW, Integer);                       \
   MYSETGETFN(OBJPROP_STYLE,      0, lp[5],  SW, Integer);                       \
   MYSETGETFN(OBJPROP_WIDTH,      0, lp[6],  SW, Integer);                       \
   MYSETGETFN(OBJPROP_BACK,       0, lp[7],  SW, Integer);                       \
   MYSETGETFN(OBJPROP_FILL,       0, lp[8],  SW, Integer);                       \
   MYSETGETFN(OBJPROP_SELECTABLE, 0, lp[9],  SW, Integer);                       \
   MYSETGETFN(OBJPROP_RAY_RIGHT,  0, lp[10], SW, Integer);                       \
   MYSETGETFN(OBJPROP_RAY_LEFT,   0, lp[11], SW, Integer);                       \
   MYSETGETFN(OBJPROP_LEVELS,     0, lp[12], SW, Integer);                       \
   MYSETGETFN(OBJPROP_PRICE,      0, dp[0],  SW, Double);                        \
   MYSETGETFN(OBJPROP_PRICE,      1, dp[1],  SW, Double);                        \
   MYSETGETFN(OBJPROP_PRICE,      2, dp[2],  SW, Double);                        \
   string tmp_str;                                                               \
   for(int pos = 0;  pos < (int)lp[12];  ++ pos)                                 \
   {                                                                             \
      MYSETGETFN(OBJPROP_LEVELVALUE, pos, dp[ArraySize(dp)-1-pos], SW, Double);  \
      MYSETGETFN(OBJPROP_LEVELCOLOR, pos, lp[ArraySize(lp)-1-pos], SW, Integer); \
      tmp_str = DoubleToString(dp[ArraySize(dp)-1-pos]*100, 1);                  \
      MYSETGETFN(OBJPROP_LEVELTEXT, pos, tmp_str, SW, String);                   \
   }                                                                             \
}

   if(save)
   {
      string name;
      for(int i = ObjectsTotal(0, 0) - 1;  i >= 0;  -- i)
      {
         name = ObjectName(0, i, 0);

         lp[0] = ObjectGetInteger(0, name, OBJPROP_TYPE);
         MYSETGET(Get);
         FileWriteInteger(hnd, StringLen(name));
         FileWriteString(hnd, name);
         FileWriteArray(hnd, lp);
         FileWriteArray(hnd, dp);
      }
   }
   else
   {
      string name;
      long min_time = LONG_MAX, max_time = LONG_MAX;
      while( ! FileIsEnding(hnd) )
      {
         int namesz = (int)FileReadInteger(hnd);
         name = FileReadString(hnd, namesz);
         FileReadArray(hnd, lp);
         FileReadArray(hnd, dp);
       //  lp[4] = (color)lp[4];   // Because ObjectGetInteger works incorrectly.

         ObjectCreate(0, name, (ENUM_OBJECT)lp[0], 0, 0, 0, 0, 0, 0, 0);
         MYSETGET(Set);
      }
   }

   FileClose(hnd);

#undef MYSETGETFN
#undef MYSETGET
}
 }    
 
Влад. Влад.:

Со скобками все в порядке просто в коде выше не указал извиняюсь может быть весь посмотрите только пожалуйста оБъясните что почем а то просто тыкать не то

Это должно быть за пределами Start(), потому что функция

void act(bool save // true если сохраняем
        )
{
...
}

Ну и вызов самой функции

void OnStart() 
{
// act(true);  // записать
// act(false); // прочитать
}
 

Товарищчи инженеры MQL5 в ветке достигнут минимум теперь скрипт стал выводить на график файл.

Далее мои мечты придумать как сделать файл бин в скрипте переменной ,то есть чтобы в настройках скрипта можно было выбирать какой файл будет открываться на  определенном графике валютной пары 

 int hnd = FileOpen("Active_Panel_scheme_23.bin", save ? FILE_WRITE|FILE_BIN : FILE_READ|FILE_BIN);
   if(hnd == INVALID_HANDLE)
 
Влад. Влад.:

Товарищчи инженеры MQL5 в ветке достигнут минимум теперь скрипт стал выводить на график файл.

Далее мои мечты придумать как сделать файл бин в скрипте переменной ,то есть чтобы в настройках скрипта можно было выбирать какой файл будет открываться на  определенном графике валютной пары 

Задача не полная!

Что нужно от начала до конца и в итоге?

 
Влад. Влад.:

Товарищчи инженеры MQL5 в ветке достигнут минимум теперь скрипт стал выводить на график файл.

Далее мои мечты придумать как сделать файл бин в скрипте переменной ,то есть чтобы в настройках скрипта можно было выбирать какой файл будет открываться на  определенном графике валютной пары 

В первый раз я выдрал лишь кусок, выкладываю почти всё, дальше сами смотрите

int onecase_openfile(bool save, bool chart_num, uint &id)
{
   if(id == UINT_MAX)
   {
      string name = save ? "onecase_save" : "onecase_load";
      id = (uint)GlobalVariableGet(name);
      GlobalVariableSet(name, id+1);
   }
   
   int file = FileOpen("one_case/"+IntegerToString(id), 
                       save ? FILE_WRITE|FILE_BIN : FILE_READ|FILE_BIN);

   if(chart_num  &&  file != INVALID_HANDLE)
   {
      ObjectCreate(0, "id_label", OBJ_LABEL, 0, 0, 0);
      ObjectSetInteger(0, "id_label", OBJPROP_XDISTANCE, 130);
      ObjectSetInteger(0, "id_label", OBJPROP_YDISTANCE, 45);
      ObjectSetInteger(0, "id_label", OBJPROP_CORNER, 2);
      ObjectSetString(0, "id_label", OBJPROP_TEXT, IntegerToString(id));
      ObjectSetInteger(0, "id_label", OBJPROP_FONTSIZE, 28);
   }
   return file;
}

void onecase_act(bool save,           // true если сохраняем
                 bool chart_num,      // true для вывода на в угол номера графика
                 uint id=UINT_MAX     // идентификатор сохранения
                )
{
   int hnd;
   if((hnd = onecase_openfile(save, chart_num, id)) == INVALID_HANDLE)
      return;

   long lp[33];
   double dp[23];
   ArrayInitialize(lp, 0);
   ArrayInitialize(dp, 0);
#define MYSETGETFN(PROP, MODIF, VAR, SW, SUF)  Object##SW##SUF(0,name,PROP,MODIF,VAR)
#define MYSETGET(SW)                                                             \
{                                                                                \
   MYSETGETFN(OBJPROP_TIME,       0, lp[1],  SW, Integer);                       \
   MYSETGETFN(OBJPROP_TIME,       1, lp[2],  SW, Integer);                       \
   MYSETGETFN(OBJPROP_TIME,       2, lp[3],  SW, Integer);                       \
   MYSETGETFN(OBJPROP_COLOR,      0, lp[4],  SW, Integer);                       \
   MYSETGETFN(OBJPROP_STYLE,      0, lp[5],  SW, Integer);                       \
   MYSETGETFN(OBJPROP_WIDTH,      0, lp[6],  SW, Integer);                       \
   MYSETGETFN(OBJPROP_BACK,       0, lp[7],  SW, Integer);                       \
   MYSETGETFN(OBJPROP_FILL,       0, lp[8],  SW, Integer);                       \
   MYSETGETFN(OBJPROP_SELECTABLE, 0, lp[9],  SW, Integer);                       \
   MYSETGETFN(OBJPROP_RAY_RIGHT,  0, lp[10], SW, Integer);                       \
   MYSETGETFN(OBJPROP_RAY_LEFT,   0, lp[11], SW, Integer);                       \
   MYSETGETFN(OBJPROP_LEVELS,     0, lp[12], SW, Integer);                       \
   MYSETGETFN(OBJPROP_PRICE,      0, dp[0],  SW, Double);                        \
   MYSETGETFN(OBJPROP_PRICE,      1, dp[1],  SW, Double);                        \
   MYSETGETFN(OBJPROP_PRICE,      2, dp[2],  SW, Double);                        \
   string tmp_str;                                                               \
   for(int pos = 0;  pos < (int)lp[12];  ++ pos)                                 \
   {                                                                             \
      MYSETGETFN(OBJPROP_LEVELVALUE, pos, dp[ArraySize(dp)-1-pos], SW, Double);  \
      MYSETGETFN(OBJPROP_LEVELCOLOR, pos, lp[ArraySize(lp)-1-pos], SW, Integer); \
      tmp_str = DoubleToString(dp[ArraySize(dp)-1-pos]*100, 1);                  \
      MYSETGETFN(OBJPROP_LEVELTEXT, pos, tmp_str, SW, String);                   \
   }                                                                             \
}

   if(save)
   {
      string name;
      for(int i = ObjectsTotal(0, 0) - 1;  i >= 0;  -- i)
      {
         name = ObjectName(0, i, 0);
         if(name == "id_label")
            continue;

         lp[0] = ObjectGetInteger(0, name, OBJPROP_TYPE);
         MYSETGET(Get);
         FileWriteInteger(hnd, StringLen(name));
         FileWriteString(hnd, name);
         FileWriteArray(hnd, lp);
         FileWriteArray(hnd, dp);
      }
   }
   else
   {
      string name;
      long min_time = LONG_MAX, max_time = LONG_MAX;
      while( ! FileIsEnding(hnd) )
      {
         int namesz = (int)FileReadInteger(hnd);
         name = FileReadString(hnd, namesz);
         FileReadArray(hnd, lp);
         FileReadArray(hnd, dp);
       //  lp[4] = (color)lp[4];   // Because ObjectGetInteger works incorrectly.

         ObjectCreate(0, name, (ENUM_OBJECT)lp[0], 0, 0, 0, 0, 0, 0, 0);
         MYSETGET(Set);
      }
   }

   FileClose(hnd);

#undef MYSETGETFN
#undef MYSETGET
}
void OnStart()
{
   onecase_act(true, true); // каждый следующий вызов сохранит объекты в one_case/GlobalVariableGet("onecase_save"),
                            // ГВ будет инкрементирована
   
   uint id = 5;
   onecase_act(true, true, id); // вызов сохранит объекты в one_case/id

   onecase_act(false, true); // каждый следующий вызов загрузит объекты из one_case/GlobalVariableGet("onecase_load"),
                             // ГВ будет инкрементирована

   uint id = 5;
   onecase_act(false, true, id); // вызов загрузит объекты из one_case/id
}

Функции в заголовочный файл, два скрипта - один на сохранение, другой на загрузку.  У меня там ещё реализована навигация к началу/к концу группы объектов, но в МТ барахлит ChartNavigate() поэтому вырезал.

 
pavlick_:

В первый раз я выдрал лишь кусок, выкладываю почти всё, дальше сами смотрите

Функции в заголовочный файл, два скрипта - один на сохранение, другой на загрузку.  У меня там ещё реализована навигация к началу/к концу группы объектов, но в МТ барахлит ChartNavigate() поэтому вырезал.

pavlick_:

В первый раз я выдрал лишь кусок, выкладываю почти всё, дальше сами смотрите

Функции в заголовочный файл, два скрипта - один на сохранение, другой на загрузку.  У меня там ещё реализована навигация к началу/к концу группы объектов, но в МТ барахлит ChartNavigate() поэтому вырезал.

мне как нибудь по проще создаю файл с моими графическими объектами на графике например "AUD_USD"

с помощью этого скрипта


input int interfaceID=0; //входной параметр - идентификатор сохраняемого интерфейса
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   //откроем файл для записи   
   int handle=FileOpen("AUD_USD"+IntegerToString(interfaceID)+".bin", FILE_WRITE|FILE_BIN);
   if(handle!=INVALID_HANDLE)
     {
      //переберём все объекты на экране
      for(int i=0;i<ObjectsTotal(0);i++)
        {
         string name=ObjectName(0,i);
         //и запишем их свойства в файл
         FileWriteString(handle,name,100);
         FileWriteInteger(handle,ObjectGetInteger(0,name,OBJPROP_TYPE));

         FileWriteInteger(handle,ObjectGetInteger(0,name,OBJPROP_XDISTANCE));
         FileWriteInteger(handle,ObjectGetInteger(0,name,OBJPROP_YDISTANCE));
         FileWriteInteger(handle,ObjectGetInteger(0,name,OBJPROP_XSIZE));
         FileWriteInteger(handle,ObjectGetInteger(0,name,OBJPROP_YSIZE));
         FileWriteInteger(handle,ObjectGetInteger(0,name,OBJPROP_COLOR));
         FileWriteInteger(handle,ObjectGetInteger(0,name,OBJPROP_STYLE));
         FileWriteInteger(handle,ObjectGetInteger(0,name,OBJPROP_WIDTH));
         FileWriteInteger(handle,ObjectGetInteger(0,name,OBJPROP_BACK));
         FileWriteInteger(handle,ObjectGetInteger(0,name,OBJPROP_SELECTED));
         FileWriteInteger(handle,ObjectGetInteger(0,name,OBJPROP_SELECTABLE));
         FileWriteInteger(handle,ObjectGetInteger(0,name,OBJPROP_READONLY));
         FileWriteInteger(handle,ObjectGetInteger(0,name,OBJPROP_FONTSIZE));
         FileWriteInteger(handle,ObjectGetInteger(0,name,OBJPROP_STATE));
         FileWriteInteger(handle,ObjectGetInteger(0,name,OBJPROP_BGCOLOR));

         FileWriteString(handle,ObjectGetString(0,name,OBJPROP_TEXT),100);
         FileWriteString(handle,ObjectGetString(0,name,OBJPROP_FONT),100);
         FileWriteString(handle,ObjectGetString(0,name,OBJPROP_BMPFILE,0),100);
         FileWriteString(handle,ObjectGetString(0,name,OBJPROP_BMPFILE,1),100);

         FileWriteDouble(handle,ObjectGetDouble(0,name,OBJPROP_PRICE));
        }
      //закроем файл
      FileClose(handle);
      Alert("Done!");
     }
  }
//+------------------------------------------------------------------+

У меня таких файлов образуется несколько  с разными графическими объектами на разных графиках разных валютных инструментах МТ5

потом я с помощью вашего выше указанного скрипта

void act(bool save // true если сохраняем
        )
{
   int hnd = FileOpen("AUD_USD", save ? FILE_WRITE|FILE_BIN : FILE_READ|FILE_BIN);
   if(hnd == INVALID_HANDLE)
      return;

   long lp[33];
   double dp[23];
   ArrayInitialize(lp, 0);
   ArrayInitialize(dp, 0);
#define MYSETGETFN(PROP, MODIF, VAR, SW, SUF)  Object##SW##SUF(0,name,PROP,MODIF,VAR)
#define MYSETGET(SW)                                                             \
{                                                                                \
   MYSETGETFN(OBJPROP_TIME,       0, lp[1],  SW, Integer);                       \
   MYSETGETFN(OBJPROP_TIME,       1, lp[2],  SW, Integer);                       \
   MYSETGETFN(OBJPROP_TIME,       2, lp[3],  SW, Integer);                       \
   MYSETGETFN(OBJPROP_COLOR,      0, lp[4],  SW, Integer);                       \
   MYSETGETFN(OBJPROP_STYLE,      0, lp[5],  SW, Integer);                       \
   MYSETGETFN(OBJPROP_WIDTH,      0, lp[6],  SW, Integer);                       \
   MYSETGETFN(OBJPROP_BACK,       0, lp[7],  SW, Integer);                       \
   MYSETGETFN(OBJPROP_FILL,       0, lp[8],  SW, Integer);                       \
   MYSETGETFN(OBJPROP_SELECTABLE, 0, lp[9],  SW, Integer);                       \
   MYSETGETFN(OBJPROP_RAY_RIGHT,  0, lp[10], SW, Integer);                       \
   MYSETGETFN(OBJPROP_RAY_LEFT,   0, lp[11], SW, Integer);                       \
   MYSETGETFN(OBJPROP_LEVELS,     0, lp[12], SW, Integer);                       \
   MYSETGETFN(OBJPROP_PRICE,      0, dp[0],  SW, Double);                        \
   MYSETGETFN(OBJPROP_PRICE,      1, dp[1],  SW, Double);                        \
   MYSETGETFN(OBJPROP_PRICE,      2, dp[2],  SW, Double);                        \
   string tmp_str;                                                               \
   for(int pos = 0;  pos < (int)lp[12];  ++ pos)                                 \
   {                                                                             \
      MYSETGETFN(OBJPROP_LEVELVALUE, pos, dp[ArraySize(dp)-1-pos], SW, Double);  \
      MYSETGETFN(OBJPROP_LEVELCOLOR, pos, lp[ArraySize(lp)-1-pos], SW, Integer); \
      tmp_str = DoubleToString(dp[ArraySize(dp)-1-pos]*100, 1);                  \
      MYSETGETFN(OBJPROP_LEVELTEXT, pos, tmp_str, SW, String);                   \
   }                                                                             \
}

   if(save)
   {
      string name;
      for(int i = ObjectsTotal(0, 0) - 1;  i >= 0;  -- i)
      {
         name = ObjectName(0, i, 0);

         lp[0] = ObjectGetInteger(0, name, OBJPROP_TYPE);
         MYSETGET(Get);
         FileWriteInteger(hnd, StringLen(name));
         FileWriteString(hnd, name);
         FileWriteArray(hnd, lp);
         FileWriteArray(hnd, dp);
      }
   }
   else
   {
      string name;
      long min_time = LONG_MAX, max_time = LONG_MAX;
      while( ! FileIsEnding(hnd) )
      {
         int namesz = (int)FileReadInteger(hnd);
         name = FileReadString(hnd, namesz);
         FileReadArray(hnd, lp);
         FileReadArray(hnd, dp);
       //  lp[4] = (color)lp[4];   // Because ObjectGetInteger works incorrectly.

         ObjectCreate(0, name, (ENUM_OBJECT)lp[0], 0, 0, 0, 0, 0, 0, 0);
         MYSETGET(Set);
      }
   }

   FileClose(hnd);

#undef MYSETGETFN
#undef MYSETGET
}

Вывожу его на график что уже получилось я добавил только вот это

void OnStart() 
{
// act(true);  // записать
 act(false); // прочитать
} 

Теперь я хочу вот в поле name была переменная в которую подставлялись бы разные файлы бин с разных графиков и это потом можно было применять в настройках скрипта перед выводом на график

 int hnd = FileOpen("name", save ? FILE_WRITE|FILE_BIN : FILE_READ|FILE_BIN);
   if(hnd == INVALID_HANDLE)
      return;

Вот этим буду заниматься .Ваш скрипт правильный он рабочий но немного для других целей.

 

1. Главное преимущество кода, который выкладывал в том, что формат файла задаётся в одном месте. Вы же хотите пойти неправильным путём - задавать формат в обоих скриптах.

2. Не смешивайте разные форматы - писать своим, а читать моим, формат несовместим. Или делайте всё сами, или воспользуйтесь готовым. Я не понимаю почему у вас там что-то из этого получилось.

3. Если нужно разделение по символам, то легко допилить - вшить имя символа в имена файлов и имена ГВ. Но мне как-то не надо было.

 
pavlick_:

1. Главное преимущество кода, который выкладывал в том, что формат файла задаётся в одном месте. Вы же хотите пойти неправильным путём - задавать формат в обоих скриптах.

2. Не смешивайте разные форматы - писать своим, а читать моим, формат несовместим. Или делайте всё сами, или воспользуйтесь готовым. Я не понимаю почему у вас там что-то из этого получилось.

3. Если нужно разделение по символам, то легко допилить - вшить имя символа в имена файлов и имена ГВ. Но мне как-то не надо было.

Хорошо я попробую))) , но уверяю вас , что я все сделал на двух скриптах без ошибки, все сработало , все совместимо. Просто я не пробовал ваш код в действии целиком.

 
pavlick_:

1. Главное преимущество кода, который выкладывал в том, что формат файла задаётся в одном месте. Вы же хотите пойти неправильным путём - задавать формат в обоих скриптах.

2. Не смешивайте разные форматы - писать своим, а читать моим, формат несовместим. Или делайте всё сами, или воспользуйтесь готовым. Я не понимаю почему у вас там что-то из этого получилось.

3. Если нужно разделение по символам, то легко допилить - вшить имя символа в имена файлов и имена ГВ. Но мне как-то не надо было.

Скомпилировал ваш код правда приходится ставить сплеши   если сохраняю или выгружаю

onecase_act(true, true); // каждый следующий вызов сохранит объекты в one_case/GlobalVariableGet("onecase_save"),
                            // ГВ будет инкрементирована
   
  // uint id = 5;
   //onecase_act(true, true, id); // вызов сохранит объекты в one_case/id

   onecase_act(false, true); // каждый следующий вызов загрузит объекты из one_case/GlobalVariableGet("onecase_load"),
                             // ГВ будет инкрементирована

    uint id = 5;
   onecase_act(false, true, id); // вызов загрузит объекты из one_case/id

иначе дает ошибку

id' - variable already defined

можно ли это делать в настройках скрипта когда вывожу на график и id менять не мешало бы 

конечному потребителю не понравится каждый раз нырять в Эдитор

мне функции которые это делают подскажите остальное я сам люблю доводить с благодарностью