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

 
Василий:
Да, спрашиваю о MQL 5? да,  доступ надо получить к данным текущего символа. Данные нужны в коде советника. Получается мне нужно, например, узнать цену закрытия бара, предшествующего настоящему
Просмотрите пример для CopyTime
 
Karputov Vladimir:
Просмотрите пример для CopyTime
Понял, попробую разобраться. Спасибо!
 
Василий:
Да, спрашиваю о MQL 5? да,  доступ надо получить к данным текущего символа. Данные нужны в коде советника. Получается мне нужно, например, узнать цену закрытия бара, предшествующего настоящему

Вам бы документацию немного почитать.

int  CopyClose( 
   string           symbol_name,       // имя символа 
   ENUM_TIMEFRAMES  timeframe,         // период 
   int              start_pos,         // откуда начнем  
   int              count,             // сколько копируем 
   double           close_array[]      // массив для копирования цен закрытия 
   );

 

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

ENUM_ORDER_TYPE indicator_01()
  {
   double ma[2];
   double close[2];
   static int h_ma=INVALID_HANDLE;
   if(Bars(_Symbol,PERIOD_CURRENT)<ma_period+1)return(WRONG_VALUE);
   if(h_ma==INVALID_HANDLE || h_ma==0)
     {
      h_ma=iMA(_Symbol,_Period,ma_period,ma_shift,ma_method,ma_price);
      return(WRONG_VALUE);
     }
   if(CopyBuffer(h_ma,0,1,2,ma)<2) return(WRONG_VALUE);
   if(CopyClose(_Symbol,PERIOD_CURRENT,1,2,close)<2) return(WRONG_VALUE);

   if(close[1]>ma[1]&&close[0]<ma[0])return(ORDER_TYPE_BUY);
   if(close[1]<ma[1]&&close[0]>ma[0])return(ORDER_TYPE_SELL);

   return(WRONG_VALUE);
  }
 
Sergey Gritsay:

...

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

Плохой пример. Переменную, хранящую хендл индикатора, в MQL5 нужно объявлять в "шапке" - в области глобальных переменных программы, получать хендл в OnInit(). И только потом можно обращаться к хендлу за получением данных из любого места программы.
 

Всем салют !

Получаю в тестере по событию OnTrade данные по истории сделок.

  for(int i=0;i<HistoryDealsTotal();i++){
       ulong deal_ticket=HistoryDealGetTicket(i);
       Print("ticket=",deal_ticket);
       Print("price=",HistoryDealGetDouble(deal_ticket,DEAL_PRICE));
       Print("time=",TimeToString(HistoryDealGetInteger(deal_ticket,DEAL_TIME)));

И вот что получаю в логах.

0    22:58:16.487    Core 1    2016.04.01 00:00:00   Number of bars in the terminal history for the symbol-period GBPUSD at the moment = 7729
JR    0    22:58:16.487    Core 1    2016.04.01 03:00:00   Попытка совершения торговой операции 0 лотом 0.01
EL    0    22:58:16.487    Core 1    2016.04.01 03:00:00   market buy 0.01 GBPUSD sl: 1.43033 tp: 1.44034 (1.43646 / 1.43654 / 1.43646)
GO    0    22:58:16.487    Core 1    2016.04.01 03:00:00   deal #2 buy 0.01 GBPUSD at 1.43654 done (based on order #2)
GE    0    22:58:16.487    Core 1    2016.04.01 03:00:00   deal performed [#2 buy 0.01 GBPUSD at 1.43654]
NK    0    22:58:16.487    Core 1    2016.04.01 03:00:00   order performed buy 0.01 at 1.43654 [#2 buy 0.01 GBPUSD at 1.43654]
HI    0    22:58:16.487    Core 1    2016.04.01 03:00:00   ticket=1
HM    0    22:58:16.487    Core 1    2016.04.01 03:00:00   price=0.0
HH    0    22:58:16.487    Core 1    2016.04.01 03:00:00   time=2016.04.01 00:00
CR    0    22:58:16.487    Core 1    2016.04.01 03:00:00   ticket=2
ID    0    22:58:16.487    Core 1    2016.04.01 03:00:00   price=1.43654
OP    0    22:58:16.487    Core 1    2016.04.01 03:00:00   time=2016.04.01 03:00

Откуда возникает первая сделка с нулевым прайсом ? Я ее не совершаю :-).

Объясните плиз.

З.Ы. Кажется понял. У первой сделки профит 10килобаксов. Только все равно странно. Зачем ?

И вот еще вопрос. Сделка (которая моя - покупка по 1,43654) не отработала еще. Как она вообще в истории очутилась ?

Мне нужно как в MQL4 считать в массив данные ТОЛЬКО по закрытым сделкам. Как это сделать ???

P.S. Фильтровать по DEAL_ENTRY_OUT ?

 
Alexandr Saprykin:
Переустановить терминал пробовали?
Да, спасибо. Только это и помогло.
 
Karputov Vladimir:
Плохой пример. Переменную, хранящую хендл индикатора, в MQL5 нужно объявлять в "шапке" - в области глобальных переменных программы, получать хендл в OnInit(). И только потом можно обращаться к хендлу за получением данных из любого места программы.

Не совсем согласен с вами, по поводу получения хендла, так как функция OnInit() выполняется один раз, а 100%-ой гарантии нет что будет создан индикатор с первого раза. По поводу объявления переменной возможны вы правы, но чем хуже вариант со статической переменной хотелось бы знать в документации написано 

 Локальные переменные, объявленные с ключевым словом static сохраняют свои значения в течение всего времени существования  функции. При каждом следующем вызове функции такие локальные переменные содержат те значения, которые они имели при предыдущем вызове.

 

Фильтровать по DEAL_ENTRY_OUT

 
Sergey Gritsay:

Не совсем согласен с вами, по поводу получения хендла, так как функция OnInit() выполняется один раз, а 100%-ой гарантии нет что будет создан индикатор с первого раза. По поводу объявления переменной возможны вы правы, но чем хуже вариант со статической переменной хотелось бы знать в документации написано 

...

Для этого в OnInit() при создании хендла индикатора осуществляется проверка. Если хендл не создан, то в OnOnit() нужно возвращать INIT_FAILED. То есть создание хендла индикатора - только один раз и только в OnInit(). Это Вам не "4" - бардак и шатание и объявление хендлов по всем закоулкам программы.
 
Karputov Vladimir:
Для этого в OnInit() при создании хендла индикатора осуществляется проверка. Если хендл не создан, то в OnOnit() нужно возвращать INIT_FAILED. То есть создание хендла индикатора - только один раз и только в OnInit(). Это Вам не "4" - бардак и шатание и объявление хендлов по всем закоулкам программы.
Я бы не был столь категоричен в своих утверждениях. Бардак - не в клозетах, бардак - в головах (с)
Причина обращения: