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_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);
}
//+------------------------------------------------------------------+
Приветствую. Ребята кто в теме подскажите, не знаю как решить проблему. Пишу торговую панель для себя под МТ4 с использованием классов создания панелей и диалогов, доступных в МТ4. Для ввода данных цены открытия сделки, а так же для установки СЛ и ТП использую Класс CEdit (является классом простого элемента управления на основе объекта "Поле ввода"). Альтернатива есть Класс CSpinEdit (является классом комбинированного элемента управления "Поле инкремента-декремента"), но он идет для целочисленных данных. В общем мне удобнее использовать CEdit, так как инкримент мне не нужен.
Так вот, как сделать, чтобы в поле вводаCEdit можно было вводить только цифры? При этом желательно, чтобы была и маска ввода, как это реализовано в терминале мт4 при нажатии "новый ордер" мы видим, что поля стоп лоса и тейк профита форматируются по маске типа 0.0000 и т д. Как сделать тоже самое с CEdit? Я просто не очень глубоко еще вник в тему классов и некоторые вещи непонятны.
Приветствую. Ребята кто в теме подскажите, не знаю как решить проблему. Пишу торговую панель для себя под МТ4 с использованием классов создания панелей и диалогов, доступных в МТ4. Для ввода данных цены открытия сделки, а так же для установки СЛ и ТП использую класс CEdit (является классом простого элемента управления на основе объекта "Поле ввода"). Альтернатива есть Класс CSpinEdit (является классом комбинированного элемента управления "Поле инкремента-декремента"), но он идет для целочисленных данных. В общем мне удобнее использовать CEdit, так как инкримент мне не нужен.
Так вот, как сделать, чтобы в поле ввода CEdit можно было вводить только цифры? При этом желательно, чтобы была и маска ввода, как это реализовано в терминале мт4 при нажатии "новый ордер" мы видим, что поля стоп лоса и тейк профита форматируются по маске типа 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);
//--- 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;
}
}
}
//+------------------------------------------------------------------+
Здравствуйте господа форумчане!!! У меня такая делема. В будние дни тестировал советник был один результат, в выходной тестер выдает обсалютно другой результат! Подскажите пожалуйста почему так?
Ну пока с мобилы, скажу так: где в коде алерт и цикл с принт, в том месте структура уже заполнена.
Alert там как раз за рамками циклов в функции On Start ()
44705
Alert там как раз за рамками циклов в функции On Start ()
44705
Alert там как раз за рамками циклов в функции On Start ()
Ну вот приблизительно показываю как в функцию оформить. Дальше вызываете когда нужно:
Можно.
Удивительные возможности.
Большое Спасибо.
Скажите, пожалуйста, где почитать об этом подробнее?
Сейчас пытаюсь опубликовать текст на урл, но код, приведённый в справке, не хочет авторизоваться даже на своём родном сайте.
Интересно, какие сведения нужно собрать о стороннем сайте, кроме урл адреса, чтобы авторизоваться и опубликовать текст.
Скажите, пожалуйста, где почитать об этом подробнее?
Здесь
Приветствую.
Ребята кто в теме подскажите, не знаю как решить проблему.
Пишу торговую панель для себя под МТ4 с использованием классов создания панелей и диалогов, доступных в МТ4.
Для ввода данных цены открытия сделки, а так же для установки СЛ и ТП использую Класс CEdit (является классом простого элемента управления на основе объекта "Поле ввода"). Альтернатива есть Класс CSpinEdit (является классом комбинированного элемента управления "Поле инкремента-декремента"), но он идет для целочисленных данных. В общем мне удобнее использовать CEdit, так как инкримент мне не нужен.
Так вот, как сделать, чтобы в поле ввода CEdit можно было вводить только цифры? При этом желательно, чтобы была и маска ввода, как это реализовано в терминале мт4 при нажатии "новый ордер" мы видим, что поля стоп лоса и тейк профита форматируются по маске типа 0.0000 и т д. Как сделать тоже самое с CEdit? Я просто не очень глубоко еще вник в тему классов и некоторые вещи непонятны.
163837
Приветствую.
Ребята кто в теме подскажите, не знаю как решить проблему.
Пишу торговую панель для себя под МТ4 с использованием классов создания панелей и диалогов, доступных в МТ4.
Для ввода данных цены открытия сделки, а так же для установки СЛ и ТП использую класс CEdit (является классом простого элемента управления на основе объекта "Поле ввода"). Альтернатива есть Класс CSpinEdit (является классом комбинированного элемента управления "Поле инкремента-декремента"), но он идет для целочисленных данных. В общем мне удобнее использовать CEdit, так как инкримент мне не нужен.
Так вот, как сделать, чтобы в поле ввода CEdit можно было вводить только цифры? При этом желательно, чтобы была и маска ввода, как это реализовано в терминале мт4 при нажатии "новый ордер" мы видим, что поля стоп лоса и тейк профита форматируются по маске типа 0.0000 и т д. Как сделать тоже самое с CEdit? Я просто не очень глубоко еще вник в тему классов и некоторые вещи непонятны.
Вот панель диалогов с элементом управления CEdit (для наглядности пример сделан в виде одного файла) - в панели проверяются введённые символы. Допустимы только цифры:
Здесь
Книги нет в продаже, но нашлась в свободном доступе.
Спасибо.