Может ли ДЦ стирать комментарии в мт5? - страница 2

 
Maxim Kuznetsov:

во первых ДЦ как правило не затирают (технически могут, но я про такие случае не слышал), а дописывают в комент свою информацию. Как и в 4-ке. Если места в коменте не хватит, то часть будет затёрта.
Ну так и не надо писать в коментариях "Войну и мир"

во вторых отдельным ордерам в 5-ке нужен только до TradeTransaction - чтобы там было проще разобраться откуда чего взялось. Если нетинговый счёт, то коменту с этого момента можно сказать прощай :-)

Да я много и не собираюсь писать. Время + цена. А вы много неттинговых счетов видели на форексе?))

Maxim Kuznetsov:

А вообще коментарии используются при перезапуске или переезде советника. Или при работе советника с "помощником". Или привязки к своей базе там пишутся. И в прочих случаях :-)

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


Каким боком переезд ассоциируется с временем получения сигнала, чтобы по логам можно было оценить время от получения сигнала до исполнения соотв.приказа ))
 
hoz:

Да я много и не собираюсь писать. Время + цена. А вы много неттинговых счетов видели на форексе?))

ну пишите в глобальные переменные терминала, вот нашел у себя на работе часть библиотеки для записи в глобальные переменные

//____________________________________________________________________________________
void WriteGV(int magic_,string name_,double value){
string s = StringConcatenate(Symbol(),magic_,name_);
if(GlobalVariableSet(s,value)==0) Print(__FUNCTION__,"Ошибка записи № ",GetLastError());
}
//____________________________________________________________________________________
void WriteGV(int magic_,string name_,bool value){
string s = StringConcatenate(Symbol(),magic_,name_);
double res = 0;
if(value) res = 1.0; else res = -1.0;
if(GlobalVariableSet(s,res)==0) Print(__FUNCTION__,"Ошибка записи № ",GetLastError());
}
//____________________________________________________________________________________
bool ReadGV(int magic_,string name_,double &value){
string s = StringConcatenate(Symbol(),magic_,name_);
if(!GlobalVariableCheck(s)) return(false);
value = GlobalVariableGet(s);
return(true);}
//____________________________________________________________________________________
bool ReadGV(int magic_,string name_,int &value){
string s = StringConcatenate(Symbol(),magic_,name_);
if(!GlobalVariableCheck(s)) return(false);
value = int(GlobalVariableGet(s));
return(true);}
//____________________________________________________________________________________
bool ReadGV(int magic_,string name_,bool &value){
GetLastError();
string s = StringConcatenate(Symbol(),magic_,name_);
if(!GlobalVariableCheck(s)) return(false);
double  res= GlobalVariableGet(s);
if(res>0) value = true; else{if(res<0) value = false;else {Print(__FUNCTION__,"Ошибка чтения №",GetLastError());return(false);}}
return(true);}
//____________________________________________________________________________________
void DellAllGV(int magic_){
GlobalVariablesDeleteAll(StringConcatenate(Symbol(),magic_));}

пишите в имя переменной тестовую часть, а в значение что считаете нужным, компилятор прекрасно находит функции на соотвествие типам, если сигнал отменен, то удаляйте из глобальных переменных -  вмоем примере это DellAllGV(int magic_) - для Ваше задачи это некий паттерн, ну используйте уникальные мена переменных - в Вашем случае текст комментария

 
Igor Makanu:

ну пишите в глобальные переменные терминала, вот нашел у себя на работе часть библиотеки для записи в глобальные переменные

пишите в имя переменной тестовую часть, а в значение что считаете нужным, компилятор прекрасно находит функции на соотвествие типам, если сигнал отменен, то удаляйте из глобальных переменных -  вмоем примере это DellAllGV(int magic_) - для Ваше задачи это некий паттерн, ну используйте уникальные мена переменных - в Вашем случае текст комментария

В принципе, это как бы вариант, хотя, опять-таки, можно писать данные в файл. Все данные как-бы в структуре то будут хранится, например, а паралельно хоть даже по таймер писать данные в файл и всё. Но вот всё-таки не очень мне это нравится. Так получается что можно было бы нативно выбрать ордера соответствующие сигналу и с ними что-то делать. А так вместо того, что бы ордера выбрать мы будет проверять то, что имеется в глобальных переменных. Вроде бы суть таже, но..

 
hoz:

В принципе, это как бы вариант, хотя, опять-таки, можно писать данные в файл. Все данные как-бы в структуре то будут хранится, например, а паралельно хоть даже по таймер писать данные в файл и всё. Но вот всё-таки не очень мне это нравится. Так получается что можно было бы нативно выбрать ордера соответствующие сигналу и с ними что-то делать. А так вместо того, что бы ордера выбрать мы будет проверять то, что имеется в глобальных переменных. Вроде бы суть таже, но..

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

 
Igor Makanu:

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

Так можно прописать что в тестере запись в файлы не шла. Структура все равно будет ровно крутиться. Зачем нужна эта запись.

 
Konstantin Nikitin:

Так можно прописать что в тестере запись в файлы не шла. Структура все равно будет ровно крутиться. Зачем нужна эта запись.

Ну так это само собой разумеется. Я так всегда и делаю. Тока вот этот момент домозгую и реализую. Я к подобным вещам привередливо очень отношусь т.к. потом проще всё обслуживать, когда всё грамотно продуманно. Не хочется с каждым ботов переписывать что-то. Лучше перемусолить обслуживающие коды, что бы потом эти вещи применялись всегда в любой ситуации.

 

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

Если ДЦ дописывает свои записи в конец комментария (я не знаю, как это на самом деле, не торгую на форексе), то можно в конце писать ключевое слово, означающее конец пользовательского комментария. Если оно пропало - то комментарий испортили.

 
Sergey Savinkin:

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

Если ДЦ дописывает свои записи в конец комментария (я не знаю, как это на самом деле, не торгую на форексе), то можно в конце писать ключевое слово, означающее конец пользовательского комментария. Если оно пропало - то комментарий испортили.

То комментарий испортили, что дальше делать хз... Так? Не практично. Я думаю, нужно сделать типа хэштэбла. Ассоциация данных с неким ключом. Тока вот в мт мне не нравится реализация обработки данных. Хотя, для теста сойдёт. Дальше нужно писать иначе.

 

вот набросал на соседнем форуме, код в принципе работающий, но нужно немного проверок добавить

#property strict
#include <Arrays\\ArrayString.mqh>

class COrderComment {
   private:
      CArrayString str,number;
   public:
//-----------------------------------------------------------------
      void Set(int ticket,string comment){
         str.Add(comment);
         number.Add(IntegerToString(ticket));
      }
//-----------------------------------------------------------------
      string Get(int ticket){
         string res="",stmp = IntegerToString(ticket);
         for(int i=0;i<str.Total();i++){
            if(number.At(i)==stmp) {res=str.At(i); break;}
         }
         return(res);
      }
//-----------------------------------------------------------------
      void clear(){
         str.Shutdown();
         number.Shutdown();
      }
};
COrderComment mycomment;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
      int i;
      // запишем 5 коментариев
      for(i=1;i<6;i++) mycomment.Set(i,StringConcatenate("comment# ",i));
      // прочитаем 7 коментариев
      for(i=1;i<8;i++) Print(i," : ",mycomment.Get(i));
      // удалим все коментарии
      mycomment.clear();
      // прочитаем 5 коментариев
      Print("Удалил....");
      for(i=1;i<6;i++) Print(i," : ",mycomment.Get(i));
      // запишем 5 коментариев
      for(i=1;i<6;i++) mycomment.Set(i,StringConcatenate("comment# ",i));
      // прочитаем 7 коментариев
      for(i=1;i<6;i++) Print(i," : ",mycomment.Get(i));
  }

вызов:

string comm = "Это коментарий к ордеру и к сигналу";
int TICKET=OrderSend(Symbol(),OP_BUY, Lot, Price,Slippage,SL,TP,comm,magic_,0,col);
if(TICKET==-1)Print("Ошибка № ",GetLastError()," при открытии ордера"); else mycomment.Set(TICKET,comm);  


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

ЗЫ: по уму нужно взять класс CArrayString и переписать под свою задачу, задача довольно простая 

 
Sergey Chalyshev:
Вы хотите сказать, что на платформу МТ5 нельзя полагаться?

Ну дописывать же ДЦ в комментарий может. 

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