zvagolskiy.ru 2 Share Posted April 16, 2020 (edited) Здравствуйте.Я самостоятельно пытаюсь изучать язык MQL 4,изучаю уже около 2 лет.Толковой информации очень мало.В интернете все как-то безсистемно,а я изучаю с самого нуля и все через интернет.Самое толковое это этот форум и учебник Ковалева.Но вот с горем пополам.Написал свой первый советник.Прошу строго не судить.Я только учусь.Проблема состоит в том,что при компиляции метаэдитор выдает две ошибки.Обе ошибки связаны со скобками.Советник находится в файле под этим сообщением.Подскажите,пожалуйста,где ошибки.И вообще,если Вам не трудно,подскажите,что можно исправить в советнике или сделать по другому.Поясню,что я при написании этого советника расчитывал сделать свой первый робот,который сможет торговать,то есть без всяких сложных дополнений. Скрытый текст #property copyright "Copyright 2019, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" #property strict extern int Period_MA_1=12; //Период МА 1. extern int Period_MA_2=24; //Период МА 2. extern int StopLoss=30; extern int TakeProfit=100; extern int Magic=12345; extern int TrailingStop=50; extern int TrailingStep=10; extern double Rastvor=28.0; //Расстояние между МА 1 и МА 2,необходимое для открытия ордера. extern double Lots=0.1; //Жестко заданное кол-во лотов. extern double Prots=3; //Если параметр Lots=0,то размер лота выбираем в % от свободных средств. bool Work=true; //Если стоит параметр true,то эксперт работает.Если false,то нет. string Symbol; //Название фин.инструмента,на котором будет работать советник. //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { double Min_Lot; //Минимально разрешенный брокером размер лота. double Free; //Сколько свободных средств на счете. double Step; //Шаг изменения размера лота. double Lot; //Размер лота,заданный пользователем. double One_Lot; //Стоимость одного лота. //БЛОК ПРЕДВАРИТЕЛЬНОЙ ОБРАБОТКИ.// { if(Bars < Period_MA_2) //Проверяем наличие необходимого кол-ва баров. { Alert("Недостаточно баров в окне.Эксперт не работает."); return(); //Выход из функции OnInit.Эксперт не работает. } if(Work == false) //Критическая ошибка. { Alert("Критическая ошибка.Эксперт не работает."); return(); //Выход из функции OnInit.Эксперт не работает. } return(INIT_SUCCEEDED); //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //ТОРГОВЫЕ КРИТЕРИИ.// MA_1_t=iMA(NULL,0,Period_MA_1,MODE_LWMA,PRICE_TYPICAL,0); //Свежие данные по МА 1. MA_2_t=iMA(NULL,0,Period_MA_2,MODE_LWMA,PRICE_TYPICAL,0); //Свежие данные по МА 2. if(MA_1_t>MA_2_t+Rastvor*Point) //Если разница между МА больше заявленной,то открываем ордер. { Opn_B=true; } if(MA_1_t<MA_2_t+Rastvor*Point) //Если разница между МА больше заявленной,то открываем ордер. { Opn_S=true; } } //+------------------------------------------------------------------+ //+------------------------------------------------------------------------------------------------- //СТОИМОСТЬ ОРДЕРОВ.// //+------------------------------------------------------------------------------------------------- RefreshRates(); Min_Lot=MarketInfo(Symbol,MODE_MINLOT); Free=AccountFreeMargin(); Step=MarketInfo(Symbol,MODE_LOTSTEP); if (Lots < Min_Lot) Lot=Min_Lot; if(Lot >= Min_Lot) Lots=Lots; else Lots=MathFloor(Free*Prots/One_Lot/Step)*Step); if(Lots * Min_Lot > Free) { Alert("Не хватает денег на счете", Lts," лотов"); return; } //+----------------------------------------------------------------------------------+ //ОТКРЫТИЕ ОРДЕРОВ// { if (Opn_B==true) //Критерий окрытия ордера Buy. { RefreshRates(); SL=Bid-New_Stop(StopLoss)*Point; //Вычисление SL открываемого ордера. TP=Bid+New_Stop(TakeProfit)*Point; //Вычисление TP открываемого ордера. Alert("Попытка открыть ордер Buy.Ожидание ответа"); Ticket=OrderSend(Symbol,OP_BUY,Lts,Ask,2,SL,TP); //Открытие ордера Buy. if (Ticket > 0) //Получилось. { Alert("Открыт ордер Buy.",Ticket); return; //Выход из OnTick. } if (Fun_Error(GetLastError)==1) //Обработка ошибок. continue; //Повторная попытка. return; //Выход из OnTick. } if (Opn_S==true) //Критерий открытия ордера Sell. { RefreshRates(); SL=Ask+New_Stop(StopLoss)*Point; //Вычисление SL открываемого ордера. TP=Ask-New_Stop(TakeProfit)*Point; //Вычисление TP открываемого ордера. Alert("Попытка открыть ордер Sell.Ожидание ответа."); Ticket=OrderSend(Symbol,OP_SELL,Lts,Bid,2,SL,TP); //Открытие ордера Sell. if (Ticket > 0) //Получилось. { Alert ("Открыт ордер Sell.",Ticket); return; //Выход из OnTick. } if (FunError(GetLastError)==1) //Обработка ошибок. continue; //Повторная попытка. return; //Выход из OnTick. } //+----------------------------------------------------------------------------------------------+ //ТРЕЙЛИНГ СТОП. void Trailing() RefreshRates(); for (int i=OrdersTotal()-1;i>=0;i--) { //Проверяем все ордера,находящиеся в терминале. if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) //Если успешно выбрался ордер. if (OrderType()=OP_BUY) //Если открыт ордер на покупку. if (OrderSymbol()==Symbol && OrderMagicNumber()=Magic) //Проверяем наш ли ордер. if (Bid-OrderOpenPrice()>TrailingStop*Point || OrderStopLoss==StopLoss) //Умножаем для пятизначных цен.Вычисляем разницу между ценой откр. и сравниваем с трейлингом. if (OrderStopLoss<Bid-(TrailingStep+TrailingStop)*Point || OrderStopLoss=StopLoss) if (!OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Bid-TrailingStop*Point,Digits)0,0)) if (OrderType()=OP_SELL) //Если открыт ордер на продажу. if (OrderSymbol()==Symbol && OrderMagicNumber()=Magic) //Проверяем наш ли ордер. if (Ask-OrderOpenPrice()>TrailingStop*Point || OrderStopLoss=StopLoss) //Умножаем для пятизначных цен.Вычисляем разницу между ценой откр. и сравниваем с трейлингом. if (OrderStopLoss<Ask-(TrailingStep+TrailingStop)*Point || OrderStopLoss=StopLoss) if (!OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Ask+TrailingStop*Point,Digits)0,0)) } //+------------------------------------------------------------------------------------------------------------------- Ошибки: } - unexpected end of program строка 155 столбец 5 { - unbalanced parentheses строка 29 столбец 3 proba 2.mq4 Edited April 17, 2020 by Capman Quote Link to post Share on other sites
Ugar68 372 Share Posted April 16, 2020 Оператор if должен содержать как минимум условие, в круглых скобках, и действие, если это условие выполняется, после круглых скобок в фигурных скобках, или без фигурных скобок если действие одно. if (!OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Bid-TrailingStop*Point,Digits)0,0)) Где действие? Quote Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку. Чужие программы не переделываю. Link to post Share on other sites
zvagolskiy.ru 2 Author Share Posted May 2, 2020 Здравствуйте.Это опять я.Пробую написать советник.Пока самый простой.Написал код советника,а компилятор выдает одну ошибку:while-expressions are not allowed on a global scope строка 115,столбец 6.Помогите,пожалуйста разобраться в чем ошибка.Файл советника внизу. proba 3.mq4 Quote Link to post Share on other sites
Hitronrav 4,787 Share Posted May 2, 2020 (edited) 3 часа назад, zvagolskiy.ru сказал: Здравствуйте.Это опять я.Пробую написать советник.Пока самый простой.Написал код советника,а компилятор выдает одну ошибку:while-expressions are not allowed on a global scope строка 115,столбец 6.Помогите,пожалуйста разобраться в чем ошибка.Файл советника внизу. "Выражения while недопустимы в глобальной области видимости", то есть вне функций. У вас функция OnTick() кончилась перед while. Для исправления эту фигурную скобку нужно перенести в конец кода: Советую использовать стилизатор, чтобы не путаться в скобках. Стилизатор срабатывает по нажатию Ctrl+, (контрол–запятая). Только рекомендую в настройках переключить его стиль с MetaQuotes на какой-нибудь другой, потому что MetaQuotes разбивает else if'ы. Лично мне показался самым удобным Ratliff: Edited May 2, 2020 by Hitronrav Quote Link to post Share on other sites
zvagolskiy.ru 2 Author Share Posted May 2, 2020 Спасибо большое.Сам бы я не разобрался. Quote Link to post Share on other sites
Hitronrav 4,787 Share Posted May 2, 2020 1 час назад, zvagolskiy.ru сказал: Спасибо большое.Сам бы я не разобрался. Ага, там кроме этого, ещё много с чем разбираться. Прежде всего обратите внимание: — в условиях (if) пишется двойное равенство == а не одинарное = — имена переменных не должны повторять названия встроенных функций (Symbol) — не надо открытие позиции делать в бесконечном цикле – чуть что и советник зависнет; 2-3 попытки хватит, с паузами в секунду-другую между ними — если вход по индикаторам, то достаточно один раз на открытии свечи прогнать функцию OnTick; для этого используем iTime — должно быть ограничение на число позиций Поправил ваш советник в соответствии со своим пониманием, можете сравнить с исходным: proba 3 fixed.mq4 Кстати, если перевернуть торговую логику, то есть покупать вместо продажи и наоборот, внезапно получается отличный результат на часах в 2020 году: Прибыльность 2,77 это очень круто, у меня таких граальных систем нет Quote Link to post Share on other sites
zvagolskiy.ru 2 Author Share Posted May 2, 2020 Еще раз спасибо большое.Я самоучка, учусь по учебнику Ковалева и что в интернете найду.Плохо когда рядом нет хорошего учителя,как говорится в живую.Приходится самому доходить до многого.Я живу в г.Черкесск,здесь нет программистов по mql,по крайней мере я не нашел.А самый простой трейлинг стоп можете добавить?Теперь буду разбирать ваш файл по буковкам.Буду изучать.Сам я торгую роботом дженерик.На ********** Форекс v.11.94.Еще есть ECN счет в Альпари,там торгую дженериком v.9.02 b стратегией 1-2-3. Quote Link to post Share on other sites
Hitronrav 4,787 Share Posted May 3, 2020 9 часов назад, zvagolskiy.ru сказал: А самый простой трейлинг стоп можете добавить? Никогда не пользовался трейлинг стопами, но добавил. Отслеживает положение стопа на каждом тике. Если вам достаточно раз за свечу, то запихайте код трала под if(PrevTime!=iTime(Symbol(),0,0)) { заодно исправил свою недоделку с открытием сделок только один раз за свечу, и добавил содержания в функцию Fun_Error (как понимаю, её идея взята из книги Ковалёва). proba 3 trailing.mq4 Вообще, трейлинг стоп рекомендуют использовать в старых книгах о биржевом рынке в применении к долгосрочной торговле. Для форексного краткосрока считаю эту вещь вредной. Слишком сильно у нас цена болтается – короткие стопы цепляет, а потом идёт в сторону бывшего профита. 1 Quote Link to post Share on other sites
Hitronrav 4,787 Share Posted May 3, 2020 Прошу прощения, криворукий я сделал ошибку в советнике из предыдущего поста (позиции считались, только если трал работал) исправил методом копипаста: proba 3 corrected.mq4 Quote Link to post Share on other sites
zvagolskiy.ru 2 Author Share Posted May 7, 2020 Здравствуйте.У меня есть несколько вопросов по нашему советнику proba 3 correctid,только поймите меня правильно,я только учусь программированию.Учебник Ковалева хороший,но в процессе обучения все равно бывают вопросы.Если не хотите,не отвечайте,я пойму.Итак вопрос первый.Блок обработки ошибок работает так(если не правильно поправьте,пожалуйста).Когда советник запускается в работу,и например торговый сервер занят(ошибка №4),то в журнал приходит соответствующее сообщение и возвращает значение 1(не критическая ошибка),(значение 1 возвращается в первый оператор return)ждет сколько указано в операторе Sleep,и пробует еще раз(а сколько раз будет пробовать?).А если если например торговый счет заблокирован,то функция вернула значение 0 и опять после заданного в операторе Sleep ожидания функция пробует еще раз(опять сколько раз она будет пробовать?).И если опять вернулся ноль(во второй оператор return),то тогда уже будет проверятся значение переменной Work?И если оно равно false то советник закроется.А для чего третий оператор return,самый последний в блоке обработок ошибок?Вообще правильно я изложил порядок работы блока обработки ошибок? И второй вопрос.В блоке открытия ордеров если не получилось открыть ордер,то в функцию GetLastError возвращается значение 1.Эта функция самостоятельно пытается исправить ошибку(сколько раз пробует исправить?)?Или передает управление в блок обработки ошибок?Вообщем пока хватит вопросов.Еще раз прошу меня правильно понять.Я год назад понял,что программирование MQL это мое занятие.Мне интересно этим заниматься,но мне не у кого учиться.Но если вы заняты,то я пойму. Quote Link to post Share on other sites
Hitronrav 4,787 Share Posted May 7, 2020 2 часа назад, zvagolskiy.ru сказал: Здравствуйте.У меня есть несколько вопросов по нашему советнику proba 3 correctid,только поймите меня правильно,я только учусь программированию.Учебник Ковалева хороший,но в процессе обучения все равно бывают вопросы.Если не хотите,не отвечайте,я пойму.Итак вопрос первый.Блок обработки ошибок работает так(если не правильно поправьте,пожалуйста).Когда советник запускается в работу,и например торговый сервер занят(ошибка №4),то в журнал приходит соответствующее сообщение и возвращает значение 1(не критическая ошибка),(значение 1 возвращается в первый оператор return)ждет сколько указано в операторе Sleep,и пробует еще раз(а сколько раз будет пробовать?). Если речь о советнике proba 3 corrected, то будет пробовать 3 раза, потому что указано условие while(Tries<3). Если же мы говорим о советнике из книги Ковалёва, то там стоит while(true), поэтому пробовать будет бесконечно. Цитата А если если например торговый счет заблокирован,то функция вернула значение 0 и опять после заданного в операторе Sleep ожидания функция пробует еще раз Нет, если вернула 0, то сработает условие else { break; } и произойдёт выход из цикла while, совершаемый оператором break. Цитата И если опять вернулся ноль(во второй оператор return),то тогда уже будет проверятся значение переменной Work?И если оно равно false то советник закроется. В советнике proba 3 corrected переменная Work нигде не изменяется, она всегда равна true. Нужно в функцию обработки ошибок добавить приравнивание Work значению false для ошибок, при которых работа советника становится бессмысленной (и перенести условие выхода по критической ошибке в OnTick), чтобы она начала использоваться. В советнике из книги Ковалёва, если Work равно false, сразу происходит выход из потиковой функции и советник "крутится вхолостую". Цитата А для чего третий оператор return,самый последний в блоке обработок ошибок? Да на всякий случай он был поставлен, можно убрать смело так как на всех возможных путях выполнения уже стоят return'ы. Цитата И второй вопрос.В блоке открытия ордеров если не получилось открыть ордер,то в функцию GetLastError возвращается значение 1. GetLastError возвращает число, код ошибки – и больше ничего не делает. Коды ошибок бывают разные (4, 128,135 и т.д.) Дальше это число передаётся в функцию Fun_Error, которая для некритических ошибок (после которых можно пробовать открывать ордер ещё раз) возвращает 1, а для всех остальных 0. Quote Link to post Share on other sites
zvagolskiy.ru 2 Author Share Posted May 7, 2020 Спасибо за разъяснения. Quote Link to post Share on other sites
zvagolskiy.ru 2 Author Share Posted May 13, 2020 Здравствуйте,если я Вам еще не надоел,у меня есть несколько учебных вопросов(плохо,когда нет рядом преподавателя)Первый вопрос время ожидания Sleep пользователь сам определяет или есть какой-то стандарт для каждой ошибки.Если есть стандарт,где его можно посмотреть?Второй вопрос операторы break и Refreshreates используются в советнике исходя из каждой конкретной ситуации когда надо прервать исполнение кода или обновить данные или тоже есть какой то стандарт их использования?Третий вопрос код критической ошибки я правильно записал?Четвертый вопрос чем отличаютя переменные extern int TrailingStop=500;extern int TrailingStep=100;от переменных double pTrailingStop;double pTrailingStep.Пятый вопрос- static datetime PrevTime=0;-это когда эксперта присоединяют к графику,то экперт сам определяет на каком таймфреме он находится?Шестой вопрос-переменная- bool IsSucceeded(эксперт прекращает работу) это противоположная переменной Succeeded (иницилизация эксперта прошла успешно)?Так много вопросов,потомучто в учебнике Ковалева не все понятно.Учебник хороший,но плохо,когда рядом нет преподавателя.Вообще я хочу обьединить эксперт с трендовой стратегией и эксперт,основанный на боковом движении.Рынок ведь до 80% времени находится во флэте.Получится,что эксперт будет всегда в деле.Такое вообще возможно с точки зрения програмного кода?Я понимаю,что я не первый кто об этом подумал.Скорее всего все уже изобретено до меня,но все же,я ведь только учусь и собираюсь учиться серьезно и все хочу сам проверить и попробовать. Quote Link to post Share on other sites
Hitronrav 4,787 Share Posted May 13, 2020 (edited) 45 минут назад, zvagolskiy.ru сказал: Первый вопрос время ожидания Sleep пользователь сам определяет или есть какой-то стандарт для каждой ошибки. Определяет сам. Наверно, для некоторых ошибок можно поставить время побольше (например, для 136 ERR_OFF_QUOTES несколько тысяч миллисекунд, чтобы дождаться котировок), для других ошибок достаточно и 100 мс. Цитата Второй вопрос операторы break и Refreshreates используются в советнике исходя из каждой конкретной ситуации когда надо прервать исполнение кода или обновить данные или тоже есть какой то стандарт их использования? break используется для выхода из циклов for, while или из switch'а. Конкретно в советнике он выходит из while в случае успешного открытия позиции. RefreshRates() нужна там, где есть вероятность, что котировки успели измениться за время работы функции. RefreshRates() обычно вызывают после тяжёлых вычислений, которые могут занимать секунды, или после паузы (Sleep). Кстати, в советнике по уму следует RefreshRates() переместить в строку после вызова Fun_Error, потому что вызывать её в начале цикла ни к чему, котировки в тот момент ещё свежие. А по большому счёту RefreshRates() наследие эпохи реквот и на счетах с Market Execution особо не нужна! Сейчас с любой ценой отправляете ордер в рынок и он исполняется (но уже по той цене, которую брокер назначит). Цитата Третий вопрос код критической ошибки я правильно записал? ? Цитата Четвертый вопрос чем отличаютя переменные extern int TrailingStop=500;extern int TrailingStep=100;от переменных double pTrailingStop;double pTrailingStep. Вторые умножены на Point, то есть превращены из пунктов в реальные ценовые значения. 1 пункт соответствует 0,00001 (если 5 знаков после запятой) Цитата Пятый вопрос- static datetime PrevTime=0;-это когда эксперта присоединяют к графику,то экперт сам определяет на каком таймфреме он находится? static datetime PrevTime=0; – это для того, чтобы открытие ордеров и связанные с ним расчёты делались только один раз за свечу того таймфрейма, на котором находится советник. Мы создаём статическую (не теряющую своего значения между вызовами) переменную PrevTime, которую потом приравниваем времени текущей свечи, если она не равна ему. А если равна, то ничего не считаем и не открываем. То есть, когда свеча меняется, PrevTime становится не равна времени этой новой свечи и поэтому код под условием исполняется. Узнать таймфрейм можно функцией Period(). Цитата Шестой вопрос-переменная- bool IsSucceeded(эксперт прекращает работу) это противоположная переменной Succeeded (иницилизация эксперта прошла успешно)? IsSucceeded – переменная, которая принимает значение, возвращаемое OrderSelect, она далее ни для чего не используется. Я сделал так, потому что мы вызываем OrderSelect в цикле, который просто не начнётся, если позиций нет. Иначе пришлось бы проверять, равно ли IsSucceeded true, и только тогда что-то там считать. Переменной Succeeded в советнике нет. Есть предопределённая константа INIT_SUCCEEDED (вместо которой можно написать просто 0). Цитата Вообще я хочу обьединить эксперт с трендовой стратегией и эксперт,основанный на боковом движении.Рынок ведь до 80% времени находится во флэте.Получится,что эксперт будет всегда в деле.Такое вообще возможно с точки зрения програмного кода? С точки зрения кода возможно, с точки зрения прибыльности – Edited May 13, 2020 by Hitronrav Quote Link to post Share on other sites
zvagolskiy.ru 2 Author Share Posted May 18, 2020 Здравствуйте.С Вашего позволения есть у меня еще несколько вопросов по этому советнику(а что делать,я ведь только учусь)Первый вопрос:если ошибка уже прописана в коде,как например в начале советника ошибка"Недостаточно баров.Советник не работает.",ее обязательно так же записывать в блоке обработки ошибок?В журнале советника показываются все сообщения,записанные в советнике,или только с блока обработки ошибок?Второй вопрос:В функцию обработки ошибок переменную Work я правильно добавил?Третий вопрос:Обязательно в блоке обработки ошибок записывать все возможные варианты ошибок?Или это делается по мере необходимости?Если например во время работы советник перестал работать,а эта ошибка не записана в коде и в блоке обработки ошибок?Значит программисту придется искать причину?Четвертый вопрос:протестировал советник со всеми исправлениями,не слился.Для меня это уже достижение,но показал прибыль всего 3 % в год.Как Вы считаете стоит его оптимизировать или это уже бесполезно(именно этот советник,основанный на пересечении двух МА)И последний вопрос:Я торгую советником generic.Вообщем хороший советник.Может подскажете хороший советник?Я вообще хочу в идеале торговать несколькими роботами у разных брокеров.Перепробовал не менее 100 роботов.Но пока лучше дженерика не нашел . Strategy Tester Report proba 3 trailing Alpari-Standard3 (Build 1220) Символ EURUSD (Euro vs US Dollar) Период 1 Час (H1) 2010.03.01 00:00 - 2020.02.28 23:00 (2010.03.01 - 2020.03.01) Модель Все тики (наиболее точный метод на основе всех наименьших доступных таймфреймов) Параметры Period_MA_1=12; Period_MA_2=24; StopLoss=300; TakeProfit=1000; Magic=12345; TrailingStop=500; TrailingStep=100; Rastvor=280; Lots=0.1; Prots=0; Баров в истории 63013 Смоделировано тиков 197705584 Качество моделирования 25.00% Ошибки рассогласования графиков 0 Начальный депозит 1000.00 Спред 10 Чистая прибыль 381.76 Общая прибыль 13672.27 Общий убыток -13290.51 Прибыльность 1.03 Матожидание выигрыша 0.46 Абсолютная просадка 317.53 Максимальная просадка 973.56 (54.70%) Относительная просадка 54.70% (973.56) Всего сделок 824 Короткие позиции (% выигравших) 423 (34.04%) Длинные позиции (% выигравших) 401 (29.93%) Прибыльные сделки (% от всех) 264 (32.04%) Убыточные сделки (% от всех) 560 (67.96%) Самая большая прибыльная сделка 99.09 убыточная сделка -33.28 Средняя прибыльная сделка 51.79 убыточная сделка -23.73 Максимальное количество непрерывных выигрышей (прибыль) 7 (430.84) непрерывных проигрышей (убыток) 16 (-436.64) Макс. непрерывная прибыль (число выигрышей) 430.84 (7) непрерывный убыток (число проигрышей) -436.64 (16) Средний непрерывный выигрыш 1 непрерывный проигрыш 3 proba 3 corrected.mq4 Quote Link to post Share on other sites
zvagolskiy.ru 2 Author Share Posted May 18, 2020 По второму вопросу я кажется не правильно загрузил файл. Вот этот файл. proba 3 trailing.mq4 Quote Link to post Share on other sites
zvagolskiy.ru 2 Author Share Posted May 18, 2020 Еще один вопрос:а что значит вид переменной input в заголовке советника? Чем он отличается от extern? Quote Link to post Share on other sites
Hitronrav 4,787 Share Posted May 18, 2020 2 часа назад, zvagolskiy.ru сказал: Первый вопрос:если ошибка уже прописана в коде,как например в начале советника ошибка"Недостаточно баров.Советник не работает.",ее обязательно так же записывать в блоке обработки ошибок? Нет. Это, собственно, не ошибка, просто советник не сможет рассчитать значение MA, если не хватает баров, поэтому там прописан выход. 2 часа назад, zvagolskiy.ru сказал: В журнале советника показываются все сообщения,записанные в советнике,или только с блока обработки ошибок? Всё, что выводят Alert'ы и Print'ы. 2 часа назад, zvagolskiy.ru сказал: Второй вопрос:В функцию обработки ошибок переменную Work я правильно добавил? Неправильно. Во-первых, в первом switch'е уже прописан выход из функции при default, поэтому ваш switch не сработает. Во-вторых, если написать switch(0), то это даст единственное значение 0 и всё. В-третьих, ошибки с кодом 1000 вроде бы не существует. В-четвёртых, никакое значение переменной Work не присваивается. 2 часа назад, zvagolskiy.ru сказал: Третий вопрос:Обязательно в блоке обработки ошибок записывать все возможные варианты ошибок?Или это делается по мере необходимости? По мере необходимости. 2 часа назад, zvagolskiy.ru сказал: Если например во время работы советник перестал работать,а эта ошибка не записана в коде и в блоке обработки ошибок?Значит программисту придется искать причину? Придётся. 2 часа назад, zvagolskiy.ru сказал: Четвертый вопрос:протестировал советник со всеми исправлениями,не слился.Для меня это уже достижение,но показал прибыль всего 3 % в год.Как Вы считаете стоит его оптимизировать или это уже бесполезно(именно этот советник,основанный на пересечении двух МА) У меня скептическое отношение к советникам на MAшках, но вы, конечно, можете оптимизировать. И да, пожалуйста, не работайте с советником, который trailing, работайте с тем, который corrected. В версии trailing содержится ошибка – бесконечное открытие позиций при трейлинг-стопе равном нулю. При этом результат существенно более прибылен именно без трейлинг-стопа (то есть когда он равен нулю в параметрах). 2 часа назад, zvagolskiy.ru сказал: И последний вопрос:Я торгую советником generic.Вообщем хороший советник.Может подскажете хороший советник? Нет, я своим торгую, но он не продаётся и тем более не отдаётся даром 2 часа назад, zvagolskiy.ru сказал: Еще один вопрос:а что значит вид переменной input в заголовке советника? Чем он отличается от extern? Значения input переменных нельзя изменять в коде советника, а extern можно. Quote Link to post Share on other sites
zvagolskiy.ru 2 Author Share Posted May 18, 2020 Спасибо за разьяснения. Quote Link to post Share on other sites
zvagolskiy.ru 2 Author Share Posted July 3, 2020 Здравствуйте.Я сейчас изучаю по видео уроку советник generic.Делаю все как говорится в видео,но компилятор выдает три ошибки:" ;" unexpected end of program строка 18; столбец 74; "{ " unbalanced parentheses строка 46 столбец 4 ; open parentheses expected строка 22, столбец 28.proba generic.mq4 Подскажите,пожалуйста,где мои ошибки? Quote Link to post Share on other sites
Ugar68 372 Share Posted July 4, 2020 03.07.2020 в 13:49, zvagolskiy.ru сказал: Здравствуйте.Я сейчас изучаю по видео уроку советник generic.Делаю все как говорится в видео,но компилятор выдает три ошибки:" ;" unexpected end of program строка 18; столбец 74; "{ " unbalanced parentheses строка 46 столбец 4 ; open parentheses expected строка 22, столбец 28.proba generic.mq4 Подскажите,пожалуйста,где мои ошибки? Кашмар!!!! Не знаю что за видеоуроки. Судя по результату, им место в помойке. Подскажу. Ошибки везде. Ну почти. Вот в этих строчках нет ошибок: extern int Magic=12345 ; double MinLot,MaxLot,LotStep; int PriceDigits; Хотя, переменная PriceDigits не нужна, так как для текущего символа уже предусмотрена переменная _Digits и в ней уже есть значение по символу. Quote Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку. Чужие программы не переделываю. Link to post Share on other sites
zvagolskiy.ru 2 Author Share Posted July 6, 2020 Просто есть большое желание учиться этому,но нет хорошей учебной базы. Quote Link to post Share on other sites
Hitronrav 4,787 Share Posted July 6, 2020 (edited) Этот видео урок пригоден для тех, кто знает основы языка MQL4. Вам же, судя по всему, нужно вначале изучить основы программирования как такового и Си-подобный синтаксис, который и используется в MQL4. Edited July 7, 2020 by Capman п.8 Quote Link to post Share on other sites
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.