Preguntas de los principiantes MQL5 MT5 MetaTrader 5 - página 1483

 

Buenos días a todos.
Por favor, díganme cómo añadir el indicador Accelerator Oscillator para dar una señal de VENTA en el color rojo y una señal de COMPRA en el color verde, al cierre de la última barra.

Gracias

 
makssub Accelerator Oscillator para que dé señal de VENTA en color rojo y señal de COMPRA en color verde, al cierre de la última barra.

Gracias

Conecte el indicador al Asesor Experto y obtenga sus datos a través de CopyBuffer(). El buffer de color tiene índice 1, donde 0 es verde y 1 es rojo.
Документация по MQL5: Технические индикаторы / iAC
Документация по MQL5: Технические индикаторы / iAC
  • www.mql5.com
iAC - Технические индикаторы - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Artyom Trishkin #:
Conecte el indicador al Asesor Experto y obtenga sus datos a través de CopyBuffer(). El buffer de color tiene índice 1, donde el valor 0 es verde, 1 es rojo.

Si no te importa. ¿Puedes darme un ejemplo?

MQL5 es difícil para mí después de MQL4.

 
makssub #:

Si no es mucha molestia. ¿Puede darme un ejemplo?

MQL5 es difícil para mí después de MQL4.

Los ejemplos están en los enlaces en mi post anterior
 

Hola.

Hay un indicador ADX en el código base. Contiene esta pieza de código

//--- set draw begin
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,ExtADXPeriod<<1);
   PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,ExtADXPeriod);
   PlotIndexSetInteger(2,PLOT_DRAW_BEGIN,ExtADXPeriod);

Si

ExtADXPeriod=14

resulta que ExtADXPeriod<<1 es igual al valor 9.

¿Por qué necesitamos tal entrada entonces? ¿No se puede escribir sin desplazamientos de bits?

ExtADXPeriod<<1

código del indicador completo a continuación


//+------------------------------------------------------------------+
//|                                                          ADX.mq5 |
//|                             Copyright 2000-2023, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright   "Copyright 2000-2023, MetaQuotes Ltd."
#property link        "https://www.mql5.com"
#property description "Average Directional Movement Index"
#include <MovingAverages.mqh>

#property indicator_separate_window
#property indicator_buffers 6
#property indicator_plots   3
#property indicator_type1   DRAW_LINE
#property indicator_color1  LightSeaGreen
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
#property indicator_type2   DRAW_LINE
#property indicator_color2  YellowGreen
#property indicator_style2  STYLE_DOT
#property indicator_width2  1
#property indicator_type3   DRAW_LINE
#property indicator_color3  Wheat
#property indicator_style3  STYLE_DOT
#property indicator_width3  1
#property indicator_label1  "ADX"
#property indicator_label2  "+DI"
#property indicator_label3  "-DI"
//--- input parameters
input int InpPeriodADX=14; // Period ADX
//--- indicator buffers
double    ExtADXBuffer[];
double    ExtPDIBuffer[];
double    ExtNDIBuffer[];
double    ExtPDBuffer[];
double    ExtNDBuffer[];
double    ExtTmpBuffer[];

int       ExtADXPeriod;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit()
  {
//--- check for input parameters
   if(InpPeriodADX>=100 || InpPeriodADX<=0)
     {
      ExtADXPeriod=14;
      PrintFormat("Incorrect value for input variable Period_ADX=%d. Indicator will use value=%d for calculations.",InpPeriodADX,ExtADXPeriod);
     }
   else
      ExtADXPeriod=InpPeriodADX;
//--- indicator buffers
   SetIndexBuffer(0,ExtADXBuffer);
   SetIndexBuffer(1,ExtPDIBuffer);
   SetIndexBuffer(2,ExtNDIBuffer);
   SetIndexBuffer(3,ExtPDBuffer,INDICATOR_CALCULATIONS);
   SetIndexBuffer(4,ExtNDBuffer,INDICATOR_CALCULATIONS);
   SetIndexBuffer(5,ExtTmpBuffer,INDICATOR_CALCULATIONS);
//--- indicator digits
   IndicatorSetInteger(INDICATOR_DIGITS,2);
//--- set draw begin
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,ExtADXPeriod<<1);
   PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,ExtADXPeriod);
   PlotIndexSetInteger(2,PLOT_DRAW_BEGIN,ExtADXPeriod);
//--- indicator short name
   string short_name="ADX("+string(ExtADXPeriod)+")";
   IndicatorSetString(INDICATOR_SHORTNAME,short_name);
   PlotIndexSetString(0,PLOT_LABEL,short_name);
  }
//+------------------------------------------------------------------+
//| 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[])
  {
//--- checking for bars count
   if(rates_total<ExtADXPeriod)
      return(0);
//--- detect start position
   int start;
   if(prev_calculated>1)
      start=prev_calculated-1;
   else
     {
      start=1;
      ExtPDIBuffer[0]=0.0;
      ExtNDIBuffer[0]=0.0;
      ExtADXBuffer[0]=0.0;
     }
//--- main cycle
   for(int i=start; i<rates_total && !IsStopped(); i++)
     {
      //--- get some data
      double high_price=high[i];
      double prev_high =high[i-1];
      double low_price =low[i];
      double prev_low  =low[i-1];
      double prev_close=close[i-1];
      //--- fill main positive and main negative buffers
      double tmp_pos=high_price-prev_high;
      double tmp_neg=prev_low-low_price;
      if(tmp_pos<0.0)
         tmp_pos=0.0;
      if(tmp_neg<0.0)
         tmp_neg=0.0;
      if(tmp_pos>tmp_neg)
         tmp_neg=0.0;
      else
        {
         if(tmp_pos<tmp_neg)
            tmp_pos=0.0;
         else
           {
            tmp_pos=0.0;
            tmp_neg=0.0;
           }
        }
      //--- define TR
      double tr=MathMax(MathMax(MathAbs(high_price-low_price),MathAbs(high_price-prev_close)),MathAbs(low_price-prev_close));
      if(tr!=0.0)
        {
         ExtPDBuffer[i]=100.0*tmp_pos/tr;
         ExtNDBuffer[i]=100.0*tmp_neg/tr;
        }
      else
        {
         ExtPDBuffer[i]=0.0;
         ExtNDBuffer[i]=0.0;
        }
      //--- fill smoothed positive and negative buffers
      ExtPDIBuffer[i]=ExponentialMA(i,ExtADXPeriod,ExtPDIBuffer[i-1],ExtPDBuffer);
      ExtNDIBuffer[i]=ExponentialMA(i,ExtADXPeriod,ExtNDIBuffer[i-1],ExtNDBuffer);
      //--- fill ADXTmp buffer
      double tmp=ExtPDIBuffer[i]+ExtNDIBuffer[i];
      if(tmp!=0.0)
         tmp=100.0*MathAbs((ExtPDIBuffer[i]-ExtNDIBuffer[i])/tmp);
      else
         tmp=0.0;
      ExtTmpBuffer[i]=tmp;
      //--- fill smoothed ADX buffer
      ExtADXBuffer[i]=ExponentialMA(i,ExtADXPeriod,ExtADXBuffer[i-1],ExtTmpBuffer);
     }
//--- OnCalculate done. Return new prev_calculated.
   return(rates_total);
  }
//+------------------------------------------------------------------+
Discover new MetaTrader 5 opportunities with MQL5 community and services
Discover new MetaTrader 5 opportunities with MQL5 community and services
  • 2023.11.30
  • www.mql5.com
MQL5: language of trade strategies built-in the MetaTrader 5 Trading Platform, allows writing your own trading robots, technical indicators, scripts and libraries of functions
 
Novichokkk #:

Si

ExtADXPeriod=14

entoncesExtADXPeriod<<1 esigual al valor 9

es igual a 28 (14<<1 es como 14*2, siempre que haya suficientes dígitos)

No hagas caso, de todas formas el compilador calculará las expresiones const al compilar y no entrarán en el código. Sólo su resultado

podría ser una optimización prematura o el autor quería demostrar que es guay.

 
Maxim Kuznetsov #:

es igual a 28 (14<<1 es como 14*2, siempre que haya suficientes dígitos)

no prestes atención, de todas formas el compilador contará las expresiones const conocidas en la compilación y no entrarán en el código. Sólo su resultado

podría ser una optimización prematura o el autor quería demostrar que es guay.

1-¿Por qué 28?

14 es binario. Es 1110.

Desplaza un bit a la izquierda, es 0111, vuelve a convertir a decimal, es 9. 1*1+1+1*2+1*4=7 (incorrecto no 9).


2-Todavía me gustaría un ejemplo concreto en este caso, lo que es más correcto para insertar en una construcción de este tipo en lugar deExtADXPeriod<<1?

 
Novichokkk #:

14 es binario. Es 1110.

Cambia un bit a la izquierda a 0111,

tenemos diferentes "izquierdas" :-)

1110<<1 := 11100

 
Maxim Kuznetsov #:

tú y yo tenemos "izquierdas" diferentes :-)

1110<<1 := 11100

Lo he leído en internet. Esto es para 32 bits entiendo, para 16 es lo mismo, no salta nada por un bit. Pero estoy aprendiendo, probablemente tengas razón.

No es el punto, es sólo una nota al margen. Me sorprendió tal construcción en el terminal. Este indicador ni siquiera es de la base de código, es de la terminal de la carpeta Ejemplos.

Archivos adjuntos:
8888.jpg  49 kb
 

¿Cómo se cambia un diseño antiguo?

ObjectSetText("Maximum",DoubleToString(ChartGetDouble(0,CHART_PRICE_MAX,0),5),8,"Arial",Red);

Aquí está todo claro. Tal y tal objeto, tal y tal descripción, tal y tal tamaño de fuente, tipo de fuente, color.

Pero eso es del antiguo.

Leo lo que se sustituye

ObjectSetText

En

ObjectGetInteger,ObjectSetString,ObjectSetIntegerStringLen.

Pero en todas estas funciones no hay tales parámetros como en ObjectSetText.

Документация по MQL5: Графические объекты / ObjectGetInteger
Документация по MQL5: Графические объекты / ObjectGetInteger
  • www.mql5.com
ObjectGetInteger - Графические объекты - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5