альтернатива функциональному сну - страница 2

 
paulepanke:

Будьте осторожны с таким утверждением. всегда есть логическая причина для запуска sleep(). в тестере и даже в индикаторах.

Я не говорил, что нет логических причин использовать sleep(), их много, я сказал, что нет причин ожидать, что sleep() будет работать в тестере стратегий. Работает ли он в индикаторе, запущенном на графике тестера стратегий, я не знаю, может и работает. . работает ли он в советнике, запущенном в тестере стратегий, насколько я знаю, нет. Можно ли заставить советника, запущенного в тестере стратегий, сделать паузу? да, можно.
 
RaptorUK:
Посмотрите, что дает TimeSeconds(), затем подумайте, что дает TimeCurrent() . . какой из них вам нужен и почему?


Симон,

int TimeSeconds( дата-время)

Возвращает количество секунд, прошедших с начала минуты для указанного времени.

datetime TimeCurrent( )
Возвращает последнее известное время сервера (время поступления последней цитаты) как количество секунд, прошедших с 00:00 1 января 1970 года.


"Какой из них вам нужен и почему?" - Саймон

Я бы использовал оба e'm совместно, потому что они идут рука об руку. - Натан

TimeSeconds(datetime time) требует переменной, помещенной внутрь скобок. TimeCurrent() затем помещается внутрь этих скобок, что представляет собой жизнеспособное решение. Я уже делал это раньше, но не понимал, почему возвращаемые значения времени проскакивают и приостанавливаются (из-за отсутствия активного тика/тиков).

Что вы скажете по этому поводу?


Спасибо.

 
WHRoeder:

  1. Никакие тики не создаются, пока вы не вернетесь, и он не создаст следующий тик и не вызовет ваш start(). Если вы вычисляете в течение 5 минут и возвращаетесь, объем (количество тиков) при следующем вызове будет +1. На живом графике, если вы рассчитываете на 5 минут, то вы пропустите 5 минут тиков, а на M1 сформируется несколько новых баров.

Уильям,

Спасибо за разъяснение этой темы.

Моя интерпретация "2." такова: когда создается тик, вызывается функция return. Далее вызывается функция Start() непосредственно после вызова функции return(0), которая запускает выполнение программы еще раз. Верна ли такая интерпретация этой части пункта 2.?


"Если вы рассчитываете на 5 минут", как я могу быть уверен, что советник будет рассчитывать в течение пяти минут (даже если советник рассчитывает в течение пяти минут, я не верю, что это гарантирует создание тика. Вероятность создания тика увеличивается)?


Прошу прощения, мне трудно это читать:

"Если вы рассчитываете в течение 5 минут и возвращаетесь, объем (количество тиков) на следующем вызове будет +1. На живом графике, если вы рассчитываете на 5 минут, то вы пропустите 5 минут тиков, а на М1 сформируется несколько новых баров."


Большое спасибо за ваш ответ.

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

Саймон,

"Можно ли заставить советника, запущенного в тестере стратегий, приостановиться? Да, можно."

Не могли бы вы изложить свои мысли относительно метода, который вы бы использовали для "приостановки" советника в тестере?


Спасибо

 
  1. Советник возвращается из start() обратно к тестеру. Тестер создает следующий тик и вызывает start(). Если советник не возвращается, то следующего тика не будет. Не имеет значения, сколько времени потребуется start() для возврата. Следующий тик будет создан, когда он вернется.
  2. В тестере вы не можете поставить советника на паузу или в сон. Вы можете программно нажать кнопку паузы, чтобы приостановить работу тестера после возврата советника из start().
 

Уильям,

Итак, новый тик вызывает функцию start() в советнике, да?

Мой вопрос к вам таков: "Знаете ли вы какой-нибудь другой способ вызова функции start(), кроме вызова нового тика? Возможно, последовательное повторяющееся действие, заменяющее вызов Start()?".

(Я думаю, есть ли способ последовательного отслеживания секунд, который не зависит от тиков)


"...Следующий тик создается, когда это происходит."

Я полагаю, что вы хотели написать: "При создании нового тика выполняется Start()." ;)


Итак, вы говорите, что советник не может быть приостановлен или переведен в спящий режим в тестере, да?


Я просмотрю предоставленную вами ссылку, а пока не могли бы вы рассказать об этом методе "нажатия кнопки паузы, чтобы приостановить работу тестера" после того, как тестируемый советник возвращается после старта?

При запуске в тестере этот метод будет имитировать работу советника, приостановленного на определенный отрезок времени в "реальном времени" на реальном счете?


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


С большой благодарностью, Уильям.


Также, вы не возражаете, если я буду называть вас просто Уилл? Это сэкономит мне секунду времени на каждое сообщение. Ваш звонок.

Мне нравится функция, которой обладает ваш советник, а именно: "Я хотел закрыть все ордера до конца недели (рынок закрывается в пятницу), чтобы предотвратить потери, если рынок провалится в конце недели, пройдя SL".

(Хлопает в ладоши от радости.) Хахаха! ;) Добавляя эту функцию в свой советник, вы сокращаете ненужные потери, но это отличается от того, что я пытаюсь сделать в настоящее время. В настоящее время я пытаюсь последовательно отслеживать секунды времени без необходимости тиков для обновления секунд. Мне нужен другой способ обновления функции Start(), понятно?


Спасибо

 
WhooDoo22:

В настоящее время я пытаюсь последовательно отслеживать секунды времени без необходимости использования тиков для обновления секунд. Мне нужен другой способ обновления функции Start(), понятно?

Я подозреваю, что то, что вы пытаетесь сделать, является ошибочным решением вашей проблемы из-за отсутствия понимания. Зачем вам знать секунды от одной секунды до другой, если цена не менялась в течение 30 секунд? Когда цена меняется, вы получаете тик.

Пояснение к словамWHRoeder, все тики создаются до того, как тестер стратегий начинает их вызывать/исполнять, они сохраняются в файл .fxt в файле tester/history, ST вызывает первый тик, который в свою очередь вызывает выполнение start(), следующий тик не вызывается/используется, пока start() не закончит выполнение, это очень важно понять. Только после завершения выполнения start() следующий тик будет использован, чтобы эксперт мог снова вызвать start(). Когда ST работает на полной скорости, именно скорость выполнения start() регулирует скорость ST, поэтому очень простая функция start() позволит ST работать очень быстро, сложная функция start() заставит ST работать медленнее.

В ситуации Live/Demo, если функция start() очень сложная и требует много времени для выполнения, возможно, несколько десятых долей секунды, возможно, что следующий тик может наступить до завершения start(), в этой ситуации тик будет пропущен и не вызовет start() ... ... это НЕ МОЖЕТ произойти с ST.

 
WhooDoo22:

Саймон,

"Можно ли заставить советника, запущенного в тестере стратегий, приостановиться? Да, можно."

Не могли бы вы высказать свои мысли по поводу метода, который вы используете для "приостановки" советника в тестере?

Конечно, он не очень элегантен, поэтому я бы не советовал никому его использовать. Я использовал GlobalVariable, устанавливаемую и снимаемую скриптом, когда советник в ST видел, что GlobalVariable установлена, он сидел в цикле, постоянно проверяя, что GlobalVariable снята, когда скрипт снимал GlobalVariable, советник выходил из цикла и его функция start() завершалась.
 
WhooDoo22:

"Какой из них вам нужен и почему?". - Саймон

Я бы использовал оба e'm в сочетании, потому что они идут рука об руку. - Натан

TimeSeconds(datetime time) требует переменной, помещенной внутрь скобок. TimeCurrent() затем помещается внутрь этих скобок, что представляет собой жизнеспособное решение. Я уже делал это раньше, но не понимал, почему возвращаемые значения времени проскакивают и приостанавливаются (из-за отсутствия активного тика/тиков).

Предположим, у вас есть 2 события, и эти события находятся на расстоянии 10 секунд друг от друга, какова будет разница между значениями, возвращаемымиTimeSeconds(datetime time) для этих двух событий?
 
RaptorUK:

Я подозреваю, что то, что вы пытаетесь сделать, является несовершенным решением вашей проблемы из-за отсутствия понимания. Зачем вам нужно знать секунды от одной секунды до другой, если цена не менялась в течение 30 секунд? Когда цена меняется, вы получаете тик.

Пояснение к словамWHRoeder, все тики создаются до того, как тестер стратегий начинает их вызывать/исполнять, они сохраняются в файл .fxt в файле tester/history, ST вызывает первый тик, который в свою очередь вызывает выполнение start(), следующий тик не вызывается/используется, пока start() не закончит выполнение, это очень важно понять. Только после завершения выполнения start() следующий тик будет использован, чтобы эксперт мог снова вызвать start(). Когда ST работает на полной скорости, именно скорость выполнения start() регулирует скорость ST, поэтому очень простая функция start() позволит ST работать очень быстро, сложная функция start() заставит ST работать медленнее.

В ситуации Live/Demo, если функция start() очень сложная и требует много времени для выполнения, возможно, несколько десятых долей секунды, возможно, что следующий тик может наступить до завершения start(), в этой ситуации тик будет пропущен и не вызовет start() ... ... это НЕ МОЖЕТ произойти с ST.

Саймон,

Я подозреваю, что то, что вы пытаетесь сделать, является несовершенным решением вашей проблемы из-за отсутствия понимания. Зачем вам нужно знать секунды от одной секунды до другой, если цена не менялась в течение 30 секунд? Когда цена меняется, вы получаете тик.

Признаюсь, у меня есть непонимание, поэтому я обсуждаю эту тему на форуме MQL4. Я хочу сохранять цену при каждом ее изменении (я понимаю, как это сделать). Также я понимаю, как последовательно сохранять цену каждую секунду на графике LIVE/DEMO с помощью Sleep(). Задача: Я хочу последовательно отслеживать секунды (без отслеживания секунд на основе создания тиков) до максимума в минуту или меньше, а затем обнулять отслеженные секунды. Я понимаю, почему я хочу достичь этой цели. Причина в том, что мне нужно протестировать советника в тестере и я не могу использовать Sleep() во время тестирования. Как правильно поступить? Собираю варианты.

Тогда подробнее? ;)

Закодируйте таймер (можно в тестере) в советнике. Этот таймер отсчитывает время вверх от 0-30 или вниз от или 30-0. Пока этот таймер считает вверх/вниз, у меня есть отдельный вектор, отслеживающий действие цены (вектор очень большого размера).

Мои условия таковы,

Если цена проходит x пунктов (в течение 0-30 или 30-0 секунд), принимаю решение.

Если цена не проходит x пунктов (в течение 0-30 или 30-0 секунд), ArrayInitialize().


Что вы скажете об этом Саймоне?


Спасибо.
Причина обращения: