Artyom Trishkin: Pendant que je suis encore sur mon portable, je vais dire ceci : où dans le code Alert et la boucle avec le print, la structure est déjà remplie.
L'alerte est juste en dehors des boucles dans la fonction On Start ()
L'alerte est juste en dehors des boucles dans la fonction On Start ()
Ici, je vous montre approximativement comment en faire une fonction. Puis vous l'appelez quand vous en avez besoin :
//+------------------------------------------------------------------+//| 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_inputsenum enumYN
{
enYes=1, // Да
enNo=0, // Нет
};
//--- input parametersinputint StartCopy=1; // Номер бара, с которого начинаем копироватьint startCopy=(StartCopy<0)?0:StartCopy;
inputint Search_Period=10; // Количество копируемых свечейint searchPeriod=(Search_Period<1)?1:Search_Period;
inputint Delta=2; // Количество пунктов допускаint delta=(Delta<0)?0:Delta;
input enumYN AsSeries=enYes; // Массив array как таймсерияMqlRates array[]; // Массив структур для копирования Open, High, Low, Close, Timestruct DataCandle // Структура для хранения всех совпадений
{
int number_matched; // Количество совпаденийMqlRates reference_candle; // Данные эталонной свечиMqlRates matched_candles[]; // Массив свечей, совпадающих с эталонной по нужному критерию
};
DataCandle dataCandle[]; // Массив структур данных свечей и их совпадений//+------------------------------------------------------------------+//| Script program start function |//+------------------------------------------------------------------+voidOnStart()
{
//---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 для вывода в журнал//--- поиск совпадений с эталонной свечой, индексируемой индексом основного цикла iint size=0; // размер массива совпадающих свечейArrayResize(data_candle[i].matched_candles,size); // Размер массива совпадений в ноль
data_candle[i].number_matched=size; // Инициализируем количество совпадений нулём//--- теперь ищем совпадения по high свечей в цикле j с high эталонной свечи с индексом ifor(int j=0; j<copied; j++) { // в цикле от i+1 до copy_barsif(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);
}
//+------------------------------------------------------------------+
Salutations. Les gars qui connaissent le sujet, je ne sais pas comment résoudre le problème. Je suisen train d'écrire un panneau de trading pour moi-même sous MT4 en utilisant les classes de création de panneaux et les dialogues disponibles dans MT4. Pour entrer des données dans le prix d'ouverture de la transaction, ainsi que pour fixer le SL et le TP, j'utilise la classe CEdit (c'est une classe de contrôle simple basée sur l'objet "Input field"). Comme alternative, il y a la classeCSpinEdit(c'est une classe du contrôle combiné "Incrément-Décrément de champ"), mais elle est utilisée pour les données entières. En général, je suis plus à l'aise en utilisantCEdit, car je n'ai pas besoin de l'incrément .
Alors, comment faire pour qu' il soitpossible d'entrer uniquement des chiffres dansle champ de saisieCEdit ? Il serait préférable de masquer l'entrée. Comme il est mis en œuvre dans le terminal MT4, lorsque nous appuyons sur "Nouvel ordre", nous voyons que les champs stop loss et take profit sont masqués comme 0,0000, etc. Comment faire de même avecCEdit ? C'est juste que je ne suis pas très loin dans le sujet du cours et certaines choses ne sont pas claires.
Salutations. Les gars qui sont dans le sujet conseillent, ne savent pas comment résoudre le problème. Je suis en train d'écrire un panneau de trading pour moi-même sous MT4 en utilisant les classes de création de panneaux et les boîtes de dialogue disponibles dans MT4. J'utilise la classe CEdit (c'est une classe de contrôle simple basée sur l'objet "Entry field"). Comme alternative, il y a la classe CSpinEdit(c'est une classe du contrôle combiné "Incrément-Décrément du champ"), mais elle est utilisée pour les données entières. En général, je suis plus à l'aise en utilisantCEdit, car je n'ai pas besoin de l'incrément .
Alors, comment faire pour qu' il soitpossible d'entrer uniquement des chiffres dansle champ de saisie CEdit ? Il serait préférable de masquer l'entrée. Comme il est mis en œuvre dans le terminal MT4, lorsque nous appuyons sur "Nouvel ordre", nous voyons que les champs stop loss et take profit sont masqués comme 0,0000, etc. Comment faire de même avec CEdit ? C'est juste que je ne suis pas très loin dans le sujet du cours et certaines choses ne sont pas claires.
Voici le panneau de dialogue avec le contrôle CEdit (pour plus de clarté, l'exemple est fait en un seul fichier) - le panneau vérifie les caractères saisis. Seuls les chiffres sont autorisés :
//+------------------------------------------------------------------+//| 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);
//--- createvirtualbool Create(constlong chart,conststring name,constint subwin,constint x1,constint y1,constint x2,constint y2);
//--- chart event handler//--- chart event handlervirtualbool OnEvent(constint id,constlong &lparam,constdouble &dparam,conststring &sparam);
protected:
//--- create dependent controlsbool CreateEdit(void);
//--- handlers of the dependent controls eventsvoid 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(constlong chart,conststring name,constint subwin,constint x1,constint y1,constint x2,constint y2)
{
if(!CAppDialog::Create(chart,name,subwin,x1,y1,x2,y2))
return(false);
//--- create dependent controlsif(!CreateEdit())
return(false);
//--- succeedreturn(true);
}
//+------------------------------------------------------------------+//| Create the display field |//+------------------------------------------------------------------+bool CControlsDialog::CreateEdit(void)
{
//--- coordinatesint x1=INDENT_LEFT;
int y1=INDENT_TOP;
int x2=ClientAreaWidth()-INDENT_RIGHT;
int y2=y1+EDIT_HEIGHT;
//--- createif(!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);
//--- succeedreturn(true);
}
//+------------------------------------------------------------------+//| Global Variables |//+------------------------------------------------------------------+
CControlsDialog ExtDialog;
//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+intOnInit()
{
//--- create application dialogif(!ExtDialog.Create(0,"Controls",0,40,40,380,344))
return(INIT_FAILED);
//--- run application
ExtDialog.Run();
//--- succeedreturn(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+voidOnDeinit(constint reason)
{
//--- очистим комментарииComment("");
//--- destroy dialog
ExtDialog.Destroy(reason);
}
//+------------------------------------------------------------------+//| Expert chart event function |//+------------------------------------------------------------------+voidOnChartEvent(constint id, // event ID constlong& lparam, // event parameter of the long typeconstdouble& dparam, // event parameter of the double typeconststring& 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 onlystring 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;
}
}
}
//+------------------------------------------------------------------+
Bonjour messieurs du forum ! !! J'ai un problème. J'ai testé le conseiller expert les jours de semaine et il a obtenu un résultat, mais le week-end, il me donne un résultat totalement différent ! Dites-moi pourquoi ?
Pendant que je suis encore sur mon portable, je vais dire ceci : où dans le code Alert et la boucle avec le print, la structure est déjà remplie.
L'alerte est juste en dehors des boucles dans la fonction On Start ()
L'alerte est juste en dehors des boucles dans la fonction On Start ()
L'alerte est juste en dehors des boucles dans la fonction On Start ()
Ici, je vous montre approximativement comment en faire une fonction. Puis vous l'appelez quand vous en avez besoin :
Vous pouvez.
Des possibilités étonnantes.
Merci beaucoup.
Pouvez-vous me dire où trouver des informations à ce sujet ?
J'essaie maintenant de publier du texte sur l'url, mais le code donné dans l'aide ne veut pas s'autoriser même sur mon site personnel.
Je me demande quelles informations je dois recueillir sur un site tiers, autres que l'adresse url, afin d'autoriser et de publier le texte.
Pouvez-vous me dire où trouver des informations à ce sujet ?
Ici
Salutations.
Les gars qui connaissent le sujet, je ne sais pas comment résoudre le problème.
Je suisen train d'écrire un panneau de trading pour moi-même sous MT4 en utilisant les classes de création de panneaux et les dialogues disponibles dans MT4.
Pour entrer des données dans le prix d'ouverture de la transaction, ainsi que pour fixer le SL et le TP, j'utilise la classe CEdit (c'est une classe de contrôle simple basée sur l'objet "Input field "). Comme alternative, il y a la classeCSpinEdit (c'est une classe du contrôle combiné "Incrément-Décrément de champ"), mais elle est utilisée pour les données entières. En général, je suis plus à l'aise en utilisantCEdit, car je n'ai pas besoin de l'incrément .
Alors, comment faire pour qu' il soitpossible d'entrer uniquement des chiffres dansle champ de saisie CEdit ? Il serait préférable de masquer l'entrée. Comme il est mis en œuvre dans le terminal MT4, lorsque nous appuyons sur "Nouvel ordre", nous voyons que les champs stop loss et take profit sont masqués comme 0,0000, etc. Comment faire de même avecCEdit ? C'est juste que je ne suis pas très loin dans le sujet du cours et certaines choses ne sont pas claires.
Salutations.
Les gars qui sont dans le sujet conseillent, ne savent pas comment résoudre le problème.
Je suis en train d'écrire un panneau de trading pour moi-même sous MT4 en utilisant les classes de création de panneaux et les boîtes de dialogue disponibles dans MT4.
J'utilise la classe CEdit (c'est une classe de contrôle simple basée sur l'objet "Entry field"). Comme alternative, il y a la classe CSpinEdit (c'est une classe du contrôle combiné "Incrément-Décrément du champ"), mais elle est utilisée pour les données entières. En général, je suis plus à l'aise en utilisantCEdit, car je n'ai pas besoin de l'incrément .
Alors, comment faire pour qu' il soitpossible d'entrer uniquement des chiffres dansle champ de saisie CEdit ? Il serait préférable de masquer l'entrée. Comme il est mis en œuvre dans le terminal MT4, lorsque nous appuyons sur "Nouvel ordre", nous voyons que les champs stop loss et take profit sont masqués comme 0,0000, etc. Comment faire de même avec CEdit ? C'est juste que je ne suis pas très loin dans le sujet du cours et certaines choses ne sont pas claires.
Voici le panneau de dialogue avec le contrôle CEdit (pour plus de clarté, l'exemple est fait en un seul fichier) - le panneau vérifie les caractères saisis. Seuls les chiffres sont autorisés :
Ici
Le livre n'est pas en vente, mais est disponible gratuitement.
Merci.