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

 
Andrey.Sabitov:

Buenas tardes, queridos expertos.

¿Podría decirme en qué parte del código hay un error que impide abrir una posición de COMPRA en la misma barra con VENTA que ha cerrado una posición anterior?

Las reglas son sencillas (de aprender):
1 Entrada - indicador lento cruzando 0 + rápido también en la zona (compra/venta)

2 Salida - cruce por indicador rápido 0

Estoy tratando de entender tu código - ahora mismo lo estoy ejecutando, no todo, has puesto

Foto de

Su código - y mis pensamientos .

Реверс добавил и Индикатор в положенное место переставил 
//+------------------------------------------------------------------+
//|                                                      TestDPO.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//---
#include <Trade\Trade.mqh>
CTrade trade;
//---
input int    dpo_fast_period = 9;     // DPO Fast Period
input int    dpo_slow_period = 40;    // DPO Fast Period
input int    Inpmagic        = 1000;  // Magic советника
input ulong  slippage        = 10;    // Проскальзывание цены
input double Inpvolume       = 0.01;  // размер позиции
input bool   Revers          = false; // Revers
//---
double fDPOVal[];    // Динамический массив для хранения значений fast DPO
double sDPOVal[];    // Динамический массив для хранения значений slow DPO
int    DPO_fast = 0; // Хэндл для быстрого DPO
int    DPO_slow = 0; // Хэндл для медленного DPO
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- prepare trade class to control positions if hedging mode is active
   trade.SetExpertMagicNumber(Inpmagic);
   trade.SetMarginMode();
   trade.SetTypeFillingBySymbol(Symbol());
//--- DPO indicator
   DPO_fast=iCustom(NULL,0,"Examples\\DPO",dpo_fast_period);
   if(DPO_fast==INVALID_HANDLE)
     {
      printf("Error creating MA indicator");
      return(INIT_FAILED);
     }
//--- DPO indicator
   DPO_slow=iCustom(NULL,0,"Examples\\DPO",dpo_slow_period);
   if(DPO_slow==INVALID_HANDLE)
     {
      printf("Error creating MA indicator");
      return(INIT_FAILED);
     }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
//---------------Задаем цены покупки и продажи------------------------
   double Ask=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
   double Bid=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);

   int signal=0;  // сигнал на покупку, продажу

//--------------Проверка на новый бар
   if(!isNewBar())
      return;
//--------------------------------------------------------------------
   ArraySetAsSeries(fDPOVal,true);              // задаем направление индексов массива
   ArraySetAsSeries(sDPOVal,true);
   if(CopyBuffer(DPO_fast,0,0,10,fDPOVal)<0)    // наполняем массив значений DPO fast
     {
      Alert("Ошибка копирования буфера индикатора fast DPO. Ошибка ", GetLastError());
     }
   if(CopyBuffer(DPO_slow,0,0,10,sDPOVal)<0)    // наполняем массив значений DPO slow
     {
      Alert("Ошибка копирования буфера индикатора slow DPO. Ошибка ", GetLastError());
     }

   double DPO_fast_c_value=NormalizeDouble(fDPOVal[1],6);  // запоминаем значение индикатора DPO fast на предыдущем баре
   double DPO_slow_c_value=NormalizeDouble(sDPOVal[1],6);  // запоминаем значение индикатора DPO slow на предыдущем баре
   double DPO_fast_p_value=NormalizeDouble(fDPOVal[2],6);  // запоминаем значение индикатора DPO fast на пред-предыдущем баре
   double DPO_slow_p_value=NormalizeDouble(sDPOVal[2],6);  // запоминаем значение индикатора DPO slow на пред-предыдущем баре

   if(DPO_slow_c_value>0 && DPO_slow_p_value<0 && DPO_fast_c_value>0)  // если медленный индикатор пересекает 0 снизу вверх и быстрый находится выше 0
      signal=1;                                                        // сигнал на открытие покупки
   if(DPO_slow_c_value<0 && DPO_slow_p_value>0 && DPO_fast_c_value<0)  // если медленный индикатор пересекает 0 сверху вниз и быстрый находится ниже 0
      signal=-1;                                                       // сигнал на открытие продажи
   if(DPO_fast_c_value>0 && DPO_fast_p_value<0)                        // если быстрый индикатор пересекает 0 снизу вверх
      signal=-2;                                                       // сигнал на закрытие продажи
   if(DPO_fast_c_value<0 && DPO_fast_p_value>0)                        // если быстрый индикатор пересекает 0 сверху вниз
      signal=2;                                                        // сигнал на закрытие покупки
   if(!Revers)
     {
      switch(signal)
        {
         case -1:
            trade.Buy(Inpvolume,NULL,Ask,0,0,NULL);
            break;
         case 1:
            trade.Sell(Inpvolume,NULL,Bid,0,0,NULL);
            break;
         case -2:
            trade.PositionClose(_Symbol,slippage);
            break;
         case 2:
            trade.PositionClose(_Symbol,slippage);
            break;
        }
     }
   if(Revers)
     {
      switch(signal)
        {
         case -1:
            trade.Sell(Inpvolume,NULL,Bid,0,0,NULL);
            break;
         case 1:
            trade.Buy(Inpvolume,NULL,Ask,0,0,NULL);
            break;
         case -2:
            trade.PositionClose(_Symbol,slippage);
            break;
         case 2:
            trade.PositionClose(_Symbol,slippage);
            break;
        }
     }
  }
//+------------------------------------------------------------------+
//| Возвращает true, если появился новый бар для пары символ/период  |
//+------------------------------------------------------------------+
bool isNewBar()
  {
//--- в статической переменной будем помнить время открытия последнего бара
   static datetime last_time=0;
//--- текущее время
   datetime lastbar_time=(int)SeriesInfoInteger(Symbol(),Period(),SERIES_LASTBAR_DATE);

//--- если это первый вызов функции
   if(last_time==0)
     {
      //--- установим время и выйдем
      last_time=lastbar_time;
      return(false);
     }

//--- если время отличается
   if(last_time!=lastbar_time)
     {
      //--- запомним время и вернем true
      last_time=lastbar_time;
      return(true);
     }
//--- дошли до этого места - значит бар не новый, вернем false
   return(false);
  }
//+------------------------------------------------------------------+
 

Gracias a los que han respondido.

Pero el problema sigue siendo que cuando se cierra una orden y hay una señal en la misma barra, la posición no se abre.

¿Pueden decirme a qué puede deberse esto y cómo puede solucionarse?


 
Andrey.Sabitov:

Gracias a los que han respondido.

Pero el problema sigue siendo que cuando se cierra una orden y hay una señal en la misma barra, la posición no se abre.

¿Pueden decirme, por favor, a qué puede deberse esto y cómo solucionarlo?


De un vistazo rápido, comprueba si hay un nuevo bar:

//--------------Проверка на новый бар
   if(!isNewBar())
      return;

y sólo entonces buscar una señal. Resulta que si ya has estado en esta barra no la golpearás.

 

¿tal vez algo así?

//+------------------------------------------------------------------+
//|                                                      TestDPO.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//---
#include <Trade\Trade.mqh>
CTrade trade;
//---
input int    dpo_fast_period = 9;     // DPO Fast Period
input int    dpo_slow_period = 40;    // DPO Fast Period
input int    Inpmagic        = 1000;  // Magic советника
input ulong  slippage        = 10;    // Проскальзывание цены
input double Inpvolume       = 0.01;  // размер позиции
input bool   Revers          = false; // Revers
//---
double fDPOVal[];    // Динамический массив для хранения значений fast DPO
double sDPOVal[];    // Динамический массив для хранения значений slow DPO
int    DPO_fast = 0; // Хэндл для быстрого DPO
int    DPO_slow = 0; // Хэндл для медленного DPO
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- prepare trade class to control positions if hedging mode is active
   trade.SetExpertMagicNumber(Inpmagic);
   trade.SetMarginMode();
   trade.SetTypeFillingBySymbol(Symbol());
//--- DPO indicator
   DPO_fast=iCustom(NULL,0,"Examples\\DPO",dpo_fast_period);
   if(DPO_fast==INVALID_HANDLE)
     {
      printf("Error creating MA indicator");
      return(INIT_FAILED);
     }
//--- DPO indicator
   DPO_slow=iCustom(NULL,0,"Examples\\DPO",dpo_slow_period);
   if(DPO_slow==INVALID_HANDLE)
     {
      printf("Error creating MA indicator");
      return(INIT_FAILED);
     }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
//---------------Задаем цены покупки и продажи------------------------
   double Ask=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
   double Bid=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);

   int signal=0;  // сигнал на покупку, продажу

//*******************************************************************
// эта часть программы выполняется каждый тик
//-if(!isNewBar(PERIOD_M1))
   Print("Новый бар M1 ",  TimeCurrent());
//-if(!isNewBar(PERIOD_M5))
   Print("Новый бар M5 ",  TimeCurrent());
//-if(!isNewBar(PERIOD_CURRENT))
   Print("Новый бар M15",  TimeCurrent());
//*******************************************************************
//--------------Проверка на новый бар
   if(!isNewBar(PERIOD_CURRENT))
      return;
//--------------------------------------------------------------------
   ArraySetAsSeries(fDPOVal,true);              // задаем направление индексов массива
   ArraySetAsSeries(sDPOVal,true);
   if(CopyBuffer(DPO_fast,0,0,10,fDPOVal)<0)    // наполняем массив значений DPO fast
     {
      Alert("Ошибка копирования буфера индикатора fast DPO. Ошибка ", GetLastError());
     }
   if(CopyBuffer(DPO_slow,0,0,10,sDPOVal)<0)    // наполняем массив значений DPO slow
     {
      Alert("Ошибка копирования буфера индикатора slow DPO. Ошибка ", GetLastError());
     }

   double DPO_fast_c_value=NormalizeDouble(fDPOVal[1],6);  // запоминаем значение индикатора DPO fast на предыдущем баре
   double DPO_slow_c_value=NormalizeDouble(sDPOVal[1],6);  // запоминаем значение индикатора DPO slow на предыдущем баре
   double DPO_fast_p_value=NormalizeDouble(fDPOVal[2],6);  // запоминаем значение индикатора DPO fast на пред-предыдущем баре
   double DPO_slow_p_value=NormalizeDouble(sDPOVal[2],6);  // запоминаем значение индикатора DPO slow на пред-предыдущем баре

   if(DPO_slow_c_value>0 && DPO_slow_p_value<0 && DPO_fast_c_value>0)  // если медленный индикатор пересекает 0 снизу вверх и быстрый находится выше 0
      signal=1;                                                        // сигнал на открытие покупки
   if(DPO_slow_c_value<0 && DPO_slow_p_value>0 && DPO_fast_c_value<0)  // если медленный индикатор пересекает 0 сверху вниз и быстрый находится ниже 0
      signal=-1;                                                       // сигнал на открытие продажи
   if(DPO_fast_c_value>0 && DPO_fast_p_value<0)                        // если быстрый индикатор пересекает 0 снизу вверх
      signal=-2;                                                       // сигнал на закрытие продажи
   if(DPO_fast_c_value<0 && DPO_fast_p_value>0)                        // если быстрый индикатор пересекает 0 сверху вниз
      signal=2;                                                        // сигнал на закрытие покупки
   if(!Revers)
     {
      switch(signal)
        {
         case -1:
            trade.Buy(Inpvolume,NULL,Ask,0,0,NULL);
            break;
         case 1:
            trade.Sell(Inpvolume,NULL,Bid,0,0,NULL);
            break;
         case -2:
            trade.PositionClose(_Symbol,slippage);
            break;
         case 2:
            trade.PositionClose(_Symbol,slippage);
            break;
        }
     }
   if(Revers)
     {
      switch(signal)
        {
         case -1:
            trade.Sell(Inpvolume,NULL,Bid,0,0,NULL);
            break;
         case 1:
            trade.Buy(Inpvolume,NULL,Ask,0,0,NULL);
            break;
         case -2:
            trade.PositionClose(_Symbol,slippage);
            break;
         case 2:
            trade.PositionClose(_Symbol,slippage);
            break;
        }
     }
  }
/*
//+------------------------------------------------------------------+
//| Возвращает true, если появился новый бар для пары символ/период  |
//+------------------------------------------------------------------+
bool isNewBar()
  {
//--- в статической переменной будем помнить время открытия последнего бара
   static datetime last_time=0;
//--- текущее время
   datetime lastbar_time=(int)SeriesInfoInteger(Symbol(),Period(),SERIES_LASTBAR_DATE);

//--- если это первый вызов функции
   if(last_time==0)
     {
      //--- установим время и выйдем
      last_time=lastbar_time;
      return(false);
     }

//--- если время отличается
   if(last_time!=lastbar_time)
     {
      //--- запомним время и вернем true
      last_time=lastbar_time;
      return(true);
     }
//--- дошли до этого места - значит бар не новый, вернем false
   return(false);
  }
*/
//+------------------------------------------------------------------+
//| возвращает true если появился новый бар, иначе false             |
//+------------------------------------------------------------------+
bool isNewBar(ENUM_TIMEFRAMES timeFrame)
  {
//----
   static datetime old_Times[21];// массив для хранения старых значений
   bool res=false;               // переменная результата анализа
   int  i=0;                     // номер ячейки массива old_Times[]
   datetime new_Time[1];         // время нового бара

   switch(timeFrame)
     {
      case PERIOD_M1:
         i= 0;
         break;
      case PERIOD_M2:
         i= 1;
         break;
      case PERIOD_M3:
         i= 2;
         break;
      case PERIOD_M4:
         i= 3;
         break;
      case PERIOD_M5:
         i= 4;
         break;
      case PERIOD_M6:
         i= 5;
         break;
      case PERIOD_M10:
         i= 6;
         break;
      case PERIOD_M12:
         i= 7;
         break;
      case PERIOD_M15:
         i= 8;
         break;
      case PERIOD_M20:
         i= 9;
         break;
      case PERIOD_M30:
         i=10;
         break;
      case PERIOD_H1:
         i=11;
         break;
      case PERIOD_H2:
         i=12;
         break;
      case PERIOD_H3:
         i=13;
         break;
      case PERIOD_H4:
         i=14;
         break;
      case PERIOD_H6:
         i=15;
         break;
      case PERIOD_H8:
         i=16;
         break;
      case PERIOD_H12:
         i=17;
         break;
      case PERIOD_D1:
         i=18;
         break;
      case PERIOD_W1:
         i=19;
         break;
      case PERIOD_MN1:
         i=20;
         break;
     }
// скопируем время последнего бара в ячейку new_Time[0]
   int copied=CopyTime(_Symbol,timeFrame,0,1,new_Time);

   if(copied>0) // все ок. данные скопированы
     {
      if(old_Times[i]!=new_Time[0])       // если старое время бара не равно новому
        {
         if(old_Times[i]!=0)
            res=true;    // если это не первый запуск, то истина = новый бар
         old_Times[i]=new_Time[0];        // запоминаем время бара
        }
     }
//----
   return(res);
  }
//+------------------------------------------------------------------+
 
Alexsandr San:

¿tal vez algo como esto?

Si cambias los números aquí.

   double DPO_fast_c_value=NormalizeDouble(fDPOVal[1],6);  // запоминаем значение индикатора DPO fast на предыдущем баре
   double DPO_slow_c_value=NormalizeDouble(sDPOVal[0],6);  // запоминаем значение индикатора DPO slow на предыдущем баре
   double DPO_fast_p_value=NormalizeDouble(fDPOVal[0],6);  // запоминаем значение индикатора DPO fast на пред-предыдущем баре
   double DPO_slow_p_value=NormalizeDouble(sDPOVal[1],6);  // запоминаем значение индикатора DPO slow на пред-предыдущем баре

es más limpio.

Foto de

 

¡Saludos Colegas!

Por favor, avise de lo siguiente. La función OnTester calcula dos parámetros. ¿Existe la posibilidad de que cuando se optimiza un parámetro, el segundo parámetro simplemente salga en la tabla de optimización? ¿Y cómo hacer esto si es así? Gracias.

 
Hola a todos!!! ¿Pueden decirme si es posible cargar el historial de cotizaciones en mt5? Buscando información desde hace 2 días pero no lo consigo
 
Igorz2006:
Hola a todos, ¿es posible cargar el historial de cotizaciones en mt5? He estado buscando información durante 2 días, pero no puedo entenderlo

Funciones:

CopyRates

Obtiene los datos del historial de la estructura Rates para el símbolo y el período especificados en una matriz

CopyTime

Obtiene los datos históricos de la hora de apertura de la barra para un símbolo y un período especificados en una matriz

CopiarAbrir

Obtiene los datos históricos del precio de apertura de la barra para un símbolo y un período especificados en una matriz

CopyHigh

Obtiene los datos del historial del precio máximo de la barra para un símbolo y un período especificados en una matriz

CopyLow

Obtiene los datos del historial del precio mínimo de la barra para un símbolo y un período especificados en una matriz

CopiarCerrar

Obtiene los datos históricos del precio de cierre de la barra para un símbolo y un período especificados en una matriz

CopyTickVolume

Obtiene los datos históricos de los volúmenes de ticks para un símbolo y un período especificados en una matriz

CopiarVolumenReal

Obtiene los datos históricos de los volúmenes de las operaciones para un símbolo y un período especificados en una matriz

CopySpread

Obtiene los datos históricos de los spreads para un símbolo y un período especificados en una matriz

CopyTicks

Obtiene los datos del historial de ticks en formato MqlTick en un array

CopyTicksRange

Obtiene los ticks en el rango de fechas especificado en un array

Документация по MQL5: Доступ к таймсериям и индикаторам / CopyRates
Документация по MQL5: Доступ к таймсериям и индикаторам / CopyRates
  • www.mql5.com
Получает в массив rates_array исторические данные структуры MqlRates указанного символа-периода в указанном количестве. Отсчет элементов от стартовой позиции ведется от настоящего к прошлому, то есть стартовая позиция, равная 0, означает текущий бар. При копировании заранее неизвестного количества данных рекомендуется в качестве приемного...
 
Igorz2006:
¿Es posible cargar el historial de cotizaciones en mt5? Llevo 2 días buscando información, pero no la encuentro.

No hay ninguna cosa de HistoryCenter (como en el 4). simplemente presione PgUp. también compruebe en los ajustes cuántas barras para el gráfico se permiten.

 
Gracias, lo probaré. Es necesario importar el historial de cotizaciones de Bitcoin y criptomonedas para su análisis
Razón de la queja: