Ваши вопросы по языку MQL4

Ugar

Гуру форума
Но не раз сталкивался с тем, что котировки в тесторе выпрыгивают за 5 знаков после запятой (может и 8 и 16 быть). Это, конечно глюки брокеров, но они бывают.
Причём тут брокеры? Это особенность хранения дробных данных в переменных в С подобных языках программирования.
 

vladradon

Программист
Причём тут брокеры? Это особенность хранения дробных данных в переменных в С подобных языках программирования.
При чем тут особенности хранения, если у брокеров нет нормализации под определенное количество знаков или она (нормализация) дает сбои (а может и целенаправленно глючит). А если знаки не совпадают с заявленными, то сов или индюк скорее всего выдаст ошибку при попытке обработать нестандартное значение и с таким я уже не раз сталкивался.
 

ansol

Местный знаток
Причём тут брокеры? Это особенность хранения дробных данных в переменных в С подобных языках программирования.

У меня была такая фишка с альпари на конкурсном реал-счете, где своп пересчитывается в цену открытия. В результате получалась дробное значение и цена из пятизначной становилась шестизначной. Мой незамысловатый трейлинг прибавлял N пунктов к цене и пытался выставить стоп на уровне цена открытия+N*Point = получалась опять шестизначная борода и альпари слал такой трейлинг вдаль :nda:
Ну, а я послал их туда же :laugh:
 

mobidik

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

Вы тут не правы, если на "пальцах", то от брокера в терминал поступают данные с точностью до 16 знака, а вот уже сам терминал приводит /округляет/ их к своей точности. При этом бывают "сбои" в приведению к нужному типу значений в работе терминала, о чем и писал ansol.
 

ansol

Местный знаток
Вы тут не правы, если на "пальцах", то от брокера в терминал поступают данные с точностью до 16 знака, а вот уже сам терминал приводит /округляет/ их к своей точности. При этом бывают "сбои" в приведению к нужному типу значений в работе терминала, о чем и писал ansol.

Вообще-то, в рамках MQL4 было бы полезным объявлять некоторые переменные один раз на всю программу 5-значными, а не лепить везде NormalizeDouble, но, к сожалению, приходится.
Кстати, похожая ситуация имеется с лотом 0.07 - он всегда 0.07000000001(много нулей) и такой лот тоже обламывается в OrderSend, хотя логично было бы откусывать автоматом, а не мозги программеру компостировать.
 

Ugar

Гуру форума
Можно менять брокеров бесконечно, обвиняя их в кривых котировках. А можно разобраться в языке программирования и учитывать его особенности.
Запустите вот этот скрипт
#include <stdlib.mqh>
void OnStart()
{
//---
int maxfact=23;
double a=1;
for (int i=2; i<=maxfact; i++) { a=a*i; }
for (int j=maxfact; j>=2; j--) { a=a/j; }
Alert(" a=",DoubleToStrMorePrecision(a,16));
}
Смысл понятен? Должна получиться 1. А это поучается далеко не всегда. А котировки никаких брокеров здесь не используются. Какого же тогда брокера обвинить в кривых результатах?
Можете изменить int maxfact=35; и попробовать.
 

ansol

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

mobidik

-----
Кстати, похожая ситуация имеется с лотом 0.07 - он всегда 0.07000000001(много нулей) и такой лот тоже обламывается в OrderSend, хотя логично было бы откусывать автоматом, а не мозги программеру компостировать.

И не только, хотя метаквоты говорят, что этот глюк относится только к выводу информации в коммент и принт, при этом, брокер получает верное значение.

PS.
вот как значения выводятся в коммент в данном скрипте:
 

Вложения

  • test.png
    test.png
    13,6 КБ · Просмотры: 46
  • test.mq4
    956 байт · Просмотры: 18

Rennela

Новичок форума
Вопрос может не в тему. Парни подскажите кто в этом шарит: устанавливаю скрипт на VPS,на 16 валютных пар и VPS тормозить начинает,оперативка заполнена меньше трети, но процессор двухядерный загружен на 100%. Могут ли установленные скрипты так загрузить VPS?
 

mobidik

-----
Rennela, могут. Так снеси, скажем с 10 пар и посмотри как он себя поведет.
 

Rennela

Новичок форума
Rennela, могут. Так снеси, скажем с 10 пар и посмотри как он себя поведет.

Я их устанавливаю постепенно, и где-то на четвертой паре тормоза сильные начинаются. Что порекомендуете сделать в данной ситуации? Количество пар я буду только увеличивать,стратегия такая мультивалютная.На каждую пару свой терминал? Или может скрипт переписать под советник? Скрипт сам написал(начинающий)всего 458 строк кода.Или количество строк оптимизировать?
 

_SERG_

Активный участник
Я их устанавливаю постепенно, и где-то на четвертой паре тормоза сильные начинаются. Что порекомендуете сделать в данной ситуации? Количество пар я буду только увеличивать,стратегия такая мультивалютная.На каждую пару свой терминал? Или может скрипт переписать под советник? Скрипт сам написал(начинающий)всего 458 строк кода.Или количество строк оптимизировать?

Начинающий, а ты зацикливал скрипт While-ом со Sleep-ом?
 
Последнее редактирование:

mobidik

-----
Или может скрипт переписать под советник? Скрипт сам написал(начинающий)всего 458 строк кода.Или количество строк оптимизировать?

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

Rennela

Новичок форума
Тут не количество строк нужно оптимизировать, а сам код, причем, не зависимо, что Вы создаете. Сам скрипт - это разовое выполнение программы, а Вы его зациклили - вот и нагрузка на терминал. Как вариант, можно, если нет глубины истории, добавить её ограничение и после прохода всего кода установить задержку с помощью Sleep, параметр подбирать.
Самое верное, так это переписать под советник.
Удачи.

Сам скрипт состоит из блоков, которые идут один за другим по ходу работы,т.е. один блок отработал и break,и более он не используется. Вашу мысль я понял, так и сделаю. Спасибо.
 
Последнее редактирование:

Rennela

Новичок форума
Начинающий, а ты зацикливал скрипт While-ом со Sleep-ом?

Скрипт работает. Все блоки зациклены while т.к. брокеры любят или отреквотить или оффквот,да и просто сбой может какой-нибудь произойти. Sleep-ы стоят где без них никак. Или нужно Sleep ставить в конце каждого while? Если так,то какой оптимальный промежуток времени в мс?
 

Ugar

Гуру форума
Скрипт работает. Все блоки зациклены while т.к. брокеры любят или отреквотить или оффквот,да и просто сбой может какой-нибудь произойти. Sleep-ы стоят где без них никак. Или нужно Sleep ставить в конце каждого while? Если так,то какой оптимальный промежуток времени в мс?
Без Sleep цикл повторяется с максимальной скорость, которую может выдать процессор.То есть грузить проц на максимум. Чем меньше спит, тем больше нагрузка. Ставь 300. Обычно достаточно выполнять 3 раза в секунду.
 
Последнее редактирование:

_SERG_

Активный участник
...... брокеры любят или отреквотить или оффквот,да и просто сбой .......
Они ж не просто так это любят, у них тоже железо не резиновое, тоже не успевает за любителями зациклить скрипты. :laugh:Да и коммуникация между брокером и тобой, тож не пуля.
По поводу времени задержки выполнения кода, вопрос не тривиальный, поскольку в течение суток интенсивность поступления котировок меняется. И в зацыкленном скрипте есть возможностьменяя параметр у Sleep(), "регулировать" количество обработок, но в интервале времени до секунды. Так шо пишите. :laugh:
Идею переписать в виде советника, одобряю, только в этом случае хорошо подумай как организовать его работу, и судя по словам выше в ветке, потребности зацикливать код, нет необходимости, достаточно вписаться в стандартные функции.
 

vladradon

Программист
Это именно для какого-то цикла внутри скрипта или сова или индюка - не важно, слипинг при неопределенно ориентированном выходе из цикла может быть уместен, но такой цикл должен иметь выход, чтобы он не подвесил весь алгоритм. Цикл должен запускаться извне (по ходу проги) и иметь выход по-умолчанию (типа фальсе - ну... не получилось) и тогда будет все без тормозов.))
 

vladradon

Программист
Только позавчера наблюдал на конкурсном счете на Exness в момент выхода новости - несколько минут тупо не обновлялись котировки, пока все не успокоилось. Мои скальперы (совы) на другом брокере слили по 5-ти стоплоссам. Как ни странно, пока фракталки в сочетании с мартином прут в гору...
 
Последнее редактирование:

e-partner

Местный знаток
Прошу помочь исправить код

Привет, коллеги, привет всем кого знаю и не знаю! *hi*

Прошу помочь с таким кодом. Цель: сделать обновление советника каждое энное время, независимо от поступления тиков:



PHP:
[SIZE="2"]
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
   Comment(TimeCurrent());
  }
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
void OnInit()
  {
//--- create timer
   EventSetTimer(1);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();
   Comment(""); } [/SIZE]

Посмотреть вложение Проверка_OnTimer.mq4

В комментарий выводится кол-во секунд неравномерно. Идут задержки зависимые от поступления тиков. Нужно, чтобы отсчет велся равномерно, без пропусков.

Жду помощи от тех, кто смог решить однажды такую задачку! :please:
 
Верх