Автоматическое копирование объектов между терминалами.

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Denis Naumov
82
Denis Naumov  
как можно настроить автоматическое копирование объектов между терминалами?

нужно автоматически копировать разметки между 1-10 терминалами для удобства. как это можно сделать? без использования шабонов. нужна полная автоматизация процесса
Maxim Kuznetsov
12943
Maxim Kuznetsov  
Denis Naumov:
как можно настроить автоматическое копирование объектов между терминалами?

нужно автоматически копировать разметки между 1-10 терминалами для удобства. как это можно сделать? без использования шабонов. нужна полная автоматизация процесса
это во фриланс :-) и не то чтобы "как два пальца об асфальт"
Yury Kirillov
5298
Yury Kirillov  
Maxim Kuznetsov:
это во фриланс :-) и не то чтобы "как два пальца об асфальт"
Неужели так сложно? При создании объекта писать его в файл, на приёмниках считывать и создавать.
Maxim Kuznetsov
12943
Maxim Kuznetsov  
Yury Kirillov:
Неужели так сложно? При создании объекта писать его в файл, на приёмниках считывать и создавать.
а в какой файл писать, в каком формате, откуда читать ??

а под каким именем создавать ? а отслеживать ObjectModify/Delete

всё одно - делать протокол обмена и выйдет а-ля "копировщик" но для граф.объектов (видов которых внезапно больше чем ордеров). 
Yury Kirillov
5298
Yury Kirillov  
Maxim Kuznetsov:
а в какой файл писать, в каком формате, откуда читать ??

а под каким именем создавать ? а отслеживать ObjectModify/Delete

всё одно - делать протокол обмена и выйдет а-ля "копировщик" но для граф.объектов (видов которых внезапно больше чем ордеров). 
Судя по исходному посту копируются разметки, что наверняка предполагает ограниченное количество видов объектов и их небольшое количество. Поэтому задача скорее всего решается просто.
Alexey Volchanskiy
27265
Alexey Volchanskiy  
Yury Kirillov:
Судя по исходному посту копируются разметки, что наверняка предполагает ограниченное количество видов объектов и их небольшое количество. Поэтому задача скорее всего решается просто.
Так и напишите и выложите в КБ ))
pavlick_
773
pavlick_  
Есть у меня скрипт: если скомпилирован с дефайном SAVE, то при первом вызове создаёт метку-индикатор указывающий на первый вызов. Второй вызов приводит к сохранению всех графических объектов в файл, время создания которых позднее, чем время метки. Без SAVE - загрузка, естественно. Можно допилить маленько и вызывать по таймеру на всех терминалах. Мьютекс между сохраняющим и заргужающими терминалами - файл открытый для эксклюзивного доступа. Если интересно могу выложить здесь (150 строк кода).
Yuriy Zaytsev
18678
Yuriy Zaytsev  
pavlick_:
Есть у меня скрипт: если скомпилирован с дефайном SAVE, то при первом вызове создаёт метку-индикатор указывающий на первый вызов. Второй вызов приводит к сохранению всех графических объектов в файл, время создания которых позднее, чем время метки. Без SAVE - загрузка, естественно. Можно допилить маленько и вызывать по таймеру на всех терминалах. Мьютекс между сохраняющим и заргужающими терминалами - файл открытый для эксклюзивного доступа. Если интересно могу выложить здесь (150 строк кода).
pavlick_
773
pavlick_  
#property strict

// Закомментировать дефайн, если скрипт загружающий
#define SAVE


uint get_id()
{
#ifdef SAVE
   string name = "onecase_save";
#else
  
string name = "onecase_load";
#endif
  
uint id = (uint)GlobalVariableGet(name);
   GlobalVariableSet(name, id+1);
   return id;
}

int openfile(bool read)
{
   uint id = get_id();
   int file = read ? FileOpen("one_case/"+IntegerToString(id), FILE_READ|FILE_BIN) :
                     FileOpen("one_case/"+IntegerToString(id), FILE_WRITE|FILE_BIN);
   if(file == INVALID_HANDLE)
      Alert("Error: file has not been opened");
  
   ObjectCreate(0, "id_label", OBJ_LABEL, 0, 0, 0);
   ObjectSetInteger(0, "id_label", OBJPROP_XDISTANCE, 90);
   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 OnStart()
{  
   long lp[40];
   double dp[40];
   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[0], SW, Integer);                              \
   MYSETGETFN(OBJPROP_TIME, 1, lp[1], SW, Integer);                              \
   MYSETGETFN(OBJPROP_TIME, 2, lp[2], SW, Integer);                              \
   MYSETGETFN(OBJPROP_COLOR, 0, lp[3], SW, Integer);                             \
   MYSETGETFN(OBJPROP_STYLE, 0, lp[4], SW, Integer);                             \
   MYSETGETFN(OBJPROP_WIDTH, 0, lp[5], SW, Integer);                             \
   MYSETGETFN(OBJPROP_BACK, 0, lp[6], SW, Integer);                              \
   MYSETGETFN(OBJPROP_FILL, 0, lp[7], SW, Integer);                              \
   MYSETGETFN(OBJPROP_SELECTABLE, 0, lp[8], SW, Integer);                        \
   MYSETGETFN(OBJPROP_RAY_RIGHT, 0, lp[9], SW, Integer);                         \
   MYSETGETFN(OBJPROP_RAY_LEFT, 0, lp[10], SW, Integer);                         \
   MYSETGETFN(OBJPROP_LEVELS, 0, lp[11], 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[11];  ++ 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);                   \
   }
      
#ifdef SAVE
   if(ObjectFind(0, "onecase_label") < 0)
   {
      ObjectCreate(0, "onecase_label", OBJ_BUTTON, 0, 0, 0);
      ObjectSetInteger(0, "onecase_label", OBJPROP_XDISTANCE, 15);
      ObjectSetInteger(0, "onecase_label", OBJPROP_YDISTANCE, 25);
      ObjectSetInteger(0, "onecase_label", OBJPROP_XSIZE, 40);
      ObjectSetInteger(0, "onecase_label", OBJPROP_YSIZE, 40);
      ObjectSetInteger(0, "onecase_label", OBJPROP_CORNER, 0);
      return;
   }
   else
   {
      int hnd;
      if((hnd = openfile(false)) == INVALID_HANDLE)
         return;
      datetime threshold = (datetime)ObjectGetInteger(0, "onecase_label", OBJPROP_CREATETIME);
      ObjectDelete(0, "onecase_label");
      
      string name;
      for(int i = ObjectsTotal(0, 0) - 1;  i >= 0;  -- i)
      {
         name = ObjectName(0, i, 0);  
         if(ObjectGetInteger(0, name, OBJPROP_CREATETIME) <= threshold  ||
            name == "id_label")
            continue;

         MYSETGET(Get);
         lp[12] = ChartGetInteger(0, CHART_SCALE);
         lp[13] = Period();
         lp[14] = ObjectGetInteger(0, name, OBJPROP_TYPE);
         FileWriteInteger(hnd, StringLen(name));
         FileWriteString(hnd, name);
         FileWriteArray(hnd, lp);
         FileWriteArray(hnd, dp);
        
         ObjectDelete(0, name);
      }
   }
#else
  
string delname;
   for(int i = ObjectsTotal(0, 0) - 1;  i >= 0;  -- i)
   {
      delname = ObjectName(0, i, 0);
      if(delname == "onecase_label")
         continue;
      ObjectDelete(0, delname);
   }

   int hnd;
   if((hnd = openfile(true)) == INVALID_HANDLE)
      return;
        
   string name;
   long min_time = LONG_MAX;
   while( ! FileIsEnding(hnd) )
   {
      int namesz = (int)FileReadInteger(hnd);
      name = FileReadString(hnd, namesz);
      FileReadArray(hnd, lp);
      FileReadArray(hnd, dp);

      ObjectCreate(0, name, (ENUM_OBJECT)lp[14], 0, 0, 0, 0, 0, 0, 0);
      MYSETGET(Set);
      if(lp[0] < min_time)
         min_time = lp[0];
   }/*
   if(min_time != LONG_MAX)
   {
      datetime buf[1];
      if(CopyTime(Symbol(), Period(), (int)ChartGetInteger(0, CHART_FIRST_VISIBLE_BAR), 1, buf) == 1)
      {
         int shift = min_time<buf[0] ? Bars(Symbol(), Period(), min_time, buf[0]) :
                                       Bars(Symbol(), Period(), buf[0], min_time);
         ChartNavigate(0, CHART_CURRENT_POS, min_time<buf[0] ? (-shift) : shift);
      }
   }*/

  
#endif
}
У меня там пути в UNIX стиле "/", в Винде возможно поменять на "\" придётся (не знаю).
Dmitiry Ananiev
9275
Dmitiry Ananiev  

сохраняем символ, сохраняем в шаблон. 
Считываем символ, открываем шаблон. 

Все!  

Alexey Viktorov
25836
Alexey Viktorov  
А завтра вы узнаете что это надо передавать по сети.
12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий