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

 
kopeyka2:

por ahora

otro marco temporal (no nativo)


Y en general, ignoras la ayuda. Estoy fuera del diálogo. Te he dado todos los datos para que el código funcione correctamente, pero no quieres escucharlo y haces las cosas a tu manera. Es una pena lo del tiempo.
 
Artyom Trishkin:
De todos modos, estás ignorando la ayuda. Estoy fuera del diálogo. Te he dado todos los datos para que el código funcione correctamente, pero no quieres escucharlo y haces las cosas a tu manera. Es una pena el tiempo.

Gracias por su atención y tiempo.... Supongo que aún no lo he descubierto... Sobre las ruedas y el motor estoy de acuerdo.

Seguramente dejaré el portátil y calcularé la media de iClose para el periodo medio.

 
kopeyka2:

Gracias por su atención y tiempo.... Supongo que aún no lo he descubierto... Sobre las ruedas y el motor estoy de acuerdo.

Seguramente dejaré el portátil y calcularé la media de iClose para el periodo medio.

//+------------------------------------------------------------------+
//|                                                       TestMA.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                                 https://mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://mql5.com"
#property version   "1.00"
#property description "Выводит данные скользящей средней с заданного таймфрейма на любом текущем"
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot LWMA
#property indicator_label1  "MA"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrBlue
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters
input uint                 InpPeriod         =  14;            // MA period
input int                  InpShift          =  0;             // MA shift
input ENUM_MA_METHOD       InpMethod         =  MODE_SMA;      // MA method
input ENUM_APPLIED_PRICE   InpApplierPrice   =  PRICE_CLOSE;   // MA applied price
input ENUM_TIMEFRAMES      InpTimeframe      =  PERIOD_H1;     // LRMA timeframe
//--- indicator buffers
double         BufferMA[];
//--- global variables
//ENUM_TIMEFRAMES   timeframe1;
int            period_ma;
int            shift_ma;
int            handle_ma;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- timer
   EventSetTimer(90);
//--- set global variables
   period_ma=int(InpPeriod<1 ? 1 : InpPeriod);
   shift_ma=InpShift;
   //timeframe1=(InpTimeframe>Period() ? InpTimeframe : Period());
//--- indicator buffers mapping
   SetIndexBuffer(0,BufferMA,INDICATOR_DATA);
//--- setting indicator parameters
   IndicatorSetString(INDICATOR_SHORTNAME,"Any TF MA on current");
   IndicatorSetInteger(INDICATOR_DIGITS,Digits());
//--- setting plot buffer parameters
   string label=TimeframeToString(InpTimeframe)+" "+MethodToString(InpMethod)+"("+(string)period_ma+")";
   PlotIndexSetString(0,PLOT_LABEL,label);
//--- setting buffer arrays as timeseries
   ArraySetAsSeries(BufferMA,true);
//--- create handles
   ResetLastError();
   handle_ma=iMA(NULL,InpTimeframe,period_ma,shift_ma,InpMethod,InpApplierPrice);
   if(handle_ma==INVALID_HANDLE)
     {
      Print("The ",TimeframeToString(InpTimeframe)," iMA(",(string)period_ma,") object was not created: Error ",GetLastError());
      return INIT_FAILED;
     }
//--- get timeframe
   Time(NULL,InpTimeframe,1);
//---
   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(period_ma,4)) return 0;
//--- Проверка и расчёт количества просчитываемых баров
   int limit=rates_total-prev_calculated;
   if(limit>1)
     {
      limit=rates_total-1;
      ArrayInitialize(BufferMA,EMPTY_VALUE);
     }
//--- Подготовка данных
   if(Time(NULL,InpTimeframe,1)==0)
      return 0;
   int bars=(InpTimeframe==PERIOD_CURRENT ? rates_total : Bars(NULL,InpTimeframe));
   int count=(limit>1 ? fmin(bars,rates_total) : 1),copied=0;
   copied=CopyBuffer(handle_ma,0,0,count,BufferMA);
   Comment(TimeframeToString(InpTimeframe)," ",MethodToString(InpMethod),": copied=",copied,", count=",count,", bars=",bars,", rates_total=",rates_total);
   if(copied!=count) return 0;
      
//--- Расчёт индикатора
   //for(int i=limit; i>=0 && !IsStopped(); i--)
   //  {
   //   
   //  }

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Custom indicator timer function                                  |
//+------------------------------------------------------------------+
void OnTimer()
  {
   Time(NULL,InpTimeframe,1);
  }
//+------------------------------------------------------------------+
//| Возвращает Time                                                  |
//+------------------------------------------------------------------+
datetime Time(const string symbol_name,const ENUM_TIMEFRAMES timeframe,const int shift)
  {
   datetime array[];
   ArraySetAsSeries(array,true);
   return(CopyTime(symbol_name,timeframe,shift,1,array)==1 ? array[0] : 0);
  }
//+------------------------------------------------------------------+
//| Возвращает наименование таймфрейма                               |
//+------------------------------------------------------------------+
string TimeframeToString(const ENUM_TIMEFRAMES timeframe)
  {
   return StringSubstr(EnumToString(timeframe),7);
  }
//+------------------------------------------------------------------+
//| Возвращает наименование метода МА                                |
//+------------------------------------------------------------------+
string MethodToString(ENUM_MA_METHOD method)
  {
   return StringSubstr(EnumToString(method),5);
  }
//+------------------------------------------------------------------+

Eliminado todo lo innecesario.

No olvide que no hay ticks en el fin de semana y que la línea sólo saldrá en los mismos plazos: el de trabajo y el de la configuración.

Si lo ejecuta en un marco de tiempo distinto al especificado en la configuración, entonces sin ticks en el fin de semana, necesita actualizar forzosamente el gráfico con el botón derecho del ratón: Actualizar, para que se dibuje la línea.

 
Artyom Trishkin:

Eliminado todo lo innecesario.

No olvide que no hay ticks en el fin de semana y que la línea se mostrará sólo en los plazos coincidentes - el de trabajo y el de la configuración.

Si lo ejecuta en un marco de tiempo distinto al especificado en la configuración, entonces sin ticks en el fin de semana, necesita actualizar forzosamente el gráfico con el botón derecho del ratón: Actualizar, para que se dibuje la línea.

Muchas gracias!!! He estado todo el día liándola.... mis ojos están cosidos. Gracias de nuevo
 

Buenas tardes a todos.

 
Lo tengo. Gracias.
 
Buenas tardes a todos.
Ante el problema del desajuste horario, por favor, ayúdenme a resolverlo.
Tratando de averiguar por qué las órdenes se retrasan, estoy registrando información de depuración en mi EA, es absolutamente correcto, se puede ver en la captura de pantalla. Observo que la hora del mensaje es 4,5 horas más que la hora de inicio de las barras (TF=M30) y es este desfase el que hace que las órdenes lleguen tarde. Es decir, según la información de depuración veo que la condición para entrar en el mercado se ha cumplido, por ejemplo, la hora en la barra es 10:00 pero la orden se coloca en la barra con la hora 14:30. Es la primera vez que me encuentro con una situación así. ¿Qué hacer?
Archivos adjuntos:
MT5dataerror.jpg  724 kb
 

Encontré un código de trailing stop en youtube, ¿cómo se puede utilizar?

#include <Trade\Trade.mqh> 
CTrade trade;

void OnTick()
  {
    double Ask = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
    
         if(PositionsTotal()<2)
    
    trade.Buy(0.10,NULL,Ask,(Ask-1000 * _Point),(Ask+500 * _Point),NULL);
    
    CheckTrailingStop(Ask);
   
  }
void   CheckTrailingStop(double Ask)
  {
     double SL = NormalizeDouble(Ask - 150 * _Point,_Digits);
     
     for (int i=PositionsTotal()-1; i>=0; i--)
     {
     string symbol=PositionGetSymbol(i);
     if (_Symbol==symbol)
     {
     ulong PositionTicket=PositionGetInteger(POSITION_TICKET);
     
     double CurrentStopLoss=PositionGetDouble(POSITION_SL);
     if (CurrentStopLoss<SL)
     {
       trade.PositionModify(PositionTicket,(CurrentStopLoss + 10*_Point),0);
     }
   }
  }   
}
 
Vladimir Baskakov:

Encontré un código de trailing stop en youtube, ¿cómo se puede utilizar?

Este arrastre es sólo para comprar y está mal implementado, no se puede utilizar.

 
Nikolay Khrushchev:

este arrastre es sólo para comprar y está mal implementado, no se puede utilizar.

Bien, gracias.
Razón de la queja: