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

 
그리고 따로 2개의 파일을 마켓에 둘 수 없습니다. 그게 정책입니다.
 
Aleksei Stepanenko # :

지표는 다음과 같습니다.

다음은 전문가입니다.

다음은 하나의 파일에 있는 모든 것입니다.

4개는 사실이지만 상위 5개에도 포함됩니다.

Expert 파일만 컴파일했습니다.

Expert Advisor가 호출할 수 있도록 표시기를 최소한 간단한 그래픽 개체로 채우십시오. 그런 다음 컴파일 후 Expert 파일만 Market으로 보내는 것처럼 Res_Ind.ex4의 이름을 바꾸거나 삭제합니다. 클라이언트는 작동하지 않는 프로그램을 받게 됩니다.

 
Aleksei Stepanenko # :
그리고 따로 2개의 파일을 마켓에 둘 수 없습니다. 그게 정책입니다.
무슨 얘기를 하는 걸까요...
 
Dmitriy VC # :

Expert 파일만 컴파일했습니다.

Expert Advisor가 호출할 수 있도록 표시기를 최소한 간단한 그래픽 개체로 채우십시오. 그런 다음 컴파일 후 Expert 파일만 Market으로 보내는 것처럼 Res_Ind.ex4의 이름을 바꾸거나 삭제합니다. 클라이언트는 작동하지 않는 프로그램을 받게 됩니다.

네, 그렇게 고집을 부릴 수는 없습니다... 리소스로 연결된 인디케이터가 어드바이저의 실행 파일에 포함되어 있다고 해서 그렇습니다.

그러나 지표가 그래픽 개체를 그리고 어드바이저가 이를 읽어야 한다는 사실이 큰 문제입니다. 그래픽 개체는 시각화로 테스트할 때만 사용할 수 있고 autovalidator는 시각화 없이 테스트하므로 개체의 속성을 볼 수 없습니다...

 
Alexey Viktorov # :

리소스로 연결된 인디케이터는 어드바이저의 실행 파일에 포함되어 있다고 해서 그렇습니다.

별도의 창에 표시

 //+------------------------------------------------------------------+
//|                                                          win.mq5 |
//|                                  Copyright 2021, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Ltd."
#property link        " https://www.mql5.com "
#property version    "1.00"
#property indicator_chart_window
#property indicator_plots 0
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {

   IndicatorSetString ( INDICATOR_SHORTNAME , "win" );

   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[])
  {
//---

//--- return value of prev_calculated for next call
   return (rates_total);
  }
//+------------------------------------------------------------------+

표시기 컴파일 --> win.ex5.

리소스에 이 지표가 있는 전문가 고문

 //+------------------------------------------------------------------+
//|                                                          exp.mq5 |
//|                                  Copyright 2021, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Ltd."
#property link        " https://www.mql5.com "
#property version    "1.00"

#resource "\\Indicators\\win.ex5"
char       number    = - 1 ;
int        handle    = INVALID_HANDLE ;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {

   if (number< 0 )
     {
      handle= iCustom ( _Symbol , _Period , "win.ex5" );
      number= char ( ChartGetInteger ( 0 , CHART_WINDOWS_TOTAL ));

       if (handle!= INVALID_HANDLE )
        {
         ChartIndicatorAdd ( 0 ,number,handle);
        }
     }

   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//---
   if (reason== REASON_REMOVE )
     {
       ChartIndicatorDelete ( 0 , int ( ChartWindowFind ( 0 , "win" )), "win" );
     }
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
//---

  }
//+------------------------------------------------------------------+

Expert 컴파일 --> exp.ex5.

Expert Advisor를 실행하면 차트에 표시기 창이 있습니다.

시장에 하나의 exp.ex5 전문가 파일을 게시합니다(실제로 win.ex5 표시기 파일을 삭제함).

Expert Advisor를 실행하면 차트에 표시기 창이 없습니다.

삭제된 win.ex5 파일을 복원합니다.

Expert Advisor를 실행하면 차트에 표시기 창이 있습니다.


결론: 표시기 코드는 Expert Advisor 코드에 포함되어 있지 않습니다. 리소스 Indicator가 있는 Expert Advisor의 정상적인 작동을 위해서는 리소스에 지정된 Indicator의 실행 파일이 필요합니다.


내 질문을 반복하겠습니다.

맞춤형 지표, 라이브러리가 있는 Expert Advisor가 있는 경우 시장에 게시하는 방법 Expert가 제대로 작동하려면 둘 이상의 파일이 필요합니까?

파일:
win.mq5  2 kb
exp.mq5  4 kb
 
Dmitriy VC # :

별도의 창에 표시

표시기 컴파일 --> win.ex5.

리소스에 이 지표가 있는 전문가 고문

Expert 컴파일 --> exp.ex5.

Expert Advisor를 실행하면 차트에 표시기 창이 있습니다.

시장에 하나의 exp.ex5 전문가 파일을 게시합니다(실제로 win.ex5 표시기 파일을 삭제함).

Expert Advisor를 실행하면 차트에 표시기 창이 없습니다.

삭제된 win.ex5 파일을 복원합니다.

Expert Advisor를 실행하면 차트에 표시기 창이 있습니다.


결론: 표시기 코드는 Expert Advisor 코드에 포함되어 있지 않습니다. 리소스 Indicator가 있는 Expert Advisor의 정상적인 작동을 위해서는 리소스에 지정된 Indicator의 실행 파일이 필요합니다.


내 질문을 반복하겠습니다.

맞춤형 지표, 라이브러리가 있는 Expert Advisor가 있는 경우 시장에 게시하는 방법 Expert가 제대로 작동하려면 둘 이상의 파일이 필요합니까?

문서에 대한 링크를 몇 번이나 받았습니까? 엄마가 읽지 말라고?

      handle= iCustom ( _Symbol , _Period , "win.ex5" ); // Это делается не так!!!!

드디어 읽다...

 
Alexey Viktorov # :

문서에 대한 링크를 몇 번이나 받았습니까? 엄마는 내가 읽지 못하게 했어?

드디어 읽다...

Alexey, 오류를 직접 지적해 주셔서 감사합니다.

문서를 읽었지만 "내 눈에는 보이지 않았습니다".

내가 사과하기 전에 - 밟았다.

이제 이해했습니다.

 

말해 주세요.

막대 수 계산을 클래스(:RatesTotal(void))에 추가했는데 구조에 올바르게 맞추는 방법을 알 수 없습니다. 이런 식으로 밝혀졌습니다. 어떻게 하면 더 좋아질 수 있는지 알려주세요.

 #include <Arrays\ArrayObj.mqh>
/********************************************************************\
|   Класс Новый бар                                                  |
\********************************************************************/
class CNewBar : public CObject
  {
private :
   string             m_symbol;
   ENUM_TIMEFRAMES    m_timeframe;
   datetime           m_time;
   long               m_rt;
   datetime           Time( void );  
   long               RatesTotal( void );   
   string              Symbol ( void )         { return this .m_symbol;    }
public :
   ENUM_TIMEFRAMES    Timeframe( void )      { return this .m_timeframe; }
   datetime           GetTime( void )        { return this .m_time;      } //  Возвращает время последнего обращения
   long               GetRatesTotal( void )     { return this .m_rt; }
   bool               IsNewBar( void );                                   //  Основная функция класса
                     CNewBar( const string symbol, const ENUM_TIMEFRAMES timeframe);
                    ~CNewBar( void ) {;}
  };
//+------------------------------------------------------------------+
//|    Конструктор                                                   |
//+------------------------------------------------------------------+
CNewBar::CNewBar( const string symbol, const ENUM_TIMEFRAMES timeframe) : m_time( 0 )
  {
   this .m_symbol = symbol;
   this .m_timeframe = (timeframe == PERIOD_CURRENT ? Period () : timeframe);
  }

//+------------------------------------------------------------------+
//|  Возвращает количество баров в истории                           |
//+------------------------------------------------------------------+
long CNewBar::RatesTotal( void )
  {
//---- получим количество баров
   long rt= SeriesInfoInteger ( this .m_symbol, this .m_timeframe, SERIES_BARS_COUNT );
//---- Проверка количества
   if (rt< 1 )
       Print ( "Error " + __FUNCTION__ + " Не определенно кол-во баров " , this .m_symbol, " " , this .m_timeframe);
//----
   return (rt);
  };
 //+------------------------------------------------------------------+
//| CNewBar IsNewBar Основная функция класса                         |
//+------------------------------------------------------------------+
bool CNewBar::IsNewBar( void )
  {
   m_rt= this .RatesTotal();
   datetime tm= this .Time();
   if (tm== 0 || m_rt< 1 )
       return false ;
   if (tm!= this .m_time)
     {
       this .m_time = tm;
       return true ;
     }
   return false ;
  }
 
Dmitriy VC # :

이제 이해했습니다.

밟지 않았지만 몰랐습니다. 전혀 문제 없습니다 :)

 

어떻게 하는지 알 수 없는 prev_calculated의 계산을 유사하게 구성하는 방법을 제안할 수 있습니까?


 //+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CNewBar:: PrevCalculated ( void )
  {
   int pc= this .m_rt
   return (pc)
  }
//+------------------------------------------------------------------+
//| CNewBar IsNewBar Основная функция класса                         |
//+------------------------------------------------------------------+
bool CNewBar::IsNewBar( void )
  {
   datetime tm= this .Time();

   if (tm== 0 || m_rt< 1 )
       return false ;
   if (tm!= this .m_time)
     {
       //--- определяем время
       this .m_time = tm;
       //--- определяем кол-во
       this .m_rt= this .RatesTotal();
       return true ;
     }
   return false ;
  }