Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. En ninguna parte sin ti - 6. - página 501

 

Hola a todos.

Por favor, comente el inicio del indicador en la nueva construcción. Estoy interesado en el inicio del ciclo (cómo hacerlo correctamente). Aquí está el código de BolingerBands. Comenta los lugares con pregunta //¿Qué significa y para qué sirve?

En el tutorial hasta ahora todo es lo mismo 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);
  }
 

¿Y leer la documentación? Pisa una expresión incomprensible y pulsa la tecla mágica F1 o lee en la web.

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

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

 

Hola a todos. Por favor, ayuda, no puedo entender la situación actual.

En mi código necesito que buf0 se dibuje en pantalla, y que buf1 no se dibuje, sino que se cuente para el posterior procesamiento del array y la salida a otro buffer (por ejemplo en buf2). Oculto buf1 en una cadena:

SetIndexBuffer(0,Buf0);

SetIndexStyle (0,DRAW_LINE,STYLE_SOLID,1);

SetIndexBuffer(1,Buf1);

SetIndexStyle (1,DRAW_NONE); //Quiero ocultar esta línea

Pero cuando pongo el indicador me sale un desfase debido a la diferencia de cálculo...

PREGUNTA: ¿hay alguna forma de eliminar esta diferencia para que buf0 se dibuje normalmente?
Archivos adjuntos:
testbuf.mq4  2 kb
 
clubsmi:

Hola a todos. Por favor, ayuda, no puedo entender la situación actual.

En mi código necesito que buf0 se dibuje en pantalla, y que buf1 no se dibuje, sino que se cuente para el posterior procesamiento del array y la salida a otro buffer (por ejemplo enbuf2). Oculto buf1 en una cadena:

SetIndexBuffer(0,Buf0);

SetIndexStyle (0,DRAW_LINE,STYLE_SOLID,1);

SetIndexBuffer(1,Buf1);

SetIndexStyle (1,DRAW_NONE); //Quiero ocultar esta línea

Pero cuando pongo el indicador me sale un desfase debido a la diferencia de cálculo...

PREGUNTA: ¿hay alguna forma de eliminar esta diferencia para que buf0 se dibuje normalmente?

Lea sobre INDICATOR_DATA e INDICATOR_CALCULATIONS

Y antes de eso leer #property indicator_buffers y IndicatorBuffers(10); 10 es de mi indicador, no lo he borrado para mostrar un número no limitado de buffers como en la build de ME 509.

 
Suelo pulsar F1, pero las cosas no siempre están claras para un programador débil. Ejemplo - ArraySetAsSeries -> Establece la bandera AS_SERIES al objeto de array dinámico especificado, los elementos del array serán indexados como en timeseries.

Parámetros

array[]

[in][out] Arreglo numérico a establecer.

bandera

[in] La dirección de indexación del array.

Valor devuelto

Devuelve true si tiene éxito, en caso contrario false.

Pero qué da y cómo será for(i=0; i<InpBandsPeriod; i++) y for(i=InpBandsPeriod; i<0; i--) . Se reflejará en los bucles lo verdadero y lo falso. Esto no estaba presente en la versión 5xx. Tal vez sea posible prescindir de ArraySetAsSeries, pero entonces cuál sería el valor por defecto.O tal vez no.

 

gracias a AlexeyVik, lo he solucionado...

¿Quién puede decirme cuánto tiempo durará el antiguo lenguaje mql4 de la build 509? ¿Es necesario aprender el lenguaje a toda prisa de la nueva 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 función de Kim no funciona...

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 posición debería abrirse si no hay más posiciones con el asistente..... pero se abren en cada nueva barra con me......

 
Zver4991:


La función de Kim no funciona...

la posición debería abrirse si no hay más posiciones con el asistente..... pero se abren en cada nueva barra con me......


mira este ot - tiempo abierto ( 0 - cualquier tiempo abierto), ¿y tú?

 
gince:


mira este ot - tiempo abierto ( 0 - cualquier tiempo abierto), ¿y tú?

Y por qué

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

si no está abierto, abre

 
gince:


mira este ot - tiempo de apertura ( 0 - cualquier tiempo de apertura), y tu?


por lo que debe comprobar si no hay posiciones abiertas en absoluto con tal magik sin importar la hora de apertura..... simple limitación en el magik....toest

if(ExistPositions(NULL,-1,44444,-1)==false)//si no hay posiciones abiertas con este número mágico entonces comprobar......

.... o tal vez no entiendo.... tengo -1 porque no me importa cuando una posición abierta ..... de todos modos se abrirá sólo en una nueva barra y cuando la antigua se cierra porque las condiciones especifican que la posición puede abrirse sólo si no hay posiciones abiertas con este número mágico

para hacerlo aún más sencillo: abrir la posición y esperar a que se cierre.... cuando se cierra entonces se abre de nuevo y ciertamente no debe abrir en cada barra una posición con tal mago.... se comprueba de nuevo si no hay posiciones abiertas con tal mago