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

 
Artyom Trishkin :
글쎄, 지금은 휴대 전화에서 다음과 같이 말할 것입니다. 코드에 경고가 있고 인쇄가 있는 주기가 있는 곳에서 구조가 이미 채워져 있습니다.

경고 는 On Start() 함수의 루프 외부에 있습니다.

 
Andrey Koldorkin :

경고는 On Start() 함수의 루프 외부에 있습니다.

글쎄, 거기에 또한 사이클에 채워진 구조를 읽을 필요가 있습니다.
 
Andrey Koldorkin :

경고는 On Start() 함수의 루프 외부에 있습니다.

글쎄, 나는 그것을 함수로 배열하는 방법을 대략적으로 보여주고 있습니다. 그런 다음 필요할 때 전화하세요.

 //+------------------------------------------------------------------+
//|                                                     TestCopy.mq4 |
//|              Copyright 2016, Artem A. Trishkin, Skype artmedia70 |
//|                       https://login.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Artem A. Trishkin, Skype artmedia70"
#property link        "https://login.mql5.com/ru/users/artmedia70"
#property version    "1.00"
#property strict
#property script_show_inputs

enum enumYN
  {
   enYes= 1 , // Да
   enNo= 0 ,   // Нет
  };

//--- input parameters
input int StartCopy= 1 ;         // Номер бара, с которого начинаем копировать
int startCopy=(StartCopy< 0 )? 0 :StartCopy;
input int Search_Period= 10 ;   // Количество копируемых свечей
int searchPeriod=(Search_Period< 1 )? 1 :Search_Period;
input int Delta= 2 ;             // Количество пунктов допуска
int delta=(Delta< 0 )? 0 :Delta;
input enumYN AsSeries=enYes;   // Массив array как таймсерия
MqlRates array[];             // Массив структур для копирования Open, High, Low, Close, Time
  
struct DataCandle             // Структура для хранения всех совпадений
  {
   int number_matched;           // Количество совпадений
   MqlRates reference_candle;     // Данные эталонной свечи
   MqlRates matched_candles[];   // Массив свечей, совпадающих с эталонной по нужному критерию 
  };
  DataCandle dataCandle[];     // Массив структур данных свечей и их совпадений
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ()
  {
//---
   int copy_bars=( int ) fmin (searchPeriod, Bars ( Symbol (), Period ()));                                  // количество копируемых свечей
   int searchResult=GetDataCandles( Symbol (), PERIOD_CURRENT ,startCopy,copy_bars,array,dataCandle);   // Вызываем функцию поиска совпадающих свечей
   
   //--- если результат есть какой-то ...
   if (searchResult> 0 ) {
       //--- ... посмотрим чего понаписали в массивы
       Alert ( "Array is series: " , ArrayIsSeries (array),
             "\ntime array[0]: " , TimeToString (array[ 0 ].time, TIME_DATE | TIME_MINUTES ),
             "\ntime array[" , string (searchPeriod- 1 ), "]: " , TimeToString (array[ ArraySize (array)- 1 ].time, TIME_DATE | TIME_MINUTES ));
       for ( int i= 0 ; i< ArraySize (dataCandle)- 1 ; i++) {
         string refs_txt= "" ;
         string matched_txt= "" ;
         refs_txt= "Свеча " + IntegerToString (i, 2 , '0' )+ ": время " + TimeToString (dataCandle[i].reference_candle.time)+ ", high: " + DoubleToString (dataCandle[i].reference_candle.high, Digits ())+ " имеет совпадений: " +( string )dataCandle[i].number_matched+ " шт. " ;
         if (dataCandle[i].number_matched> 0 ) {
             for ( int j= 0 ; j< ArraySize (dataCandle[i].matched_candles); j++) {
               matched_txt= "Совпадение " + IntegerToString (j+ 1 )+ ": " + TimeToString (dataCandle[i].matched_candles[j].time)+ ", high: " + DoubleToString (dataCandle[i].matched_candles[j].high, Digits ());
               }
            }
         Print (refs_txt,matched_txt);
         }
      }
  }
//+------------------------------------------------------------------+
int GetDataCandles( string sy, ENUM_TIMEFRAMES timeframe, int begin_copy, int number_copy, MqlRates &array_rates[], DataCandle &data_candle[]) {
   int copied= 0 ;
   copied= CopyRates (sy,timeframe,begin_copy,number_copy,array_rates);       // копируем данные
   if (copied> 0 ) {                                                           // если скопировали
       ArraySetAsSeries (array_rates,AsSeries);                               // Задаём массив как таймсерию или нет
       ArrayResize (data_candle,copied);                                     // задаём размер структуры равным числу скопированных данных
       ZeroMemory (data_candle);                                             // Обнуляем данные в структуре
       //--- основной цикл по "эталонным" свечам в массиве array. Их параметры будем искать в доп. цикле
       for ( int i= 0 ; i<copied- 1 ; i++) {                                       // цикл по скопированным данным от начала до "на один меньше размера массива"
         data_candle[i].reference_candle.high=array_rates[i].high;         // ищем этот high
         data_candle[i].reference_candle.low=array_rates[i].low;           // запомнили low для сравнения
         data_candle[i].reference_candle.time=array_rates[i].time;         // запомнили time для вывода в журнал
         //--- поиск совпадений с эталонной свечой, индексируемой индексом основного цикла i
         int size= 0 ;                                                       // размер массива совпадающих свечей
         ArrayResize (data_candle[i].matched_candles,size);                 // Размер массива совпадений в ноль
         data_candle[i].number_matched=size;                               // Инициализируем количество совпадений нулём
         //--- теперь ищем совпадения по high свечей в цикле j с high эталонной свечи с индексом i
         for ( int j= 0 ; j<copied; j++) {                                     // в цикле от i+1 до copy_bars
             if (j==i) continue ;                                             // пропустим свечу "саму себя"
             //--- если совпадают high эталонной свечи (i) и свечи с индексом j (с допуском на величину Point)
             if ( NormalizeDouble (delta* Point ()- fabs (array_rates[i].high-array_rates[j].high), Digits ())>= 0 ) {
               size++;                                               
               ArrayResize (data_candle[i].matched_candles,size);                 // увеличим размер массива совпадающих свечей
               data_candle[i].number_matched=size;                               // запишем количество совпадений
               data_candle[i].matched_candles[size- 1 ].high=array_rates[j].high;   // запишем в массив high совпадающей свечи
               data_candle[i].matched_candles[size- 1 ].low=array_rates[j].low;     // запишем в массив low совпадающей свечи
               data_candle[i].matched_candles[size- 1 ].time=array_rates[j].time;   // запишем в массив время совпадающей свечи
               }
            }
         }
      }
   return (copied);
}
//+------------------------------------------------------------------+
 
Koldun Zloy :

할 수 있다.

놀라운 기능.

매우 감사합니다.

이것에 대해 더 읽을 수 있는 곳을 알려주시겠습니까?

이제 URL에 텍스트를 게시하려고 하는데 도움말에 제공된 코드가 내 사이트에서도 로그인을 원하지 않습니다.

로그인하여 텍스트를 게시하기 위해 URL 주소 외에 타사 사이트에 대해 어떤 정보를 수집해야 하는지 궁금합니다.

 
mila.com :

이것에 대해 더 읽을 수 있는 곳을 알려주시겠습니까?

여기

 

인사말.
주제에있는 사람들이 나에게 문제를 해결하는 방법을 모릅니다.
저는 MT4 에서 사용할 수 있는 패널과 대화 상자를 만들기 위한 클래스를 사용하여 MT4에서 저 자신을 위한 거래 패널을 작성하고 있습니다.
거래 시가에 대한 데이터를 입력하고 SL 및 TP를 설정하기 위해
CEdit 클래스를 사용합니다(" Edit field " 개체를 기반으로 하는 간단한 제어 요소의 클래스임). 대안은 CSpinEdit 클래스 (콤보 컨트롤 "증가-감소 필드"의 클래스)이지만 정수 데이터에 적용됩니다. 일반적으로 사용하는 것을 선호합니다. CEdit, 증분이 필요하지 않기 때문입니다.

그렇다면
CEdit 입력 필드에 숫자만 입력할 수 있도록 하는 방법은 무엇입니까? 동시에 입력 마스크도 있는 것이 바람직합니다. MT4 터미널에 구현되어 있으므로 "새 주문"을 클릭하면 손절매이익 실현 필드가 다음과 같은 마스크에 따라 형식이 지정되는 것을 볼 수 있습니다. 0.0000 등. CEdit로 동일한 작업을 수행하는 방법은 무엇입니까? 나는 아직 수업 주제에 대해 깊이 이해하지 못했으며 일부는 이해할 수 없습니다.

 
Andrey Zuev :

인사말.
주제에있는 사람들이 나에게 문제를 해결하는 방법을 모릅니다.
저는 MT4 에서 사용할 수 있는 패널과 대화 상자를 만들기 위한 클래스를 사용하여 MT4에서 저 자신을 위한 거래 패널을 작성하고 있습니다.
거래 시가에 대한 데이터를 입력하고 SL 및 TP를 설정하기 위해
CEdit 클래스("Edit field" 개체를 기반으로 하는 간단한 제어 요소의 클래스)를 사용합니다. 대안은 CSpinEdit 클래스 (콤보 컨트롤 "증가-감소 필드"의 클래스)이지만 정수 데이터에 적용됩니다. 일반적으로 사용하는 것을 선호합니다. CEdit, 증분이 필요하지 않기 때문입니다.

그렇다면
CEdit 입력 필드에 숫자만 입력할 수 있도록 하는 방법은 무엇입니까? 동시에 입력 마스크도 있는 것이 바람직합니다. MT4 터미널에 구현되어 있으므로 "새 주문"을 클릭하면 손절매 및 이익실현 필드가 다음과 같은 마스크에 따라 형식이 지정되는 것을 볼 수 있습니다. 0.0000 등. CEdit로 동일한 작업을 수행하는 방법은 무엇입니까? 저는 아직 수업 주제에 대해 깊이 이해하지 못했고 일부는 이해할 수 없습니다.

다음은 CEdit 컨트롤이 있는 대화 상자 패널입니다(명확성을 위해 예제는 단일 파일 형식으로 작성되었습니다). 입력한 문자는 패널에서 확인됩니다. 숫자만 허용됩니다.

 //+------------------------------------------------------------------+
//|                                                 ControlsEdit.mq5 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link        "http://www.mql5.com"
#property version    "1.00"
#property description "Панель индикации и диалогов управления. Демонстрация работы класса CEdit"
#include <Controls\Dialog.mqh>
#include <Controls\Edit.mqh>
//+------------------------------------------------------------------+
//| defines                                                          |
//+------------------------------------------------------------------+
//--- indents and gaps
#define INDENT_LEFT                         ( 11 )       // indent from left (with allowance for border width)
#define INDENT_TOP                          ( 11 )       // indent from top (with allowance for border width)
#define INDENT_RIGHT                        ( 11 )       // indent from right (with allowance for border width)
#define INDENT_BOTTOM                       ( 11 )       // indent from bottom (with allowance for border width)
#define CONTROLS_GAP_X                      ( 5 )       // gap by X coordinate
#define CONTROLS_GAP_Y                      ( 5 )       // gap by Y coordinate
//--- for buttons
#define BUTTON_WIDTH                        ( 100 )     // size by X coordinate
#define BUTTON_HEIGHT                       ( 20 )       // size by Y coordinate
//--- for the indication area
#define EDIT_HEIGHT                         ( 20 )       // size by Y coordinate
//--- for group controls
#define GROUP_WIDTH                         ( 150 )     // size by X coordinate
#define LIST_HEIGHT                         ( 179 )     // size by Y coordinate
#define RADIO_HEIGHT                        ( 56 )       // size by Y coordinate
#define CHECK_HEIGHT                        ( 93 )       // size by Y coordinate
//+------------------------------------------------------------------+
//| Class CControlsDialog                                            |
//| Usage: main dialog of the Controls application                   |
//+------------------------------------------------------------------+
class CControlsDialog : public CAppDialog
  {
private :
   CEdit             m_edit;                           // CEdit объект

public :
                     CControlsDialog( void );
                    ~CControlsDialog( void );
   //--- create
   virtual bool       Create( const long chart, const string name, const int subwin, const int x1, const int y1, const int x2, const int y2);
   //--- chart event handler
   //--- chart event handler
   virtual bool       OnEvent( const int id, const long &lparam, const double &dparam, const string &sparam);

protected :
   //--- create dependent controls
   bool               CreateEdit( void );
   //--- handlers of the dependent controls events
   void               OnChangeEdit( void );
  };
//+------------------------------------------------------------------+
//| Constructor                                                      |
//+------------------------------------------------------------------+
CControlsDialog::CControlsDialog( void )
  {
  }
//+------------------------------------------------------------------+
//| Destructor                                                       |
//+------------------------------------------------------------------+
CControlsDialog::~CControlsDialog( void )
  {
  }
//+------------------------------------------------------------------+
//| Event Handling                                                   |
//+------------------------------------------------------------------+
EVENT_MAP_BEGIN(CControlsDialog)
ON_EVENT(ON_END_EDIT,m_edit,OnChangeEdit)
EVENT_MAP_END(CAppDialog)
//+------------------------------------------------------------------+
//| Create                                                           |
//+------------------------------------------------------------------+
bool CControlsDialog::Create( const long chart, const string name, const int subwin, const int x1, const int y1, const int x2, const int y2)
  {
   if (!CAppDialog::Create(chart,name,subwin,x1,y1,x2,y2))
       return ( false );
//--- create dependent controls
   if (!CreateEdit())
       return ( false );
//--- succeed
   return ( true );
  }
//+------------------------------------------------------------------+
//| Create the display field                                         |
//+------------------------------------------------------------------+
bool CControlsDialog::CreateEdit( void )
  {
//--- coordinates
   int x1=INDENT_LEFT;
   int y1=INDENT_TOP;
   int x2=ClientAreaWidth()-INDENT_RIGHT;
   int y2=y1+EDIT_HEIGHT;
//--- create
   if (!m_edit.Create(m_chart_id,m_name+ "Edit" ,m_subwin,x1,y1,x2,y2))
       return ( false );
//--- разрешим редактировать сожержимое
   if (!m_edit.ReadOnly( false ))
       return ( false );
   if (!Add(m_edit))
       return ( false );
//--- succeed
   return ( true );
  }
//+------------------------------------------------------------------+
//| Global Variables                                                 |
//+------------------------------------------------------------------+
CControlsDialog ExtDialog;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- create application dialog
   if (!ExtDialog.Create( 0 , "Controls" , 0 , 40 , 40 , 380 , 344 ))
       return ( INIT_FAILED );
//--- run application
   ExtDialog.Run();
//--- succeed
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//--- очистим комментарии
   Comment ( "" );
//--- destroy dialog
   ExtDialog.Destroy(reason);
  }
//+------------------------------------------------------------------+
//| Expert chart event function                                      |
//+------------------------------------------------------------------+
void OnChartEvent ( const int id,         // event ID  
                   const long & lparam,   // event parameter of the long type
                   const double & dparam, // event parameter of the double type
                   const string & sparam) // event parameter of the string type
  {
   ExtDialog.ChartEvent(id,lparam,dparam,sparam);
  }
//+------------------------------------------------------------------+
//| Event handler                                                    |
//+------------------------------------------------------------------+
void CControlsDialog::OnChangeEdit( void )
  {
//--- allowed to use 0 to 9 digits only
   string    text     =m_edit.Text();
   int       text_len = StringLen (text);
   string    sample   = "0123456789" ;
   for ( int i= 0 ;i<text_len;i++)
     {
       string substr= StringSubstr (text,i, 1 );
       if ( StringFind (sample,substr, 0 )==- 1 )
        {
         m_edit.Text( "Допустымы только цифры" );
         break ;
        }
     }
  }
//+------------------------------------------------------------------+
파일:
 
Koldun Zloy :

여기

  이 책은 판매용이 아니지만 공개 도메인에서 발견되었습니다.

고맙습니다.

 
안녕하세요. 하루가 끝날 때 주문을 마감하기 위해 어떤 코드를 작성해야 하는지 알려주실 수 있습니까?
 
포럼의 여러분 안녕하세요! 그런 딜레마가 있습니다. 평일에는 Expert Advisor가 하나의 결과를 테스트하고 주말에는 테스터가 완전히 다른 결과를 제공합니다! 왜 그런지 알려주세요.
사유: