Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 1263

 
Vladimir Karputov:

'STRUCT_POSITION' - это ТИП ДАННЫХ. Вам нужно создать объект с этим типом и потом вызывать ОБЬЕКТ.GetCurrentPositionProperty();

Пробовал. Такой обЪект создан, объявлен сразу после объявления структуры

StrPositionArray[]

Если прописать в ОнТике

void OnTick()
  {
//---
   StrPositionArray[].GetCurrentPositionProperty();
  }

получаем ошибку:

']' - expression expected eSower_and_Gather_5.mq5 69 21

это та-же строка, только вторая скобка, та что прямо перед точкой.
 
Vladimir Karputov:

Код: (просто вызывается функция - функция советника, а не метод структуры - так понятнее)

Тоесть использовать :: было пустой затеей? 

Тогда зачем прописывать функцию 

GetCurrentPositionProperty()

внутри структуры??? Она ведь и без прописывания внутри структиуры отлично будет заполнять ее. Проясните плиз, что-то вообще запутался, может это уже устаревшая фишка, про которую нужно забыть ???

 
Sergey Voytsekhovsky:

Тоесть использовать :: было пустой затеей? 

Тогда зачем прописывать функцию 

внутри структуры??? Она ведь и без прописывания внутри структиуры отлично будет заполнять ее. Проясните плиз, что-то вообще запутался, может это уже устаревшая фишка, про которую нужно забыть ???

Копипаст. Осталась строка после копипаста.

Нужно так (внутри структуру нет никаких методов)

//+------------------------------------------------------------------+
//| Structure Positions                                              |
//+------------------------------------------------------------------+
struct STRUCT_POSITION
  {
   ENUM_POSITION_TYPE type;       // тип позиции
   ulong              ticket;     // тикет позиции
   long               identifier; // идентификатор
   long               magic;      // магический номер
   double             volume;     // объем позиции
   double             open_price; // цена открытия
   datetime           open_time;  // время открытия
   double             profit;     // профит позиции
   double             comission;  // комиссия
   double             swap;       // своп
   string             comment;    // комментарий
  };
STRUCT_POSITION StrPositionArray[];
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
 
Vladimir Karputov:

Копипаст. Осталась строка после копипаста.

Нужно так (внутри структуру нет никаких методов)

Ну вот, а я столько времени потратил на урок. Правда он был для МТ4, там это преподнесено как фишка, вот выдержка из текста:

1
2
3
4
5
6
7
8
9
10
11
12
struct state
   {
    int                buy_count;         // количество ордеров buy
    int                sell_count;        // количество ордеров sell
    double             buy_bottom_price;  // цена открытия самого нижнего ордера buy
    double             sell_top_price;    // цена открытия самого верхнего ордера sell
    double             profit;            // прибыль всех ордеров
 
    // метод для сбора информации о состоянии счёта
    // и обновления элементов структуры
    void               Refresh();
   } State;

В структуре присутствует метод  Refresh(), который рассчитывает и присваивает значения элементам структуры. Определим тело метода вне структуры. Для этого используем операцию разрешения контекста (::). Контекст – это дескриптор (имя) структуры:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
//+------------------------------------------------------------------+
//| Метод собирает информацию о текущем состоянии счёта              |
//| и обновляет соответствующие поля структуры                       |
//+------------------------------------------------------------------+
void state::Refresh( void )
   {
// обнуляем числовые поля структуры
    ZeroMemory( this );
 
    for ( int i=OrdersTotal()-1; i>=0; i--)
       if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
          if (OrderSymbol()==_Symbol && OrderMagicNumber()==Magic)
            {
             double OpenPrice=OrderOpenPrice();
             profit+=OrderProfit()+OrderCommission()+OrderSwap();
             switch (OrderType())
               {
                case OP_BUY:
                   buy_count++;
                   if (OpenPrice<buy_bottom_price || buy_bottom_price==0)
                      buy_bottom_price=OpenPrice;
                   break ;
                case OP_SELL:
                   sell_count++;
                   if (OpenPrice>sell_top_price || sell_top_price==0)
                      sell_top_price=OpenPrice;
                   break ;
               }
            }
 
   }

Обратите внимание, что в теле метода мы обращаемся к элементам структуры, не используя точку, так как мы использовали операцию разрешения контекста. Числовые поля перед их обновлением в самом начале тела метода обнуляются функцией  ZeroMemory() с ключевым словом  this, таким образом, структура передаёт ссылку на саму себя.

Основной код советника внутри обработчика  OnTick() теперь будет выглядеть так:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
   {
    for ( int i=0; i<2000; i++)
    {
     double b=MathSqrt(i);
    }
// открываем новые ордера и фиксируем прибыль только на открытии нового бара
    if (IsNewBar())
      {
       // получаем новый сигнал
       int Signal=GetSignal();
       // сразу выходим из функции, если на закрытом баре не был сформирован сигнал
       if (Signal<0)
          return ;
 
       // обновляем структуру
       State.Refresh(); // (!!!)
 
dr.mr.mom:

Эксперт обрабатывает события. Если Вы не хотите дожидаться события NewTick#, которое обрабатывается функцией OnTick, есть возможность используя функцию 

bool  EventSetTimer(
   int  seconds      // количество секунд
   );

генерировать события от таймера с указанной периодичностью, событие Timer# обрабатывается функцией OnTimer(). Эксперт у вас будет работать постоянно(с некой периодичностью) не дожидаясь тиков, а что уж он будет при этом делать, решать вам.

Еще раз - мне надо в событии ОнИнит проверить торговое время или нет.

 
Открыл демо счет, подключился к платному сигналу. Так можно делать? Подключать учебный счет к реальным сигналам для автоследования?
 
Finansiallogin1:
Открыл демо счет, подключился к платному сигналу. Так можно делать? Подключать учебный счет к реальным сигналам для автоследования?

За деньги наверное можно всё.)))

 
Andrey Sokolov:

Еще раз - мне надо в событии ОнИнит проверить торговое время или нет.

Идентификатора, торговое или не торговое время скорее всего нет, исходя из набора и назначения стандартных функций ОнТик, ОнТаймер и других. А что мешает календарь запрограммировать, начала работы бирж известны. Хотя мне не понятна идея. ОнТик и так сработает по первому же тику. Между сессиями, которые понятно когда будут, можно делать дорогие расчеты привязываясь к реальному времени.

 
Valeriy Yastremskiy:

Идентификатора, торговое или не торговое время скорее всего нет, исходя из набора и назначения стандартных функций ОнТик, ОнТаймер и других. А что мешает календарь запрограммировать, начала работы бирж известны. Хотя мне не понятна идея. ОнТик и так сработает по первому же тику. Между сессиями, которые понятно когда будут, можно делать дорогие расчеты привязываясь к реальному времени.

вот

 
Andrey Sokolov:

вот

Что значит начинал работать, если он прикреплен к чарту он работает. Не понятна задача. Если перед первым тиком за пять минут до начала сессии, то ОнТаймер. А до первого тика если по ОнТик работает, то зачем? С момента окончания торгового времени и на момент начала, что меняется?

Зы заметил. Событие в ОнИнит? Это когда руками набрасываешь? Время между тиками, в голову только это идет. Если более 120 секунд, то вряд ли торговое. Но лучше у Брокера или ДЦ узнавать, есть ли вообще идентификатор торгового времени.