초보자의 질문 MQL5 MT5 MetaTrader 5 - 페이지 1213

 
Andrey.Sabitov :

안녕하세요 전문가 여러분.

이전 위치를 닫은 SELL과 동일한 막대에서 BUY 위치를 열 수 없는 코드의 오류가 어디에 있습니까?

규칙은 간단합니다(배우기):
1 항목 - 느린 표시기로 교차 0 + 빠름도 영역에 있습니다(매수/매도)

2 출구 - 빠른 표시기가 있는 횡단 0

여기에서 귀하의 코드를 알아 내려고 노력 중입니다. 귀하가 게시한 모든 코드가 아니기 때문에 지금까지 방금 시작했습니다.

스냅 사진

귀하의 코드와 내 사전 생각.

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

응답해주신 분들께 감사드립니다.

그러나 문제는 주문이 마감되고 같은 막대에 신호가 있을 때 위치가 열리지 않는다는 것입니다.

이 문제의 원인이 무엇이며 어떻게 고칠 수 있는지 알려주실 수 있습니까?


 
Andrey.Sabitov :

응답해주신 분들께 감사드립니다.

그러나 문제는 주문이 마감되고 같은 막대에 신호가 있을 때 위치가 열리지 않는다는 것입니다.

이 문제의 원인이 무엇이며 어떻게 고칠 수 있는지 알려주실 수 있습니까?


Offhand: 새 막대를 확인 중입니다.

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

그리고 나서야 신호를 찾습니다. 이미이 술집에 가본 적이 있다면 이미 들어 가지 않을 것입니다.

 

아마도 그런 것?

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

아마도 그런 것?

여기서 숫자를 바꾸면

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

청소기 작동

스냅 사진

 

동료를 환영합니다!

다음을 프롬프트합니다. OnTester 함수에서 두 개의 매개변수가 계산됩니다. 하나의 매개변수에 대해 최적화할 때 최적화 테이블에 두 번째 매개변수를 단순히 표시하는 것이 가능합니까??? 그렇다면 어떻게 해야 할까요? 고맙습니다!

 
여보세요!! 말해봐, MT5에서 시세 내역을 다운로드 할 수 있습니까? 2일째 정보를 찾고 있지만 알아낼 수 없음
 
Igorz2006 :
여보세요!! 말해봐, MT5에서 시세 내역을 다운로드 할 수 있습니까? 정보를 찾고 있는 2일차, 그러나 나는 그것을 알아낼 수 없다

기능:

카피율

구조체의 과거 데이터를 배열로 가져옵니다.   요금   지정된 문자 및 기간 동안

카피타임

해당 기호 및 기간에 대한 막대의 열림 시간에 대한 배열 기록 데이터를 가져옵니다.

복사 열기

해당 기호 및 기간에 대한 막대의 시가에 대한 과거 데이터를 배열로 수신

카피하이

해당 기호 및 기간에 대한 막대의 최고 가격에 대한 과거 데이터를 배열로 수신

낮은 복사

해당 기호 및 기간에 대한 막대의 최소 가격에 대한 과거 데이터를 배열로 가져옵니다.

복사닫기

해당 기호 및 기간에 대한 막대 종가에 대한 과거 데이터를 배열로 가져옵니다.

CopyTickVolume

해당 기호 및 기간에 대한 틱 볼륨의 과거 데이터를 배열로 가져옵니다.

CopyRealVolume

해당 기호 및 기간에 대한 거래량에 대한 과거 데이터를 어레이로 가져옵니다.

카피스프레드

해당 기호 및 기간의 스프레드에 대한 과거 데이터를 배열로 가져옵니다.

카피틱

MqlTick 형식의 눈금을 배열로 가져옵니다.

CopyTicksRange

지정된 날짜 범위의 눈금을 배열로 가져옵니다.

Документация по MQL5: Доступ к таймсериям и индикаторам / CopyRates
Документация по MQL5: Доступ к таймсериям и индикаторам / CopyRates
  • www.mql5.com
Получает в массив rates_array исторические данные структуры MqlRates указанного символа-периода в указанном количестве. Отсчет элементов от стартовой позиции ведется от настоящего к прошлому, то есть стартовая позиция, равная 0, означает текущий бар. При копировании заранее неизвестного количества данных рекомендуется в качестве приемного...
 
Igorz2006 :
여보세요!! 말해봐, MT5에서 시세 내역을 다운로드 할 수 있습니까? 정보를 찾고 있는 2일차, 그러나 나는 그것을 알아낼 수 없다

HistoryCenter와 같은 것은 없습니다(4개에서와 같이). 그냥 PgUp을 누르십시오. 또한 차트에 허용되는 막대의 수를 설정에서 확인하십시오.

 
감사합니다. 노력하겠습니다. 분석을 위해 비트코인 및 암호화폐 시세 이력을 가져와야 합니다.
사유: