Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 883

 
Alexey Viktorov:

Es lo mismo en mql5. Incluso se extiende ligeramente. ¿No es lo que necesitamos?

SÍMBOLO_COMERCIO_VALOR_DE_TICK

Valor de SYMBOL_TRADE_TICK_VALUE_PROFIT

doble

SYMBOL_TRADE_TICK_VALUE_PROFIT

Valor del tick calculado para la posición rentable

doble

SIMBOLO_COMERCIO_VALOR_DE_PUNTUALIDAD_PÉRDIDA

Valor calculado de un tick para una posición perdedora

doble

SYMBOL_TRADE_TICK_SIZE

Cambio de precio mínimo

doble

Maldita sea, soy tan tonto que he puesto TICK_SIZE en lugar de TICK_VALUE... Debería irme a la cama.
 
Chicos, ¿qué pasa aquí, ayúdenme?
 
Alexey Viktorov:

Lo primero que me llamó la atención fue la secuencia de topes.

Los buffers de construcción deben ejecutarse SIEMPRE en secuencia. Es decir, si los búferes de datos son los números 2 y 3, el búfer de color DEBE ser el número 4

Si este no es el único error, lo examinaremos más a fondo.

Bien, encontré esa función en las instrucciones, aquí:

MQL5 Reference Guide / Custom Indicators / SetIndexBuffer
".....

boolSetIndexBuffer(
intindex,// índice del buffer
doublebuffer[],// array
ENUM_INDEXBUFFER_TYPEdata_type//lo que se almacenará
);

Parámetros

índice

[in] Número de búfer del indicador. La numeración empieza por el 0. El número debe ser menor que el valor declarado en la #propiedad indicator_buffers.

buffer[]

[in] Matriz declarada en el programa del indicador personalizado.

tipo_de_datos

[in] Tipo de datos almacenados en la matriz de indicadores. Por defecto, INDICATOR_DATA (valores del indicador calculado). También puede tomar el valor INDICATOR_COLOR_INDEX, entonces este búfer está destinado a almacenar los índices de los colores para el búfer del indicador anterior. Se pueden especificar hasta 64 colores en la línea #property indicator_colorN. El valor INDICATOR_CALCULATIONS significa que esta memoria intermedia participa en los cálculos intermedios del indicador, y no está pensada para el dibujo.

 

Intenté rehacerlo y obtuve aún más mierda. El histograma desapareció por completo y el indicador de líneas se volvió extraño, por no decir otra cosa. El de la señal se cortó por encima de 50 y el principal por debajo. En el código no existen estos límites.

 
Artyom Trishkin:

Te he dado un enlace para estudiar no el histograma, sino cómo trabajar con el buffer de color. Aléjate del histograma y céntrate en cómo tienes que trabajar con el color.

Lo he estudiado, pero nada nuevo, aparentemente es (nuevo para mí) por supuesto, obvio para todos los iniciados, autoexplicativo. No he podido encontrar nada nuevo, excepto la característica descrita anteriormente de la disposición mutua de los buffers durante la indexación. Esta secuencia respetada, obtuvo una imagen aún más cursi.

Fotos abajo, archivo adjunto

//+------------------------------------------------------------------+
//|                                       Stoch_HISTOGRAM_MQL5_4.mq5 |
//|                   Copyright 2009-2017, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2009-2017, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"

//--- indicator settings
#property indicator_separate_window
#property indicator_buffers 8
#property indicator_plots   3

#property indicator_type1   DRAW_COLOR_HISTOGRAM2
#property indicator_color1  clrGreen,clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1 

#property indicator_type1   DRAW_LINE       // основная
#property indicator_color1  clrLightSeaGreen
#property indicator_style1  STYLE_SOLID
#property indicator_width2  3 

#property indicator_type2   DRAW_LINE       // сигнальная
#property indicator_color2  clrYellow
#property indicator_style2  STYLE_SOLID
#property indicator_width3  2 

//--- input parameters
input int InpKPeriod=5;  // K period
input int InpDPeriod=3;  // D period
input int InpSlowing=3;  // Slowing

