Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 2023
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Вы получаете значение хэндлов созданных индикаторов (10 и 11).
Спасибо большое!
Почему советник открывает на одну свечу раньше, чем записано в условии?
Вот условие
MqlRates rt[2];
//--- go trading only for first ticks of new bar
if(CopyRates(_Symbol,_Period,0,2,rt)!=2)
{
Print("CopyRates of ",_Symbol," failed, no history");
// return;
}
//--- get current Moving Average
double ma[2];
if(CopyBuffer(ExtHandle,0,0,2,ma)!=2)
{
Print("CopyBuffer from iMA failed, no data");
return;
}
//--- check signals
ENUM_ORDER_TYPE signal=WRONG_VALUE;
if(rt[0].open<ma[0] && rt[0].close<ma[0])
signal=ORDER_TYPE_SELL; // sell conditions
if(rt[0].open>ma[0] && rt[0].close>ma[0])
signal=ORDER_TYPE_BUY; // buy conditions
И вот результат
Прочитал справочник, и, согласно ему, rt[0] - это данные свечи - самой отдалённой, то есть самой старой.
Если мы копируем в массив два значения, то самое старое - это и есть предыдущая свеча. Но, советник открывает ещё раньше и по цене открытия предыдущей свечи, а не на текущей
Причём, закрывает правильно... согласно обратному условию
Почему советник открывает на одну свечу раньше, чем записано в условии?
По этому условию
если свеча открылась ниже МА - продаем, если открылась выше МА - покупаем.По этому условию
если свеча открылась ниже МА - продаем, если открылась выше МА - покупаем.Обратите внимание на эту строчку:
Это, как я понял, ещё и закрытие. То есть, и открытие и закрытие должно быть выше МА. А получается... да, вы верно заметили, что открывается только по открытию. Почему тогда не работает rt[0].close<ma[0]
Обратите внимание на эту строчку:
Это, как я понял, ещё и закрытие. То есть, и открытие и закрытие должно быть выше МА. А получается... да, вы верно заметили, что открывается только по открытию. Почему тогда не работает rt[0].close<ma[0]
[0] - это текущая свеча и в момент открытия open=close
Хм, странно. В документации сказано: при использовании CopyRates( CopyBuffer и тд), копирование массива идёт в обратном направлении: [0] массива - это самая старая цена, а [n+1] - это новая.
Хм, странно. В документации сказано: при использовании CopyRates( CopyBuffer и тд), копирование массива идёт в обратном направлении: [0] массива - это самая старая цена, а [n+1] - это новая.
CopyRates
Получает в массив rates_array исторические данные структуры MqlRates указанного символа-периода в указанном количестве. Отсчет элементов от стартовой позиции ведется от настоящего к прошлому, то есть стартовая позиция, равная 0, означает текущий бар.
CopyRates
Получает в массив rates_array исторические данные структуры MqlRates указанного символа-периода в указанном количестве. Отсчет элементов от стартовой позиции ведется от настоящего к прошлому, то есть стартовая позиция, равная 0, означает текущий бар.
Вы про массив исторических данных. Но в условии фигурирует пользовательский массив (rt[2] и ma[2]). В них функция CopyRates и CopyBuffer копирует из исторического массива данные с точностью до наоборот: из [0] исторического массива цена копируется в [n-1] пользовательского. Как на вышевставленной картинки из документации. Это подтверждается также правильным закрытием позиции (условие тоже самое, просто зеркальное), и принтом
2022.08.22 21:29:52.460 Core 01 2022.08.19 23:56:59 rt[0].close = 1.00411 rt[0].time 2022.08.19 23:46:00
2022.08.22 21:29:52.460 Core 01 2022.08.19 23:56:59 rt[1].close = 1.00409 rt[1].time 2022.08.19 23:47:00 (текущая свеча)
Текущая свеча — rt[1]. Ставлю советнику условие "Если rt[0].close, она же предыдущая свеча, выше ma[0] (тоже предыдущее значение машки, зафиксированная/закрытая свеча), то открывай buy. После открытия, если условия те же самые, но наоборот - закрой позицию.
И, закрывает то он по правилам... а почему открывает неправильно? Ведь на момент открытия позиции предыдущая свеча закрылась ниже, а не выше машки
Вы про массив исторических данных. Но в условии фигурирует пользовательский массив (rt[2] и ma[2]). В них функция CopyRates и CopyBuffer копирует из исторического массива данные с точностью до наоборот: из [0] исторического массива цена копируется в [n-1] пользовательского. Как на вышевставленной картинки из документации. Это подтверждается также правильным закрытием позиции (условие тоже самое, просто зеркальное), и принтом
2022.08.22 21:29:52.460 Core 01 2022.08.19 23:56:59 rt[0].close = 1.00411 rt[0].time 2022.08.19 23:46:00
2022.08.22 21:29:52.460 Core 01 2022.08.19 23:56:59 rt[1].close = 1.00409 rt[1].time 2022.08.19 23:47:00 (текущая свеча)
Текущая свеча — rt[1]. Ставлю советнику условие "Если rt[0].close, она же предыдущая свеча, выше ma[0] (тоже предыдущее значение машки, зафиксированная/закрытая свеча), то открывай buy. После открытия, если условия те же самые, но наоборот - закрой позицию.
И, закрывает то он по правилам... а почему открывает неправильно? Ведь на момент открытия позиции предыдущая свеча закрылась ниже, а не выше машки
Ты прав. Почему у тебя так происходит я не знаю.
Попробуй принтовать данные перед и после открытия - возможно что-то выяснишь.
Ты прав. Почему у тебя так происходит я не знаю.
Попробуй принтовать данные перед и после открытия - возможно что-то выяснишь.
Точно! Попробую, спасибо!