Denis Naumov:
как можно настроить автоматическое копирование объектов между терминалами?
нужно автоматически копировать разметки между 1-10 терминалами для удобства. как это можно сделать? без использования шабонов. нужна полная автоматизация процесса
это во фриланс :-) и не то чтобы "как два пальца об асфальт"
как можно настроить автоматическое копирование объектов между терминалами?
нужно автоматически копировать разметки между 1-10 терминалами для удобства. как это можно сделать? без использования шабонов. нужна полная автоматизация процесса
Maxim Kuznetsov:
это во фриланс :-) и не то чтобы "как два пальца об асфальт"
Неужели так сложно? При создании объекта писать его в файл, на приёмниках считывать и создавать.
это во фриланс :-) и не то чтобы "как два пальца об асфальт"
Yury Kirillov:
Неужели так сложно? При создании объекта писать его в файл, на приёмниках считывать и создавать.
а в какой файл писать, в каком формате, откуда читать ??Неужели так сложно? При создании объекта писать его в файл, на приёмниках считывать и создавать.
а под каким именем создавать ? а отслеживать ObjectModify/Delete
всё одно - делать протокол обмена и выйдет а-ля "копировщик" но для граф.объектов (видов которых внезапно больше чем ордеров).
Maxim Kuznetsov:
а в какой файл писать, в каком формате, откуда читать ??
а под каким именем создавать ? а отслеживать ObjectModify/Delete
всё одно - делать протокол обмена и выйдет а-ля "копировщик" но для граф.объектов (видов которых внезапно больше чем ордеров).
Судя по исходному посту копируются разметки, что наверняка предполагает ограниченное количество видов объектов и их небольшое количество. Поэтому задача скорее всего решается просто.
а в какой файл писать, в каком формате, откуда читать ??
а под каким именем создавать ? а отслеживать ObjectModify/Delete
всё одно - делать протокол обмена и выйдет а-ля "копировщик" но для граф.объектов (видов которых внезапно больше чем ордеров).
Yury Kirillov:
Судя по исходному посту копируются разметки, что наверняка предполагает ограниченное количество видов объектов и их небольшое количество. Поэтому задача скорее всего решается просто.
Так и напишите и выложите в КБ ))
Судя по исходному посту копируются разметки, что наверняка предполагает ограниченное количество видов объектов и их небольшое количество. Поэтому задача скорее всего решается просто.
Есть у меня скрипт: если скомпилирован с дефайном SAVE, то при первом вызове создаёт метку-индикатор указывающий на первый вызов. Второй вызов приводит к сохранению всех графических объектов в файл, время создания которых позднее, чем время метки. Без SAVE - загрузка, естественно. Можно допилить маленько и вызывать по таймеру на всех терминалах. Мьютекс между сохраняющим и заргужающими терминалами - файл открытый для эксклюзивного доступа. Если интересно могу выложить здесь (150 строк кода).
pavlick_:
Есть у меня скрипт: если скомпилирован с дефайном SAVE, то при первом вызове создаёт метку-индикатор указывающий на первый вызов. Второй вызов приводит к сохранению всех графических объектов в файл, время создания которых позднее, чем время метки. Без SAVE - загрузка, естественно. Можно допилить маленько и вызывать по таймеру на всех терминалах. Мьютекс между сохраняющим и заргужающими терминалами - файл открытый для эксклюзивного доступа. Если интересно могу выложить здесь (150 строк кода).
Есть у меня скрипт: если скомпилирован с дефайном SAVE, то при первом вызове создаёт метку-индикатор указывающий на первый вызов. Второй вызов приводит к сохранению всех графических объектов в файл, время создания которых позднее, чем время метки. Без SAVE - загрузка, естественно. Можно допилить маленько и вызывать по таймеру на всех терминалах. Мьютекс между сохраняющим и заргужающими терминалами - файл открытый для эксклюзивного доступа. Если интересно могу выложить здесь (150 строк кода).
#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 стиле "/", в Винде возможно поменять на "\" придётся (не знаю).
// Закомментировать дефайн, если скрипт загружающий
#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
}
сохраняем символ, сохраняем в шаблон.
Считываем символ, открываем шаблон.
Все!
А завтра вы узнаете что это надо передавать по сети.
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
нужно автоматически копировать разметки между 1-10 терминалами для удобства. как это можно сделать? без использования шабонов. нужна полная автоматизация процесса