Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 6. - pagina 501

 

Ciao a tutti.

Si prega di commentare l'inizio dell'indicatore nella nuova costruzione. Sono interessato all'avvio del ciclo (come farlo correttamente). Ecco il codice di BolingerBands. Commentare i luoghi con la domanda //che cosa significa e a cosa serve?

Nel tutorial finora tutto è il solito vecchio 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 leggere la documentazione? Passa su un'espressione incomprensibile e premi il magico tasto F1 o leggi sul sito web.

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

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

 

Ciao a tutti. Per favore aiutatemi, non riesco a capire la situazione.

Nel mio codice ho bisogno che buf0 sia disegnato sullo schermo, e che buf1 non sia disegnato, ma contato per l'ulteriore elaborazione dell'array e l'output in un altro buffer (per esempio in buf2). Nascondo buf1 in una stringa:

SetIndexBuffer(0,Buf0);

SetIndexStyle (0,DRAW_LINE,STYLE_SOLID,1);

SetIndexBuffer(1,Buf1);

SetIndexStyle (1,DRAW_NONE); //voglio nascondere questa linea

Ma quando imposto l'indicatore ottengo un offset dovuto alla differenza di calcolo...

DOMANDA: c'è un modo per rimuovere questa differenza in modo che buf0 sia disegnato normalmente?
File:
testbuf.mq4  2 kb
 
clubsmi:

Ciao a tutti. Per favore aiutatemi, non riesco a capire la situazione.

Nel mio codice ho bisogno che buf0 sia disegnato sullo schermo, e che buf1 non sia disegnato, ma contato per l'ulteriore elaborazione dell'array e l'output in un altro buffer (per esempio inbuf2). Nascondo buf1 in una stringa:

SetIndexBuffer(0,Buf0);

SetIndexStyle (0,DRAW_LINE,STYLE_SOLID,1);

SetIndexBuffer(1,Buf1);

SetIndexStyle (1,DRAW_NONE); //voglio nascondere questa linea

Ma quando imposto l'indicatore ottengo un offset dovuto alla differenza di calcolo...

DOMANDA: c'è un modo per rimuovere questa differenza in modo che buf0 sia disegnato normalmente?

Leggi su INDICATOR_DATA e INDICATOR_CALCULATIONS

E prima di questo leggere #property indicator_buffers e IndicatorBuffers(10); 10 è dal mio indicatore, non l'ho cancellato per mostrare un numero non limitato di buffer come nella build ME 509.

 
Premo spesso F1, ma le cose non sono sempre chiare per un programmatore debole. Esempio - ArraySetAsSeries -> Imposta il flag AS_SERIES all'oggetto array dinamico specificato, gli elementi dell'array saranno indicizzati come in una serie temporale.

Parametri

array[]

[in][out] Matrice numerica da impostare.

bandiera

[in] La direzione di indicizzazione dell'array.

Valore restituito

Restituisce true se ha successo, altrimenti false.

Ma cosa dà e come sarà for(i=0; i<InpBandsPeriod; i++) e for(i=InpBandsPeriod; i<0; i--) . Il vero e il falso si rifletteranno nei cicli. Questo non era presente nella build 5xx. Forse è possibile fare a meno di ArraySetAsSeries, ma allora quale sarebbe il default.O forse no.

 

grazie ad AlexeyVik, ho capito tutto...

Chi può dirmi quanto durerà il vecchio linguaggio mql4 della build 509? è necessario imparare in fretta il linguaggio dalla nuova build?

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

la funzione di kim non funziona...

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

la posizione dovrebbe aprirsi se non ci sono più posizioni con il wizard..... ma si aprono su ogni nuova barra con me......

 
Zver4991:


la funzione di kim non funziona...

la posizione dovrebbe aprirsi se non ci sono più posizioni con il wizard..... ma si aprono su ogni nuova barra con me......


guardate questo ot - tempo aperto(0 - qualsiasi tempo aperto), e voi?

 
gince:


guardate questo ot - tempo aperto (0 - qualsiasi tempo aperto), e voi?

E perché

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

se non c'è un'apertura, aprire

 
gince:


guardate questo ot - tempo di apertura ( 0 - qualsiasi tempo di apertura), e voi?


quindi dovrebbe controllare se non ci sono posizioni aperte con un tale magik non importa a che ora di apertura..... semplice limitazione sul magik....toast

if(ExistPositions(NULL,-1,44444,-1)==falso)//se non ci sono posizioni aperte con questo numero magico allora check......

.... o forse non capisco.... ho -1 perché non mi interessa quando una posizione si è aperta ..... comunque si aprirà solo su una nuova barra e quando la vecchia è chiusa perché le condizioni specificano che la posizione può aprire solo se non ci sono posizioni aperte con questo numero magico

per renderlo ancora più semplice: aprire la posizione e aspettare che si chiuda.... quando si chiude poi si apre di nuovo e certamente non dovrebbe aprire su ogni barra una posizione con un tale mago.... è controllato di nuovo se non ci sono posizioni aperte con tale mago

Motivazione: