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

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

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; // Уничтожаем указатель и очищаем память

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

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


Спасибо, я вспомнил почему на сокращение перешел, переменная не обновляется в циклах (ну очевидно что функция не вызывается) и надо на каждый чих делать новую, а потом убивать. В общем проще returntick на switch перевести. 

 
Vitaly Muzichenko:

Посылать на сервер post-запрос с номером счёта

На сервере сверять пришедший номер со всеми строками в файле CSV, и если есть совпадение, то с этой строки файла посылать в ответе в терминал сообщение. Осталось прочесть ответ от сервера в терминале, и вывести его на график.

Вообще, такие вещи проще реализовывать на MySQL, чем на файле.


Спасибо за ответ, Виталий! 

Три дня пытаюсь разобраться, но пока ни фига не выходит(я пока новичок - в начале пути)...

Можно чуть подробней расписать? С каким либо примером...

Извините, за мою непонятливость...

 

И еще один вопрос..

Хотел добиться, чтобы Луч рисовал линию от текущей цены - до конца дня к концу уровня(23:59)(white2), но он рисует по времени до конца дня(как и нужно), но не на уровне (white2), а уходит глубоко вниз к границе графика.

Причем подсовываю ему любой из уровней (red1, red2 и т.д.), но все равно Луч уходит или вверх в бесконечность или вниз. И правильно ли я написал, чтобы начало Луча всегда начиналось с High[0] т.е. при новой свече начало перемещается на новую свечу(т.е. следует за ценой) или он отрисовывает Луч только один раз? Уровни получаются из CSV. Помогите плз...

if(уровни==Daily)
        {
         double red1 = d_input[0];
         double red2 = d_input[1];
         double blue1 = d_input[2];
         double blue2 = d_input[3];
         double white = d_input[4];
         double signal= d_input[5];
         double z_1 = d_input[6];
         double z_2 = d_input[7];
         double white2 = d_input[8];
                 
         t0 = дата_уровней + 1*PeriodSeconds(PERIOD_M1);
         t1 = дата_уровней + 24*PeriodSeconds(PERIOD_H1);

         Draw_Level("red1", red1, c_day_1, STYLE_SOLID, 2);  
         Draw_Level("red2", red2, c_day_1, STYLE_SOLID, 2);  
         Draw_Level("blue1", blue1, c_day_2, STYLE_SOLID, 2);  
         Draw_Level("blue2", blue2, c_day_2, STYLE_SOLID, 2);  
         Draw_Level("white", white,c_day_3, STYLE_SOLID,2);
         Draw_Level("white2", white2,c_day_3, STYLE_DOT,0);
        
         Draw_Level("green1",z_1, c_day_4, STYLE_SOLID,2);
         Draw_Level("green2",z_2,c_day_3, STYLE_DOT,2);
               
        string name = "Ray";
         int window = 0, time1 = (int)Time[0], time2 = (int)StrToTime(txt_data+" 23:59");
          double price1 = High[0], price2= white2;
         
          ObjectCreate(name, OBJ_TREND, window, time1, price1, time2, price2);
          ObjectSet(name, OBJPROP_COLOR, clrAqua);
          ObjectSet(name, OBJPROP_RAY_RIGHT, false);
          ObjectSet(name,OBJPROP_WIDTH,1);
          ObjectSet(name,OBJPROP_STYLE,2);
              
        
        if(показ_не отработанных)
            if(!check_white_level(дата_уровней,white))
               draw_line(t0,white,c_day_3);
                 else(Draw_Level("white", white,c_day_3, STYLE_SOLID,1));// меняет толщину белой при достижении ценой
                
        }
 
MosheDayan:

И еще один вопрос..

Хотел добиться, чтобы Луч рисовал линию от текущей цены - до конца дня к концу уровня(23:59)(white2), но он рисует по времени до конца дня(как и нужно), но не на уровне (white2), а уходит глубоко вниз к границе графика.

Причем подсовываю ему любой из уровней (red1, red2 и т.д.), но все равно Луч уходит или вверх в бесконечность или вниз. Уровни получаются из CSV. Помогите плз...

Выясните (уточните проверьте ) значение white2 с помощью Alert или Print.
 
STARIJ:
Выясните (уточните проверьте ) значение white2 с помощью Alert или Print.
Выясняю при помощи Alert сразу пишет "EURUSD Error  FileOpen() for write" и пропадают все уровни текущего дня... вчерашние и все прошлые остаются... во как.. Луч на месте начинается там где надо и уходит на уровень вчерашнего white2, но не в конец дня, а сегодня вертикально вниз визуально видно что останавливается на уровне вчерашнего white2.
 
MosheDayan:
Выясняю при помощи Alert сразу пишет "EURUSD Error  FileOpen() for write" и пропадают все уровни текущего дня... вчерашние и все прошлые остаются... во как.. Луч на месте начинается там где надо и уходит на уровень вчерашнего white2, но не в конец дня, а сегодня вертикально вниз визуально видно что останавливается на уровне вчерашнего white2.

А зачем Вам обращаться к файлу? у Вас есть значение white2 и перед использованием выведите егос помощью Alert("white2 = ", white2);

 
STARIJ:

А зачем Вам обращаться к файлу? у Вас есть значение white2 и перед использованием выведите егос помощью Alert("white2 = ", white2);

Спасибо за пояснение.... вот что пишет:  white2 = 0.0

п.с. это я туплю... white2 = 0.0 пишет для других валютных пар на них в CSV нет уровней. А для EURUSD в CSV есть уровни и Алерт их показывает на вчера (white2  1.1720) на сегодня (white2 1.1810)

Луч начинается там где надо, но уходит на уровень вчерашнего white2 т.е на 1.1720, а надо сегодняшнего на 1.1810, и уходит не в конец дня 23:59, а сегодня вертикально вниз визуально видно что останавливается на уровне вчерашнего white2 т.е на 1.1720.

 

 ччто-тонепонятное  

описал функцию

int IsBelow

//>>>>>>>>>>>>>>>>>>>>>

 {

 

 Alert("beg IsBelow");

 

  Alert("NextTick=",NextTick);

//---------------------------


//---------------------------

 Alert("NextTick=",NextTick);

 

 Alert("end IsBelow");

 

 }

//>>>>>>>>>>>>>>>>>>>>>>>

получил сообщение   перед телом фуекции semicolon expexted {

Вопрос какой semicolon expected ?

объясните, пожаалуйста...

 
buyanov:

 ччто-тонепонятное  

описал функцию

int IsBelow

//>>>>>>>>>>>>>>>>>>>>>

 {

 

 Alert("beg IsBelow");

 

  Alert("NextTick=",NextTick);

//---------------------------


//---------------------------

 Alert("NextTick=",NextTick);

 

 Alert("end IsBelow");

 

 }

//>>>>>>>>>>>>>>>>>>>>>>>

получил сообщение   перед телом фуекции semicolon expexted {

Вопрос какой semicolon expected ?

объясните, пожаалуйста...


void IsBelow()

 
buyanov:

 ччто-тонепонятное  

описал функцию

int IsBelow

//>>>>>>>>>>>>>>>>>>>>>

 {

 

 Alert("beg IsBelow");

 

  Alert("NextTick=",NextTick);

//---------------------------


//---------------------------

 Alert("NextTick=",NextTick);

 

 Alert("end IsBelow");

 

 }

//>>>>>>>>>>>>>>>>>>>>>>>

получил сообщение   перед телом фуекции semicolon expexted {

Вопрос какой semicolon expected ?

объясните, пожаалуйста...

Ответ здесь
Функции - Основы языка - Справочник MQL4
Функции - Основы языка - Справочник MQL4
  • docs.mql4.com
Функции - Основы языка - Справочник MQL4
Причина обращения: