初学者的问题 MQL5 MT5 MetaTrader 5 - 页 580

 
Artyom Trishkin:
虽然我还在手机上,但我要说的是:在代码Alert和带打印的循环中,结构已经被填入。

Alert 就在On Start ()函数中的循环之外

 
Andrey Koldorkin:

Alert就在On Start ()函数中的循环之外

好吧,这就是你需要阅读循环中所填充的结构的地方。
 
Andrey Koldorkin:

Alert就在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地址之外,我还需要收集关于第三方网站的什么信息,以便授权和发布文本。

 
mila.com:

你能告诉我在哪里可以读到更多这方面的信息吗?

这里

 

问候。
知道这个问题的人,我不知道如何解决这个问题。
我在
MT4下为自己编写 一个交易面板,使用MT4中的面板创建和对话框 类。
为了将数据输入交易
开盘价 ,以及设置SL和TP,我使用了CEdit (它是一个基于 "输入字段 "对象的简单控件类)。作为替代方案,还有CSpinEdit (它是 "增减字段 "组合控件的一个类),但它是用于整数数据 一般来说,我更愿意使用 CEdit,因为我不需要增量。

那么,
如何使 其能够CEdit 输入框 只输入数字?在MT4终端中,当我们按 "新订单 "时,我们看到止损 和止盈 字段被掩盖为0.0000等,这样会更好。如何用CEdit做同样的事情 ?我只是对这个班级的主题了解得不是很深,有些东西不清楚。

 
Andrey Zuev:

问候。
在这个问题上的人建议,不知道如何解决这个问题。
我正在
使用MT4中的面板创建 和对话框 为自己编写 一个交易面板。
我使用
CEdit (它是一个基于 "条目字段 "对象的简单控件类)。作为替代方案, 还有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:

这里

该书没有出售,但可以免费获得。

谢谢你。

 
你好。你能告诉我应该写什么代码来在一天结束时关闭订单吗?
 
论坛的先生们,你们好!!。我有一个问题。我在工作日测试了专家顾问,它得到了一个结果,但在周末它给我一个完全不同的结果!请告诉我为什么?
原因: