Уроки по программированию на языке MQL4 от eevviill

Genadi22

Новичок форума
Спасибо...
Отлично...- да я часто встречал - MarketInfo(Symbol(),MODE_DIGITS,- и даже и сейчас есть такая проблема когда на пятизнаке лишнее число показывает,- я обращался к создателю и он мне ответил - не велика беда - отнимай одну цифру и будет тебе счастье...

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

я как раз шас просматриваю код про MarketInfo(Symbol()
и ещё раз большое спасибо всем кто откликнулся...

Советник не будет тестироватся на тестере,- токо в реальном режиме на реальном счёте,- в условиях максимально приближенных к боевым,- токо вместо открытия позиции будет выдавать сигнал в виде стрелки зелёного или красного цвета...
 
Последнее редактирование:

Genadi22

Новичок форума
Про включение и выключение модуля, опять же через иф, или свич.

С распознаванием, там проблем нет, если помощь почитать, про MarketInfo(Symbol(),MODE_DIGITS), правда на тестере не всегда работает.

как то получилось что ещё раз выскочил этот коментарий...- и даже если сто раз выскочет,- стоко раз скажу - Спасибо...
 
Последнее редактирование:

Genadi22

Новичок форума
Добрый день EEVVIILL и Уважаемые спецы...

В рамках выполнения урока 2,- нашёл интересный диалог...

не могли бы Вы прокомментировать этот диалог и сам код и дать свою оценку... Спасибо

Ваш код не является надежным, есть символы с 1 или 2 (золото) или другое количество цифр.
Я нашел лучший способ (все еще необходимо проверить его с некоторыми брокерами).
Он читает symbols.raw в истории папки, чтобы найти имя EURUSD, а затем использовать MarketInfo ();

* Определить пункт множителя (1 или 10) в зависимости от того, сколько
* Цифры символ EURUSD имеет. Это делается путем первого
* Найти точное название этого символа в symbols.raw
* Файл (это может быть или EURUSDm EURUSDiam или любое другое глупое имя
* Брокер придумывает только сломать чужой код)
* И затем usig MarketInfo () для определения цифры.

double pointsPerPip(){
int i;
int digits;
double ppp = 1;
string symbol;
int f = FileOpenHistory("symbols.raw", FILE_BIN | FILE_READ);
int count = FileSize(f) / 1936;
for (i=0; i<count; i++){
symbol = FileReadString(f, 12);
if (StringFind(symbol, "EURUSD") != -1){
digits = MarketInfo(symbol, MODE_DIGITS);
if (digits == 4){
ppp = 1;
}else{
ppp = 10;
}
break;
}
FileSeek(f, 1924, SEEK_CUR);
}
FileClose(f);
return (ppp);
}
 

_SERG_

Активный участник
Добрый день EEVVIILL и Уважаемые спецы...

В рамках выполнения урока 2,- нашёл интересный диалог...

не могли бы Вы прокомментировать этот диалог и сам код и дать свою оценку... Спасибо

Ваш код не является надежным, есть символы с 1 или 2 (золото) или другое количество цифр.
Я нашел лучший способ (все еще необходимо проверить его с некоторыми брокерами).
Он читает symbols.raw в истории папки, чтобы найти имя EURUSD, а затем использовать MarketInfo ();

* Определить пункт множителя (1 или 10) в зависимости от того, сколько
* Цифры символ EURUSD имеет. Это делается путем первого
* Найти точное название этого символа в symbols.raw
* Файл (это может быть или EURUSDm EURUSDiam или любое другое глупое имя
* Брокер придумывает только сломать чужой код)
* И затем usig MarketInfo () для определения цифры.

double pointsPerPip(){
int i;
int digits;
double ppp = 1;
string symbol;
int f = FileOpenHistory("symbols.raw", FILE_BIN | FILE_READ);
int count = FileSize(f) / 1936;
for (i=0; i<count; i++){
symbol = FileReadString(f, 12);
if (StringFind(symbol, "EURUSD") != -1){
digits = MarketInfo(symbol, MODE_DIGITS);
if (digits == 4){
ppp = 1;
}else{
ppp = 10;
}
break;
}
FileSeek(f, 1924, SEEK_CUR);
}
FileClose(f);
return (ppp);
}

Если работаете на одном инструменте, то функцию можно немного упростить.

double PointsPerPip()
{
int ppp;
if (MarketInfo( Symbol(), MODE_DIGITS) == 4 ) { ppp = 1;}
else { ppp = 10; }
return (ppp);
}

:D
 

Genadi22

Новичок форума
Хочу напомнить,- что формат общения на ветке Уроки от – eevviill, не смотря на название имеет трактовку “ Учитель – ученик”, - то есть в роли Учителя ВЫ – профессионалы(это может быть любой и не обязательно – eevviill,- и ученик – то есть – я…
По этому убедительная просьба формировать Ваши мысли и излагать их в такой форме что бы кроме Вас её мог ещё понять тот,- для кого они собственно предназначены…


Убедительная просьба к тем которые косят под профессионалов – откажитесь от намерения издавать пустые звуки,- есть большая вероятность того что сами станете пустым местом…
или от нечлено раздельных звуков типа – ни – Бе,- ни - Ме,- ни ку-ка-ре-ку…
Спасибо…
 
Последнее редактирование:

Genadi22

Новичок форума
Если Всё понятно:

Хочу представить на Ваше рассмотрение,- обсуждение,- предложения, - критику и т.д.
проект советника – STELS…- вернее общую структуру модуля – Stels_Module1

в случае если найдутся желающие принять участие в обсуждении проекта,- скачайте копию,- и в этом случае мы будем знать где и на какой стадии обсуждения мы находимся…- Цель поставить - STELS на колёса,- летать ему ещё рано…- это значит довести до тестового состояния…- Спасибо…
 

Вложения

  • STELS(test).rar
    860 байт · Просмотры: 47

Genadi22

Новичок форума
На данный момент разбирается или обсуждается
первый блок кодов,- Открытие/Закрытие,- в него входят:

1 – код- по настройке времени под брокера
2 – код- открытия/закрытия – понедельник/пятница
3 – код- открытия/закрытия – текущего дня

от них практически ничего не зависит,- поэтому требования минимальны
автоматически определять в каком формате работает Стелс
В 12часовом или 24часовом и подстраиваться под эти форматы
---------------------------------------------------------------------------------------------------------
4 – код – Таймер с форматом – 00’00”
5 – код- Marketinfo
---------------------------------------------------------------------------------------------------------
Вариант 1

string TimeToString(int ai_0)
{
if (!gi_1684) return (TimeToStr(ai_0, TIME_MINUTES));
int li_4 = TimeHour(ai_0);
int l_minute_8 = TimeMinute(ai_0);
string ls_12 = " AM";
if (li_4 >= 12)
{
li_4 -= 12;
ls_12 = " PM";
}
if (li_4 == 0) li_4 = 12;
string ls_ret_20 = DoubleToStr(li_4, 0) + ":";
if (l_minute_8 < 10) ls_ret_20 = ls_ret_20 + "0";
ls_ret_20 = ls_ret_20 + DoubleToStr(l_minute_8, 0);
ls_ret_20 = ls_ret_20 + ls_12;
return (ls_ret_20);
}
можно ли использовать этот код в качестве подстройки времени под брокера…
в случае если у кого то есть иное решение – пусть опубликует его под – вариант 2 и т.д.
 

Genadi22

Новичок форума
Всем привет и доброго здравия…
Как говорится чем дальше в лес – тем больше дров…- Уважаемые спецы в поисках некоторых ответов таки пришлось изучать протоколы безопасности…
Честно говоря я в шоке…- Может действительно стоит в первую очередь подумать об этом,- ведь все те трейдеры которые пользуются Вашими программами,- насколько мне удалось увидеть перебрав сотни программ даже не подозревают что их советники – это лучший способ слить свои же деньги…- попробую показать это на примере – Стелса…

У Стелса есть два слабых места
1 - Информационное – цель – дезинформация – подмена котировок на протокольном уровне(для пользователя это не доступно) - эта проблема решена
2 - Временное – цель - нейтрализация…
и вот с временной пока нет…
- работая в реальном режиме она не составляет проблем.- но для Стелса может стать камнем преткновения…

А именно…
- На каком то этапе на Стелса начнётся – Охота…- противник будет знать основные характеристики Стелса – он знает что Стелс появляется на последней секунде и исчезает на первой секунде(теоретически идеальный вариант)…
откинем формальности и рассмотрим проблему под микроскопом…
Стелс на задании:

1- тик – фиксация параметров
2- тик - генерирование сигнала
3- тик – команда на исполнение
4- тик – исполнение
5- тик- завершение

Действия – Охотника:

1- тик – обнаружение сканера Стелса
2- тик – команда на исполнение
3- тик - ожидание
4- тик – исполнение

для Стелса это означает следующее:

1- тик – фиксация параметров
2- тик – генерирование сигнала
3- тик – команда на исполнение
4- тик – ТИКА НЕТ

Цель достигнута - Стелс нейтрализован(причём обратите внимание что – Охотник мог отдать команду на исполнение ещё до того как такую же команду должен отдать Стелс),- и так,- команда отдана и зависла на сервере,- теперь Стелс беспомощен он ничего не может изменить…
Дальнейшие действия выглядят таким образом – если позиция ушла в профит – сервер отвечает на запрос – цены изменились повторите запрос,- лимит времени у Стелса исчерпан он на следующем тике завершает работу…
если позиция ушла в минус – то первый тик приходит скажем через 20 мин но уже с исполненной командой то есть открытой позицией и я вижу что уже в минусе на хорошие 50 пунктов…- Если вместе с ордером был выставлен – СтопЛосс,- то фактически ответ придёт уже с отработанным СтопЛоссом, - то есть с меня если можно так выразится – за живо сняли шкуру…
Но,- есть идея – это не панацея от всех бед,- а просто попытка оснастить несколькими сценариями исполнения,- своего рода – машинное чутьё…
 

ostrik

Элитный участник
Ребят подскажите если не сложно как можно вставить функцию пароля на запуск индикатора, т.е. кидаем индикатор на график в окне прописываем пароль, индикатор запускается... Привязку к счёту сделать, типа номер счёта 10235 умножаем его на 10 получаем нужный пароль для запуска...
Заранее благодарен за помощь!
 

AlexeyVik

Программист mql4 mql5
Всем привет и доброго здравия…
Как говорится чем дальше в лес – тем больше дров…- Уважаемые спецы в поисках некоторых ответов таки пришлось изучать протоколы безопасности…
Честно говоря я в шоке…- Может действительно стоит в первую очередь подумать об этом,- ведь все те трейдеры которые пользуются Вашими программами,- насколько мне удалось увидеть перебрав сотни программ даже не подозревают что их советники – это лучший способ слить свои же деньги…- попробую показать это на примере – Стелса…

У Стелса есть два слабых места
1 - Информационное – цель – дезинформация – подмена котировок на протокольном уровне(для пользователя это не доступно) - эта проблема решена
2 - Временное – цель - нейтрализация…
и вот с временной пока нет…
- работая в реальном режиме она не составляет проблем.- но для Стелса может стать камнем преткновения…

А именно…
- На каком то этапе на Стелса начнётся – Охота…- противник будет знать основные характеристики Стелса – он знает что Стелс появляется на последней секунде и исчезает на первой секунде(теоретически идеальный вариант)…
откинем формальности и рассмотрим проблему под микроскопом…
Стелс на задании:

1- тик – фиксация параметров
2- тик - генерирование сигнала
3- тик – команда на исполнение
4- тик – исполнение
5- тик- завершение
Действия – Охотника:

1- тик – обнаружение сканера Стелса
2- тик – команда на исполнение
3- тик - ожидание
4- тик – исполнение

для Стелса это означает следующее:

1- тик – фиксация параметров
2- тик – генерирование сигнала
3- тик – команда на исполнение
4- тик – ТИКА НЕТ

Цель достигнута - Стелс нейтрализован(причём обратите внимание что – Охотник мог отдать команду на исполнение ещё до того как такую же команду должен отдать Стелс),- и так,- команда отдана и зависла на сервере,- теперь Стелс беспомощен он ничего не может изменить…
Дальнейшие действия выглядят таким образом – если позиция ушла в профит – сервер отвечает на запрос – цены изменились повторите запрос,- лимит времени у Стелса исчерпан он на следующем тике завершает работу…
если позиция ушла в минус – то первый тик приходит скажем через 20 мин но уже с исполненной командой то есть открытой позицией и я вижу что уже в минусе на хорошие 50 пунктов…- Если вместе с ордером был выставлен – СтопЛосс,- то фактически ответ придёт уже с отработанным СтопЛоссом, - то есть с меня если можно так выразится – за живо сняли шкуру…
Но,- есть идея – это не панацея от всех бед,- а просто попытка оснастить несколькими сценариями исполнения,- своего рода – машинное чутьё…
Тут немного не так.
Функция int Start(){} выполняется от начала до конца за один тик, включая обращения к пользовательским функциям. Даже если тики идут часто, например на новостях, а код слишком громоздкий и в нём много циклов, то пока выполняется код может проскочить мимо 1 и не один тик.
Получается, что всё расписанное может быть выполнено за один тик. А на втором охотник пусть ищет твой самолёт.

Так работают все советники которые настроены работать только на открытии нового бара. И пишется это элементарно.
Некоторые пишут непосредственно в код ф-ции Start() но я предпочитаю отдельную пользовательскую ф-цию
Код:
bool NewBar()
{
   [B]static [/B]datetime lastbar = 0;
   datetime curbar = [B]iTime(NULL, Period(), 0)[/B];// Можно заменить на [B]Time[0][/B]
   if(lastbar < curbar)
   {
    lastbar = curbar;
    return (true);
   }
   else return(false);
}//******************************************************************|
А в ф-ции Start()
{
if(NewBar()) {//выполнить набор команд}
return(0);
}
 

AlexeyVik

Программист mql4 mql5
Ребят подскажите если не сложно как можно вставить функцию пароля на запуск индикатора, т.е. кидаем индикатор на график в окне прописываем пароль, индикатор запускается... Привязку к счёту сделать, типа номер счёта 10235 умножаем его на 10 получаем нужный пароль для запуска...
Заранее благодарен за помощь!
В самом начале поставить условие
if(AccountNumber() != 102350) return(0);
 

Genadi22

Новичок форума
Тут немного не так.

Отлично…- Спасибо…- это уже реальный шанс что проект будет доведён до ума
осталось добавить токо распознавание ситуации
а именно при открытии позиции сперва должен учитываться факт на наличие разрыва(проще говоря – гэпа)- если разрыв будет больше 3- пипок(регулируемый параметр) сигнал игнорируется(или недействителен)
Теперь собственно структура…
1-й модуль состоит из двух блоков
1- Сканер
2- Искусственный интеллект
но в тестовом варианте только сканер…
принцип работы:
в конце часа на последней минуте/секунде сканируется четыре тайм фрейма:
М5; М15; М30; Н1;
все свечи на указанных тайм фреймах должны быть однонаправленными
то есть:
если цена закрытия выше цены открытия – бычьи свечи
если цена закрытия ниже цены открытия – медвежьи свечи
такой сигнал имеет статус – сгенерированного
(смотрите скриншот)
далее сигнал поступает на командный блок и ему придаётся статус:
если сигнал токо от сканера – то слабый - cod 1,- и игнорируется…
если сигнал будет подтверждён искусственным интеллектом - то сильный – cod 2, - позиция открывается…
Но в тестовом варианте – когда будет получен сигнал от сканера,- в место открытия позиции
на графике должна появится стрелка соответствующего цвета – зелёная или красная, а также символ той валюты на которой был зафиксирован сигнал…

Вот в принципе и вся работа модуля 1…
 

Вложения

  • 24.jpg
    24.jpg
    79,9 КБ · Просмотры: 58

AlexeyVik

Программист mql4 mql5
Отлично…- Спасибо…- это уже реальный шанс что проект будет доведён до ума
осталось добавить токо распознавание ситуации
а именно при открытии позиции сперва должен учитываться факт на наличие разрыва(проще говоря – гэпа)- если разрыв будет больше 3- пипок(регулируемый параметр) сигнал игнорируется(или недействителен)
Теперь собственно структура…
1-й модуль состоит из двух блоков
1- Сканер
2- Искусственный интеллект
но в тестовом варианте только сканер…
принцип работы:
в конце часа на последней минуте/секунде сканируется четыре тайм фрейма:
М5; М15; М30; Н1;
все свечи на указанных тайм фреймах должны быть однонаправленными
то есть:
если цена закрытия выше цены открытия – бычьи свечи
если цена закрытия ниже цены открытия – медвежьи свечи
такой сигнал имеет статус – сгенерированного
(смотрите скриншот)
далее сигнал поступает на командный блок и ему придаётся статус:
если сигнал токо от сканера – то слабый - cod 1,- и игнорируется…
если сигнал будет подтверждён искусственным интеллектом - то сильный – cod 2, - позиция открывается…
Но в тестовом варианте – когда будет получен сигнал от сканера,- в место открытия позиции
на графике должна появится стрелка соответствующего цвета – зелёная или красная, а также символ той валюты на которой был зафиксирован сигнал…

Вот в принципе и вся работа модуля 1…
И здесь повторяется та-же ошибка.
Зачем пытаться поймать последнюю секунду часа, когда вполне может произойти ситуёвина, что за последнюю секунда не будет тика.
А если взять последнюю минуту, то после анализа может произойти так, что на М5 и даже на М15 будет противоположный сигнал.

Всё это делается на первом тике старшего ТФ. На анализ ситуации затрачивается несколько миллисекунд и тут-же проверяется наличие гепа простым вычитанием Close[1]-Open[0] и сразу-же принимается решение.
 

Genadi22

Новичок форума
И здесь повторяется та-же ошибка.

Отлично...- Спасибо...
Это как раз то что нужно...
Я просто передал режим ручной торговли,- но советник похоже будет более проворней чем ручной режим...
И совершенно верно,- если среди - бычьих или медвежьих свечей присутствует хоть одна противоположная,- то никаких действий,- и советник переходит в режим ожидания...
 
Последнее редактирование:

Krashid

Активный участник
У меня такая просьба по мартину когда подает заявку на открытие ордера на сервер к примеру на сел можно сделать так чтоб открылся ордер сел и бай но бай ордер открылся с разницей спреда возможно сделать такое и на оборот с уважением
 

ostrik

Элитный участник
Ребят помогите с проблемой справиться второй день бьюсь... Хочу брать данные из индикатора и другим рисовать стрелки, прописал условие стрелку вверх показывает без проблем, а вниз дублирует сигнал на каждом баре в чемё может быть дело?
PHP:
//---- получение значений индикатора в переменные

         double smHullgreen=iCustom(NULL,0,"smHull Mavg",0,ii);
         double smHullgreen1=iCustom(NULL,0,"smHull Mavg",0,ii+1);
	 double smHullred=iCustom(NULL,0,"smHull Mavg",1,ii);
	 double smHullred1=iCustom(NULL,0,"smHull Mavg",1,ii+1);
      
                
         if(smHullgreen < smHullred && smHullgreen>smHullred1)
         {                        dUpCCIBuffer[ii] = Low[ii] - 20 * MarketInfo(Symbol(),MODE_POINT);
                 }
        
        
         if (smHullgreen > smHullred && smHullred<smHullgreen1) 
            
         {
            dDownCCIBuffer[ii] = High[ii] + 20 * MarketInfo(Symbol(),MODE_POINT);
 }
 
Последнее редактирование модератором:
Верх