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

 
mwwm:

а как правильно это выполнять?

А как вы это делаете?
 
Artyom Trishkin:
А как вы это делаете?
int OnCalculate(const int rates_total, 
                const int prev_calculated, 
                const datetime &time[], 
                const double &Op[], 
                const double &Hi[], 
                const double &Lo[], 
                const double &Cl[], 
                const long &tick_volume[], 
                const long &volume[], 
                const int &spread[]) 
  { 
   ArraySetAsSeries(time,true); 
   ArraySetAsSeries(Op,true); 
   ArraySetAsSeries(Hi,true); 
   ArraySetAsSeries(Lo,true); 
   ArraySetAsSeries(Cl,true); 
//--- 
double mas[];
   if(prev_calculated==0) 
     { 
      int prices1=CopyOpen(Symbol(),0,0,Bars(_Symbol,_Period),Op);
      int prices2=CopyHigh(Symbol(),0,0,Bars(_Symbol,_Period),Hi); 
      int prices3=CopyLow(Symbol(),0,0,Bars(_Symbol,_Period),Lo); 
      int prices4=CopyClose(Symbol(),0,0,Bars(_Symbol,_Period),Cl); 
      int prices5=CopyTime(Symbol(),0,0,Bars(_Symbol,_Period),time); 

     } 
   else 
     { 

      int prices1=CopyOpen(Symbol(),0,0,1,Op);
      int prices2=CopyHigh(Symbol(),0,0,1,Hi); 
      int prices3=CopyLow(Symbol(),0,0,1,Lo); 
      int prices4=CopyClose(Symbol(),0,0,1,Cl);     
      int prices5=CopyTime(Symbol(),0,0,1,time);     
       }   
      for(int i=rates_total-1;i>=0 && !IsStopped();) {
      mas[i]=Op[i]/Cl[i];
      i--;
      }
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+-------------------------------

Упрощенно так, CopyOpen я так понимаю лишнее для OnCalculate, но так он видит только историю из окна терминала? 

 
mwwm:

Упрощенно так, CopyOpen я так понимаю лишнее для OnCalculate, но так он видит только историю из окна терминала? 

Массив mas на каждом тике создается с нулевым размером и далее нигде не меняет свой размер. Поэтому любое обращение к нему вызовет выход за пределы массива. 

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

 
mwwm:

Упрощенно так, CopyOpen я так понимаю лишнее для OnCalculate, но так он видит только историю из окна терминала? 

Пример:

//+------------------------------------------------------------------+
//|                                                         Test.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                             https://mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://mql5.com/ru/users/artmedia70"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot OC
#property indicator_label1  "Open/Close"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- indicator buffers
double         BufferOC[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- Задаём массив BufferOC как буфер индикатора
   SetIndexBuffer(0,BufferOC,INDICATOR_DATA);
//--- Устанавливаем ему направление индексации как у таймсерии
   ArraySetAsSeries(BufferOC,true);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
//--- Проверка на минимальное колиество баров для расчёта
   if(rates_total<1) return 0;
//--- Установка массивов буферов как таймсерий
   ArraySetAsSeries(open,true);
   ArraySetAsSeries(close,true);
//--- Проверка и расчёт количества просчитываемых баров
   int limit=rates_total-prev_calculated;
   if(limit>1) // если это первый запуск, или изменение истории, или открытие нового бара
     {
      limit=rates_total-1;                   // установим начало цикла на начало исторических данных
      ArrayInitialize(BufferOC,EMPTY_VALUE); // инициализируем массив
     }
//--- Расчёт индикатора
   for(int i=limit; i>=0 && !IsStopped(); i--)
     {
      if(close[i]==0) continue;
      BufferOC[i]=open[i]/close[i];
     }

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
Ihor Herasko:

Массив mas на каждом тике создается с нулевым размером и далее нигде не меняет свой размер. Поэтому любое обращение к нему вызовет выход за пределы массива. 

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

Моя неточность, mas[] это действительно глобальный массив должен быть, но и индикаторный буфер тоже не подходит, скорее это будет промежуточный многомерный массив. Как лучше определять оптимальный размер массива для М5, не через индикаторный буфер?  

 
mwwm:

Моя неточность, mas[] это действительно глобальный массив должен быть, но и индикаторный буфер тоже не подходит, скорее это будет промежуточный многомерный массив. Как лучше определять оптимальный размер массива для М5, не через индикаторный буфер?  

Про многомерный - не понял. Ведь речь идет об одномерном массиве. Кроме того, в MQL4 максимум измерений массива - 4. 

Чтобы сделать массив такого же размера, как размер таймсерий, нужно изменить его размер в соответствии с количеством баров, имеющихся на графике нужного символа и периода:

double fArray[];
int nBarsCnt = iBars(<символ>, <таймфрейм>);
if (ArrayResize(fArray, nBarsCnt) != nBarsCnt)
{
   // Не удалось изменить размер массива
   return;
}

ArraySetAsSeries(fArray, true);
 
mwwm:

Моя неточность, mas[] это действительно глобальный массив должен быть, но и индикаторный буфер тоже не подходит, скорее это будет промежуточный многомерный массив. Как лучше определять оптимальный размер массива для М5, не через индикаторный буфер?  

Почему не хотите использовать массивы как буферы индикатора? За ними следит подсистема, что облегчает вам работу.

А промежуточный массив-буфер индикатора делается легко:

SetIndexBuffer(1,BufferMA,INDICATOR_CALCULATIONS);
 

Здравствуйте.

На платформе объемы тиковые,реальные объёмы будут?

 
Олег Литинский:

Здравствуйте.

На платформе объемы тиковые,реальные объёмы будут?

Не будет. Используйте МТ5, там некоторые брокеры предоставляют реальные объемы.

 

Добрый день!

Прошу помочь со следующей проблемой:

1) После выполнения некоторых условий, открывается отложенный ордер:

{
price=High[1]+OrderPoint*Point;
stoploss=Low[1]-Point;
takeprofit=price+price-stoploss;
OrderSend(Symbol(),OP_BUYSTOP,1,price,3,stoploss,takeprofit);
}

Подскажите пожалуйста, что нужно дописать и куда, чтобы неоткрывшийся отложенный ордер был удален в том случае, если цена уже прошла стоп лосс(этого неоткрывшегося оредра).

Извините за глупый вопрос, заблудился в форумах пока искал ответ.

Заранее благодарю!

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