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_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);
}
//+------------------------------------------------------------------+
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 inputCEdit? 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.
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);
//--- 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;
}
}
}
//+------------------------------------------------------------------+
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é?
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 ()
L'avviso è appena fuori dai cicli nella funzione On Start ()
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:
È 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.
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.
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:
Qui
Il libro non è in vendita, ma è liberamente disponibile.
Grazie.