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

 
missha689:
Dígame cómo averiguar la fecha y la hora de ayer

Tiene todo lo que necesitas, sólo tienes que leerlo. Como éste.

iTime("USDCHF",PERIOD_H1,0)
Sólo tiene que sustituir el símbolo especificado por _Symbol, PERIOD_H1 a PERIOD_D1 y aquí tiene la hora de apertura del día. Sustituya el 0 por el 1 para obtener la hora de apertura de ayer.
 
missha689:
¿Pueden decirme cómo averiguar la fecha y la hora de ayer mediante un programa?

calendario ayer:

datetime tim=TimeCurrent()‌-24*60*60;

MqlDateTime ts;

TimeToStruct(tim,ts);

ts.hour=0;ts.min=0;ts.sec=0;

tim=StructToTime(ts);

ahora en tim - inicio del día del calendario de ayer (!!! no la hora de apertura del pre-bar D1)

Hora de apertura de la barra previa D1 - iTime(0,PERIOD_D1,1); con una pequeña corrección - si es sábado, entonces añada 24 horas, si es domingo, entonces 48 horas.

 
Alexey Viktorov:

Bueno, tiene todo lo que necesitas, sólo tienes que leerlo. Como éste.

iTime("USDCHF",PERIOD_H1,0)
Sólo tiene que sustituir el símbolo especificado por _Symbol, PERIOD_H1 a PERIOD_D1 y aquí tiene la hora de apertura del día. Sustituya el 0 por el 1 para obtener la hora de apertura de ayer.

Llevo desde ayer intentando averiguar cómo hacerlo, pero no puedo, así que pido ayuda, porque soy nuevo en esto.

Por favor, ayúdeme a encontrar el índice de la barra de ayer a las 15:00 y el índice de la barra de hoy a las 7:00 sólo sin especificar explícitamente la fecha como se muestra en el ejemplo

 
Maxim Kuznetsov:

calendario ayer:

datetime tim=TimeCurrent()‌-24*60*60;

MqlDateTime ts;

TimeToStruct(tim,ts);

ts.hour=0;ts.min=0;ts.sec=0;

tim=StructToTime(ts);

ahora en tim - inicio de la jornada del calendario de ayer (!!! no la hora de apertura del prebaremo D1)

Hora de apertura de la barra previa D1 - iTime(0,PERIOD_D1,1); con una pequeña corrección - añadir 24 horas si es sábado, 48 horas si es domingo.

Gracias
 
Sergey Gritsay:


para transferir la banda de parada a sin pérdidas, la entrada de la orden y la distancia en pips se pasan a la función

void zero_profit(int ticket, int distance)
  {
   double sl=0.0;

   if(OrderSelect(ticket,SELECT_BY_TICKET))
     {
      if(OrderType()==OP_BUY)
        {
         if(Bid>=OrderOpenPrice() && Bid-OrderOpenPrice()>=distance*_Point) sl=OrderOpenPrice();
         if(OrderStopLoss()!=0 && OrderStopLoss()>=OrderOpenPrice())return;
        }
      if(OrderType()==OP_SELL)
        {
         if(Ask<=OrderOpenPrice() && OrderOpenPrice()-Ask>=distance*_Point) sl=OrderOpenPrice();
         if(OrderStopLoss()!=0 && OrderStopLoss()<=OrderOpenPrice())return;
        }
      ResetLastError();

      if(sl<=0)return;
      if(!OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),0))
        {
         int error=GetLastError();
         rezult=StringConcatenate(OrderSymbol(),": error modifying StopLoss order ",OrderTicket()," ",TypeToStr(OrderType())," №- ",error);
         Print(rezult);
        }

     }
  }


¡¡¡¡¡...gracias sergey!!!!!

 
Vitaly Muzichenko:

Genial, intentaré meter las funciones en el EA. Publicaré el resultado más tarde.

¡¡¡Gracias!!!

Se ha añadido un segundo método de búsqueda.

//+------------------------------------------------------------------+
//|                                             iFreeNumFractals.mq4 |
//|              Copyright 2017, Artem A. Trishkin, Skype artmedia70 |
//|                       https://login.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, Artem A. Trishkin, Skype artmedia70"
#property link      "https://login.mql5.com/ru/users/artmedia70"
#property version   "3.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   2
//--- plot UpperFractal
#property indicator_label1  "Upper Fractal"
#property indicator_type1   DRAW_ARROW
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- plot LowerFractal
#property indicator_label2  "Lower Fractal"
#property indicator_type2   DRAW_ARROW
#property indicator_color2  clrSteelBlue
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1
//---
enum ENUM_TYPE_FRACTAL
  {
   TYPE_FRACTAL_ACCURATE   =  0,    // Accurate fractal
   TYPE_FRACTAL_INACCURATE =  1,    // Inaccurate fractal
  };
//--- input parameters
input ENUM_TYPE_FRACTAL TypeFractals   =  TYPE_FRACTAL_ACCURATE;  // Type of fractal
input int               LeftNumUp      =  2;                      // The number of bars on the left for upper fractals
int leftNumUp;    // Количество баров слева для верхнего фрактала
input int               RightNumUp     =  2;                      // The number of bars on the right for upper fractals
int rightNumUp;   // Количество баров справа для верхнего фрактала
input int               LeftNumDn      =  2;                      // The number of bars on the left for lower fractals
int leftNumDn;    // Количество баров слева для нижнего фрактала
input int               RightNumDn     =  2;                      // The number of bars on the right for lower fractals
int rightNumDn;   // Количество баров справа для нижнего фрактала
//--- indicator buffers
double         BufferUpperFractal[];
double         BufferLowerFractal[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,BufferUpperFractal);
   SetIndexBuffer(1,BufferLowerFractal);
//--- setting a code from the Wingdings charset as the property of PLOT_ARROW
   PlotIndexSetInteger(0,PLOT_ARROW,217);
   PlotIndexSetInteger(1,PLOT_ARROW,218);
   SetIndexArrow(0,217);
   SetIndexArrow(1,218);
   SetIndexEmptyValue(0,EMPTY_VALUE);
   SetIndexEmptyValue(1,EMPTY_VALUE);
//---
   leftNumUp=(LeftNumUp<1?1:LeftNumUp);
   rightNumUp=(RightNumUp<1?1:RightNumUp);
   leftNumDn=(LeftNumDn<1?1:LeftNumDn);
   rightNumDn=(RightNumDn<1?1:RightNumDn);
   string short_name=MQLInfoString(MQL_PROGRAM_NAME)+"("+(string)leftNumUp+","+(string)rightNumUp+")("+(string)leftNumDn+","+(string)rightNumDn+")";
   IndicatorSetString(INDICATOR_SHORTNAME,short_name);
   IndicatorSetInteger(INDICATOR_DIGITS,Digits());
//---
   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[])
  {
//---
   if(rates_total<fmax(leftNumUp+rightNumUp,leftNumDn+rightNumDn)) return(0);
   int limit=rates_total-prev_calculated;
   if(limit>0) {
      ArrayInitialize(BufferUpperFractal,0.0);
      ArrayInitialize(BufferUpperFractal,0.0);
      limit=rates_total-fmax(leftNumUp,leftNumDn)-1;
      }
   //---
   for(int i=limit; i>fmin(rightNumUp,rightNumDn); i--) {
      if(GetFreeUpperFractal(Symbol(),PERIOD_CURRENT,i,leftNumUp,rightNumUp)>0) BufferUpperFractal[i]=high[i];
      if(GetFreeLowerFractal(Symbol(),PERIOD_CURRENT,i,leftNumDn,rightNumDn)>0) BufferLowerFractal[i]=low[i];
      }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+----------------------------------------------------------------------------+
double GetFreeLowerFractal(const string symbol_name,ENUM_TIMEFRAMES timeframe,int shift,int left_dimension=2,int right_dimension=2) {
   int bars=Bars(symbol_name,timeframe);
   if(left_dimension<1)  left_dimension=1;
   if(right_dimension<1) right_dimension=1;
   if(shift-right_dimension<1 || shift+left_dimension>bars-1) return(-1);
   if(TypeFractals==TYPE_FRACTAL_ACCURATE) {
      for(int i=shift-1; i>=shift-right_dimension; i--) if(GetPriceLow(symbol_name,timeframe,i)<GetPriceLow(symbol_name,timeframe,i+1)) return(-1);
      for(int i=shift+1; i<=shift+left_dimension; i++)  if(GetPriceLow(symbol_name,timeframe,i)<GetPriceLow(symbol_name,timeframe,i-1)) return(-1);
      }
   else {
      for(int i=shift-1; i>=shift-right_dimension; i--) if(GetPriceLow(symbol_name,timeframe,i)<GetPriceLow(symbol_name,timeframe,shift)) return(-1);
      for(int i=shift+1; i<=shift+left_dimension; i++)  if(GetPriceLow(symbol_name,timeframe,i)<GetPriceLow(symbol_name,timeframe,shift)) return(-1);
      }
   return(GetPriceLow(symbol_name,timeframe,shift));
}
//+----------------------------------------------------------------------------+
double GetFreeUpperFractal(const string symbol_name,ENUM_TIMEFRAMES timeframe,int shift,int left_dimension=2,int right_dimension=2) {
   int bars=Bars(symbol_name,timeframe);
   if(left_dimension<1)  left_dimension=1;
   if(right_dimension<1) right_dimension=1;
   if(shift-right_dimension<1 || shift+left_dimension>bars-1) return(-1);
   if(TypeFractals==TYPE_FRACTAL_ACCURATE) {
      for(int i=shift-1; i>=shift-right_dimension; i--) if(GetPriceHigh(symbol_name,timeframe,i)>GetPriceHigh(symbol_name,timeframe,i+1)) return(-1);
      for(int i=shift+1; i<=shift+left_dimension; i++)  if(GetPriceHigh(symbol_name,timeframe,i)>GetPriceHigh(symbol_name,timeframe,i-1)) return(-1);
      }
   else {
      for(int i=shift-1; i>=shift-right_dimension; i--) if(GetPriceHigh(symbol_name,timeframe,i)>GetPriceHigh(symbol_name,timeframe,shift)) return(-1);
      for(int i=shift+1; i<=shift+left_dimension; i++)  if(GetPriceHigh(symbol_name,timeframe,i)>GetPriceHigh(symbol_name,timeframe,shift)) return(-1);
      }
   return(GetPriceHigh(symbol_name,timeframe,shift));
}
//+----------------------------------------------------------------------------+
double GetPriceHigh(const string symbol_name, ENUM_TIMEFRAMES timeframe, int shift){
   double array[1];
   if(CopyHigh(symbol_name,timeframe,shift,1,array)==1) return(array[0]);
   return(-1);
}
//+----------------------------------------------------------------------------+
double GetPriceLow(const string symbol_name, ENUM_TIMEFRAMES timeframe, int shift){
   double array[1];
   if(CopyLow(symbol_name,timeframe,shift,1,array)==1) return(array[0]);
   return(-1);
}
//+----------------------------------------------------------------------------+
Archivos adjuntos:
 
Artyom Trishkin:

Se ha añadido un segundo método de búsqueda.


Gracias, es simplemente genial.

Restos por subir a kodobase)

 
Vitaly Muzichenko:

Gracias, todo es súper.

Restos por subir a la kodobase)

Ya está hecho :))) Lo envié para probarlo.
 

Hola.

Estoy en linux. Tengo varios pares de divisas abiertos en MT4 - hasta 10. ¿Cómo puedo utilizar el MQL4 para organizar las pestañas del gráfico en una secuencia determinada?

El trabajo con los perfiles, el estudio de 1_MQL4.pdf e Internet no ha dado ningún resultado.

Saludos, Vladimir

 
DVlad:

Hola.

Estoy en linux. Tengo varios pares de divisas abiertos en MT4 - hasta 10. ¿Cómo puedo utilizar el MQL4 para organizar las pestañas del gráfico en una secuencia determinada?

El trabajo con los perfiles, el estudio de 1_MQL4.pdf e Internet no ha dado ningún resultado.

Saludos, Vladimir.

Incluso en Windows, las pestañas no se pueden ordenar mediante mql4.

Sólo puede abrir los gráficos en la secuencia que necesite y establecer las plantillas necesarias en ellos.

Razón de la queja: