Корректное открытие нескольких позиций - страница 3

 
rid писал (а) >>
И НЕ удивительно. Если вы работаете на тф-1мин. Советник не успеват открыть позицию, как с новым тиком цена изменяется и появляется ошибка. Насколько я знаю, такая ошибка устраняется встроенной функцией
RefreshRates( )

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

Так мне уже совсем непонятно! Как вы хотите, чтобы открывались позиции ? То вас не устраивает, что они "снова открываются" !

То не устраивает, что - "Закройте вручную одну из позиций и она не откроется снова " !

А где я писал о том что меня не устраивает что позиции "снова открываются"?

В идеале советник должен открыть три позиции .Если закрыть одну или две позиции то советник должен их открыть заново. Правильно?

 
rid писал (а) >>
И НЕ удивительно. Если вы работаете на тф-1мин. Советник не успеват открыть позицию, как с новым тиком цена изменяется и появляется ошибка. Насколько я знаю, такая ошибка устраняется встроенной функцией
RefreshRates( )

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

Так мне уже совсем непонятно! Как вы хотите, чтобы открывались позиции ? То вас не устраивает, что они "снова открываются" !

То не устраивает, что - "Закройте вручную одну из позиций и она не откроется снова " !

А вообще то, лучше бы вам не заморачиваться с тиками, а сделать работу эксперта по ЦЕНАМ ОТКРЫТИЯ

 
Как правильно в моём советнике использовать RefreshRates() Помогите с кодом пожалуйста
 

Не знаю, правильно или нет. Это вам самому надо задавать условия открытия.

Я изначально предложил вам пример блока открытия, где советник открывал 3 позиции, только тогда, когда все предыдущие три уже закроются. Именно так я понял вашу изначальную просьбу.

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

Вот у меня есть тут ссылка на обработку ошибок, гляньте, - мож пригодится

https://book.mql4.com/ru/trading/ordersend

 
misterx писал (а) >>
Как правильно в моём советнике использовать RefreshRates() Помогите с кодом пожалуйста

В самом простейшем случае вы попробуйте поставить RefreshRates(); перед каждой функцией ticket = (OrderSend(

 

Я мало сталкивался с этой функцией. В подобных случаях я обычно набираю в ПОИСКЕ форума RefreshRates, и вот сейчас получил : https://www.mql5.com/ru/search

Обратите внимание на 2-й пункт -

"

2. Открытие и установка ордеров 2008-05-05 14:26:13

Для того чтобы программа работала устойчиво, с минимальным количеством отклонённых торговых приказов, перед исполнением функции OrderSend() необходимо обновлять используемые программой параметры информационного окружения с помощью функций MarketInfo() и RefreshRates()."

 
rid писал (а) >>

Не знаю, правильно или нет. Это вам самому надо задавать условия открытия.

Я изначально предложил вам пример блока открытия, где советник открывал 3 позиции, только тогда, когда все предыдущие три уже закроются. Именно так я понял вашу изначальную просьбу.

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

Вот у меня есть тут ссылка на обработку ошибок, гляньте, - мож пригодится

https://book.mql4.com/ru/trading/ordersend

Ну хорошо пусть будет открытие трёх позиций после того как все три закроются но в том варианте который вы предложили позиции открываются некорректно первая

позиция открывается всегда а при открытии второй и третьей часто возникает ошибка 129 и 138 и в результате вместо 3 позиций открываются две или одна

 
rid писал (а) >>

Я мало сталкивался с этой функцией. В подобных случаях я обычно набираю в ПОИСКЕ форума RefreshRates, и вот сейчас получил : https://www.mql5.com/ru/search

Обратите внимание на 2-й пункт -

"

2. Открытие и установка ордеров 2008-05-05 14:26:13

Для того чтобы программа работала устойчиво, с минимальным количеством отклонённых торговых приказов, перед исполнением функции OrderSend() необходимо обновлять используемые программой параметры информационного окружения с помощью функций MarketInfo() и RefreshRates()."

Спасибо! С RefreshRates кажется работает час два погоняю напишу.

 
misterx писал (а) >>

первая

позиция открывается всегда а при открытии второй и третьей часто возникает ошибка 129 и 138 и в результате вместо 3 позиций открываются две или одна

Ну это уже строго ваша невнимательность и недоработка! - ошибка 129

Вы где-то в OrderSend(...) перепутали бид и аск

Вот посмотрите справку https://book.mql4.com/ru/trading/ordersend

"

Ошибка 129. Неправильная цена

В ряде случаев возникает банальная ошибка - в качестве цены открытия указывается не то значение двухсторонней котировки. Как известно (см. Требования и ограничения торговых операций), рыночные ордера Buy открываются ценой Ask. Вот что получится, если ошибочно указать Bid:

//--------------------------------------------------------------------
// mistaken.mq4 
// Предназначен для использования в качестве примера в учебнике MQL4.
//--------------------------------------------------------------------
int start()                                     // Спец. функция start
  {                                             // Открытие BUY
   OrderSend(Symbol(),OP_BUY,0.1,Bid,3,Bid-15*Point,Bid+15*Point);
   Alert (GetLastError());                      // Сообщение об ошибке
   return;                                      // Выход из start()
  }
//--------------------------------------------------------------------

Перед отправкой торгового приказа на сервер клиентский терминал проанализирует, соответствуют ли заявленные значения цены и стоп-приказов допустимым значениям. Во время этой проверки обнаружится, что заявленная цена открытия ордера является ошибочной, поэтому торговый приказ не будет отправлен клиентским терминалом для исполнения на сервер, а функция GetLastError() вернёт значение 129 (см. Коды ошибок). "

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

 
rid писал (а) >>

Ну это уже строго ваша невнимательность и недоработка! - ошибка 129

Вы где-то в OrderSend(... перепутали бид и аск

Вот посмотрите справку https://book.mql4.com/ru/trading/ordersend

"

Ошибка 129. Неправильная цена

В ряде случаев возникает банальная ошибка - в качестве цены открытия указывается не то значение двухсторонней котировки. Как известно (см. Требования и ограничения торговых операций), рыночные ордера Buy открываются ценой Ask. Вот что получится, если ошибочно указать Bid:

Перед отправкой торгового приказа на сервер клиентский терминал проанализирует, соответствуют ли заявленные значения цены и стоп-приказов допустимым значениям. Во время этой проверки обнаружится, что заявленная цена открытия ордера является ошибочной, поэтому торговый приказ не будет отправлен клиентским терминалом для исполнения на сервер, а функция GetLastError() вернёт значение 129 (см. Коды ошибок). "

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

         if(iSAR(NULL,0,step0,0.1,0)<Close[0] )
         
         
        {
          RefreshRates();
      ticket = (OrderSend( Symbol(), OP_BUY,GetSizeLot(), Ask, slippage,
       Bid-StopLoss*Point,Ask+TakeProfit*Point,NameExpert,
               0, Green ) );
if(ticket<1) {Print("Ошибка открытия 1-го ордера BUY #",GetLastError());return (0); }  
if (ticket>0) //Sleep(10000);
          { //если 1-я позиция открылась, открываем вторую
          RefreshRates();       
         ticket_1 = (OrderSend( Symbol(), OP_BUY,GetSizeLot(), Ask, slippage,
       Bid-StopLoss*Point,Ask+TakeProfit*Point,NameExpert,
              0, Green ) ); 
if(ticket_1<1) {Print("Ошибка открытия 2 ордера BUY #",GetLastError());return (0); }    
if (ticket_1>0) // Sleep(10000);
         { // если вторая позиция открылась, открываем третью 
          RefreshRates();
      ticket_2 = (OrderSend( Symbol(), OP_BUY,GetSizeLot(), Ask, slippage,
       Bid-StopLoss*Point,Ask+TakeProfit*Point,NameExpert,
              0, Green ) );
           if(ticket_2<1)
          {Print("Ошибка открытия 3 ордера BUY #",GetLastError());return (0); }   
         } 
       }    
     }

            
      if(iSAR(NULL,0,step0,0.1,0)>Close[0])
    {
        
        //---- открываем СЕЛЛ позицию
      RefreshRates();
      ticket = (OrderSend( Symbol(), OP_SELL,GetSizeLot(), Bid, slippage,
        Ask+StopLoss*Point,Bid-TakeProfit*Point, NameExpert,
              0, Red ));
              
           if(ticket<1) {Print("Ошибка открытия 1-го ордера BUY #",GetLastError());return (0); }  
if (ticket>0) //Sleep(10000);
          { //если 1-я позиция открылась, открываем вторую
       RefreshRates();      
      ticket_1 = (OrderSend( Symbol(), OP_SELL,GetSizeLot(), Bid, slippage,
        Ask+StopLoss*Point,Bid-TakeProfit*Point, NameExpert,
             0, Red ));
             
          if(ticket_1<1) {Print("Ошибка открытия 2 ордера BUY #",GetLastError());return (0); }    
if (ticket_1>0) // Sleep(10000);
         { // если вторая позиция открылась, открываем третью        
      RefreshRates(); 
      ticket_2 = (OrderSend( Symbol(), OP_SELL,GetSizeLot(), Bid, slippage,
        Ask+StopLoss*Point,Bid-TakeProfit*Point, NameExpert,
              0, Red ));               
                if(ticket_2<1)
          {Print("Ошибка открытия 3 ордера BUY #",GetLastError());return (0); }   
         } 
       }    
     }
   
    return(0);
    
}
В таком виде работает но теперь если при закрытии позиции произойдёт ошибка и открытыми останутся одна или две позиции то это не приемлимо как этого избежать?
Причина обращения: