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

 

다음과 같이 가능합니다.

 void OnStart ()
{
   int select= 10 ;
   MqlRates rates[];
   CopyRates ( _Symbol , _Period , 0 ,select,rates);
   for ( int i= 1 ;i<select;i++)
  {
     if (rates[i].close<rates[i- 1 ].close)
    {
       //тут какой-нибудь код
    }
  }
}
 
Fleder :

다음과 같이 가능합니다.

고맙습니다.

ArraySize 에 대한 질문, 한 번에 선택 [9] 요소의 수가 있으면 함수가 값 10을 반환합니까? 또는 값을 할당 할 때까지 0이 될까요?

 
websafe25 :

고맙습니다.

ArraySize 에 대한 질문, 한 번에 선택 [9] 요소의 수가 있으면 함수가 값 10을 반환합니까? 또는 값을 할당 할 때까지 0이 될까요?

배열 작업을 위한 함수 그룹

4차원 배열만 허용됩니다. 차원 은 0 에서 dimension_size-1 까지 인덱싱됩니다 . 50개 요소의 1차원 배열의 특별한 경우 첫 번째 요소에 액세스하는 것은 array[0], 마지막 요소인 array[49]처럼 보입니다.

확인할 스크립트는 다음과 같습니다.

 //+------------------------------------------------------------------+
//|                                                  test_script.mq5 |
//|                              Copyright © 2014, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2014, Vladimir Karputov"
#property link        "http://wmua.ru/slesar/"
#property version    "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ()
  {
   double select[ 9 ];
   Print ( "Количество элементов массива select =" , ArraySize (select));
  }
//+------------------------------------------------------------------+
Документация по MQL5: Операции с массивами
Документация по MQL5: Операции с массивами
  • www.mql5.com
Операции с массивами - Документация по MQL5
 
websafe25 :

고맙습니다.

ArraySize 에 대한 질문, 한 번에 선택 [9] 요소의 수가 있으면 함수가 값 10을 반환합니까? 또는 값을 할당 할 때까지 0이 될까요?

배열이 정적이고 크기가 10개의 셀이면 ArraySize 함수는 각 셀의 내용에 관계없이 항상 숫자 10을 반환합니다.

배열이 동적이면 ArraySize 함수는 실제 크기를 반환합니다(이 크기는 변경할 수 있음).

 

내 생성기를 계속 만듭니다) 모듈은 Include\Expert\Signal에 있습니다.

1. 신호 모듈 목록에서 찾을 수 없습니다.

2. 이 행은 혼란스럽습니다.

 double buy    =Signal_open_b( 1 );
사이의 차이를 얻을 필요가
Main(index)-Signal(index)

색인 1이 있는 막대에. 제가 올바르게 이해했다면 색인이 괄호 안에 표시되어 있습니까?

3. 이 라인은 모든 표시기 버퍼의 수를 나타냅니까, 아니면 어느 것이 사용될 것인가?

 if (!m_TSI.NumBuffers( 11 )) return ( false );

4. 확인을 위해 스크립트에서 이 생성기의 데이터를 요청하는 방법을 알려주십시오.

아래는 전체 코드입니다. 제가 다른곳에서 틀릴수도 있으니 조언 부탁드립니다.

 #include <Expert\ExpertSignal.mqh>
// wizard description start
//+------------------------------------------------------------------+
//| Description of the class                                         |
//| Title=Сигнал индикатора 'Blau_Ergodic'                           |
//| Type=SignalAdvanced                                              |
//| Name=MyCustomIndicator                                           |
//| ShortName=MyCustomIndicator                                      |
//| Class=CSignalMyCustInd                                           |
//| Page=signal_envelopes                                            |
//| Parameter=q                                                      |
//| Parameter=r                                                      |
//| Parameter=s                                                      |
//| Parameter=u                                                      |
//| Parameter=ul                                                     |
//+------------------------------------------------------------------+
// wizard description end
//+------------------------------------------------------------------+
//| Class CSignalMyCustInd.                                          |
//| Purpose: Класс генератора торговых сигналов на основе            |
//|          пользовательского индикатора.                           |
//| Является производным от класса CExpertSignal.                    |
//+------------------------------------------------------------------+
class CSampleSignal : public CExpertSignal
  {
protected :
   CiCustom           m_TSI;               // объект для доступа к значениям TSI
   CiClose            m_close;           // объект для доступа к ценам закрытия баров
   //--- настраиваемые параметры
   int       q;   // q - период, по которому вычисляется моментум
   int       r; // r - период 1-й EMA, применительно к моментуму
   int       s;   // s - период 2-й EMA, применительно к результату первого сглаживания
   int       u;   // u - период 3-й EMA, применительно к результату второго сглаживания
   int       ul; // ul - (сигнальная линия) период EMA, применительно к эргодике
   double              m_stop_loss;       // уровень установки ордера "stop loss" относительно цены открытия
   double              m_take_profit;     // уровень установки ордера "take profit" относительно цены открытия
public :
              CSampleSignal();
 //--- методы установки настраиваемых параметров              
   void                Q( int value)                 { q=value;   }
   void                R( int value)                 { r=value;   }
   void                S( int value)                 { s=value;   }
   void                U( int value)                 { u=value;   }
   void                UL( int value)                { ul=value;  }
   void                StopLoss( double value)       { m_stop_loss=value;   }
   void                TakeProfit( double value)     { m_take_profit=value; }
   //--- метод проверки параметров настройки
   virtual bool        ValidationSettings();   
   virtual bool        InitIndicators(CIndicators* indicators);
     //--- методы проверки, если модели рынка сформированы 
   virtual bool       CheckOpenLong( double & price, double & sl, double & tp, datetime & expiration);
   virtual bool       CheckOpenShort( double & price, double & sl, double & tp, datetime & expiration);
protected :
   //--- метод инициализации объектов
   bool                InitMyCustomIndicator(CIndicators* indicators);
   bool                InitClose(CIndicators* indicators);
   //--- методы доступа к данным объектов
   double              Main( int index)                     { return (m_TSI.GetData( 0 ,index)); }
   double              Signal( int index)                   { return (m_TSI.GetData( 1 ,index)); }
   double              Signal_open_b( int index)           { return (Main(index)-Signal(index));}
   double              Signal_open_s( int index)           { return (Signal(index)-Main(index));}
   double              Close( int index)                    { return (m_close.GetData(index)); }
  };
//+------------------------------------------------------------------+
//| Конструктор CSampleSignal.                                       |
//| INPUT:  нет.                                                     |
//| OUTPUT: нет.                                                     |
//| REMARK: нет.                                                     |
//+------------------------------------------------------------------+
void CSampleSignal::CSampleSignal()
  {
   q= 2 ; 
   r= 7 ;
   s= 5 ;
   u= 3 ;
   ul= 5 ;   
  }
//+------------------------------------------------------------------+
//| Проверка параметров настройки.                                   |
//| INPUT:  нет.                                                     |
//| OUTPUT: true-если настройки правильные, иначе false.             |
//| REMARK: нет.                                                     |
//+------------------------------------------------------------------+
bool CSampleSignal::ValidationSettings()
  {
   //--- проверка параметров
   if (q<= 0 ||r<= 0 ||s<= 0 ||u<= 0 ||ul<= 0 )
     {
       printf ( __FUNCTION__ + ": период должен быть больше нуля" );
       return ( false );
     }
//--- успешное завершение
   return ( true );
  }
//+------------------------------------------------------------------+
//| Инициализация индикаторов и таймсерий.                           |
//| INPUT:  indicators - указатель на объект-коллекцию               |
//|                      индикаторов и таймсерий.                    |
//| OUTPUT: true-в случае успешного завершения, иначе false.         |
//| REMARK: нет.                                                     |
//+------------------------------------------------------------------+
bool CSampleSignal::InitIndicators(CIndicators* indicators)
  {
//--- проверка указателя
   if (indicators== NULL )       return ( false );
//--- инициализация TSI
   if (!InitMyCustomIndicator(indicators))     return ( false );
   //--- инициализация таймсерии цен закрытия
   if (!InitClose(indicators)) return ( false );
   return ( true );
  }
//+------------------------------------------------------------------+
//| Инициализация индикаторов.                                       |
//+------------------------------------------------------------------+
bool CSampleSignal::InitMyCustomIndicator(CIndicators *indicators)
  {
//--- добавление объекта в коллекцию
   if (!indicators.Add( GetPointer (m_TSI)))
     {
       printf ( __FUNCTION__ + ": error adding object" );
       return ( false );
     }
//--- задание параметров индикатора
   MqlParam parameters[ 6 ];
//---
   parameters[ 0 ].type= TYPE_STRING ;
   parameters[ 0 ].string_value= "Blau_Ergodic.ex5" ;
   parameters[ 1 ].type= TYPE_INT ;
   parameters[ 1 ].integer_value=q;
   parameters[ 2 ].type= TYPE_INT ;
   parameters[ 2 ].integer_value=r;
   parameters[ 3 ].type= TYPE_INT ;
   parameters[ 3 ].integer_value=s;
   parameters[ 4 ].type= TYPE_INT ;
   parameters[ 4 ].integer_value=u;
   parameters[ 5 ].type= TYPE_INT ;
   parameters[ 5 ].integer_value=ul;
//--- инициализация объекта
   if (!m_TSI.Create(m_symbol.Name(), 0 , IND_CUSTOM , 6 ,parameters))
     {
       printf ( __FUNCTION__ + ": error initializing object" );
       return ( false );
     }
//--- количество буферов
   if (!m_TSI.NumBuffers( 11 )) return ( false );
//--- ok
   return ( true );
  }
//+------------------------------------------------------------------+
//| Инициализация таймсерии цен закрытия.                            |
//| INPUT:  indicators - указатель на объект-коллекцию               |
//|                      индикаторов и таймсерий.                    |
//| OUTPUT: true-в случае успешного завершения, иначе false.         |
//| REMARK: нет.                                                     |
//+------------------------------------------------------------------+
bool CSampleSignal::InitClose(CIndicators* indicators)
  {
//--- инициализация объекта таймсерии
   if (!m_close.Create(m_symbol.Name(),m_period))
     {
       printf ( __FUNCTION__ + ": ошибка инициализации объекта" );
       return ( false );
     }
//--- добавление объекта в коллекцию
   if (!indicators.Add( GetPointer (m_close)))
     {
       printf ( __FUNCTION__ + ": ошибка добавления объекта" );
       return ( false );
     }
//--- успешное завершение
   return ( true );
  }
//+------------------------------------------------------------------+
//| Проверка выполнения условия для покупки.                         |
//| INPUT:  price      - ссылка для размещения цены открытия,        |
//|         sl         - ссылка для размещения цены stop loss,       |
//|         tp         - ссылка для размещения цены take profit,     |
//|         expiration - ссылка для размещения времени истечения.    |
//| OUTPUT: true-если условие выполнено, иначе false.                |
//| REMARK: нет.                                                     |
//+------------------------------------------------------------------+
bool CSampleSignal::CheckOpenLong( double & price, double & sl, double & tp, datetime & expiration)
  {
//--- подготовка данных
   double buy    =Signal_open_b( 1 );
   double unit  =PriceLevelUnit();
//--- проверка условия
   if (buy> 1 )
     {
      price=m_symbol.NormalizePrice(Close( 0 ));
      sl   =m_symbol.NormalizePrice(price-m_stop_loss*unit);
      tp   =m_symbol.NormalizePrice(price+m_take_profit*unit);
      expiration+=m_expiration* PeriodSeconds (m_period);
       //--- условие выполнено
       return ( true );
     }
//--- условие не выполнено
   return ( false );
  }
 
forexman77 :

내 생성기를 계속 만듭니다) 모듈은 Include\Expert\Signal에 있습니다.

1. 신호 모듈 목록에서 찾을 수 없습니다.

2. 이 행은 혼란스럽습니다.

사이의 차이를 얻을 필요가

색인 1이 있는 막대에. 제가 올바르게 이해했다면 색인이 괄호 안에 표시되어 있습니까?

3. 이 라인은 모든 표시기 버퍼의 수를 나타냅니까, 아니면 어느 것이 사용될 것인가?

4. 확인을 위해 스크립트에서 이 생성기의 데이터를 요청하는 방법을 알려주십시오.

아래는 전체 코드입니다. 제가 다른곳에서 틀릴수도 있으니 조언 부탁드립니다.

클래스 뒤의 헤더에서 CSampelSignal을 작성해야 합니다.
 
barabashkakvn :
클래스 뒤의 헤더에서 CSampelSignal을 작성해야 합니다.

다음과 같이 했습니다.

 //+------------------------------------------------------------------+
//| Description of the class                                         |
//| Title=Сигнал индикатора 'Blau_Ergodic'                           |
//| Type=SignalAdvanced                                              |
//| Name=MyCustomIndicator                                           |
//| ShortName=MyCustomIndicator                                      |
//| Class=CSampelSignal                                              |
//| Page=signal_envelopes                                            |
//| Parameter=q                                                      |
//| Parameter=r                                                      |
//| Parameter=s                                                      |
//| Parameter=u                                                      |
//| Parameter=ul                                                     |
//+------------------------------------------------------------------+
// wizard description end
//+------------------------------------------------------------------+
//| Class CSampelSignal.                                          |
//| Purpose: Класс генератора торговых сигналов на основе            |
//|          пользовательского индикатора.                           |
//| Является производным от класса CExpertSignal.                    |
//+------------------------------------------------------------------+
나는 그것을 찾을 수 없습니다. 메뉴에서 고문 생성을 선택합니다 .
 
forexman77 :

다음과 같이 했습니다.

나는 찾지 않는다. 메뉴에서 고문 생성을 선택합니다 .
MetaEditor를 다시 시작해야 합니다.


Мастер MQL5: Как написать свой модуль торговых сигналов
Мастер MQL5: Как написать свой модуль торговых сигналов
  • 2010.12.28
  • MetaQuotes Software Corp.
  • www.mql5.com
Генератор торговых стратегий Мастера MQL5 значительно упрощает проверку торговых идей. В статье рассказывается о том, как написать и подключить в Мастер MQL5 свой собственный класс торговых сигналов с реализацией сигналов по пересечению ценой скользящей средней, рассматривается структура и формат описания созданного класса для Мастера MQL5.
 
barabashkakvn :
MetaEditor를 다시 시작해야 합니다.

https://www.mql5.com/en/articles/226

여러 번 열었다 닫았다. 아무것도 없습니다.

아마도 소멸자가 놓쳤기 때문일 것입니다. 컴파일되지 않고 오류가 발생합니다.

 //+------------------------------------------------------------------+
//| Destructor                                                       |
//+------------------------------------------------------------------+
CSampleSignal::~CSampleSignal( void )
  {
  }
~CSampleSignal' - 멤버 함수 가 정의되지 않았습니다.
 
forexman77 :

다음과 같이 했습니다.

나는 찾지 않는다. 메뉴에서 고문 생성을 선택합니다 .

그리고, 모자라는 이름으로 종교가 허락하지 않는 코드를 전체적으로 나열해 보세요 :) ?

또한 읽을 가치가 있습니다.

MQL5 마법사: 자신의 거래 신호 모듈을 작성하는 방법

https://www.mql5.com/ru/forum/3724/page3#comment_66962

그리고 코드의 오류는 헤더의 매개변수에 대한 잘못된 설명입니다. 강조 표시된 것은 수정된 코드입니다.

 #include <Expert\ExpertSignal.mqh>
// wizard description start
//+------------------------------------------------------------------+
//| Description of the class                                         |
//| Title=Сигнал индикатора 'Blau_Ergodic'                           |
//| Type=SignalAdvanced                                              |
//| Name=MyCustomIndicator                                           |
//| ShortName=MyCustomIndicator                                      |
//| Class=CSampleSignal                                              |
//| Page=signal_envelopes                                            |
//| Parameter=q,int,12,Parametr_q                                    |
//| Parameter=r,int,6,Parametr_r                                     |
//| Parameter=s,int,9,Parametr_s                                     |
//| Parameter=u,int,24,Parametr_u                                    |
//| Parameter=ul,int,8,Parametr_ul                                   |
//+------------------------------------------------------------------+
// wizard description end

물론 천장에서 매개 변수 값을 설정합니다. 이 값은 예시일 뿐입니다.

사유: