Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 280

 
hamsteruser:

*returntick тоже не уничтожается. Меня просто выхлоп торгового терминала запутал. Пишет про неочищенную память.


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

 
Anatolij Povoroznyj:

Здравствуйте. Помогите пожалуйста подправить код. Надо чтобы советник не открывал серию ордеров, а только один ордер по первому событию. 

Сейчас это работает так: когда ССI пересекает линию 200 сверху вниз - открывается БАЙ, потом если ССI пересекает 200 сверху вниз ещё раз открывается ещё один БАЙ и т.д, и т.д, пока ССI не пересечёт линию -200 снизу вверх, тогда закрываются все БАИ и открывается СЕЛЛ.

Что хочу попросить: когда ССI пересекает линию 200 сверху вниз - открывается БАЙ (первый и единственный), другие БАИ не должны открываться до тех пор пока ССI не пересечёт линию -200 снизу вверх, при этом закрывается БАЙ и открывается СЕЛЛ. (Зеркально СЕЛЛ и линия -200)


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

 

наверно не в тему..

Пожелание по МТ4

Использую много алертов, причем настроенных на определенные параметры.

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

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

Было бы неплохо возможность сортировки сделать, такие же, как и в закладке "торговля"

 
hamsteruser:

Есть функция с поинтером:


Я еще в другой функции вызываю:


А как почистить память за ней?

На delete(TickReturn); у меня ошибка operand excepted.

TickReturn* rt = returntick( period, 1 );

int timeis = rt.curtime;

delete rt;
 
MMM1972:

наверно не в тему..

Пожелание по МТ4

Использую много алертов, причем настроенных на определенные параметры.

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

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

Было бы неплохо возможность сортировки сделать, такие же, как и в закладке "торговля"

Терминал МТ4 больше не развивается. Только исправляются найденные баги.

 
Алексей Барбашин:

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

Память действительно течёт.

  class TickReturn

   {

   public:

      int curtime;

      double open;

      double close;

      double high;

      double low;

      double priceask;

      double pricebid;

      

   };



  TickReturn *returntick(int period, int timeposition)

   {

      TickReturn *returntick = new TickReturn();

      MqlRates rates[];

      MqlTick last_tick;

      

      if(SymbolInfoTick(symbol,last_tick)){}

      else Print("SymbolInfoTick() failed, error = ",GetLastError());

      

      //int timeposition=0;

      ArraySetAsSeries(rates,true);

      ArrayResize(rates,1);

      int copied=CopyRates(symbol,period,timeposition,1,rates);

      

      returntick.curtime = rates[0].time;

      returntick.open = rates[0].open;

      returntick.close = rates[0].close;

      returntick.high = rates[0].high;

      returntick.low = rates[0].low;

      returntick.priceask = last_tick.ask;

      returntick.pricebid = last_tick.bid;

      

      return(returntick);

}

void OnTick() { int period = 15; int timeis = returntick(period, 1).curtime; Print("timeis= ", TimeToStr(timeis,TIME_SECONDS)); Вот здесь пытаюсь уничтожить указатель. }

 
hamsteruser:

Память действительно течёт.


void OnTick() { int period = 15; int timeis = returntick(period, 1).curtime; Print("timeis= ", TimeToStr(timeis,TIME_SECONDS)); Вот здесь пытаюсь уничтожить указатель. }


Как-то не ясно что именно можно здесь уничтожать. Не удивительно что память течет. Что такое указатель? Указатель - это ссылка на адрес памяти, где хранится созданная динамическая переменная. По сути вы вызываете процедуру получения указателя на переменную класса, в процедуре объект класса создается, помещается в память, далее указатель возвращается в функцию получения тиков и.... при выходе из функции уничтожается. Обращаю внимание на то, что уничтожается указатель, а память при этом не очищается! И с каждым новым тиком памяти сжирается все больше и больше! Чтобы обойти этот момент в вашей редакции кода вам прежде всего нужно убрать сокращение и поместить указатель в другую переменную:  TickReturn* temptick = returntick(period, 1);// Получаем указатель и помещаем его в переменную int timeis = temptick.curtime; // Получаем нужное значение из объекта по указателю ...... delete temptick; // Уничтожаем указатель и очищаем память

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

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

 

1.Средствами mql4 возможно ли реализовать отключение других советников? 

2. Проверку есть ли на данном ChartId запущенный эксперт?

 
Sergey Likho:

1.Средствами mql4 возможно ли реализовать отключение других советников? 

2. Проверку есть ли на данном ChartId запущенный эксперт?


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

 
Aleksey Vyazmikin:

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


Идея именно в том, чтоб по условию советник А, отключал советника B.

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