Это не в OnInit делается. Классическая FSM:
int state=INITIAL_STATE;
int OnInit() {
state=RestoreOldState(); // восстанавливаем прежнее состояние, на момент до рестарта совентника
}
void OnTick() {
if (state==INITIAL_STATE) {
// пока состояние "не до конца стартанули" - ни чего и делать
DoNothing();
return;
}
}
void OnChartEvent(....) {
if (sparam==MY_EDIT && ... ) {
state=READY_TO_RUN;
}
}
void OnDeinit(const int reason) {
SaveState();
}
Здравствуйте.
Задача: в OnInit() выводится на график "поле ввода" OBJ_EDIT. Нужно сделать так, чтоб пока в поле ввода не введена никакая информация, программа дальше не выполнялась.
Можно запустить бесконечный цикл, но как то это не элегантно, а вот по другому, что то у меня не получается.
А чем обработка событий в OnChartEvent не нравится?
Делайте как положено, а не задом наперед. Делать так: код вставлять через кнопку
Вот результат (предварительно код причёсан стилизатором) - и оказывается, что никто никакие пробелы не кушает.
//+------------------------------------------------------------------+ //| ProjectName | //| Copyright 2020, CompanyName | //| http://www.companyname.net | //+------------------------------------------------------------------+ int state=INITIAL_STATE; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int OnInit() { state=RestoreOldState(); // восстанавливаем прежнее состояние, на момент до рестарта совентника } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void OnTick() { if(state==INITIAL_STATE) { // пока состояние "не до конца стартанули" - ни чего и делать DoNothing(); return; } } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void OnChartEvent(....) { if(sparam==MY_EDIT && ...) { state=READY_TO_RUN; } } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { SaveState(); } //+------------------------------------------------------------------+
Просто делайте как полагается, а не как вздумается.
Это не в OnInit делается. Классическая FSM:
int state=INITIAL_STATE;
int OnInit() {
state=RestoreOldState(); // восстанавливаем прежнее состояние, на момент до рестарта совентника
}
void OnTick() {
if (state==INITIAL_STATE) {
// пока состояние "не до конца стартанули" - ни чего и делать
DoNothing();
return;
}
}
void OnChartEvent(....) {
if (sparam==MY_EDIT && ... ) {
state=READY_TO_RUN;
}
}
void OnDeinit(const int reason) {
SaveState();
}
Спасибо, мне ваше решение нравится)))
А чем обработка событий в OnChartEvent не нравится?
Просто мне надо, чтоб советник ничего не делал пока в поле ввода не появятся какие нибудь данные.
А как мне в этом может помочь OnChartEvent , я не знаю.
Просто мне надо, чтоб советник ничего не делал пока в поле ввода не появятся какие нибудь данные.
А как мне в этом может помочь OnChartEvent , я не знаю.
CHARTEVENT_OBJECT_ENDEDIT
CHARTEVENT_OBJECT_ENDEDIT
Ну по сути то, хоть так хоть эдак а всё равно получается бесконечный цикл. Код предложенный Maxim Kuznetsov по сути тот же бесконечный цикл с интервалом равным времени прихода следующего тика.
Что то у меня отладка не хочет нормально работать, не могу проверить.
Вот такая конструкция будет работать? Просто я не знаю точно, пока не прошла инициализация советника, обрабатываются ли события?
bool state = false; //+------------------------------------------------------------------+ int OnInit() { EditCreate(); while(!state) Sleep(3000); return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ void OnChartEvent(const int id, // идентификатор события const long& lparam, // параметр события типа long const double& dparam, // параметр события типа double const string& sparam // параметр события типа string ) { if(id==CHARTEVENT_OBJECT_ENDEDIT) state = true; } //+------------------------------------------------------------------+P.S. не будет работать, так как чтоб зайти в OnChartEvent, надо сначала выйти из цикла, а он бесконечный.
bool flag; //+------------------------------------------------------------------+ int OnInit() { flag= true; ... return(INIT_SUCCEEDED); } void OnTick() { if(flag) { if(ObjectGetString(0,"name",OBJPROP_TEXT,0)=="") { Alert("Заполните значением");// можно обернуть паузой в 5 секунд, но не Sleep() OnInit(); return; } else { flag=false; } } ... }
Sleep() в OnInit() действительно нельзя, в тестере вызывает ошибку.
Думал кратенько описать задачу будет достаточно, но...
Задача такая. Товарищ заказывает индикаторы, советники у разных людей, хочет их защитить ключом, лицензией, как угодно, по времени, по пользователю, в общем не важно.
Вот я хотел написать код, чтоб он его мог вставить в советник/индикатор скомпилировать и всё, индикатор/советник не стартанёт без ключа.
У друга уровень понимания кода на уровне , "ух ты буковки!!!". И объяснять ему, что это надо вставить сюда, а это туда, довольно таки сложно и долго.
Вот мне надо, чтоб пока не заполнено "поле ввода", советник не стартовал, при этом надо, чтоб код в советник можно было скопировать в два клика.
Просто лениво писать скрипт который сам будет изменять нужный советник. Хотя если не найду простого решения, придётся так делать.
// можно обернуть паузой в 5 секунд, но не Sleep()
вот это не понял. Как обернуть паузой?
P.S. " Sleep() в OnInit() действительно нельзя, в тестере вызывает ошибку."
На самом деле ошибку вызывал бесконечный цикл, а не Sleep().
- www.mql5.com
Sleep() в OnInit() действительно нельзя, в тестере вызывает ошибку. ...
Задача такая. Товарищ заказывает индикаторы, советники у разных людей, хочет их защитить ключом, лицензией, как угодно, по времени, по пользователю, в общем не важно.
Sleep в индикаторах вообще не работает. Так что вам правильно показали коды. Пишите через флаг, или STATE.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Здравствуйте.
Задача: в OnInit() выводится на график "поле ввода" OBJ_EDIT. Нужно сделать так, чтоб пока в поле ввода не введена никакая информация, программа дальше не выполнялась.
Можно запустить бесконечный цикл, но как то это не элегантно, а вот по другому, что то у меня не получается.