//--- indicator buffers
double    ColorHistogram_2Buffer1[]; 
double    ColorHistogram_2Buffer2[]; 
double    ColorHistogram_2Colors[];
double    ExtMainBuffer[];
double    ExtSignalBuffer[];
double    ExtHighesBuffer[];
double    ExtLowesBuffer[];
color     colors[]={clrRed,clrGreen};
int       cl;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit()
  {
//--- indicator buffers mapping

   SetIndexBuffer(0,ColorHistogram_2Buffer1,INDICATOR_DATA);
   SetIndexBuffer(1,ColorHistogram_2Buffer2,INDICATOR_DATA);
   SetIndexBuffer(2,ColorHistogram_2Colors,INDICATOR_COLOR_INDEX);
   SetIndexBuffer(3,ExtMainBuffer,INDICATOR_DATA);
   SetIndexBuffer(4,ExtSignalBuffer,INDICATOR_DATA);
   SetIndexBuffer(5,ExtHighesBuffer,INDICATOR_CALCULATIONS);
   SetIndexBuffer(6,ExtLowesBuffer,INDICATOR_CALCULATIONS);  
   
   //ArraySetAsSeries(ExtMainBuffer,true);
   //ArraySetAsSeries(ExtSignalBuffer,true);
   //ArraySetAsSeries(ExtHighesBuffer,true);
   //ArraySetAsSeries(ExtLowesBuffer,true);
   //ArraySetAsSeries(ColorHistogram_2Buffer1,true);
   //ArraySetAsSeries(ColorHistogram_2Buffer2,true);
   //ArraySetAsSeries(ColorHistogram_2Colors,true);
   
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);
//--- set accuracy
   IndicatorSetInteger(INDICATOR_DIGITS,2);
//--- set levels
   IndicatorSetInteger(INDICATOR_LEVELS,3);
   IndicatorSetDouble(INDICATOR_LEVELVALUE,0,20);
   IndicatorSetDouble(INDICATOR_LEVELVALUE,1,50);
   IndicatorSetDouble(INDICATOR_LEVELVALUE,2,80);
//--- set maximum and minimum for subwindow 
   IndicatorSetDouble(INDICATOR_MINIMUM,0);
   IndicatorSetDouble(INDICATOR_MAXIMUM,100);
//--- name for DataWindow and indicator subwindow label
   IndicatorSetString(INDICATOR_SHORTNAME,"Stoch_HISTOGRAM("+(string)InpKPeriod+","+(string)InpDPeriod+","+(string)InpSlowing+")");
   PlotIndexSetString(3,PLOT_LABEL,"Main");
   PlotIndexSetString(4,PLOT_LABEL,"Signal");
   //PlotIndexSetString(2,PLOT_LABEL,"UP");
   //PlotIndexSetString(3,PLOT_LABEL,"LOW");
//--- sets first bar from what index will be drawn
   PlotIndexSetInteger(3,PLOT_DRAW_BEGIN,InpKPeriod+InpSlowing-2);
   PlotIndexSetInteger(4,PLOT_DRAW_BEGIN,InpKPeriod+InpDPeriod);
   PlotIndexSetInteger(5,PLOT_DRAW_BEGIN,InpKPeriod+InpSlowing-2);
   PlotIndexSetInteger(6,PLOT_DRAW_BEGIN,InpKPeriod+InpSlowing-2);
//--- initialization done
  }
//+------------------------------------------------------------------+
//| Stochastic Oscillator                                            |
//+------------------------------------------------------------------+
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,k,start;
//--- check for bars count
   if(rates_total<=InpKPeriod+InpDPeriod+InpSlowing)
      return(0);
//---
   start=InpKPeriod-1;
   if(start+1<prev_calculated) start=prev_calculated-2;
   else
     {
      for(i=0;i<start;i++)
        {
         ExtLowesBuffer[i]=0.0;
         ExtHighesBuffer[i]=0.0;
        }
     }
//--- calculate HighesBuffer[] and ExtHighesBuffer[]
   for(i=start;i<rates_total && !IsStopped();i++)
     {
      double dmin=1000000.0;
      double dmax=-1000000.0;
      for(k=i-InpKPeriod+1;k<=i;k++)
        {
         if(dmin>low[k])  dmin=low[k];
         if(dmax<high[k]) dmax=high[k];
        }
      ExtLowesBuffer[i]=dmin;
      ExtHighesBuffer[i]=dmax;
     }
//--- %K
   start=InpKPeriod-1+InpSlowing-1;
   if(start+1<prev_calculated) start=prev_calculated-2;
   else
     {
      for(i=0;i<start;i++) ExtMainBuffer[i]=0.0;
     }
//--- main cycle
   for(i=start;i<rates_total && !IsStopped();i++)
     {
      double sumlow=0.0;
      double sumhigh=0.0;
      for(k=(i-InpSlowing+1);k<=i;k++)
        {
         sumlow +=(close[k]-ExtLowesBuffer[k]);
         sumhigh+=(ExtHighesBuffer[k]-ExtLowesBuffer[k]);
        }
      if(sumhigh==0.0) ExtMainBuffer[i]=100.0;
         else ExtMainBuffer[i]=sumlow/sumhigh*100;
      if(ExtMainBuffer[i]>50){
         cl=1;
         ColorHistogram_2Buffer1[i]=50; 
         ColorHistogram_2Buffer2[i]=ExtMainBuffer[i]; 
         ColorHistogram_2Colors[i]=colors[cl];
     Print("ExtMainBuffer[i]=",ExtMainBuffer[i],
           " cl=",cl,
           " ColorHistogram_2Buffer1[i]=",ColorHistogram_2Buffer1[i],
           " ColorHistogram_2Buffer2[i]=",ColorHistogram_2Buffer2[i],
           " ColorHistogram_2Colors[i]=",ColorHistogram_2Colors[i]);
         } 
      if(ExtMainBuffer[i]<50){
         cl=0;
         ColorHistogram_2Buffer1[i]=ExtMainBuffer[i]; 
         ColorHistogram_2Buffer2[i]=50; 
         ColorHistogram_2Colors[i]=colors[cl];
     Print("ExtMainBuffer[i]=",ExtMainBuffer[i],
           " cl=",cl,
           " ColorHistogram_2Buffer1[i]=",ColorHistogram_2Buffer1[i],
           " ColorHistogram_2Buffer2[i]=",ColorHistogram_2Buffer2[i],
           " ColorHistogram_2Colors[i]=",ColorHistogram_2Colors[i]);
         } 
     }
//--- signal
   start=InpDPeriod-1;
   if(start+1<prev_calculated) start=prev_calculated-2;
   else
     {
      for(i=0;i<start;i++) ExtSignalBuffer[i]=0.0;
     }
   for(i=start;i<rates_total && !IsStopped();i++)
     {
      double sum=0.0;
      for(k=0;k<InpDPeriod;k++) sum+=ExtMainBuffer[i-k];
      ExtSignalBuffer[i]=sum/InpDPeriod;
     }
//--- OnCalculate done. Return new prev_calculated.
   return(rates_total);
  }
//+------------------------------------------------------------------+ 
Archivos adjuntos:
 

Hola.

Puedes decirme por favor dónde puedo encontrar el algoritmo para la apertura de órdenes "fiables" (hasta ahora sólo me interesan las órdenes de mercado), porque estoy perplejo.

El problema es que en mi cuenta (Alpari) los niveles StopLevel y FreezeLevel son cero y si utilizo sólo estas limitacioneshttps://book.mql4.com/ru/appendix/limits significa que un StopLoss en la compra se puede establecer en el nivel Bid y en la venta en el nivel Ask, pero esto no es cierto. En este caso, OrderSend devuelve un error "No hay precio" (ERR_OFF_QUOTES, código 136).

Al mismo tiempo, las operaciones sin stops o con stops de 50 o más puntos se abren sin problemas.

Descubrí por experiencia que el SlopLoss mínimo es de 19 pips. No sé cómo determinar este margen de forma programada.

 
Estos niveles deben establecerse a partir del precio de cierre de la orden, no del precio de apertura. Y el precio de cierre al fijar estos niveles no debe ser igual al valor fijado
 
