Разработка универсального и работающего шаблона для экспертов.

 
Всем кто разбирается в MQ4 не составляет особого труда написать экспертную систему на основе индикаторов, математических выражений или т.п. И каждый кто программирует эксперты наверника уже имеет определенный шаблон, что-бы не переписывать одно и тоже. Кто-то просто капирует куски кода из других экспертов, кто-то потеет смотрит HELP и пишет ручками. Так как ресурс посвящается именно программированию на MQ4 для MetaTrader 4, то для новичков это будет очень полезная ветка.
 
это не совсем просто...
вот у меня, например, в "шаблон" входит библиотека стандартных ф-ций (3000 строк) ну и несколько вариантов эксперта (для одной открытой позиции, для 2-х отложенных ордеров, и т.д.).
И от того, что я их выложу, легче никому не будет - задолбаются разбираться ;)

Ко всем кодам надо подробные инструкции и описания. А это - работы не меньше, чем написание самого кода =)
Поэтому "шаблон" вряд ли получится выложить. Просите конкретные решения - тут, я думаю, мы поможем ;)
 
Я пока не говорю что-бы универсальный шаблон был так наворочен, что новичку никак не разобраться в нем. Все должно быть постепенно и для всех понятно.
Вот например мой шаблон.
//+------------------------------------------------------------------+ //| ИМЯ ЭКСПЕРТА.mq4 | //| Copyright © 2005-2006, ВАШ НИК | //| http://www.ECЛИ ЕСТЬ.ru/ | //+------------------------------------------------------------------+ #property copyright "Copyright © 2005 ВАШ НИК или ФИО" #property link "http://www.....ru/" #define MAGIC 15122005 #include <stdlib.mqh> extern string _Parameters_Trade = "Основные параметры торговли."; extern double StopLoss = 100; //Уровень S/L extern double TakeProfit = 500; //Уровень T/P extern int Slippage = 3; //Проскальзование extern double Lots = 0.10; //Начальный лот extern string Name_Expert = "ИМЯ ЭКСПЕРТА"; // Название эксперта extern string _Time_Trade = "Время торговли вкл./откл."; extern bool UseHourTrade = True; extern int FromHourTrade = 0; //Время начала торгов extern int ToHourTrade = 23; //Время конца торгов торгов extern string _Color_Trade = "Цвета для позиций"; extern color clOpenBuy = Blue; //Открытие BUY extern color clModifyBuy = Blue; //Модификация BUY extern color clCloseBuy = Aqua; //Закрытие BUY extern color clOpenSell = Red; //Открытие SELL extern color clModifySell = Red; //Модификация SELL extern color clCloseSell = Violet; //Закрытие SELL extern string _Sound_Trade = "Звуковые эффекты вкл./откл."; extern bool UseSound = True; extern string NameFileSound = "alert.wav"; #include <b-SimpleTrailing.mqh> int start(){ //+------------------------------------------------------------------+ //| Траллин стоп. Используется дополнительные библиотеки. | //+------------------------------------------------------------------+ if (UseTrailing) TrailingPositions(); //+------------------------------------------------------------------+ //| Ограничение работы по времени в ЧАСАХ | //+------------------------------------------------------------------+ if (UseHourTrade){ if (!(Hour()>=FromHourTrade && Hour()<=ToHourTrade)) { Comment("Time for trade has not come else!"); return(0); } } //+------------------------------------------------------------------+ //| Условие при невыполнении каторых эксперт не работает. | //+------------------------------------------------------------------+ if(Bars<100){ Print("bars less than 100"); return(0); } if(StopLoss<10){ Print("StopLoss less than 10"); return(0); } if(TakeProfit<10){ Print("TakeProfit less than 10"); return(0); } if(StopLoss<10){ Print("StopLoss less than 10"); return(0); } if(TakeProfit<10){ Print("TakeProfit less than 10"); return(0); } if (!ExistPositions()) { if(AccountFreeMargin()<(1000*Lots)){ Print("Нету свободных денег. Free Margin = ", AccountFreeMargin()); return(0); } //+------------------------------------------------------------------+ //| Условия на открытие и закрытие позиций | //+------------------------------------------------------------------+ if (!ExistPositions()){ if ((Усло
 
Это могут сделать производители - выложить сделанные по своему стандарту функции решения часто встречающихся задач.
В особенности это было бы полезно в отношении торговых функций.

Что касается общественного сотрудничества, то это - пустая затея.
Слишком велика и серьёзна задача. Через неделю все участники остынут и получится как всегда.
 
SKif:
Это могут сделать производители - выложить сделанные по своему стандарту функции решения часто встречающихся задач.
В особенности это было бы полезно в отношении торговых функций.

Что касается общественного сотрудничества, то это - пустая затея.
Слишком велика и серьёзна задача. Через неделю все участники остынут и получится как всегда.
Так общими усилиями можно этот шаблон за неделю другую сделать, проверить и пользоваться, а потом мелкие дороботки, если они возникнут уже выкладывать и объяснять.
 
Я, например, не предполагаю отступать от своего стиля, что бы здесь ни выкладывали другие юзеры.
Не очень понятно кому нужны эти общие усилия.
 
SKif:
Я, например, не предполагаю отступать от своего стиля, что бы здесь ни выкладывали другие юзеры.
Не очень понятно кому нужны эти общие усилия.
Выше приведен код, разве его структура плохая?
Темболее если на основе него кто-то возьмет и напишет эксперт.
Основные функции то там есть. Единственное я спросит про ту часть каторая у меня никак не получается.
 
Выше приведен код, разве его структура плохая?
У каждого своё преставление о том что хорошо, а что плохо.

Ну, вот, например, фрагмент:
if (!ExistPositions()){ if ((Усло
 
SKif, я подозреваю что программировать вы умеете и делаете это с пониманием самого процесса программирования.
Но пока от Вас кроме критики я ничего не слышу. А ведь я просто попытался помочь не только себе но и людям каторые вообще не умеют программировать, но очень хотят делать и тестировать эксперты. Воплощать свои идеи в кодах. Шаблон необходим лиш как инструмен для решения проблемы неумения программировать. А Вы как я вижу чему-то научились и всех называете ЮЗЕРАМИ, лично для меня это созвучно слову ЛОХ. Если Вы такой крутой перец в программировании так покажите свой шаблон, что-бы говорить по существу. Да в моём коде нету еще кучи функций и дополнительных модулей, да я еще спрашиваю как делать это и как делать то, да я прошу помощи. НО прасящему дается, так говорилось в писании. Но если бы я все это знал и умел, зачем мне было идти сюда и постить сдесь свои сообщения. Я просто бы читал этот форум и улыбался от того что я знаю, а они "лохи" не знают. Может быть с Вами так это и происходит, известно только Вам. Если есть желание помочь, помогите, если "трепаться" собераетесь ни о чем, выберите другой форум или ветку. Мне кажется данный ресурс создан для программистов, дабы помочь друг другу и научиться программировать.
 
HIDDEN,
ну вот ..

Люди так устроены, что любую критику воспринимают как личное оскорбление.
Если Вы так расценили моё сообщение, то напрасно, потому что я восвсе не имел ввиду кого-то высмеять.
Я называю посетителей сети Интернет юзерами, это действительно так, но не вкладываю в это слово ничего оскорбительного. Если Вы знаете какое-то другое слово, то подскажите, возможно, я буду в будущем его использовать.

В целом, поверьте, я настроен доброжелательно.
Я спрашиваю здесь на форуме то, что не понятно или не известно мне.
Я также в меру сил помогаю другим юзерам разобраться в том, в чём сам уже разобрался. Если интересно как я это делаю - пройдите по последним нескольким десяткам тем и посмотрите. Я ЗА то, чтоб друг другу помогать.

Иногда я выкладываю свой код, если в этом есть нужда.
Сейчас я занят созданием графического советника. Расчитываю закончить его написание к Новому Году. Надеюсь, всем понравится, если разработчики не будут возражать, то он будет обубликован здесь на форуме. Пока он ещё не создан. После публикации, предположительно в течение месяца, будет продолжаться вылавливание остаточных ошибок и обмен мнениями юзеров. Если хотите, тоже можете принять участие.

По существу темы я остаюсь при своём мнении. Считаю, что эта идея работать не будет. Как мог я объяснил почему. На форуме можно только посмотреть некоторые технические решения и потом применить их в самостоятельной работе.

Если хотите посмотреть на мой стиль написания кода, то вот, пожалуйста. Это - одна из моих функций. Анализировать её содержание без наличия всего кода не имеет смысла. Вся программа пока не готова.
Если есть ко мне вопросы, то пожалуйста. Если смогу, то помогу.
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж // AG_Putnik_scr.mq4 // Предназначен для работы в качестве функции в программном комплексе AutoGraf. // Отслеживание линий, находящихся в движении. // Формирование сведений об изменении юзером курсов Opn, SL или TP ордера. // Перерисовка ордерных линий при изменении Opn, SL или TP. //жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж // // //жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж include жжжж /* #include <stdlib.mqh> #include <stderror.mqh> #include <WinUser32.mqh> //-------------------------------------------------------------------------------------------------------------------- #include <AG_Peremen_scr.mq4> // Файл описания переменных скрипта. #include <AG_Metsenat_scr.mq4> // Предопределение переменных скрипта. #include <AG_Semafor_scr.mq4> // Анализатор прав на работу скрипта. #include <AG_Work_scr.mq4> // Главная рабочая функция скрипта. #include <AG_Message_uni.mq4> // Список сообщений. #include <AG_Gorizont_scr.mq4> // Управление горизонтальными линиями разметки #include <AG_Gor_del_scr.mq4> // Удаление горизонтальных линий разметки. #include <AG_Gor_ins_scr.mq4> // Рисование горизонтальных линий разметки. #include <AG_Gor_que_scr.mq4> // Исследование горизонтальных линий разметки. #include <AG_Terminal_scr.mq4> // Анализ торгового терминала. #include <AG_Hudozhnik_scr.mq4> // Раскраска новых ордеров и удаление раскраски закрытых ордеров. #include <AG_Hud_del_scr.mq4> // Удаление ордерных линий. #include <AG_Hud_ins_scr.mq4> // Рисование ордерных линий. #include <AG_Renew_scr.mq4> // Обновление параметров скрипта при изм. extern-переменных в эксперте. #include <AG_Del_Obj_scr.mq4> // Удаление всех созданных объектов. #include <AG_Reagent_scr.mq4> // Реагирование на управляющие воздействия. #include <AG_Rea_line_scr.mq4> // Реакция на перемещение и удаление ордерных линий #include <AG_Rea_sund_scr.mq4> // Реакция на инструменты сундука */ //жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж // // //жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж int AG_Putnik_scr() { for (i=0; i<=Mas_Sledopyt[0][0]; i++) { for (j=0; j<=4; j++) { Mas_Sledopyt[i][j]=0; // Обнулимся перед началом событий } } //=================================================================================================== Регистрация ==== for (i=1; i<=Kol; i++) // По списку ордеров { Text_Number=DoubleToStr( Mas_Ord_Tek[i][4], 0); // [4]=номер ордера for (j=1; j<=3; j++) // По Opn, SL, TP ордера { His_Name = AutoGraf + OrdLine + Text_Number + Postfix[j]; // Формируем имя объекта Mesto_Line=ObjectGet( His_Name, OBJPROP_PRICE1); // Запрашиваем его координаты, и если.. if (GetLastError()==4202) continue; // ..объекта нет, то нам это не интересно.. if ( Mesto_Line!=Mas_Ord_Tek[i][j] ) // ..попалась смещённая линия,.. { // ..то есть 2 варианта: //-------------------------------------------------------------------------------------------------------------------- for(oo=1; oo<=Kol; oo++) // Пойдём по стар. списку орд. и узнаем.. { // ..а был ли такой ордер раньше if (Mas_Ord_Tek[i][4] == Mas_Ord_Old[oo][4] && // Если в старом был такой же ордер.. Mas_Ord_Tek[i][j] != Mas_Ord_Old[oo][j] && // 1. Изменился курс Opn, SL или TP. Mesto_Line == Mas_Ord_Old[oo][j] ) // ..а линия осталась на прежнем месте.. { // Надо просто постав. линию на новое место ObjectSet(His_Name,OBJPROP_PRICE1,Mas_Ord_Tek[i][j]); // Перемещаем объект на место ObjectsRedraw(); } } //-------------------------------------------------------------------------------------------------------------------- for(oo=1; oo<=Kol; oo++) // Пойдём по стар. списку орд. и узнаем.. { // ..а был ли такой ордер раньше if (Mas_Ord_Tek[i][4] == Mas_Ord_Old[oo][4] && // Если в старом был такой же ордер.. Mas_Ord_Tek[i][j] == Mas_Ord_Old[oo][j] && // 2. Линию сместил юзер Mesto_Line != Mas_Ord_Old[oo][j] ) { // Её надо учесть (=1) в соотв. ячейке // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Yes=0; if (Mas_Sledopyt[0][0]>0) { for (k=1; k<=Mas_Sledopyt[0][0];k++) // Для начала выясним есть ли такой ном.орд { if (Mas_Sledopyt[k][4]==Mas_Ord_Tek[i][4]) // Уже есть такой номер ордера { Yes=1; // Заполнять новую строку не надо Mas_Sledopyt[k][j]=1; // Линия учтена в имеющейся строке } } } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - if (Yes==0) // До сих пор ордер в массиве не числится { Mas_Sledopyt[0][0]=Mas_Sledopyt[0][0]+1; // Увеличиваем количество движимых ордеров k=Mas_Sledopyt[0][0]; Mas_Sledopyt[k][4] = Mas_Ord_Tek[i][4]; // Ном. ордера учтён в новой строке Mas_Sledopyt[k][j] = 1; // Линия учтена в новой строке } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - } } //-------------------------------------------------------------------------------------------------------------------- } } } //==================================================================================================================== /* Alert(Mas_Sledopyt[4][0]," ",Mas_Sledopyt[4][1]," ",Mas_Sledopyt[4][2]," ",Mas_Sledopyt[4][3]," ",Mas_Sledopyt[4][4]); Alert(Mas_Sledopyt[3][0]," ",Mas_Sledopyt[3][1]," ",Mas_Sledopyt[3][2]," ",Mas_Sledopyt[3][3]," ",Mas_Sledopyt[3][4]); Alert(Mas_Sledopyt[2][0]," ",Mas_Sledopyt[2][1]," ",Mas_Sledopyt[2][2]," ",Mas_Sledopyt[2][3]," ",Mas_Sledopyt[2][4]); Alert(Mas_Sledopyt[1][0]," ",Mas_Sledopyt[1][1]," ",Mas_Sledopyt[1][2]," ",Mas_Sledopyt[1][3]," ",Mas_Sledopyt[1][4]); Alert(Mas_Sledopyt[0][0]," ",Mas_Sledopyt[0][1]," ",Mas_Sledopyt[0][2]," ",Mas_Sledopyt[0][3]," ",Mas_Sledopyt[0][4]); Alert("------- Sred ----------"); AG_Message_uni(77); */ //================================================================================================ Снятие с учёта ==== for (k=1; k<=Mas_Sledopyt[0][0];k++) // Идём по массиву движимых ордеров { if (Mas_Sledopyt[k][4] > 0) // Нашлась строка с ордером { for (j=1; j<=3; j++) // Идём по ордеру { if (Mas_Sledopyt[k][j] == 1) // Есть признак движения { Text_Number=DoubleToStr( Mas_Sledopyt[k][4], 0); // [4]=номер ордера His_Name = AutoGraf + OrdLine + Text_Number + Postfix[j]; // Формируем имя объекта Mesto_Line=ObjectGet( His_Name, OBJPROP_PRICE1); // Запрашиваем его координаты, и .. ObjectDelete(His_Name); // Удаляем! :) ObjectGet( His_Name, OBJPROP_PRICE1); // Снова запрашиваем его координаты if (GetLastError()==4202) // Объекта нету, значит надо снять с учёта { // .. а это значит, что // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ObjectCreate( His_Name, OBJ_HLINE,0,0,Mesto_Line); // a)Создаём объект там, где его удалили ObjectSet ( His_Name, OBJPROP_COLOR, Yellow ); // Раскрашиваем объект в жёлтенькое ObjectSet ( His_Name, OBJPROP_STYLE, STYLE_DOT ); // Устанавливаем тип линии // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Mas_Sledopyt[k][j]=0; // б)Обнуляем этот параметр if ( Mas_Sledopyt[k][1] == 0 && Mas_Sledopyt[k][2] == 0 && // Если остальные элементы тоже = 0, то.. Mas_Sledopyt[k][3] == 0 ) { Mas_Sledopyt[k][4] = 0; // ..снимаем с учёта весь ордер.. Mas_Sledopyt[0][0] =Mas_Sledopyt[0][0]-1; // ..и уменьшаем колич. движимых ордеров } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - } // А если ошибка не возникла, значит.. // ..объект не был удалён программой,.. // ..а это свидетельствует, что наш юзер.. // ..тянет сейчас эту линию мышкой :), // ..т.е. линия ещё не "пришла", т.е.. // ..оставляем её в учёте движимых. } } } } //==================================================================================================================== /* //-------------------------------------------------------------------------------------------------------------------- Alert(Mas_Sledopyt[4][0]," ",Mas_Sledopyt[4][1]," ",Mas_Sledopyt[4][2]," ",Mas_Sledopyt[4][3]," ",Mas_Sledopyt[4][4]); Alert(Mas_Sledopyt[3][0]," ",Mas_Sledopyt[3][1]," ",Mas_Sledopyt[3][2]," ",Mas_Sledopyt[3][3]," ",Mas_Sledopyt[3][4]); Alert(Mas_Sledopyt[2][0]," ",Mas_Sledopyt[2][1]," ",Mas_Sledopyt[2][2]," ",Mas_Sledopyt[2][3]," ",Mas_Sledopyt[2][4]); Alert(Mas_Sledopyt[1][0]," ",Mas_Sledopyt[1][1]," ",Mas_Sledopyt[1][2]," ",Mas_Sledopyt[1][3]," ",Mas_Sledopyt[1][4]); Alert(Mas_Sledopyt[0][0]," ",Mas_Sledopyt[0][1]," ",Mas_Sledopyt[0][2]," ",Mas_Sledopyt[0][3]," ",Mas_Sledopyt[0][4]); Alert("------- низ -------------"); AG_Message_uni(77); //-------------------------------------------------------------------------------------------------------------------- */ return; } //жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж Конец модуля жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж /* Alert("Metka 5");//oooooooooooooooooooooooooooooooooooooooooooooooooo AG_Message_uni(77);//oooooooooooooooooooooooooooooooooooooooooooooooo
 
SKif:
Если есть ко мне вопросы, то пожалуйста. Если смогу, то помогу.
вопрос уже задавал 2 раза. Если можешь помоги решить проблему.
Код приложен выше в моём посте. Сам вопрос в 3-ем посте.
Причина обращения: