Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 138

 
missha689:
Diga-me como descobrir a data e a hora de ontem

Tem tudo o que você precisa, basta lê-lo. Como este aqui.

iTime("USDCHF",PERIOD_H1,0)
Basta substituir o símbolo especificado por _Symbol, PERÍODO_H1 a PERÍODO_D1 e aqui você tem o horário de abertura do dia. Substitua 0 por 1 para obter o horário de abertura de ontem.
 
missha689:
Você pode me dizer como saber programticamente a data e a hora de ontem?

calendário de ontem:

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

MqlDateTime ts;

TimeToStruct(tim,ts);

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

tim=StructToTime(ts);

agora em tempo - início do dia do calendário de ontem (!!! não hora de abertura da pré-bar D1)

Tempo de abertura da pré-barra D1 - iTime(0,PERÍODO_D1,1); com pequena correção - se é sábado, então acrescente 24 horas, se é domingo, então 48 horas.

 
Alexey Viktorov:

Bem, tem tudo o que você precisa, basta lê-lo. Como este aqui.

iTime("USDCHF",PERIOD_H1,0)
Basta substituir o símbolo especificado por _Symbol, PERÍODO_H1 a PERÍODO_D1 e aqui você tem o horário de abertura do dia. Substitua 0 por 1 para obter o horário de abertura de ontem.

Tenho tentado descobrir como fazê-lo desde ontem, mas não consigo, por isso estou pedindo ajuda, porque sou novo nisso.

Ajude-me a encontrar o índice da barra de ontem às 15:00 e o índice da barra de hoje apenas às 7:00, sem especificar explicitamente a data, como mostrado no exemplo

 
Maxim Kuznetsov:

calendário de ontem:

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

MqlDateTime ts;

TimeToStruct(tim,ts);

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

tim=StructToTime(ts);

agora em tempo - início do dia do calendário de ontem (!!! não o horário de abertura da pré-bar D1)

Tempo de abertura da pré-barra D1 - iTime(0,PERÍODO_D1,1); com pequena correção - adicionar 24 horas se for sábado, 48 horas se for domingo.

Obrigado
 
Sergey Gritsay:


função para transferir a faixa de parada para sem perdas, o ticket de pedido e a distância em pips são enviados para a função

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);
        }

     }
  }


...obrigado sergey!!!!!

 
Vitaly Muzichenko:

Legal, vou tentar puxar as funções para dentro da EA. Publicarei o resultado mais tarde.

Obrigado!!!

Acrescentou um segundo método de busca.

//+------------------------------------------------------------------+
//|                                             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);
}
//+----------------------------------------------------------------------------+
Arquivos anexados:
 
Artyom Trishkin:

Acrescentou um segundo método de busca.


Obrigado, é simplesmente fantástico.

Permanece para ser carregado no kodobase)

 
Vitaly Muzichenko:

Obrigado, só que tudo é super.

Permanece para ser carregado no kodobase)

Já feito :)))) Enviou-o para testes.
 

Olá.

Eu estou no linux. Eu tenho vários pares de moedas abertos em MT4 - até 10. Como posso usar a MQL4 para organizar as guias dos gráficos em uma determinada seqüência?

Trabalhar com perfis, estudar 1_MQL4.pdf e a Internet não mostrou nenhum resultado.

Cumprimentos, Vladimir

 
DVlad:

Olá.

Eu estou no linux. Eu tenho vários pares de moedas abertos em MT4 - até 10. Como posso usar a MQL4 para organizar as guias dos gráficos em uma determinada seqüência?

Trabalhar com perfis, estudar 1_MQL4.pdf e a Internet não mostrou nenhum resultado.

Cumprimentos, Vladimir.

Mesmo no Windows, as abas não podem ser classificadas por meio de mql4.

Você só pode abrir gráficos na seqüência que precisar e definir os modelos necessários neles.

Razão: