SOS. Нужна помошь по советнику на двух индикаторах - страница 2

 

Максим, а не могут данные перемешаться из-за того что они пишутся в один буфер (нулевой который) ?

Не подскажете как работать с буферами когда индикатор сдвинут вперед или назад во времени ? 

Какое будет первое значение буфера ? А то у меня сделки как-то "криво" открываются.

 Что такое алерты и принты ? Если можно. 

 

Еще раз спасибо. 

 
Robas1000:

Максим, а не могут данные перемешаться из-за того что они пишутся в один буфер (нулевой который) ?

Не подскажете как работать с буферами когда индикатор сдвинут вперед или назад во времени ? 

Какое будет первое значение буфера ? А то у меня сделки как-то "криво" открываются.

 Что такое алерты и принты ? Если можно. 

 

Еще раз спасибо. 

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

err3=CopyBuffer(iMA1_handle,0,1,20,iMA1_buf);

вы копируете из нулевого буфера (поскольку для МА он всего один) 20 значений индикатора, начиная с 1-го, а не с 0-го. Если надо с нулевого, или еще с какого-то, то нужно вторую единичку поменять на 0. Первое значение буфера всегда идет под индексом 0 а не 1. iMA1_buf[0] будет содержать последнее известное значение индикатора, т.е. первое справа. 1 - второе,  и т.д.

Print(); это ф-я, которая будет выводить нужную инфу в журнал, в процессе тестирования советника. Допустим, вы можете посмотреть какое значение индикатора скопировалось в массив:

Print(iMA1_buf[0]);

 В журнале появится нулевое (то есть первое) полученное значение.

 

Вот тут вы сравниваете зачение одного индикатора на 8 баре со значением другого индикатора на 10-м:

iMA1_buf[8]>iMA_buf[10]

 Мб вам нужно сравнивать на первом или нулевом баре?

 

Максим, благодаря разьяснениям (о том как буферы формируются)  уже вот так выглядит код и код работает (сделки идут):

 Только в старой версии Metatradera 5 он не работает (один ордер открывается как и было)! 

 

if(iMA_buf[1]>iMA1_buf[1])          //если значение индикатора были больше цены закрытия и стали меньше
     {
      if(m_Position.Select(my_symbol))                             //если уже существует позиция по этому символу
        {
         if(m_Position.PositionType()==POSITION_TYPE_SELL) m_Trade.PositionClose(my_symbol);  //и тип этой позиции Sell, то закрываем ее
         if(m_Position.PositionType()==POSITION_TYPE_BUY) return;                             //а если тип этой позиции Buy, то выходим
        }
      m_Trade.Buy(0.01,my_symbol);                                  //если дошли сюда, значит позиции нет, открываем ее
     }
   if(iMA_buf[1]<iMA1_buf[1])          //если значение индикатора были меньше цены закрытия и стали больше
     {
      if(m_Position.Select(my_symbol))                             //если уже существует позиция по этому символу
        {
         if(m_Position.PositionType()==POSITION_TYPE_BUY) m_Trade.PositionClose(my_symbol);   //и тип этой позиции Buy, то закрываем ее
         if(m_Position.PositionType()==POSITION_TYPE_SELL) return;                            //а если тип этой позиции Sell, то выходим
        }
      m_Trade.Sell(0.01,my_symbol);                                 //если дошли сюда, значит позиции нет, открываем ее
     }
 
Robas1000:

Максим, благодаря разьяснениям (о том как буферы формируются)  уже вот так выглядит код и код работает:

 

Ну а сделки в соответствии с вашими правилами открываются теперь? Должно в любой версии работать, здесь все функции стандартные и старые. Мб в тестере опять не на всех тиках тестируете?
 
Да, открываются ! Но в старой версии все равно не работает, там открывается только одна сделка и все.
 

Почему-то сделки открываются по несуществующим ценам:

 

 

Максим, вы не сталкивались с таким ? 

 
Robas1000:

Почему-то сделки открываются по несуществующим ценам:

 

 

Максим, вы не сталкивались с таким ? 

Это из-за большого спреда скорее всего, проверьте какой он у вас
 

А где он настраивается (искал, не могу найти) ? Спред у меня 10 копеек ночью, 2 копейки днем.

 

Я заменилс траку которая открывает позиции (что-бы "левых цен" открытия небыло) на эту:

 

 m_Trade.Buy(0.01,my_symbol,Close_buf[1],(Close_buf[1]-0.5),(Close_buf[1]+0.5));

 

Стопы стоят 50 копеек, пишет что не правильные:

 

2015.11.05 19:21:43.436 2015.01.02 14:35:00   failed instant sell 0.01 USDRUR at 58.9025 sl: 58.4025 tp: 59.4025 [Invalid stops]

 

Еще реквоты, откуда они берутся непонятно:

 

2015.11.05 19:21:41.525 2015.01.02 12:15:00   CTrade::OrderSend: instant buy 0.01 USDRUR at 59.9765 sl: 59.4765 tp: 60.4765 [requote (59.9735/62.0900)]
 
Robas1000:
А где он настраивается (искал, не могу найти) ? Спред у меня 10 копеек ночью, 2 копейки днем.

А в мт5 нет этой настройки, он берется из обзора рынка. Тут спред рубля 3, судя по графику, потому и стопы не ставятся.

requote (59.9735/62.0900) нифига себе реквот :)