klok79:

Hola.

Puedes decirme por favor dónde puedo encontrar el algoritmo para la apertura de órdenes "fiables" (hasta ahora sólo me interesan las órdenes de mercado), porque estoy perplejo.

El problema es que en mi cuenta (Alpari) los niveles StopLevel y FreezeLevel son cero y si utilizo sólo estas limitacioneshttps://book.mql4.com/ru/appendix/limits significa que un StopLoss en la compra se puede establecer en el nivel Bid y en la venta en el nivel Ask, pero esto no es cierto. En este caso, OrderSend devuelve un error "No hay precio" (ERR_OFF_QUOTES, código 136).

Al mismo tiempo, las operaciones sin stops o con stops de 50 o más puntos se abren sin problemas.

Descubrí por experiencia que el SlopLoss mínimo es de 19 pips. No sé cómo determinar este margen de forma programada.

Pruebe minStopLoss = Precio actual +/- (MaxValue(2*Spread, StopLoss));

 
¿Por qué no se destruyen los objetos cuando se detiene la depuración? Entiendo que no se llama a OnDeinit(). Después de la parada de depuración tengo que matar el terminal cada vez.
 

Buenas tardes el código de abajo problema se actualiza a menudo array adx_sig[9] . Quería conseguir una dependencia de actualización de datos a tiempo. Pero algo salió mal.

//+------------------------------------------------------------------+
//|                                                          123.mq5 |
//|                        Copyright 2019, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
input int                  ADX_adx_period          = 14;                                                 // adx period ADX 
input int                  ADX_lower_level         = 20;                                                 // Lower level ADX 
int h_adx[9];
double adx1_buffer[3];
double adx2_buffer[3];
double adx3_buffer[3];
ENUM_TIMEFRAMES handle_period[9]={PERIOD_CURRENT,PERIOD_M1,PERIOD_M5,PERIOD_M15,PERIOD_M30,PERIOD_H1,PERIOD_H4,PERIOD_D1,PERIOD_W1};
int adx_sig[9];
int OnInit()
  {
//---
   for(int i=0; i<ArraySize(handle_period); i++)
     {
      //--- Установим хэндлы для индикаторов
      h_adx[i]=iADX(_Symbol,handle_period[i],ADX_adx_period);
        if(h_adx[i]<0) 
        {
         Alert("Ошибка при создании индикаторов - : ",GetLastError(),"!!");
        }
     }   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
    for(int i=0; i<ArraySize(handle_period); i++)
     {
      //--- Удаляем хэндлы для индикаторов
      IndicatorRelease(h_adx[i]);
     }
     //---
       
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   for(int i_sig=0; i_sig<ArraySize(handle_period); i_sig++)
     {
      if(CopyBuffer(h_adx[i_sig],0,0,3,adx1_buffer)<3)Print("CopyBuffer adx1_buffer ",GetLastError());
      if(CopyBuffer(h_adx[i_sig],1,0,3,adx2_buffer)<3)Print("CopyBuffer adx2_buffer ",GetLastError());
      if(CopyBuffer(h_adx[i_sig],2,0,3,adx3_buffer)<3)Print("CopyBuffer adx3_buffer ",GetLastError());
      if(adx3_buffer[1]<adx2_buffer[1] && adx3_buffer[1]>=ADX_lower_level && adx3_buffer[1]>adx3_buffer[2])adx_sig[i_sig]=1;
      else if(adx3_buffer[1]>adx2_buffer[1] && adx3_buffer[1]>=ADX_lower_level && adx3_buffer[1]<adx3_buffer[2])adx_sig[i_sig]=-1;
      else adx_sig[i_sig]=0;
      }
      PrintFormat("ADX sig0=%i sig1=%i sig2=%i sig3=%i sig4=%i sig5=%i sig6=%i sig7=%i sig8=%i",adx_sig[0],adx_sig[1],adx_sig[2],adx_sig[3],adx_sig[4],adx_sig[5],adx_sig[6],adx_sig[7],adx_sig[8]); 
  }