Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 2023

 
Artyom Trishkin #:
Вы получаете значение хэндлов созданных индикаторов (10 и 11).
Чтобы получать значения от созданных индикаторов, нужно использовать CopyBuffer() для нужного индикатора, указав хэндл этого индикатора в параметрах функции

Спасибо большое!

 

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

Вот условие 


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] - это данные свечи - самой отдалённой, то есть самой старой. 

Если мы копируем в массив два значения, то самое старое - это и есть предыдущая свеча. Но, советник открывает ещё раньше и по цене открытия предыдущей свечи, а не на текущей

Причём, закрывает правильно... согласно обратному условию

 
Ivan Butko #:

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

По этому условию

   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


если свеча открылась ниже МА - продаем, если открылась выше МА - покупаем.
 
Tretyakov Rostyslav #:

По этому условию

если свеча открылась ниже МА - продаем, если открылась выше МА - покупаем.

Обратите внимание на эту строчку:

...&& rt[0].close<ma[0])



Это, как я понял, ещё и закрытие. То есть, и открытие и закрытие должно быть выше МА. А получается... да, вы верно заметили, что открывается только по открытию. Почему тогда не работает rt[0].close<ma[0]

 
Ivan Butko #:

Обратите внимание на эту строчку:



Это, как я понял, ещё и закрытие. То есть, и открытие и закрытие должно быть выше МА. А получается... да, вы верно заметили, что открывается только по открытию. Почему тогда не работает rt[0].close<ma[0]

[0] - это текущая свеча и в момент открытия open=close
 
Tretyakov Rostyslav #:
[0] - это текущая свеча и в момент открытия open=close

Хм, странно. В документации сказано: при использовании CopyRates( CopyBuffer и тд), копирование массива идёт в обратном направлении: [0] массива - это самая старая цена, а [n+1] - это новая. 


 
Ivan Butko #:

Хм, странно. В документации сказано: при использовании CopyRates( CopyBuffer и тд), копирование массива идёт в обратном направлении: [0] массива - это самая старая цена, а [n+1] - это новая.

CopyRates

Получает в массив rates_array исторические данные структуры MqlRates указанного символа-периода в указанном количестве. Отсчет элементов от стартовой позиции ведется от настоящего к прошлому, то есть стартовая позиция, равная 0, означает текущий бар.

 
Tretyakov Rostyslav #:

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. После открытия, если условия те же самые, но наоборот - закрой позицию. 

И, закрывает то он по правилам... а почему открывает неправильно? Ведь на момент открытия позиции предыдущая свеча закрылась ниже, а не выше машки

 
Ivan Butko #:

Вы про массив исторических данных. Но в условии фигурирует пользовательский массив (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. После открытия, если условия те же самые, но наоборот - закрой позицию. 

И, закрывает то он по правилам... а почему открывает неправильно? Ведь на момент открытия позиции предыдущая свеча закрылась ниже, а не выше машки

Ты прав. Почему у тебя так происходит я не знаю.

Попробуй принтовать данные перед и после открытия - возможно что-то выяснишь.

 
Tretyakov Rostyslav #:

Ты прав. Почему у тебя так происходит я не знаю.

Попробуй принтовать данные перед и после открытия - возможно что-то выяснишь.

Точно! Попробую, спасибо!

Причина обращения: