Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 501

 

Привет всем.

Пожалуйства прокоментируйте начало индикатора в новом билде. Меня интересует запуск цикла (как правильно жто надо делать). Тут вставил код с БолингерБандс. Прокоментируйте те места, где стоит вопрос //что это значит ? и зачем жто ?

В учебнике пока еже все по старому https://book.mql4.com/ru/samples/icustom

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 i,pos;
//---
   if(rates_total<=InpBandsPeriod || InpBandsPeriod<=0)    //что это значит ?
      return(0);
//--- counting from 0 to rates_total
   ArraySetAsSeries(ExtMovingBuffer,false);                //что это значит ?
   ArraySetAsSeries(ExtUpperBuffer,false);                 //что это значит ?
   ArraySetAsSeries(ExtLowerBuffer,false);                 //что это значит ?
   ArraySetAsSeries(ExtStdDevBuffer,false);                //что это значит ?
   ArraySetAsSeries(close,false);
//--- initial zero
   if(prev_calculated<1)                                  //что это значит ?
     {
      for(i=0; i<InpBandsPeriod; i++)                      //что это значит ?
        {
         ExtMovingBuffer[i]=EMPTY_VALUE;                   //что это значит ?
         ExtUpperBuffer[i]=EMPTY_VALUE;                    //что это значит ?
         ExtLowerBuffer[i]=EMPTY_VALUE;                    //что это значит ?
        }
     }
//--- starting calculation
   if(prev_calculated>1)                                   //что это значит ?
      pos=prev_calculated-1;                               //что это значит ?
   else                                                    //что это значит ?
      pos=0;//что это значит ?
//--- main cycle
   for(i=pos; i<rates_total && !IsStopped(); i++)          //что это значит ?
     {
      //--- 
      
      //код индикатора в цикле
      
      //---
     }
//---- OnCalculate done. Return new prev_calculated.
   return(rates_total);
  }
 

А в документации прочесть? Наступить на непонятное выражение и нажать волшебную клавишу F1 или почитать на сайте.

https://docs.mql4.com/ru/array/arraysetasseries

https://docs.mql4.com/ru/basis/function/events#oncalculate

 

Всем привет. Прошу помощи, не магу разобрать в сложившийся ситуации.

В представленном мною коде мне нужно чтобы buf0 рисовался на экране, а buf1 не рисовался, но считался для дальнейшей обработки массивов и вывода в другой буфер (к примеру в buf2). Я скрываю buf1 в строке:

SetIndexBuffer(0,Buf0);

SetIndexStyle (0,DRAW_LINE,STYLE_SOLID,1);

SetIndexBuffer(1,Buf1);

SetIndexStyle (1,DRAW_NONE); //хочу скрыть эту линию

Но при установке индикатора получаю смещение из-за разницы расчетов…

ВОПРОС: можно ли как то убрать эту разницу, чтобы buf0 рисовался нармально?
Файлы:
testbuf.mq4  2 kb
 
clubsmi:

Всем привет. Прошу помощи, не магу разобрать в сложившийся ситуации.

В представленном мною коде мне нужно чтобы buf0 рисовался на экране, а buf1 не рисовался, но считался для дальнейшей обработки массивов и вывода в другой буфер (к примеру в buf2). Я скрываю buf1 в строке:

SetIndexBuffer(0,Buf0);

SetIndexStyle (0,DRAW_LINE,STYLE_SOLID,1);

SetIndexBuffer(1,Buf1);

SetIndexStyle (1,DRAW_NONE); //хочу скрыть эту линию

Но при установке индикатора получаю смещение из-за разницы расчетов…

ВОПРОС: можно ли как то убрать эту разницу, чтобы buf0 рисовался нармально?

Прочти о INDICATOR_DATA и INDICATOR_CALCULATIONS

А до этого прочти #property indicator_buffers и IndicatorBuffers(10); 10 это из моего индикатора, удалять не стал чтобы показать не ограниченность количества буферов как в МЕ 509 билда.

 
F1 нажимаю часто. но для слабого програмиста не всегда все понятно. Пример - ArraySetAsSeries ->Устанавливает флаг AS_SERIES указанному объекту динамического массива, индексация элементов массива будет производиться как в таймсериях.

Параметры

array[]

[in][out] Числовой массив для установки.

flag

[in] Направление индексирования массива.

Возвращаемое значение

Возвращает true в случае успеха, иначе false

Но что что дает и как это будет при for(i=0; i<InpBandsPeriod; i++) и for(i=InpBandsPeriod; i<0; i--) . Будит ли отражатся в циклах true и false. В билдах 5хх этого небыло. Может можно без ArraySetAsSeries, но тогда что будет по умолчанию.А может нельзя.

 

спасибо AlexeyVik, разобрался...

кто подскажет как долго старый язык mql4 с 509 билда просуществует? нужно ли в торопях изучать язык с нового билда?

 
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//|    ot - время открытия             ( 0   - любое время открытия)           |
//+----------------------------------------------------------------------------+
bool ExistPositions(string sy="", int op=-1, int mn=-1, datetime ot=0) {
  int i, k=OrdersTotal();
 
  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (ot<=OrderOpenTime()) return(True);
            }
          }
        }
      }
    }
  }
  return(False);
}

не работает функция от кима...

if(IsNewBar()==true)
{
if(ExistPositions(NULL,-1,44444,-1)==false)
           {
       
                  trade=true;
                         
            if(trade!=false)
              {
                    
                        OpenPosition(Symbol(),OP_BUY,0.1,Ask-sl*Point,Ask+tp*Point,44444);

                        trade=false;
                       }
                   
      }
  }            
       }   

должна открыватся позиция при условии что нету больше позиций стаким магиком.....а они открываются на каждом новом баре у меня......

 
Zver4991:


не работает функция от кима...

должна открыватся позиция при условии что нету больше позиций стаким магиком.....а они открываются на каждом новом баре у меня......


посмотри на это ot - время открытия ( 0 - любое время открытия), а у тебя?

 
gince:


посмотри на это ot - время открытия ( 0 - любое время открытия), а у тебя?

И зачем

trade=true;if(trade!=false) .......
                          

если нет открытой, открываем

 
gince:


посмотри на это ot - время открытия ( 0 - любое время открытия), а у тебя?


так она должна проверить нету ли воопще открытых позиций с таким магиком без разницы с каким временем открытия.....простое ограничение по магику....тоесть

if(ExistPositions(NULL,-1,44444,-1)==false)//если нету открытых позиций с таким магиком то делаем что то......

....или я что то не доганяю....у меня стоит -1 потому что мне все равно когда открылась позиция .....ведь она и так у мееня будет открыватся только на новом баре и в том случае когда закрылась старая так как в услвии задано что открывать позу можна только когда нету открытых с таким магиком

если ещо проще то открыли позу и ждем пока она не закроетя.... когда закроется тогда открываем снова и уж ни как не должно открыватся на каждом баре позиции с таким магиком....ведь снова в условии задано проверять нету ли открытых позиций с таким магиком

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