Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 580

 
Artyom Trishkin:
Mentre sono ancora sul mio cellulare, dirò questo: dove nel codice Alert e nel ciclo con la stampa, la struttura è già compilata.

L'avviso è appena fuori dai cicli nella funzione On Start ()

 
Andrey Koldorkin:

L'avviso è appena fuori dai cicli nella funzione On Start ()

Bene, è qui che dovete leggere la struttura riempita nel ciclo.
 
Andrey Koldorkin:

L'avviso è appena fuori dai cicli nella funzione On Start ()

Qui vi mostro approssimativamente come trasformarlo in una funzione. Poi lo chiami ogni volta che ne hai bisogno:

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

È possibile.

Possibilità incredibili.

Grazie mille.

Puoi dirmi per favore dove leggere di più su questo?

Ora sto cercando di pubblicare il testo nell'url, ma il codice dato nell'aiuto non vuole autorizzare nemmeno sul mio sito principale.

Mi chiedo quali informazioni devo raccogliere su un sito terzo, oltre all'indirizzo url, per autorizzare e pubblicare il testo.

 
mila.com:

Puoi dirmi per favore dove leggere di più su questo?

Qui

 

Saluti.
Ragazzi che conoscono l'argomento, non so come risolvere il problema.
Sto scrivendo
un pannello di trading per me stesso sotto MT4 utilizzando le classi di creazione di pannelli e le finestre di dialogo disponibili in MT4.
Per inserire i dati nel prezzo di apertura
dell'affare, così come per impostare lo SL e il TP, uso la classe CEdit (è una classe di controllo semplice basata sull'oggetto "Input field "). Inalternativa, c'è la classeCSpinEdit (è una classe del controllo combinato "Campo di incremento-decremento"), ma è usata per dati interi. In generale, mi sento più a mio agio usandoCEdit, dato che non ho bisogno dell'incremento .

Quindi,
come rendere possibile inserire solo cifre nel campo di input CEdit? Sarebbe meglio mascherare l'entrata. Come è implementato nel terminale MT4 quando premiamo "New Order", vediamo che i campi stop loss e take profit sono mascherati come 0.0000, ecc. Come fare lo stesso conCEdit? È solo che non sono molto addentro all'argomento della classe e alcune cose non sono chiare.

 
Andrey Zuev:

Saluti.
I ragazzi che sono in argomento consigliano, non sanno come risolvere il problema.
Sto scrivendo
un pannello di trading per me stesso sotto MT4 usando le classi di creazione del pannello e le finestre di dialogo disponibili in MT4.
Uso la classe
CEdit (è una classe di controllo semplice basata sull'oggetto "Entry field") . Inalternativa, c'è laclasse CSpinEdit (è una classe del controllo combinato "Increment-Decrement field"), ma è usata per dati interi. In generale, mi sento più a mio agio usandoCEdit, dato che non ho bisogno dell'incremento .

Quindi,
come rendere possibile inserire solo cifre nel campo di input CEdit? Sarebbe meglio mascherare l'entrata. Come è implementato nel terminale MT4 quando premiamo "New Order", vediamo che i campi stop loss e take profit sono mascherati come 0.0000, ecc. Come fare lo stesso con CEdit? Solo che non sono molto addentro all'argomento della classe e alcune cose non sono chiare.

Ecco il pannello di dialogo con il controllo CEdit (per chiarezza, l'esempio è fatto come un singolo file) - il pannello controlla i caratteri inseriti. Sono ammessi solo i numeri:

//+------------------------------------------------------------------+
//|                                                 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;
        }
     }
  }
//+------------------------------------------------------------------+
File:
 
Koldun Zloy:

Qui

Il libro non è in vendita, ma è liberamente disponibile.

Grazie.

 
Salve. Potete dirmi quale codice scrivere per chiudere l'ordine alla fine della giornata?
 
Ciao signori del forum!!! Ho un problema. Ho testato l'Expert Advisor nei giorni feriali e ha ottenuto un risultato, ma nel fine settimana mi dà un risultato completamente diverso! Per favore, ditemi perché?