iRSI() не открывает ордер в конце таймфрейма

Во-первых, я новичок в кодировании EA, во-вторых, я искал соответствующий пост на самом форуме MT4 и в могучем Google.

Сейчас я написал простого советника для открытия ордера при выполнении определенных условий, одно из которых double RSI_1 = iRSI( NULL, PERIOD_H1, 14, PRICE_CLOSE, 0 ) > 70.

Ну и как видно во вложении ордер открылся не по цене close свечи, а выше, по картинке он должен был открыться на следующей свече справа.

Я думаю, согласно документации, что при использовании price_close rsi будет рассчитываться по цене close для выбранного периода времени, но это не выглядит так. .

Что мне не хватает?

Как я могу это исправить?

rsipic


person fabio.geraci    schedule 03.05.2015    source источник
comment
Я изменил на RSI_1 = iRSI(NULL,PERIOD_H1,14,PRICE_CLOSE,1) › 70   -  person fabio.geraci    schedule 06.05.2015
comment
Хотя это изменение возможно, вы можете заметить, что вы добавили задержку более чем на 1 час в принятии торгового решения ( как вводит параметр shift ). Если ваша количественная модель подтвердит, что ваша стратегия не чувствительна к такой задержке TimeDOMAIN, вы можете закончить. В противном случае следует понимать, что такой обходной путь, основанный на синтаксисе, может также оказать огромное и разрушительное влияние на итоговую производительность торговой стратегии. Итак, количественный тест + количественный тест + количественный тест, прежде чем предположить его осуществимость.   -  person user3666197    schedule 08.05.2015


Ответы (1)


В: Что мне не хватает?

MT4-Terminal, программируемое устройство доступа к торговле на стороне клиента, использует (по историческим причинам) индексацию регистров с обратным временем, в которых хранятся фактические/исторические значения { open, high, low, close, volume } для соответствующих единиц времени (конкретные по продолжительности для каждого TimeFRAME).

Другие значения получаются/вычисляются из этих кардинальных значений (либо с помощью "предопределенных" (реализованных) индикаторов { iRSI(), iMFI(), ... }, либо программно с помощью вашего MQL4-кода).

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

Как только появляется aNewBarEVENT, происходит особый случай (всегда)...

Регистры open[0] == high[0] == low[0] == close[0] & volume[0] == 1

По прошествии времени и благодаря последующим поступлениям anFxMarketEVENT в программное обеспечение вашего терминала MT4 volume[0] > 1 растет, а регистр close[0] получает все новые и новые значения (обычно отличные от open[0] )

Таким образом, этот механизм «усложняет» любое принятие решений, связанных с «только что представленным» значением close[0], поскольку следующее поступление anFxMarketEVENT (новая цена Ask/Bid от брокера) перемещает значение регистра в какое-то другое значение. значение, чем могло быть использовано в предыдущую (милли-)секунду.

Таким образом, ваш код мог начать некоторую активность прямо в тот момент (производное) значение iRSI( ..., PRICE_CLOSE, ... ) действительно было > 70, однако в течение оставшегося времени до anEndOfBAR последующие close[0] цены пошли в таком направлении, что последнее значение iRSI() на " оставляя" бар был намного меньше 70 ... (как вы, кажется, пытаетесь изобразить на своем (обрезанном без масштабов) PrintScreen)

Вторая проблема связана с расстоянием между маркерами aPriceDOMAIN "выше" уровня свечи close[aBarPTR].

ДЛИННАЯ сделка была открыта по цене, заданной как Bid == close[0], так и Spread, тем не менее, на графике показаны цены свечей как цены на основе Bid, поэтому в случае, если визуальное расстояние равно Spread во время XTO (где значение Spread может иметь постоянный или переменный размер, в зависимости от условий и положений вашего брокера), позиция входа в ДЛИННУЮ сделку является справедливой и правильной.

Третья проблема, которая может быть, но не обязательно иметь место в данном случае, заключается в том, что функция MT4-Terminal, называемая Тестер стратегии, была не совсем справедливой и удобной при работе с несколькими таймфреймами. расчеты во время бэктестинга. Несколько лет назад наша команда просто отказалась от использования встроенных функций и начала использовать нашу собственную обработку регистров, чтобы поддерживать наши собственные независимые значения с несколькими TimeFRAME, на которые мы действительно могли положиться.

В: Как я могу это исправить?

Из-за характера обработки событий горячего [0]-бара вашему коду нужны другие фильтры или дополнительные индикаторы, которые не запаздывают (не добавляют дополнительную задержку и перекос во времени, когда срабатывает торговое решение) и не вызывают флаттера (повторение срабатывания в течение одного и того же бара).

MQL4 дает некоторые инструменты для этого, если нужно получить больше, можно прибегнуть к дополнительным внешним средствам (полностью распределенные многоагентные вычисления на основе grid/cloud/GPU).

Итак, наслаждайтесь великим миром FX/MT4.

Все эти возможности у вас под рукой.

person user3666197    schedule 07.05.2015