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

 
EVGENII SHELIPOV #:

Доброе время суток .

Вывожу на монитор величину дневного фрактала в виде его величины или вертикальной линии. Линия не отображается а величина равна 0.

Вот часть кода


 Подскажите в чем ошибка

Потому что величина равна 0.  Фрактал образуется спустя n-свечей

 
Vitaly Muzichenko #:

Массив на всю доступную историю, мне это не нужно.

Нужно буквально 50-100 баров

Вот так


А в чем смысл индикатора? Если не секрет конечно) Там конечно проблема в отображении времени. Т.е. это не реальное время тиков, а по номерное. Каждый номер на своем баре ТФ. 

 
Valeriy Yastremskiy #:

А в чем смысл индикатора? Если не секрет конечно) Там конечно проблема в отображении времени. Т.е. это не реальное время тиков, а по номерное. Каждый номер на своем баре ТФ. 

Смысл, видеть последние тики на открытом графике :)

P.S. * изменение Ask и Bid

Как в Обзоре рынка


 
Tretyakov Rostyslav #:

Потому что величина равна 0.  Фрактал образуется спустя n-свечей

Фрактал образовывается если нет нового экстремума и через три бара те 0, 1, 2. 

double FractalDayUpper = iFractals(Symbol(), PERIOD_D1, MODE_UPPER, 2);
   ObjectCreate("signal00",OBJ_LABEL,0,0,0,0,0);
   ObjectSet("signal00",OBJPROP_XDISTANCE,600);
   ObjectSet("signal00",OBJPROP_YDISTANCE,100);

Ничего не изменилось.

Или что то опять не правильно 

 
Vitaly Muzichenko #:

Это сделал, работает

---

Что-то подсказывает, что можно обойтись без цикла.

Так ли это?

Вроде в MQL нет функции сдвига массива, на сколько я знаю. Значит, сдвиг можно сделать только с помощью цикла. А чем он Вас не устраивает?

P.S. На счёт дополнительного массива, он был не нужен. Вы правильно сделали сдвиг и запись значения bid прямо в буфере!

 
EVGENII SHELIPOV #:

Доброе время суток .

Вывожу на монитор величину дневного фрактала в виде его величины или вертикальной линии. Линия не отображается а величина равна 0.

Вот часть кода


 Подскажите в чем ошибка

А почему Вы уверены, что фрактал на нулевом баре обязательно должен быть не 0? Когда, не 0 будет только в том случае, если он там есть!


Tretyakov Rostyslav #:

Потому что величина равна 0.  Фрактал образуется спустя n-свечей

И это тоже бывает далеко не всегда. Только в том случае если n-й бар является фракталом!

 
Vitaly Muzichenko #:

Смысл, видеть последние тики на открытом графике :)

P.S. * изменение Ask и Bid

Как в Обзоре рынка


А мне подумалось скорости мерять)))

 
Vitaly Muzichenko #:

Смысл, видеть последние тики на открытом графике :)

P.S. * изменение Ask и Bid

Как в Обзоре рынка


ArrayCopy() чем не подходит?
Документация по MQL5: Операции с массивами / ArrayCopy
Документация по MQL5: Операции с массивами / ArrayCopy
  • www.mql5.com
ArrayCopy - Операции с массивами - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Artyom Trishkin #:
ArrayCopy() чем не подходит?

ArrayCopy, это для копирования из одного массива в другой. А здесь нужно сдвигать значения перед добавлением каждого тика. Поэтому, решается только с помощью цикла.

 
Artyom Trishkin #:
ArrayCopy() чем не подходит?

Как это использовать, можно показать?

Задача вот

Вот готовый код, но цикл немного пугает

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots   2
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrDodgerBlue
#property indicator_label1  "Bid"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrRed
#property indicator_label2  "Ask"

double Buffer1[];
double Buffer2[];
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnInit()
{
  SetIndexBuffer(0,Buffer1);
  ArraySetAsSeries(Buffer1,true);
  SetIndexBuffer(1,Buffer2);
  ArraySetAsSeries(Buffer2,true);
  ArrayInitialize(Buffer1,EMPTY_VALUE);
  ArrayInitialize(Buffer2,EMPTY_VALUE);
  IndicatorSetInteger(INDICATOR_DIGITS,Digits());
  IndicatorSetString(INDICATOR_SHORTNAME,"Tick:");
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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 H=100;
  if(prev_calculated==0) {
    ArrayInitialize(Buffer1,EMPTY_VALUE);
    ArrayInitialize(Buffer2,EMPTY_VALUE);
  }
  if(rates_total-prev_calculated==1) {
    Buffer1[H+1]=EMPTY_VALUE;
    Buffer2[H+1]=EMPTY_VALUE;
  }
  double b=SymbolInfoDouble(Symbol(),SYMBOL_BID);
  double a=SymbolInfoDouble(Symbol(),SYMBOL_ASK);
  Buffer1[0]=b;
  Buffer2[0]=a;
  for(int j=H; j>0; j--) {
    Buffer1[j]=Buffer1[j-1];
    Buffer2[j]=Buffer2[j-1];
  }
  return(rates_total);
}
//+------------------------------------------------------------------+

---

Опять-же, внутри ArrayCopy()  есть цикл, и возможно не один. Так что код от замены вряд-ли станет легче и быстрее