Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 1144

 
Valeriy Yastremskiy:

это понятно, но сходу mql5 сложен для понимания к сожалению. Согласен с fxsaber, думается мне легче на 4ке, а для оптимизации и других плюшек затаскиваем советник в 5ку. Вообще хотелось бы знать, а есть ли кто, что бы без ООП практики сразу mql5 осилил? После С++ 4ка конечно не актуальна, хотя может и ошибаюсь.

Два абсолютно одинаковых языка. Ни больше, ни меньше. И ООП (которым всех запугали) абсолютно одинаково есть в обоих. Не знали? Начитались страшилок в интернете и нагляделись блогеров в ютубе, которые "сеют доброе-разумное-вечное"? Которые с умным видом рассказывают чушь собачью, намеренно отпугивая людей от MQL5.

Спешу разочаровать - оба языка совершенно одинаковы. Как по лёгкости понимания, так и по возможностям и наличию ООП.
Правда возможностей в MQL5 больше.

 
Alexey Viktorov:

Я там испанца к тебе отправил - ну пугайся. Сделай ему индикатор - мне некогда. На английском пишет. Если что - поясню. Но .. сам разберёшься.

 
Alexey Viktorov:

Я не помню ответ Артёма, да и искать не буду, я и так догадаюсь что он мог ответить. Именно в его статьях есть весь нужный функционал для этого и все коды в его статьях либо мультитерминальные либо их две версии, для mql5 и для mql4. Я проверял эти варианты на mql4, всё отрабатывает «на ура» отлавливает закрытие по стопу или тейку и не ошибается.

Да, разобраться в этих статьях сложно, но оно того сто́ит, если вам не больше лет чем мне. А мне, для программиста неприлично много.

Другой вариант попроще, но работать будет гораздо медленнее. Пишите тикеты ордеров в массив, и по этому массиву выбирайте ордер, сверяйте время закрытия ордера. Если больше нуля, значит закрыт. Если в комментарии этого закрытого ордера есть буквы «sl» значит ордер закрыт по стопу. Дальше, если ордер закрыт из массива удаляем. Или после завершения прохода по всему массиву, его перезаполняем оставшимися открытыми ордерами. В общем полёт фантазии...

Какой вариант выбрать решение за вами. И прочтите несколько моих сообщений по поводу учебника Ковалёва. Именно в учебнике предлагается писать int start() тогда как в обновлённом mql4 для советников надо писать void OnTick()

Для индикаторов и скриптов смотрите в документации. И к стати, индикаторы писать в обновлённом mql4 гораздо легче, чем это было в то время когда Сергей писал этот учебник.

Большое спасибо. Ваша Информация была для меня очень ценной. Особенно о функции start()

 
Alexey Viktorov:

Я не помню ответ Артёма, да и искать не буду, я и так догадаюсь что он мог ответить. ...

Вот мой ответ. С чётким указанием что нужно сделать:

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам

Artyom Trishkin, 2020.04.28 08:22

Объяснение на словах: нужно отслеживать количество ордеров и позиций и сравнивать их с прошлым состоянием. Если на прошлом тике было 12 позиций, а на текущем их стало 8, то имеем изменение на 4 позиции. Соответственно, нужно брать четыре последние (по времени их закрытия) позиции для того чтобы понять что с ними произошло.

Но, судя по приложенному коду, в котором написаны "чудеса", вам пояснение на словах действительно не нужно. Но здесь помогают, а не пишут за/для.


 
ANDREY:

Большое спасибо. Ваша Информация была для меня очень ценной. Особенно о функции start()

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

А что вообще делает ваш код кроме того, что открывает две позиции на продажу каждую в строго заданное время, и распечатывает время открытия последней позиции когда это разрешено? Всё. При этом используя неинициализированные переменные, что может привести к "чудесам" в поведении кода, и очень-очень старый обработчик start(), который вытащен с пыльной полки с многолетней паутиной, и в маркет (когда-нибудь ведь захотите что-то продать) с древними обработчиками никогда не пропустит валидатор - будет твердить, что неверный тип программы.

Спасибо за участие. На паре англ.фунт- доллар США я нашел при тестировании  одну закономерность в поведении цены. Эта закономерность с небольшими коррекциями, и так же с небольшими просадками , график баланса  ведет постоянно  вверх с 2008 года и по текущий момент. Как я сказал коррекции графика баланса и просадки небольшие, но по времени бывают длительными , по несколько месяцев .На других парах эта закономерность выражена, но не так явно, как  на фунт - долларе.
Я начал тестировать различные варианты этой закономерности и прибегнул для этой цели к оптимизации. Но как оказалось оптимизация по нескольким параметрам сразу ,занимает огромное количество времени. В моем случае - около года. Генетический алгоритм мне не подходит.
Потом мне пришла мысль , что протестировать и оптимизировать можно быстрее при помощи правильно составленного кода , функции Рrint() и таблицы Ексель.

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

Спасибо за помощь.

int s1,Mn,a,CH;
double Hay,Lou=Bid,Nm_PL[700]={0},PrS,DL=0.0030,X;
int start()
{
int ot = OrdersTotal();                                         
int Ht = OrdersHistoryTotal();
////******************************************************************
if (OrderSelect (Ht-1,SELECT_BY_POS, MODE_HISTORY))                                             
if (X!=OrderTicket( ))
{
Mn=OrderMagicNumber();CH=TimeHour(OrderOpenTime());PrS=OrderProfit( );Nm_PL[CH+Mn*24]=Nm_PL[CH+Mn*24]+PrS;
Print("----------------- ПРОФИТ-----------------------=",CH,"    Ном орд.(1-26)   ",Mn," ТП    ",PrS," ФИН.РЕЗУЛЬТ.   ",Nm_PL[CH+Mn*24]," НОМ. ИНДЕКСА   ",Mn*24);X=OrderTicket();
}
////******************************************************************
if (Bid < Lou)
{
Lou=Bid;
}
//=======================
if (Bid > Hay)
{
Hay=Bid;
}
////=======================
if (Bid - Lou > DL&& Lou!=0)
{
for(int c=0; c<=500;c+=20) 
{
a++;
OrderSend(Symbol(),OP_SELL,0.1,Bid, 3,Ask+0.0030+c*Point,Ask-0.0010-c*Point,"300",a );
}
Lou=Bid;
Hay=Bid;
a=0;
s1=0;
}
return(0);
}

Если на одном тике закрываются по стопу или тейку два и более ордеров, программа печатает Print() только после последнего закрывшегося на этот тике ордера. А мне нужен  Print()  после каждого закрытого ордера. Как этого добиться я не знаю. Но если увижу нужный код, сразу все пойму и запомню.

Внизу пример  моей проблемы


Генетические алгоритмы - это просто!
Генетические алгоритмы - это просто!
  • www.mql5.com
Введение Генетический алгоритм (ГА) относится к эвристическим алгоритмам (ЭА), который даёт приемлемое решение задачи в большинстве практически значимых случаев, однако при этом правильность решения математически не доказана и применяют чаще всего для задач, аналитическое решение которых весьма затруднительно или вовсе невозможно. Классическим...
 
Valeriy Yastremskiy:
По хорошему в редакторе создаём что нам нужно, советник, скрипт, индикатор и редактор создаст шаблон с правильными полями.

Да. Я обращал внимание на  эти правильные поля , то есть новые функции вместо СТАРТА . Но не придавал им значения и по прежнему пользовался для тестирования СТАРТОМ.
А Вы не знаете где можно почитать по подробнее о последних обновлениях MQL4  А то информации везде очень много, а нужной найти очень сложно. Иногда даже не знаю где искать.Учебник Ковалева  мне очень нравится именно тем что в нем вся информация логически структурирована и потому заходит в мозги легко и быстро. И в достаточной степени детализирована, для понимания всех необходимых тонкостей. Удивляюсь почему он не напишет так же учебник для MQL5.

 
Artyom Trishkin:

Два абсолютно одинаковых языка. Ни больше, ни меньше. И ООП (которым всех запугали) абсолютно одинаково есть в обоих. Не знали? Начитались страшилок в интернете и нагляделись блогеров в ютубе, которые "сеют доброе-разумное-вечное"? Которые с умным видом рассказывают чушь собачью, намеренно отпугивая людей от MQL5.

Спешу разочаровать - оба языка совершенно одинаковы. Как по лёгкости понимания, так и по возможностям и наличию ООП.
Правда возможностей в MQL5 больше.

Да в общем-то согласен, и ООП в 4ке рад))) но в доступе новичков по своему опыту учебники Ковалёва, Ждана по 4ке и непонятный Мишина по 5ке и ООП. Его понять не знаю как. Сколько не повторяй инкапсуляция, полиформизм понимание не придет. И статьи, которые не понимаешь какие читать первыми. И где что нужно искать. Поэтому до сих пор в кодобазе в онтик выход из функции старт встречается )))))
 
ANDREY:

Да. Я обращал внимание на  эти правильные поля , то есть новые функции вместо СТАРТА . Но не придавал им значения и по прежнему пользовался для тестирования СТАРТОМ.
А Вы не знаете где можно почитать по подробнее о последних обновлениях MQL4  А то информации везде очень много, а нужной найти очень сложно. Иногда даже не знаю где искать.Учебник Ковалева  мне очень нравится именно тем что в нем вся информация логически структурирована и потому заходит в мозги легко и быстро. И в достаточной степени детализирована, для понимания всех необходимых тонкостей. Удивляюсь почему он не напишет так же учебник для MQL5.

Как сказал  Alexey Viktorov: Поймите простую истину, что mql5 отличается от mql4 только функцией OrderSend() и может ещё несколько функций которые я не помню. Ещё важное отличие, это направление индексации индикаторных буферов. Но это решается в полтычка, хотя лучше привыкнуть к новшеству. А получение значений индикаторов осталось прежним. 
Статьи по ООП для начинающих помогли. И справка редактора.
 
ANDREY:

Спасибо за участие.

...

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

Спасибо за помощь.

Если на одном тике закрываются по стопу или тейку два и более ордеров, программа печатает Print() только после последнего закрывшегося на этот тике ордера. А мне нужен  Print()  после каждого закрытого ордера. Как этого добиться я не знаю. Но если увижу нужный код, сразу все пойму и запомню.

Внизу пример  моей проблемы


Я вам уже отвечал:

Объяснение на словах: нужно отслеживать количество ордеров и позиций и сравнивать их с прошлым состоянием. Если на прошлом тике было 12 позиций, а на текущем их стало 8, то имеем изменение на 4 позиции. Соответственно, нужно брать четыре последние (по времени их закрытия) позиции для того чтобы понять что с ними произошло.

Вы берёте последний в списке ордер:

int Ht = OrdersHistoryTotal();
////******************************************************************
if (OrderSelect (Ht-1,SELECT_BY_POS, MODE_HISTORY))

А вам нужно сначала узнать на сколько изменилось состояние в списке ордеров. Было 12, стало 8 - изменилось на 4 ордера. Соответственно - вам нужно все четыре ордера распечатать. А вы всегда распечатываете только самый последний в списке.

Как узнать на сколько изменилось? Нужно при запуске советника записать количество ордеров в переменную, например int last_total. Затем на каждом тике сравнивать OrdersTotal() с last_total. Если они НЕ равны - произошло изменение. Записать разницу между OrdersTotal() и last_total в переменную, например num_changes и сохранить в last_total новое состояние OrdersTotal().
Тут могут быть нюансы, например, при срабатывании отложенных ордеров. Но пока вам бы сделать то, что нужно для начала.
Зная количество пропавших ордеров, вы можете их посмотреть в истории. Впрочем, можно ограничиться только контролем ордеров в историческом списке - сделать всё вышеописанное не для списка рыночных, а для списка исторических ордеров. Разница между тем, что было, и тем что стало - это и есть то количество ордеров, которые нужно проанализировать. Вы же всегда анализируете только самый последний в списке.

При этом никто не гарантирует, что последний в историческом списке ордер будет последним закрытым. Это тоже нюансы, которые нужно учитывать. Но потом.