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

[Удален]  
Одна сделка на бар или время. Как осуществить?
 
Vladimir Baskakov:
Одна сделка на бар ***

В OnTradeTransaction отлавливаем транзакцию TRADE_TRANSACTION_DEAL_ADD и определяет тип сделки. Если сделка DEAL_TYPE_BUY или DEAL_TYPE_SELL - запоминаем время открытия текущего бара. В блоке генерации сигналов сравниваем это время и время открытия текущего бара.

[Удален]  
Vladimir Karputov:

В OnTradeTransaction отлавливаем транзакцию TRADE_TRANSACTION_DEAL_ADD и определяет тип сделки. Если сделка DEAL_TYPE_BUY или DEAL_TYPE_SELL - запоминаем время открытия текущего бара. В блоке генерации сигналов сравниваем это время и время открытия текущего бара.

if (day!=TimeDay(TimeCurrent()))
      {
      
      // проверяем условие открытия
          {
          //если условие подходит, открываем сделку — и изменяем флаг day
          day=TimeDay(TimeCurrent());
          }
 
Vladimir Baskakov:

"TimeDay" - нет такой функции.

[Удален]  
Vladimir Karputov:

"TimeDay" - нет такой функции.

Пардон ошибся, а так?
MqlDateTime currTime=TimeToStruct(TimeCurrent());
   if (day!=currTime.day)
      {
      day=currTime.day);
      
      // открываем сделку
      
 

Vladimir Baskakov:
Пардон ошибся, а так?

MqlDateTime currTime=TimeToStruct(TimeCurrent());
   if (day!=currTime.day)
      {
      day=currTime.day);
      
      // открываем сделку
      

Это будет работать как "одна сделка в день". 

[Удален]  
Vladimir Karputov:

Это будет работать как "одна сделка в день". 

О, то что надо!

 
Здравствуйте. 
Вопрос: Как посчитать реальное количество баров таймфрейма. При запросе Bars, iBars даёт 01.01.1970 (если перевести в дату). Реально же, по факту на экране бар с 21.09.2019. 
Вся история на графике - 25 недель... (PERIOD_W1).

Как именно выглядит кодовая строка запроса, что реально  на экране?  Как согласовать? Спасибо.
[Удален]  

MQL5

Никак не могу добиться толку. Может тут кто-нибудь подскажет?

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Прошу подсказку.

Сергей Таболин, 2019.03.07 08:14

На основе одного индикатора из кодабазы написал пример того что я хочу. Работает. Но при запуске выдаёт ошибку:

2019.03.06 21:24:26.091 my_MA_S (GBPUSD,M15)    array out of range in 'my_MA_S.mq5' (103,59)

Не подскажете где ошибка?

//+------------------------------------------------------------------+
//|                                                       myMA_S.mq5 |
//|                                     Copyright 2019, Tabolin S.N. |
//|                           https://www.mql5.com/ru/users/vip.avos |
//+------------------------------------------------------------------+
#property   copyright   "Copyright 2019, Tabolin S.N."
#property   link        "https://www.mql5.com/ru/users/vip.avos"
#property   version     "1.07"
//#property   icon        "\\Images\\mi2.ico"
//----------------------------------------------------------------------------------------------
#define     GS          1.618
#define     PI          3.14159
//----------------------------------------------------------------------------------------------
#property strict
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1

#property indicator_label1  "myMA_S"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1 

//--- input parameters
input int      InpPeriodMA          = 45; // MA period
input int      InpShiftCorrection   = 9;  // Correction shift
//--- indicator buffers
double         Buffer1[];
int            handle_MA;                           // переменная для хранения хэндла индикатора HMA5
double         buffer_MA[];                         // массив для хранения значений индикатора HMA5
int            n=0;
int            ma_bars_calculated = 0; 
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   ArraySetAsSeries(Buffer1,        true);
   ArraySetAsSeries(buffer_MA,      true);

   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,-1);

   SetIndexBuffer(0,Buffer1,INDICATOR_DATA);
//--- set shortname and change label
   string short_name="myMA_S("+
                              IntegerToString(InpPeriodMA)+","+
                              IntegerToString(InpShiftCorrection)+")";
   IndicatorSetString(INDICATOR_SHORTNAME,short_name);
   PlotIndexSetString(0,PLOT_LABEL,short_name);
//--- set accuracy
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
//--- sets first bar from what index will be drawn
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,InpPeriodMA);

   handle_MA = iMA(Symbol(),0,InpPeriodMA,0,MODE_SMA,PRICE_CLOSE);
   if(handle_MA == INVALID_HANDLE)                                       // проверяем наличие хендла индикатора
   {
      Comment("Не удалось получить хендл индикатора handle_MA");         // если хендл не получен, то выводим сообщение в лог об ошибке
      Print("Не удалось получить хендл индикатора handle_MA");
      return(INIT_FAILED);                                                 // завершаем работу с ошибкой
   }

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   
   int ma_values_to_copy; 
   int ma_calculated = BarsCalculated(handle_MA); 
   if(ma_calculated <= 0){ 
      PrintFormat("BarsCalculated() вернул %d, код ошибки %d",ma_calculated,GetLastError()); 
      return(0); 
     }  
   if(prev_calculated == 0 || ma_calculated != ma_bars_calculated || rates_total > prev_calculated + 1){ 
      if(ma_calculated > rates_total) ma_values_to_copy = rates_total; 
      else ma_values_to_copy = ma_calculated; 
     } else { 
      ma_values_to_copy = (rates_total - prev_calculated) + 1; 
     } 
     
   if(CopyBuffer(handle_MA,0,0,ma_values_to_copy,buffer_MA) < 0 ) // копируем данные из индикаторного массива в массив buffer_HMA5
   {                                                                                // если не скопировалось
      Print("Не удалось скопировать данные из индикаторного буфера в buffer_MA");   // то выводим сообщение об ошибке
      return(0);                                                                    // и выходим из функции
   }

   for(int i = 0; i < ma_values_to_copy; i++)
     {
      Buffer1[i]  = buffer_MA[i]+(buffer_MA[i+1]-buffer_MA[i+InpShiftCorrection])/(InpShiftCorrection/GS);//1.314;
     }
   
   return(rates_total);
  }
//+------------------------------------------------------------------+

Что где не так?
Файлы:
my_MA_S.mq5  10 kb
 
Сергей Таболин:

MQL5

Никак не могу добиться толку. Может тут кто-нибудь подскажет?

Что где не так?
Два буфера, а в #property указан один