Qualquer pergunta de novato, de modo a não desorganizar o fórum. Profissionais, não passem por aqui. Em nenhum lugar sem você - 6. - página 501

 

Olá a todos.

Favor comentar sobre o início do indicador na nova construção. Estou interessado no início do ciclo (como fazê-lo corretamente). Aqui está o código da BolingerBands. Comente os lugares com perguntas // o que isso significa e para que serve?

No tutorial até agora, tudo é o mesmo de sempre 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);
  }
 

E ler a documentação? Pise em uma expressão incompreensível e pressione a tecla mágica F1 ou leia no site.

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

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

 

Olá a todos. Por favor, ajude-me, eu não consigo entender a situação atual.

Em meu código preciso que buf0 seja desenhado na tela, e buf1 não é desenhado, mas contado para processamento e saída posterior de array para outro buffer (por exemplo, em buf2). Eu escondo buf1 em um fio:

SetIndexBuffer(0,Buf0);

SetIndexStyle (0,DRAW_LINE,STYLE_SOLID,1);

SetIndexBuffer(1,Buf1);

SetIndexStyle (1,DRAW_NONE); //I quero esconder esta linha

Mas quando defino o indicador, recebo uma compensação devido à diferença no cálculo.

PERGUNTA: existe alguma maneira de remover essa diferença para que o buf0 seja desenhado normalmente?
Arquivos anexados:
testbuf.mq4  2 kb
 
clubsmi:

Olá a todos. Por favor, ajude-me, eu não consigo entender a situação.

Em meu código preciso que buf0 seja desenhado na tela, e buf1 não é desenhado, mas contado para processamento e saída posterior de array para outro buffer (por exemplo, embuf2). Eu escondo buf1 em um fio:

SetIndexBuffer(0,Buf0);

SetIndexStyle (0,DRAW_LINE,STYLE_SOLID,1);

SetIndexBuffer(1,Buf1);

SetIndexStyle (1,DRAW_NONE); //I quero esconder esta linha

Mas quando defino o indicador, recebo uma compensação devido à diferença no cálculo.

PERGUNTA: existe alguma maneira de remover essa diferença para que o buf0 seja desenhado normalmente?

Leia sobre INDICATOR_DATA e INDICATOR_CALCULATIONS

E antes disso leia #property indicator_buffers e IndicatorBuffers(10); 10 é do meu indicador, eu não o apaguei para mostrar um número não limitado de buffers como no ME 509 build.

 
Eu costumo pressionar F1, mas as coisas nem sempre são claras para um programador fraco. Exemplo - ArraySetAsSeries -> Sets AS_SERIES flag to specified dynamic array object, array elements will be indexed as in timeseries.

Parâmetros

matriz[]

[dentro][fora] matriz numérica a definir.

bandeira

[em] A direção de indexação da matriz.

Valor retornado

Retorna verdadeiro se bem-sucedido, caso contrário, falso.

Mas o que dá e como será para(i=0; i<InpBandsPeriod; i++) e para(i=InpBandsPeriod; i<0; i--) . Será verdadeiro e falso refletir-se nos laços. Isto não estava presente no build 5xx. Talvez seja possível fazer sem ArraySetAsSeries, mas então o que seria o padrão.Ou talvez você não.

 

graças a AlexeyVik, resolveu o problema...

Quem pode me dizer quanto tempo durará o antigo idioma mql4 da construção 509? é necessário aprender o idioma à pressa a partir da nova construção?

 
//|  Параметры:                                                                |
//|    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);
}

A função da kim não está funcionando...

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;
                       }
                   
      }
  }            
       }   

a posição deve abrir se não houver mais posições com o wizard..... mas elas abrem em cada novo bar comigo......

 
Zver4991:


A função da kim não está funcionando...

a posição deve abrir se não houver mais posições com o wizard..... mas elas abrem em cada novo bar comigo......


olhe para este ot - tempo aberto( 0 - qualquer tempo aberto), e você?

 
gince:


olhe para este ot - tempo aberto ( 0 - qualquer tempo aberto), e você?

E por que

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

se não houver aberto, aberto

 
gince:


veja este ot - tempo de abertura ( 0 - qualquer tempo de abertura), e você?


portanto, deve verificar se não há nenhuma posição aberta com tal magik, não importa o tempo de abertura..... limitação simples no magik....toast

if(ExistPosições(NULL,-1,44444,-1)==falso)// se não houver posições em aberto com este número mágico, então verifique......

.... ou talvez eu não entenda.... Tenho -1 porque não me importo quando uma posição aberta ..... de qualquer forma abrirá apenas em um novo bar e quando o antigo estiver fechado porque as condições especificam que a posição só pode abrir se não houver posições abertas com este número mágico

para torná-lo ainda mais simples: abrir posição e esperar até o fechamento.... quando fecha, então abre novamente e certamente não deve abrir em cada bar uma posição com este mágico.... é novamente verificado na condição de ver se não há posições abertas com este mágico.