Questions from Beginners MQL5 MT5 MetaTrader 5 - page 1213

 
Andrey.Sabitov:

Good afternoon, dear experts.

Could you please tell me where in the code there is an error that prevents opening BUY position on the same bar with SELL that has closed a previous position?

The rules are simple (to learn):
1 Entry - slow indicator crossing 0 + fast also in the zone (buy/sell)

2 Exit - crossing by quick indicator 0

I'm trying to figure out your code - I'm just running it now, not all of it, you've laid out

Photo by

Your code - and my thoughts .

Реверс добавил и Индикатор в положенное место переставил 
//+------------------------------------------------------------------+
//|                                                      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);
  }
//+------------------------------------------------------------------+
 

Thanks to those who responded.

But the problem remains that when an order is closed and there is a signal on the same bar, the position does not open.

Can you please tell me what this might be about and how can it be fixed?


 
Andrey.Sabitov:

Thanks to those who responded.

But the problem remains that when an order is closed and there is a signal on the same bar, the position does not open.

Can you please tell me what this could be about and how to fix it?


At a quick glance, you check for a new bar:

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

and only then look for a signal. It turns out that if you have already been on this bar you will not hit it.

 

maybe something like this ?

//+------------------------------------------------------------------+
//|                                                      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:

maybe something like this?

If you change the numbers here.

   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 на пред-предыдущем баре

it's cleaner.

Photo by

 

Greetings Colleagues!

Please advise the following. The OnTester function calculates two parameters. Is there a possibility when optimizing on one parameter, the second parameter is simply output in the optimization table??? And how to do this if yes? Thank you!

 
Hi all!!! Can you tell me if it is possible to load quotes history in mt5? Looking for info for 2 days but can't figure it out
 
Igorz2006:
Hi all! Can you tell me, is it possible to load the quotes history in mt5? I' ve been searching for info for 2 days, but can't figure it out

Functions:

CopyRates

Gets history data of Rates structure for specified symbol and period into an array

CopyTime

Gets history data on bar opening time for a specified symbol and period into an array

CopyOpen

Gets history data on bar opening price for a specified symbol and period into an array

CopyHigh

Gets history data on maximal bar price for a specified symbol and period into an array

CopyLow

Gets history data on minimal bar price for a specified symbol and period into an array

CopyClose

Gets history data on bar close price for a specified symbol and period into an array

CopyTickVolume

Gets history data on tick volumes for a specified symbol and period into an array

CopyRealVolume

Gets history data on trade volumes for a specified symbol and period into an array

CopySpread

Gets history data on spreads for a specified symbol and period into an array

CopyTicks

Gets history data on ticks in MqlTick format into an array

CopyTicksRange

Gets ticks in the specified date range into an array

Документация по MQL5: Доступ к таймсериям и индикаторам / CopyRates
Документация по MQL5: Доступ к таймсериям и индикаторам / CopyRates
  • www.mql5.com
Получает в массив rates_array исторические данные структуры MqlRates указанного символа-периода в указанном количестве. Отсчет элементов от стартовой позиции ведется от настоящего к прошлому, то есть стартовая позиция, равная 0, означает текущий бар. При копировании заранее неизвестного количества данных рекомендуется в качестве приемного...
 
Igorz2006:
Is it possible to load the quotes history in mt5? I' ve been searching for info for 2 days, but can't find it.

There is no HistoryCenter thingy (like in 4). just press PgUp. also check in the settings how many bars for the chart are allowed.

 
Thanks, I'll give it a try. Bitcoin and crypto quote history needs to be imported for analysis