MT4. Вопрос по написанию советника: не срабатывает условие завязанное на рыночной цене - страница 3

 
Andrey Pereverzev:

А ничего он там не пишет (((

Пишет, что идут покупки (как и следует),

но о попытке закрыть Лонги ничего не пишет.

Ваше сообщение "Пытаюсь закрыть бай" не указывается нигде 

Значит условие не выполняется. Об этом я вам и пытался сказать ранее смотрите другую часть кода.

Andrey Pereverzev:

Почему режим отладки включается на EUR/USD?

Можно изменить как-то на другой инструмент? 

В метаедиторе сервис -> настройки закладка "отладка" установите галочку "использовать указанные настройки" и настройте так как вам надо.

 
Vitalii Ananev:

Значит условие не выполняется. Об этом я вам и пытался сказать ранее смотрите другую часть кода.

В метаедиторе сервис -> настройки закладка "отладка" установите галочку "использовать указанные настройки" и настройте так как вам надо.

Спасибо.

На счет условия - они выполняются, но видимо ручки кривоваты ))) 

 
Но как может быть, что в тестере позы открываются, а в отладчике - нет ?
 
Andrey Pereverzev:

Спасибо.

На счет условия - они выполняются, но видимо ручки кривоваты ))) 

Если не пишет "пытаюсь закрыть бай" значит одно из условий

     if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        if (OrderType()==OP_BUY) 
        {
            Print("Пытаюсь закрыть бай");
             OrderClose (OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),slippage); 
        } 

 не выполняется.

Andrey Pereverzev:
Но как может быть, что в тестере позы открываются, а в отладчике - нет ?

Вроде в МТ4 отладка запускается в реальном времени. Поэтому запускайте на демо. Может у вас отключена автоторговля.  

 
Vitalii Ananev:

Если не пишет "пытаюсь закрыть бай" значит одно из условий

        } 

не выполняется.

Вроде в МТ4 отладка запускается в реальном времени. Поэтому запускайте на демо. Может у вас отключена автоторговля.  

Да, все верно - в режиме реального времени запускается.

Так может не открываются сделки, потому что счет, на котором я запускаю отладку - нулевой? 

 

... понятно, все равно не открываются позы...

буду дальше курить код

ухх нелегкий ваш труд ))) 

 

Может попробуем сначала?:

 

Как выглядит мой код: 


  int start() 

{

 if(iTime(_Symbol,NULL,1) == prevtime) return(0);

prevtime=iTime(_Symbol,NULL,1); 

//----------------УСЛОВИЯ ДЛЯ ВХОДА В LONG-------------------------------------------------------------------+ 

if(здесь условия перечислены)

 Print("Пытаюсь открыть бай");

 

//----------------ОТКРЫТИЕ ЛОНГ-ПОЗИЦИИ----------------------------------------------------------------------+ 

{

ticketB=OrderSend(Symbol(), OP_BUY, Lots, Ask, 10, Low[1]-SL*Point, 0);

if(ticketB<0) 

{Alert("Покупка Лонга не прошла");} 

 

Может чего в нем не так? Почему он в процессе отладки выдает мне сообщение "Покупка Лонга не прошла" ?

 
Andrey Pereverzev:

Может попробуем сначала?:

 

Как выглядит мой код: 


  int start() 

{

 if(iTime(_Symbol,NULL,1) == prevtime) return(0);

prevtime=iTime(_Symbol,NULL,1); 

//----------------УСЛОВИЯ ДЛЯ ВХОДА В LONG-------------------------------------------------------------------+ 

if(здесь условия перечислены)

 Print("Пытаюсь открыть бай");

 

//----------------ОТКРЫТИЕ ЛОНГ-ПОЗИЦИИ----------------------------------------------------------------------+ 

{

ticketB=OrderSend(Symbol(), OP_BUY, Lots, Ask, 10, Low[1]-SL*Point, 0);

if(ticketB<0) 

{Alert("Покупка Лонга не прошла");} 

 

Может чего в нем не так? Почему он в процессе отладки выдает мне сообщение "Покупка Лонга не прошла" ?

1. Нормализуйте значение   Low[1]-SL*Point с помощью функции NormalizeDouble()

2. Сравните цену Ask и Low[1]-SL*Point() возможно что вы ставите стоп слишком близко.

3. После попытки установить ордер  напишите

if (ticketB<=0)

int err = GetLastError() ;

if (err>0) Print("Покупка Лонга не прошла. Ошибка "+err);

Смотрите в журнале код ошибки и ищите причину.

Функцию Alert() я бы не стал использовать в советнике  если предполагается работа на полном автомате. Лучше выводить сообщения в журнал.

 
Vitalii Ananev:

Если не пишет "пытаюсь закрыть бай" значит одно из условий

 не выполняется.

Вроде в МТ4 отладка запускается в реальном времени. Поэтому запускайте на демо. Может у вас отключена автоторговля.  

Точно, забыл разрешить автоторговлю.

Спасибо. Позы открываются 

 
Vitalii Ananev:

1. Нормализуйте значение   Low[1]-SL*Point с помощью функции NormalizeDouble()

2. Сравните цену Ask и Low[1]-SL*Point() возможно что вы ставите стоп слишком близко.

3. После попытки установить ордер  напишите

if (ticketB<=0)

int err = GetLastError() ;

if (err>0) Print("Покупка Лонга не прошла. Ошибка "+err);

Смотрите в журнале код ошибки и ищите причину.

Функцию Alert() я бы не стал использовать в советнике  если предполагается работа на полном автомате. Лучше выводить сообщения в журнал.

SL выставляется как и запланировано :) Они выставляются.

Что касается п.3, то Вы здесь правы. Робот будет на автомате работать и эти сообщения со звуками будут мешать от ручной торговли ))) Как все будет готов - пропишу это, а пока // :)

Буду дальше ковыряться. Сегодня с коллективной помощью шаг вперед сделал - это круто! Спасибо 

 
Andrey Pereverzev:

SL выставляется как и запланировано :) Они выставляются.

Что касается п.3, то Вы здесь правы. Робот будет на автомате работать и эти сообщения со звуками будут мешать от ручной торговли ))) Как все будет готов - пропишу это, а пока // :)

Буду дальше ковыряться. Сегодня с коллективной помощью шаг вперед сделал - это круто! Спасибо 

Почитайте справку к функции OrderSend() в самом конце примечание.

 ....

Нельзя использовать расчетную либо ненормализованную цену. .... В случае ошибочных, а также ненормализованных стопов генерируется ошибка 130 (ERR_INVALID_STOPS).  

Цены должны быть нормализованы. Для тестера может и так сойдет, но для реала нет. 

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