Jump to content

Общие вопросы по языку MQL


Recommended Posts

AntFX
Я читал об обратном

Вы читали, а я сталкивался. С обратными примерами (когда вдруг функция API mql4 стала не работать, а аналогичная из mql5 стала работать) не сталкивался. Хотя конечно ничто не стоит на месте, может быть глюки уже подправили.

Edited by AntFX

1

Link to post
Share on other sites
  • Replies 7.6k
  • Created
  • Last Reply

Top Posters In This Topic

  • AntFX

    577

  • sergey1294

    569

  • Ugar68

    517

  • Programmer

    419

Top Posters In This Topic

Popular Posts

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

На счёт проверок, это правильно. Я больше очень практикую, то же нарывался. Но в моём случае у меня советник открывал ордер минимальным лотом вместо нормального, когда замечал, доливаться было поздно.

Основной советник выставляет "сигнальный" отложенный ордер далеко от текущей цены и каждую например, минуту модифицирует у него время экспирации: это может быть текущее время плюс 1 час, или плюс 1 су

Posted Images

MG4

продолжу

//MQL4
bool  IsTradeAllowed();

Возвращает информацию о возможности торговли при помощи экспертов.

все просто и понятно

 

 

Информация о запущенной MQL5-программе
MQLInfoInteger()
MQL_TRADE_ALLOWED -  Разрешение на торговлю для данной запущенной программы. 

//MQL5
int  MQLInfoInteger(
   int  property_id      // идентификатор свойства. Может быть одним из значений перечисления ENUM_MQL_INFO_INTEGER.
   );


что мы получаем в итоге?

//MQL5
MQLInfoInteger(MQL_TRADE_ALLOWED)

число 0 или 1?

 

я могу так?

//MQL5
if(MQLInfoInteger(MQL_TRADE_ALLOWED)) Print("Торговля разрешена ")

PS
никак не пойму, почему бы не сделать функцию например
MQLInfobool()
для констант
MQL_DLLS_ALLOWED  Разрешение на использование DLL для данной запущенной программы
MQL_TRADE_ALLOWED Разрешение на торговлю для данной запущенной программы
MQL_SIGNALS_ALLOWED Разрешение на работу с сигналами данной запущенной программы
MQL_DEBUG  Признак работы запущенной программы в режиме отладки
MQL_PROFILER  Признак работы запущенной программы в режиме профилирования кода
MQL_TESTER  Признак работы запущенной программы в тестере
MQL_OPTIMIZATION Признак работы запущенной программы в процессе оптимизации
MQL_VISUAL_MODE  Признак работы запущенной программы в визуальном режиме тестирования
MQL_FRAME_MODE  Признак работы запущенного эксперта на графике в режиме сбора фреймов результатов оптимизации

 


— Маржинкольщик наколи мне маржинкол.

Только качественная аналитика в ветке ПАММ-а MTSavg

 

Link to post
Share on other sites
coder-ex

продолжу

//MQL4
bool  IsTradeAllowed();

Возвращает информацию о возможности торговли при помощи экспертов.

все просто и понятно

 

 

Информация о запущенной MQL5-программе

MQLInfoInteger()

MQL_TRADE_ALLOWED -  Разрешение на торговлю для данной запущенной программы. 

//MQL5
int  MQLInfoInteger(
   int  property_id      // идентификатор свойства. Может быть одним из значений перечисления ENUM_MQL_INFO_INTEGER.
   );

что мы получаем в итоге?

//MQL5
MQLInfoInteger(MQL_TRADE_ALLOWED)

число 0 или 1?

 

я могу так?

//MQL5
if(MQLInfoInteger(MQL_TRADE_ALLOWED)) Print("Торговля разрешена ")

PS

никак не пойму, почему бы не сделать функцию например

MQLInfobool()

для констант

MQL_DLLS_ALLOWED  Разрешение на использование DLL для данной запущенной программы

MQL_TRADE_ALLOWED Разрешение на торговлю для данной запущенной программы

MQL_SIGNALS_ALLOWED Разрешение на работу с сигналами данной запущенной программы

MQL_DEBUG  Признак работы запущенной программы в режиме отладки

MQL_PROFILER  Признак работы запущенной программы в режиме профилирования кода

MQL_TESTER  Признак работы запущенной программы в тестере

MQL_OPTIMIZATION Признак работы запущенной программы в процессе оптимизации

MQL_VISUAL_MODE  Признак работы запущенной программы в визуальном режиме тестирования

MQL_FRAME_MODE  Признак работы запущенного эксперта на графике в режиме сбора фреймов результатов оптимизации

все просто, язык создавали несколько "поколений" команд программистов и то что уже реализовано, не всегда охоьа ломать и переделывать, тем более, что тогда все программы которых коснется изменение в языке, перестанут работать, да программисты-пользователи языка MQL побегут от нестабильного языка в котором что то постоянно меняется :)


Разработка торговых систем и прикладного ПО для FOREX и FORTS. Программирование на MQL4, MQL5, C++ Qt.

Link to post
Share on other sites
Fargoth

подскажите, может кто-нибудь сталкивался:
эксперт крутится на M15, в своей работе вызывает iCustom с периодом H4
спустя десять минут после получения значений индикатора в журнале появляется запись:

Custom indicator ... EURUSD,H4: removed

через пять минут после этого (на очередной свече M15) эксперт опять его подгружает:

Custom indicator ... EURUSD,H4: loaded successfully

в общем то всё работает, но я не припомню, чтобы раньше это происходило

 
 
Link to post
Share on other sites
AntFX

 

 

подскажите, может кто-нибудь сталкивался:

Чтобы разобраться, нужен лог полностью, а не только вырезки из него. 


1

Link to post
Share on other sites
Fargoth

Чтобы разобраться, нужен лог полностью, а не только вырезки из него. 

Журнал из таких вот записей и состоит

post-420553-0-47450200-1423498696_thumb.jpg

Несколько больше информации выдаёт сам эксперт

post-420553-0-75559700-1423498904_thumb.jpg

"uninit reason 1", как гласит документация, есть "Программа удалена с графика"

В самом коде эксперта про "завершение индикатора", естественно ничего нет, только вызов через iCustom(...)

Может существует некий "срок жизни" для индикаторов, не относящихся в рабочему таймфрейму? :) Ровно через десять минут после инициализации "программа удаляется с графика"

Link to post
Share on other sites
AntFX

Даже не знаю, не проверял. А график таймфрейма как создан?


1

Link to post
Share on other sites
Fargoth

Даже не знаю, не проверял. А график таймфрейма как создан?

Не уверен, что правильно понял вопрос...

Обычное окно котировок онлайн для M15

На нём болтается тот же самый индикатор (для наглядности), только с параметрами для пятнадцати минут

В журналах значится именно H4, а он используется только в эксперте:

PrCh1H4down = iCustom(_symbol, PERIOD_H4, "My indicators\Price Channel", PriceChannelPeriod, 1, 1);

 

Link to post
Share on other sites
AntFX

А... меня проглючило, что это нестандартный ТФ :) Боюсь без кода советника и индикатора разобраться в причинах сложно.

Edited by AntFX

1

Link to post
Share on other sites
fy73

Думаю, вот ответ:

stringo:

VBAG:

Уважаемые разработчики!

Имеется кастомный индикатор, который используется в советнике.

Вызывается этот индюк с текущего таймфрейма(30) и со старшего(60) один раз в период. Оба индикатора выдают в советник всё корректно.

В журнале видим, что индикатор, вызываемый на текущем фрейме(30) работает без замечаний, а вот этот же индюк вызываемый со старшего фрейма постоянно выгружается минут через 10 после загрузки:

2015.02.03 21:28:15.640    Custom indicator ZSSMexp AUDUSD,H1: loaded successfully
2015.02.03 21:38:20.281    Custom indicator ZSSMexp AUDUSD,H1: removed
 

Один вопрос:

Так должно быть или использование индикатора некорректно?

Через 10 минут после последнего обращения к историческим данным (в Вашем случае AUDUSD.H1) эти данные автоматически удаляются из памяти. Вместе с ними удаляются все индикаторы, которые рассчитываются на этих данных.

Так что, всё правильно. Так и задумано.

Чтобы предотвратить автоматическую выгрузку истории и индикаторов, обращайтесь к AUDUSD,H1 немного чаще, чем 1 раз в 10 минут
Edited by fy73
  • Thanks 2

Всё сказанное вами может быть использовано против вас.

Плечо пишется через "о".

Link to post
Share on other sites
AntFX

Короче говоря добавить в OnInit(): EventSetTimer(550);

И добавить OnTimer(){ iCustom(...); }

  • Thanks 1

1

Link to post
Share on other sites
fy73

Проверил, iClose достаточно (в большинстве случаев это будет менее ресурсоёмко).

  • Thanks 2

Всё сказанное вами может быть использовано против вас.

Плечо пишется через "о".

Link to post
Share on other sites
fy73

У меня непонятки с функцией MarketInfo(symbol,MODE_TICKVALUE) в cfd.

Непосредственно перед открытием позиции принтую убыток, который возникнет по спреду:

Print("Потенциальный убыток по спреду=",MarketInfo(symbol,MODE_TICKVALUE)*MarketInfo(symbol,MODE_SPREAD)*lot);

Затем открываю позицию и принтую её текущий профит. Результаты:

0	16:29:01.183	Atromarator GBPUSD,M1: ///  #NXH5
0	16:29:01.183	Atromarator GBPUSD,M1: Потенциальный убыток по спреду=5.0
0	16:29:01.183	Atromarator GBPUSD,M1: ///
2	16:29:01.854	Atromarator GBPUSD,M1: open #265047908 buy 0.01 #NXH5 at 17840 ok
0	16:29:01.854	Atromarator GBPUSD,M1: Удачно, ticket=265047908
0	16:29:01.854	Atromarator GBPUSD,M1: Профит нового ордера=-0.75
...
0	16:29:40.059	Atromarator GBPUSD,M1: ///  AUDCHF
0	16:29:40.059	Atromarator GBPUSD,M1: Потенциальный убыток по спреду=0.5613671449082921
0	16:29:40.059	Atromarator GBPUSD,M1: ///
2	16:29:40.660	Atromarator GBPUSD,M1: open #265048021 sell 0.01 AUDCHF at 0.71931 ok
0	16:29:40.660	Atromarator GBPUSD,M1: Удачно, ticket=265048021
0	16:29:40.660	Atromarator GBPUSD,M1: Профит нового ордера=-0.5600000000000001
...
0	16:29:46.007	Atromarator GBPUSD,M1: ///  AUDNZD
0	16:29:46.007	Atromarator GBPUSD,M1: Потенциальный убыток по спреду=0.5908880000000001
0	16:29:46.007	Atromarator GBPUSD,M1: ///
2	16:29:46.494	Atromarator GBPUSD,M1: open #265048034 sell 0.01 AUDNZD at 1.05096 ok
0	16:29:46.494	Atromarator GBPUSD,M1: Удачно, ticket=265048034
0	16:29:46.494	Atromarator GBPUSD,M1: Профит нового ордера=-0.58
...
0	16:30:55.273	Atromarator GBPUSD,M1: ///  GBPAUD
0	16:30:55.274	Atromarator GBPUSD,M1: Потенциальный убыток по спреду=0.9712875000000001
0	16:30:55.274	Atromarator GBPUSD,M1: ///
2	16:30:55.898	Atromarator GBPUSD,M1: open #265048506 buy 0.01 GBPAUD at 1.96062 ok
0	16:30:55.898	Atromarator GBPUSD,M1: Удачно, ticket=265048506
0	16:30:55.898	Atromarator GBPUSD,M1: Профит нового ордера=-0.83
...
0	17:39:19.319	Atromarator GBPUSD,M1: ///  #GCG5
0	17:39:19.319	Atromarator GBPUSD,M1: Потенциальный убыток по спреду=10.0
0	17:39:19.319	Atromarator GBPUSD,M1: ///
2	17:39:23.171	Atromarator GBPUSD,M1: open #265060610 sell 0.01 #GCG5 at 1232.20 ok
0	17:39:23.171	Atromarator GBPUSD,M1: Удачно, ticket=265060610
0	17:39:23.171	Atromarator GBPUSD,M1: Профит нового ордера=-0.9
...
0	19:19:15.327	Atromarator GBPUSD,M1: ///  #NQH5
0	19:19:15.327	Atromarator GBPUSD,M1: Потенциальный убыток по спреду=5.0
0	19:19:15.327	Atromarator GBPUSD,M1: ///
2	19:19:16.314	Atromarator GBPUSD,M1: open #265080073 buy 0.01 #NQH5 at 4247.00 ok
0	19:19:16.314	Atromarator GBPUSD,M1: Удачно, ticket=265080073
0	19:19:16.314	Atromarator GBPUSD,M1: Профит нового ордера=-0.15

Всё сказанное вами может быть использовано против вас.

Плечо пишется через "о".

Link to post
Share on other sites
kazakov.v

 

 

непонятки с функцией

 

TICK_SIZE надо учитывать.

  • Thanks 1

Никому верить нельзя.

Мне - можно.

 

Link to post
Share on other sites
AntFX
TICK_SIZE надо учитывать.

А разве MODE_TICKVALUE не всегда выдает цену тика за те же единицы, в которых указывается число пунктов в MODE_SPREAD?

Edited by AntFX

1

Link to post
Share on other sites
fy73

TICK_SIZE надо учитывать.

Спасибо.

Судя по экспериментам, спред лучше посчитать вручную, заменив в рассчёте MODE_POINT на MODE_TICKSIZE?

---

В основном всё хорошо, но оказывается, есть ещё ряд символов, для которых возвращается MODE_TICKVALUE=0.0

И даже не только cfd: HKDJPY, EURZAR.

Edited by fy73

Всё сказанное вами может быть использовано против вас.

Плечо пишется через "о".

Link to post
Share on other sites
kazakov.v

 

 

разве MODE_TICKVALUE не всегда выдает цену тика за те же единицы, в которых указывается число пунктов в MODE_SPREAD?

 

Спред показан в пунктах, а ticksize может быть больше пункта, тогда стоимость пункта будет меньше tickvalue. )

  • Thanks 1

Никому верить нельзя.

Мне - можно.

 

Link to post
Share on other sites
fy73
но оказывается, есть ещё ряд символов, для которых возвращается MODE_TICKVALUE=0.0

И даже не только cfd: HKDJPY, EURZAR.

Нет, это я ошибся, не открыв в терминале все символы. Всё хорошо.


Всё сказанное вами может быть использовано против вас.

Плечо пишется через "о".

Link to post
Share on other sites
STre

Что-то никак не разберусь, как заставить индикатор перерисовываться. Может подскажете?

 

Нарисовал простенький индикатор в аттаче. При старте или изменении параметров через настройки индикатора все рисуется хорошо.

Если же приходит событие в OnChartEvent - я его получаю, e_nInpMAPeriod выставляется, IndicatorShortName обновляется в новое правильное значение. Но график не перерисовывается. Как заставить принудительно перезаполнить массив линии МА?

Test.mq4

Link to post
Share on other sites
kazakov.v

Но график не перерисовывается

У тебя расчет ограничен функцией IndicatorCounted().

Она обнуляется терминалом после инициализации, или если терминал обнаружил изменения в истории - что бывает нечасто.

Можно сделать так:

- завести глобальную переменную bool FullRecalc = false;

- заменить IndicatorCounted() на свою функцию, типа:

int MyIndicatorCounted(){

if(FullRecalc){

FullRecalc = false;

return 0;

}

return IndicatorCounted();

}

- там, где возникнет необходимость перерасчета задаешь FullRecalc = true; и на ближайшем тике произойдет принудительный перерасчет всего буфера.


Никому верить нельзя.

Мне - можно.

 

Link to post
Share on other sites
STre

У тебя расчет ограничен функцией IndicatorCounted().

Она обнуляется терминалом после инициализации, или если терминал обнаружил изменения в истории - что бывает нечасто.

Можно сделать так:

- завести глобальную переменную bool FullRecalc = false;

- заменить IndicatorCounted() на свою функцию, типа:

int MyIndicatorCounted(){

if(FullRecalc){

FullRecalc = false;

return 0;

}

return IndicatorCounted();

}

- там, где возникнет необходимость перерасчета задаешь FullRecalc = true; и на ближайшем тике произойдет принудительный перерасчет всего буфера.

Понял, спасибо. Вечером проверю.

Может еще проблема была, что писал все это в выходные и тики не приходили.

Link to post
Share on other sites
Meydron

Добрый День!

 

Надеюсь что пишу в правильной теме, если нет, приношу извинения.

 

3 недели назад написал советник, по стандартным индикаторам. Сверил верность в тестере стратегий, работает идеально.

 

Проблемы начались на второй неделе торговли:

 

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

 

Так вот этого не происходит. при возникновении сигнала к закрытию, закрывается только одна позиция.(Хотя в тестере четко видно закрытие сколько угодно позиций в одной точке)

 

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

Link to post
Share on other sites
Ugar68

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


Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку.
Чужие программы не переделываю.

Link to post
Share on other sites
Meydron

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

 

Значит как я и предполагал это связано со скоростью закрытия. Благодарю! 

Link to post
Share on other sites
Hitronrav

Значит как я и предполагал это связано со скоростью закрытия. Благодарю! 

 

делайте RefreshRates() между закрытиями

Link to post
Share on other sites

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.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Recently Browsing   0 members

    No registered users viewing this page.


×
×
  • Create New...