Preguntas de los principiantes MQL4 MT4 MetaTrader 4 - página 219

 
Vitaly Muzichenko:
Vitaly Muzichenko:
void OnTick()
  {
     ......здесь работаем с закрытием (тралом и прочим)....
if (Hour()>=10 && Hour()<11) return (0);
     ......остальной код, в частности для открытия....
  }


выдает ошибку: 'return' - 'void' function returns a value Vitaly Muzichenko:
 
Oventu:
void OnTick()
  {
     ......здесь работаем с закрытием (тралом и прочим)....
if (Hour()>=10 && Hour()<11) return;
     ......остальной код, в частности для открытия....
  }
 
Vitaly Muzichenko:
Vitaly Muzichenko:
Gracias.
 
Hola, ¿qué pasa con OrdersTotal()?
Siempre supe que contiene el número de pedidos -1, es decir, OrdersTotal()-1 y todo funcionaba, pero me puse a escribir un programa y de repente, un pedido ya no se cuenta, le pregunté a OrdersTotal() y me dio el número total de pedidos = 3, en lugar de 3-1.
¿Qué pasa?

La forma habitual del bucle en la ayuda:

int total=OrdersTotal();
for(int pos=0;pos<total;pos++)
{
}

Es decir, el primer orden es igual a cero.

Pero no, de hecho, el primer orden es 1, lo que significa que debemos empezar la búsqueda desde 1 y no desde cero?
¿Las metacitas han hecho algo mal o soy un estúpido?

Документация по MQL5: Торговые функции / OrdersTotal
Документация по MQL5: Торговые функции / OrdersTotal
  • www.mql5.com
Не следует путать между собой действующие отложенные ордера и позиции, которые также отображаются на вкладке "Торговля" в панели "Инструменты". Ордер – это распоряжение на проведение торговой операции, а позиция является результатом одной или нескольких сделок.
 
Maksim Mihajlov:
Hola, ¿qué pasa con OrdersTotal()?
Siempre supe que contiene el número de pedidos -1, es decir, OrdersTotal()-1, y todo funcionaba, pero empecé a escribir un programa y de repente no se cuenta un pedido. Pedí OrdersTotal() y dice total de pedidos = 3, en lugar de 3-1.
¿Qué pasa?

La forma habitual del bucle en la ayuda:

int total=OrdersTotal();
for(int pos=0;pos<total;pos++)
{
}

Es decir, el primer orden es igual a cero.

Pero no, de hecho, el primer orden es 1, lo que significa que debemos empezar la búsqueda desde 1 y no desde cero?
¿Las metacitas han hecho algo mal, o soy un estúpido?

Has confundido las Órdenes Relacionadas y las Venenosas. Lea la referencia. Sea más específico en su pregunta: ¿qué está tratando de contar: PEDIDOS RETIRADOS o PUESTOS? Y sí, no ha cambiado nada: el índice del primer elemento empieza por '0'.


Añadido: ejemplo

Ejemplo: Calcular posiciones y órdenes pendientes

How to start with MQL5
How to start with MQL5
  • 2020.03.12
  • www.mql5.com
This thread discusses MQL5 code examples. There will be examples of how to get data from indicators, how to program advisors...
 
Vladimir Karputov:

Has confundido las ORDENES RELACIONADAS y los PUESTOS. Lea la referencia. Formule su pregunta con más precisión: ¿qué está tratando de contar: ÓRDENES RETIRADOS o PUESTOS? Y sí, no ha cambiado nada: el índice del primer elemento empieza por '0'.


Añadido: ejemplo

Ejemplo: Calcular posiciones y órdenes pendientes

Me refiero a MQL4, no a MQL5, ¡no hay diferencia entre órdenes pendientes y de mercado!

 
Maksim Mihajlov:

Me refiero a MQL4, no a MQL5, ¡no hay división en pendientes y pendientes de mercado!

Estás escribiendo en el foro de MQl5. Está escribiendo en la sección principal. Si escribes en el foro de MQL5, obtendrás respuestas sobre MQL5.

Las preguntas sobre el antiguo terminal se dirigen a la sección especial: MQL4 y MetaTrader 4. A partir de ahora, escribe ahí. Le haré llegar sus preguntas.

 

He comparado dos variantes, en la primera, he utilizado OrdersTotal()-1 y he empezado la búsqueda desde cero - he obtenido el error
. En la segunda variante, he empezado con uno y he tomado todo OrdersTotal() - esta vez no hay error

En las capturas de pantalla, puede ver que OrdersTotal() muestra el número real de pedidos, no OrdersTotal()-1 ...

La pregunta es
por qué OrdersTotal() muestra el número real de pedidos, en lugar de -1, ¿debería ser así o es algo nuevo?
Porque en este caso, debemos empezar la búsqueda no desde el cero, sino desde el uno.

Archivos adjuntos:
4.png  181 kb
2.png  186 kb
 
Maksim Mihajlov:

He comparado dos variantes, en la primera, he utilizado OrdersTotal()-1 y he empezado la búsqueda desde cero - he obtenido el error
. En la segunda variante, he empezado con uno y he tomado todo OrdersTotal() - esta vez no hay error

En las capturas de pantalla, puede ver que OrdersTotal() muestra el número real de pedidos, no OrdersTotal()-1 ...

La pregunta es
por qué OrdersTotal() muestra el número real de pedidos, en lugar de -1, ¿debería ser así o es algo nuevo?
Porque en este caso, debemos empezar la búsqueda no desde el cero, sino desde el uno.

Creo que he entendido mi error, lo siento...
Hay un offset de -1 en esta condición:
if (OrderSelect(i-1,SELECT_BY_POS)==true){}
¡Perdón por ser tan brusco, tomé la cadena de otro programa y no presté atención al offset!

 
Hola. Necesito su ayuda para corregir el indicador. La esencia del indicador es la siguiente. Calcule la magnitud del aumento del precio en relación con la barra anterior. Para el cero se necesita una barra de estrella. Es decir, el precio de apertura es igual al de cierre. Al compilar no hay errores, pero al probar un error en la línea 80 20 caracteres. Lalínea de señaltambién está mal dibujada. Pero creo que esta es la razón del cálculo incorrecto del buffer principal. Por favor, ayúdenme a solucionarlo.
//+------------------------------------------------------------------+
//|                                                         MSBB.mq4 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

#include <MovingAverages.mqh>

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1  clrGreen
#property indicator_color2  clrRed
#property  indicator_width1  1
input int            InpMSBBPeriod=3;        // Period
input ENUM_MA_METHOD InpMSBBMethod=MODE_SMA;  // Method
//--- indicator buffers
double         ExtMSBBBuffer[];
double         ExtTempBuffer[];
double         ExtPriceBuffer[];
double         ExtSignalBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit(void)
  {
//--- indicator buffers mapping
   IndicatorDigits(Digits-2);
//--- drawing settings
   IndicatorBuffers(4);
   SetIndexStyle(0,DRAW_HISTOGRAM);
   SetIndexBuffer(0,ExtMSBBBuffer);
   SetIndexBuffer(1,ExtSignalBuffer);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(2,ExtTempBuffer);
   SetIndexBuffer(2,ExtPriceBuffer);
   SetIndexDrawBegin(1,InpMSBBPeriod);
//--- name for DataWindow and indicator subwindow label
   IndicatorShortName("MSBB("+IntegerToString(InpMSBBPeriod)+")");
   SetIndexLabel(0,"MSBB");
   SetIndexLabel(1,"Signal");
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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;//limit;
//------
   if(rates_total<=InpMSBBPeriod || InpMSBBPeriod<=2)
      return(0);
   /*//--- counting from 0 to rates_total
      ArraySetAsSeries(ExtMSBBBuffer,false);
      ArraySetAsSeries(ExtSignalBuffer,false);
      ArraySetAsSeries(open,false);
      ArraySetAsSeries(high,false);
      ArraySetAsSeries(low,false);
      ArraySetAsSeries(close,false);*/
//---
  // limit=rates_total-prev_calculated;
   //if(prev_calculated>0)
     // limit++;
//--- typical price and its moving average
   for(i=0; i<rates_total; i++)
     {
      ExtTempBuffer[i] = NormalizeDouble((close[i]-open[i])/Point(),2);
      ExtPriceBuffer[i] = NormalizeDouble((close[i+1]-open[i+1])/Point(),2);
      //ExtMSBBBuffer[i]=price_open+ExtTempBuffer[i];
      //Print("ExtPriceBuffer[i] = ", ExtPriceBuffer[i]);
      if(ExtTempBuffer[i]==0)
         ExtMSBBBuffer[i]=0.0;
      if(ExtPriceBuffer[i]>0 && ExtTempBuffer[i]>0)
        {
         double price_open = NormalizeDouble((open[i]-open[i+1])/Point(),2);
         double price_close = NormalizeDouble((close[i]-close[i+1])/Point(),2);
         if((price_open<0 && price_close>0)||(price_open>0 && price_close<0))
            ExtMSBBBuffer[i] = 0.0;
         if((price_open<0 && price_close<0)||(price_open>0 && price_close>0))
            ExtMSBBBuffer[i]=ExtTempBuffer[i]+price_open;
        }
      if(ExtPriceBuffer[i]>0 && ExtTempBuffer[i]<0)
        {
         double price_open = NormalizeDouble((open[i]-close[i+1])/Point(),2);
         double price_close = NormalizeDouble((close[i]-open[i+1])/Point(),2);
         if((price_open<0 && price_close>0)||(price_open>0 && price_close<0))
            ExtMSBBBuffer[i] = 0.0;
         if((price_open>0 && price_close>0)||(price_open<0 && price_close<0))
            ExtMSBBBuffer[i]=ExtTempBuffer[i]+price_open;
        }
      if(ExtPriceBuffer[i]<0 && ExtTempBuffer[i]<0)
        {
         double price_open = NormalizeDouble((open[i]-open[i+1])/Point(),2);
         double price_close = NormalizeDouble((close[i]-close[i+1])/Point(),2);
         if((price_open<0 && price_close>0)||(price_open>0 && price_close<0))
            ExtMSBBBuffer[i]=0.0;
         if((price_open<0 && price_close<0)||(price_open>0 && price_close>0))
            ExtMSBBBuffer[i]=ExtTempBuffer[i]+price_open;
        }
      if(ExtPriceBuffer[i]<0 && ExtTempBuffer[i]>0)
        {
         double price_open = NormalizeDouble((open[i]-close[i+1])/Point(),2);
         double price_close = NormalizeDouble((close[i]-open[i+1])/Point(),2);
         if((price_open>0 && price_close<0)||(price_open<0 && price_close>0))
            ExtMSBBBuffer[i]=0.0;
         if((price_open>0 && price_close>0)||(price_open<0 && price_close<0))
            ExtMSBBBuffer[i]=ExtTempBuffer[i]+price_open;
        }
      //--- signal line counted in the 2-nd buffer
      //ExtSignalBuffer[i]=iMAOnArray(ExtMSBBBuffer,0,InpMSBBPeriod,0,InpMSBBMethod,0);
      SimpleMAOnBuffer(rates_total,prev_calculated,1,InpMSBBPeriod+2,ExtMSBBBuffer,ExtSignalBuffer);
      Print ("ExtSignalBuffer = ", ExtSignalBuffer[i]);
      //--- done
     }
   /* if(ExtPriceBuffer[i]>0||ExtPriceBuffer[i]<0)
     {
      ExtMSBBBuffer[i] = ExtPriceBuffer[i]+ExtTempBuffer[i];
      Print("ExtMSBBBuffer[i] = ", ExtMSBBBuffer[i]);
     }
   if(ExtPriceBuffer[i]==0)
     {
      ExtMSBBBuffer[i] = 0.0;
      Print("ExtMSBBBuffer[i] = ", ExtMSBBBuffer[i]);
     }
   }*/
//---
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
Документация по MQL5: Константы, перечисления и структуры / Константы индикаторов / Линии индикаторов
Документация по MQL5: Константы, перечисления и структуры / Константы индикаторов / Линии индикаторов
  • www.mql5.com
Некоторые технические индикаторы имеют несколько отрисовываемых на графике буферов. Нумерация индикаторных буферов начинается с 0. При копировании значений индикатора функцией CopyBuffer() в массив типа double для некоторых индикаторов можно указывать не номер копируемого буфера, а идентификатор этого буфера.