Вопрос знатокам MQL - страница 14

 

 продолжение вопроса:

 

Реализован алгоритм такого условия следующим образом, вот сам фильтр:

 

//================фильтр   - начало схождения ===================
 if (FILTER_ ) { //если выключатель   фильтра включен
//------------------------------------------------ 
//задаем вычисление ценовых линий на втором   баре
double  MA_11= (iMA(Symbol_1,Period(),per2,0,ma_method,Price,2)-
                iMA(Symbol_1,Period(),per1,0,ma_method,Price,2)) ;  
double  MA_21= (iMA(Symbol_2,Period(),per2,0,ma_method,Price,2)-
                iMA(Symbol_2,Period(),per1,0,ma_method,Price,2))  ;    
double ДЕЛЬТА_MA_2 = MathAbs(MA_11 - MA_21);//разность между ценовыми линиями на 2 баре
//
if (ДЕЛЬТА_MA_2 >=  ДЕЛЬТА_MA) // если линии начинают сходится, разрешаем вход
       Trade_Filter2=true;       else Trade_Filter2=false; 
//-------------------------------------------------                 
         }  // выключатель   фильтра включен
//================== конец блока 2-го фильтра ======================

 А вот само условие для входа:

if  ( TradeDOWN==true  && .... ) {            //если условия соответствуют заданным 
if (Trade_Filter2==true || ! FILTER_ ) {       //  фильтр включен/выключен  
 ..... открвываем позиции: продаем первый инструмент и покупаем второй    

Но советник, словно не видит  условия фильтра! Он как и прежде открывает позиции, не обращая внимания на 

if (Trade_Filter2==true || ! FILTER_ ) {   .....

Не пойму, почему. Неоднократно отслеживала в онлайне открытие позиций. Но фильтр не работает! Советник его не видит... Подскажите, пож., где здесь неточность ? 

И еще вопрос. Как правильнее задавать в глобальных переменных (сейчас стоит первый вариант), -

bool Trade_Filter2=0;  либо просто   bool Trade_Filter2

 
Rita:

 продолжение вопроса:

...

Выведите MA_11, MA_21, ДЕЛЬТА_MA_2 в  в Coment() и посмотрите что там. Comment() вставлять после double ДЕЛЬТА_MA_2...

Выполняется сравнение MACD с двух разных символов, у них может быть очень разная размерность. 

 

Комментарий есть. В комменте заданы надписи "Фильтр разрешает (либо запрещает) вход"), вот так:

Сделано это так:

string on_off=StringConcatenate  (on_off,
"1-й(текущий)инстр.=",Symbol_1," 2-й инстр.=",Symbol_2," ",.....
"ДельтаТекущая/ДельтаЗаданная = ", ДЕЛЬТА_MA," / ",ДЕЛЬТА, "\n", 
 "MA_1 ",Symbol_1, "= ", MA_1 , "\n",
 "MA_2 ",Symbol_2, "= ", MA_2 , "\n",

 //--------------------------------------------------------------------------------

if (Trade_Filter2==true && FILTER_==true )  
        string  on_off4 = StringConcatenate (on_off4, "Фильтр Разрешает вход", "\n");
if (Trade_Filter2==false && FILTER_==true )  
        string  on_off41 = StringConcatenate (on_off41, "фильтр Запрещает вход", "\n");
if (FILTER_==false   )  
        string  on_off42 = StringConcatenate (on_off42, "Фильтр Отключен", "\
Я визуально наблюдаю, что линии еще расходятся и комментраий отображает "Фильтр запрещает вход"! Но вход все равно реализуется, - советник не обращает внимания на фильтр.

 Размерность инструментов одинаковая, либо (при разной размерности) - программно приведена к одинаковой с помощью коэф-тов (в коде выше это не показано, чтобы не загромождать)). С этим - порядок!

 

А вот double ДЕЛЬТА_MA_2, MA_11, MA_21- заявлены ниже ф-и Сomment()

Но Trade_Filter2 - заявлен в глобальных переменных! Так что, думаю, - что здесь в коментарии все сделано корректно!

 
На время отключите свой комментарий и пробуйте выводить его из разных мест. От места проверки условий фильтра до места его использования. Так найдете строчку в которой происходит искажение.
 
 Ок, спсб., Дмитрий! Попробую после выходных воспользоваться вашей рекомендацией.  
 
Выведите значения всех своих параметров в Print и поставьте его сразу после оператора открытия ордера.
 

Добрый день. После сегодняшнего обновления мт4 не компиллируется код советника. Непонятные 30 ошибок выдает компилятор.

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

if (Trade_Filter2==true && FILTER_==true )  
        string  on_off4 = StringConcatenate ( on_off4, "Фильтр Разрешает вход", "\n");
if (Trade_Filter2==false && FILTER_==true )  
        string  on_off41 = StringConcatenate (on_off41, "фильтр Запрещает вход", "\n");
if (FILTER_==false   )  
        string  on_off42 = StringConcatenate (on_off42, "Фильтр Отключен", "\n");       
'on_off' - undeclared identifier Exp_ARBITR_2Line_Spread_002Mod.mq4 125 35

'on_off4' - undeclared identifier Exp_ARBITR_2Line_Spread_002Mod.mq4 140 47

'on_off41' - undeclared identifier Exp_ARBITR_2Line_Spread_002Mod.mq4 142 47

И как их исправить?

 
if (Trade_Filter2==true && FILTER_==true )  
 {
  string on_off4;
  on_off4 = StringConcatenate ( on_off4, "Фильтр Разрешает вход", "\n");
 }
if (Trade_Filter2==false && FILTER_==true )  
 {
  string on_off41;
  on_off41 = StringConcatenate (on_off41, "фильтр Запрещает вход", "\n");
 }
if (FILTER_== false)  
 {
  string on_off42;
  on_off42 = StringConcatenate (on_off42, "Фильтр Отключен", "\n");
 }

Так компилируется?

Но лучше так:

string on_off4;
string on_off41;
string on_off42;
if (Trade_Filter2 == true && FILTER_ == true) on_off4 = "Фильтр Разрешает вход\n";
if (Trade_Filter2 == false && FILTER_ == true) on_off41 = "фильтр Запрещает вход\n";
if (FILTER_ == false) on_off42 = "Фильтр Отключен\n";
 
string on_off4, on_off41, on_off42;
if (Trade_Filter2==true && FILTER_==true )  
        on_off4 = StringConcatenate ( on_off4, "Фильтр Разрешает вход", "\n");
if (Trade_Filter2==false && FILTER_==true )  
        on_off41 = StringConcatenate (on_off41, "фильтр Запрещает вход", "\n");
if (FILTER_==false   )  
        on_off42 = StringConcatenate (on_off42, "Фильтр Отключен", "\n");       

Если я правильно зателепатил, так должно работать

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