Новая функция - предложение разработчикам.

 
Предлагаю разработчикам в язык MQL4 встроить новую функцию, которая позволяла бы объявить переменную, имя которой сгенерировано програмно по некоторому алгоритму.
Логика надобности такая: Пусть нам нужно после открытия ордера выполнить с позой некоторые манипуляции, причём выполнить 1 и только 1 раз. Если у нас предполагается наличие одного и только одного ордера по данной валютной паре, то как только ордер открыт, мы объявляем булевую переменную и присваиваем ей значение true. Далее, если наступают некоторые условия и эта переменная = true, то с выбранным ордером выполняются манипуляии. В случае, если манипуляции успешны, то нашей переменной мы присваиваем значение false. Задача выполнена. НО. В том случае, когда мы не знаем, насколько много у нас будет открыто ордеров (например тогда, когда поймав тренд мы открываем по неким сигналам доливочные позиции), тогда не плохо было бы объявить после открытия каждого нового ордера новую будеву переменную, имя которой бы состояло из, например, следующих символов: имя валютной пары, тип ордера (Buy/Sell) и тикет ордера. Наличие тикета в имени новой переменной гарантировало бы нам, что програмно не будет сгенерировано двух одинаковых имён.
Новая функция может выглядеть, например вот так:

string NameName;
Name=(генерируем имя для будущей переменной);
//------ теперь объявляем новую переменную --------
bool NewName(Name)=true;
//  В результате будет объявлена новая булева переменная, имя которой содержится в переменной Name

Как работать с такой переменной?
В таком случае, чтоб распознать какая переменная была объявлена, мы должны будем организовать цикл, в котором советник проходится по уже объявленным переменным и ищет именно ту, в имени которой содержитя тикет выбранного ордера. Значит нам нужна ещё одна новая функция, которая позволила бы нам пройтись по именам уже объявленных переменных.

Что Вы об этом думаете? Может есть какое иное решение этого вопроса, которое я не вижу?
 
drknn:
Предлагаю разработчикам в язык MQL4 встроить новую функцию, которая позволяла бы объявить переменную, имя которой сгенерировано програмно по некоторому алгоритму.
Логика надобности такая: Пусть нам нужно после открытия ордера выполнить с позой некоторые манипуляции, причём выполнить 1 и только 1 раз. Если у нас предполагается наличие одного и только одного ордера по данной валютной паре, то как только ордер открыт, мы объявляем булевую переменную и присваиваем ей значение true. Далее, если наступают некоторые условия и эта переменная = true, то с выбранным ордером выполняются манипуляии. В случае, если манипуляции успешны, то нашей переменной мы присваиваем значение false. Задача выполнена. НО. В том случае, когда мы не знаем, насколько много у нас будет открыто ордеров (например тогда, когда поймав тренд мы открываем по неким сигналам доливочные позиции), тогда не плохо было бы объявить после открытия каждого нового ордера новую будеву переменную, имя которой бы состояло из, например, следующих символов: имя валютной пары, тип ордера (Buy/Sell) и тикет ордера. Наличие тикета в имени новой переменной гарантировало бы нам, что програмно не будет сгенерировано двух одинаковых имён.
Новая функция может выглядеть, например вот так:

string NameName;
Name=(генерируем имя для будущей переменной);
//------ теперь объявляем новую переменную --------
bool NewName(Name)=true;
// В результате будет объявлена новая булева переменная, имя которой содержится в переменной Name

Как работать с такой переменной?
В таком случае, чтоб распознать какая переменная была объявлена, мы должны будем организовать цикл, в котором советник проходится по уже объявленным переменным и ищет именно ту, в имени которой содержитя тикет выбранного ордера. Значит нам нужна ещё одна новая функция, которая позволила бы нам пройтись по именам уже объявленных переменных.

Что Вы об этом думаете? Может есть какое иное решение этого вопроса, которое я не вижу?


А глобальные переменные не пробовал? Вроде там все это есть.

Посмотри https://docs.mql4.com/ru/globals

 
Спасибо. Гляну.
 
Да, всё получилось. Пользовался уже когда-то подобным методом. Не хотелось просто выносить переменные на глобальный уровень терминала. Но, как говоорится, если нет, то нет. Еще раз спасибо.
 

Можно и без глобальных переменных. Я использую три функции

//+------------------------------------------------------------------+
//| Изменение размеров массивов свойств ордера                       |
//+------------------------------------------------------------------+
int ResizeOrdArrays() {
  ArrayResize(OrdID,OrdArrSize);
  ArrayResize(OrdTicket,OrdArrSize);
//  ArrayResize(,OrdArrSize);
}
//+------------------------------------------------------------------+
//| Добавление ордера в список ордеров                               |
//+------------------------------------------------------------------+
int AddOrder(int ID) {
  OrdInd=OrdNum;
  OrdNum++;
  if (OrdNum > OrdArrSize) {
    OrdArrSize = OrdNum;
    ResizeOrdArrays();
  }
  OrdID[OrdInd] = ID;
  OrdTicket[OrdInd] = ticket;
//  [OrdInd] = 0;
}
//+------------------------------------------------------------------+
//| Исключение ордера из списка ордеров                              |
//+------------------------------------------------------------------+
int CutOrder() {
  OrdNum--;
  if (OrdInd < OrdNum) {
    OrdID[OrdInd] = OrdID[OrdNum];
    OrdTicket[OrdInd] = OrdTicket[OrdNum];
//    [OrdInd] = [OrdNum];
}

Пользоваться примерно так

//  Удаление ордеров из списка
  int AccTotal=OrdersHistoryTotal();
  if (AccTotal != preAccTotal) {
    for (i= preAccTotal; i<AccTotal; i++) {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) {
        Print("Ошибка при доступе к исторической базе (",GetLastError(),")");
      }
      for (OrdInd=0; OrdInd<OrdNum; OrdInd++) {
        if (OrderTicket() == OrdTicket[OrdInd]) break;
      }  //  for (OrdInd=i; OrdInd<OrdNum; OrdInd++)
      if (OrdInd >= OrdNum) {
        Print("Ордер отсутстует в OrderList, ордеров в списке: ",OrdNum,", ордеров в истории: ",AccTotal);
      }
      CutOrder();
    }  //  for (i= preAccTotal; i<AccTotal; i++)
    preAccTotal = AccTotal;
  }  //  if (AccTotal != preAccTotal)
 
//  Цикл по ордерам
  LastOrder = OrdersTotal()-1;
  for(i=LastOrder;i>=0;i--) {
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) {
      Print("Ошибка OrderSelect при работе со списком активных ордеров");
      continue;
    }
    for (OrdInd=0; OrdInd<OrdNum; OrdInd++) {
      if (OrderTicket() == OrdTicket[OrdInd]) break;
    }  //  for (OrdInd=i; OrdInd<OrdNum; OrdInd++)
    if (OrdInd >= OrdNum) {
      Print("Ордер отсутстует в OrderList, ордеров в списке: ",OrdNum,", активных ордеров: ",LastOrder);
    }
  }
  
// Добавление ордеров
  if (Sell) {
    ticket = OrderSend(Symbol(),OP_SELL,Lots,Price,3,Stop,Profit,"",1,0,Red);
    if (ticket > 0) {
      AddOrder(OP_SELL);
    }  // if (ticket > 0) 
  }  //  if (Sell)
  if (Buy) {
    ticket = OrderSend(Symbol(),OP_BUY,Lots,Price,3,Stop,Profit,"",1,0,Blue);
    if (ticket > 0) {
      AddOrder(OP_BUY);
    }  //  if (ticket > 0)
  }  //  if (Buy)
То есть всякий раз употребляя OrderSelect определяем индекс ордера в нашей дополнительной структуре. После чего можем обращаться к его новым свойствам по этому индексу. По моей оценке, это примерно на порядок быстрее, чем работа через глобальные переменные.
 
Всёравно приходится контроллировать доволно большой кусок кода. Если это можно сделать средствами MQL4, то почему бы ни встроить такую функцию в язык? Удобно ведь было бы.
 
Было бы здорово, если была функция для преобразования строкового названия переменной в саму переменную.
Это сильно облегчило бы работу с внешними переменными без организации их в массивы и замены имён.
Решила бы и вышеуказанные проблемы и многое другое можно было бы делать.
И обратную функцию тоже не мешало бы...
 
Еще предложение, сделать Быстрое преобразование Фурье (хотябы). А в идеале Дискретное двумерное преобразование. Заранее спасибо если сможете.