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

 
Tretyakov Rostyslav #:

Ошибка 3 - это не правильные параметры и магик здесь не причем

Ошибка 148 из-за того что нет проверки наличия лимиток, когда проверка увидит что лимитка есть, то новый открывать не будет

вроде сделал аналогично проверке основного лимитника, однако не  работает. Всё равно множественное открытие и ошибка 148:

//+------------------------------------------------------------------+
//|         Открытие лимитных ордеров                                |
//+------------------------------------------------------------------+
   double buylimit_open=0,selllimit_open=0; // цена открытия
   int sig_slimit=0,sig_blimit=0;           // сигнал открытия
 //если нет откр орд. и отступ > мин. стопа то, откр бай/селл на интервале "step" 
   if(n==0&&blimit==0&&step>stops) {buylimit_open=NormalizeDouble(Bid-step,Digits);sig_blimit=1; }
   
   if(n==0&&slimit==0&&step>stops) {selllimit_open=NormalizeDouble(Ask+step,Digits);sig_slimit=1;}
 //если нет откр орд. и отступ <= мин. стопа то, откр бай/селл на интервале равном мин. стопу (но это не для работы по марж зонам!) типа скальпинг  
   if(n==0&&blimit==0&&step<=stops) {buylimit_open=NormalizeDouble(Bid-stops,Digits);sig_blimit=1; }
   
   if(n==0&&slimit==0&&step<=stops) {selllimit_open=NormalizeDouble(Ask+stops,Digits);sig_slimit=1;}
 
  
   if(Bid > iHigh(NULL,1440,1)&&Buy==true&&sig_blimit==1) 
   {int open=OrderSend(Symbol(),OP_BUYLIMIT,Lots,buylimit_open,Slip,0,0,NULL,Magic,0,Blue);if(open>0) {return;} if(open<0) {Print("OrderSend failed #",GetLastError());return;}} 
   
   if(Ask < iLow(NULL,1440,1)&&Sell==true&&sig_slimit==1) 
   {int open=OrderSend(Symbol(),OP_SELLLIMIT,Lots,selllimit_open,Slip,0,0,NULL,Magic,0,Red);if(open>0) {return;} if(open<0) {Print("OrderSend failed #",GetLastError());return;}}
   

//+------------------------------------------------------------------+
//|         Открытие лимитных доп.ордеров которые не тралим          |
//+------------------------------------------------------------------+///////////////////////////////////////////////////
// OP_TYPE==0 - последний закрытый был Бай 
  int  DBlim=0, DSlim=0, DBsig=0, DSsig=0;
  
   if (n==0 && DBlim==0 && step>stops)  {DBsig=1;} //если нет никаких открытых ордеров и нет открытых доп ордеров и отступ больше мин. стопа, то  - сигнал на открытие доп ордера 

   if (n==0 && DSlim==0 && step>stops)  {DSsig=1;}
   
   if (n==0 && DBlim==0 && step<=stops)  {DBsig=1;}
   if (n==0 && DSlim==0 && step<=stops)  {DSsig=1;}
    
  if(OP_TYPE==0 && last_profit<0 && Buy==true && DBsig==1) //если последний закрытый лимитник был Бай, и он был убыточен, и "кнопка отжата" и есть сигнал на открытие

  // ...то открываем доп. лимитный ордер, вместо магика "0"
  {int open=OrderSend(Symbol(),OP_BUYLIMIT,Lots,buylimit_open,Slip,0,0,NULL,0,0,Blue);if(open>0) {return;} if(open<0) {Print("OrderSend failed #",GetLastError());return;} 


  if(OP_TYPE==1 && last_profit<0 && Sell==true && DSsig==1)
   
  {int open=OrderSend(Symbol(),OP_SELLLIMIT,Lots,selllimit_open,Slip,0,0,NULL,0,0,Red);if(open>0) {return;} if(open<0) {Print("OrderSend failed #",GetLastError());return;}}
  

где я ошибаюсь, посмотрите пожалуйста.

 
законопослушный гражданин #:

вроде сделал аналогично проверке основного лимитника, однако не  работает. Всё равно множественное открытие и ошибка 148:

где я ошибаюсь, посмотрите пожалуйста.

n==0

это проверка не лимиток, а открытых ордеров

лимитки у тебя считает blimit и slimit

 
Tretyakov Rostyslav #:

Найди эту строку и меняй число

Спасибо, Ростислав!

Все получилось!

Вы опять неравнодушны и это здорово!

Удачи!

С уважением!

 
Tretyakov Rostyslav #:

это проверка не лимиток, а открытых ордеров

лимитки у тебя считает blimit и slimit

да, об этом я знаю. Как я понимаю blimit и slimit - считает лимитки открытые по магику, а зацикливание происходит на лимитках без магика

или  blimit и slimit - считает любые лимитки и с магиком и без?

и если есть магик, то такая лимитка попадает на трал, а если нет магика, то открывается еще одна, так как условия ее открытия"  if(OP_TYPE==0 && last_profit<0 && Buy==true && sig_blimit==1)" - по прежнему выполняются

Я правильно мыслю?

 
законопослушный гражданин #:

да, об этом я знаю. Как я понимаю blimit и slimit - считает лимитки открытые по магику, а зацикливание происходит на лимитках без магика

или  blimit и slimit - считает любые лимитки и с магиком и без?

и если есть магик, то такая лимитка попадает на трал, а если нет магика, то открывается еще одна, так как условия ее открытия"  if(OP_TYPE==0 && last_profit<0 && Buy==true && sig_blimit==1)" - по прежнему выполняются

Я правильно мыслю?

Тебе нужно сделать такую же проверку для лимиток без магика

   for(int i1=total-1; i1>=0; i1--)
      if(OrderSelect(i1,SELECT_BY_POS))
         if(OrderSymbol()==Symbol())
            if(OrderMagicNumber()!=Magic)
              {
               if(OrderType()==OP_BUYLIMIT) _blimit++;
               if(OrderType()==OP_SELLLIMIT) _slimit++;
               }
 
Tretyakov Rostyslav #:

Тебе нужно сделать такую же проверку для лимиток без магика

if(OrderMagicNumber()!=Magic)

ни за что бы не догадался, что так можно делать.

получается,  или  blimit и slimit - считает любые лимитки и значит у меня в корне всё не правильно было сделано

ясно спасибо.

 
законопослушный гражданин #:

ни за что бы не догадался, что так можно делать.

получается,  или  blimit и slimit - считает любые лимитки и значит у меня в корне всё не правильно было сделано

ясно спасибо.

_blimit _slimit

для учета лимиток без магика нужно отдельные переменные

 
Tretyakov Rostyslav #:

_blimit _slimit

для учета лимиток без магика нужно отдельные переменные

сделал вот так:

for(int i1=total-1; i1>=0; i1--)
      if(OrderSelect(i1,SELECT_BY_POS))
         if(OrderSymbol()==Symbol())
            if(OrderMagicNumber()!=Magic)
              {
               if(OrderType()==OP_BUYLIMIT)  _blimit++;
               if(OrderType()==OP_SELLLIMIT) _slimit++;
               }
 int   DBsig=0, DSsig=0;
  
   if (_blimit==0 && step>stops)  {DBsig=1;}
   if (_slimit==0 && step>stops)  {DSsig=1;}
   
   if (_blimit==0 && step<=stops)  {DBsig=1;}
   if (_slimit==0 && step<=stops)  {DSsig=1;}
   
// OP_TYPE==0 - последний закрытый был Бай 
    
  if(OP_TYPE==0 && last_profit<0 && Buy==true && DBsig==1)
  
  {int open=OrderSend(Symbol(),OP_BUYLIMIT,Lots,buylimit_open,Slip,0,0,NULL,0,0,Blue);if(open>0) {return;} if(open<0) {Print("OrderSend failed #",GetLastError());return;}}

// OP_TYPE==1 - последний закрытый был Селл

  if(OP_TYPE==1 && last_profit<0 && Sell==true && DSsig==1)
   
  {int open=OrderSend(Symbol(),OP_SELLLIMIT,Lots,selllimit_open,Slip,0,0,NULL,0,0,Red);if(open>0) {return;} if(open<0) {Print("OrderSend failed #",GetLastError());return;}}

стали открываться доп ордера. Они теперь не тралятся. Ошибка 148 пропала.

Вернулась ошибка "3", это как я понимаю, потому, что нули стоят вместо стопа и тейка?

 
законопослушный гражданин #:

сделал вот так:

стали открываться доп ордера. Они теперь не тралятся. Ошибка 148 пропала.

Вернулась ошибка "3", это как я понимаю, потому, что нули стоят вместо стопа и тейка?

Нет, ошибка в расчете цены,

сделай для лимиток без магика цены  _selllimit_open и _buylimit_open

и добавь нормализацию

   if (_blimit==0 && step>stops)  {_buylimit_open=NormalizeDouble(Bid-step,Digits); DBsig=1;}
 

Tretyakov Rostyslav #
:

Нет, ошибка в расчете цены,

сделай для лимиток без магика цены  _selllimit_open и _buylimit_open

и добавь нормализацию

сделал как вы сказали и убрал кое что:

for(int i1=total-1; i1>=0; i1--)
      if(OrderSelect(i1,SELECT_BY_POS))
         if(OrderSymbol()==Symbol())
            if(OrderMagicNumber()!=Magic)
               {
               if(OrderType()==OP_BUYLIMIT)   _blimit++;
          
                 
               if(OrderType()==OP_SELLLIMIT)  _slimit++; 
  
               }
 double _buylimit_open=0,_selllimit_open=0; // цена открытия доп.ордеров              
 int   DBsig=0, DSsig=0;                    // сигнал открытия доп.ордеров   
   if (_blimit==0)  {_buylimit_open=NormalizeDouble(Bid-step,Digits);DBsig=1;}
   if (_slimit==0)  {_selllimit_open=NormalizeDouble(Ask+step,Digits);DSsig=1;}
   
// OP_TYPE==0 - последний закрытый был Бай 
    
  if(OP_TYPE==0 && last_profit<0 && Buy==true && DBsig==1)
  
  {int openD=OrderSend(Symbol(),OP_BUYLIMIT,Lots,_buylimit_open,Slip,0,0,NULL,0,0,Blue);
  if(openD>0) {return;} if(openD<0) {Print("OrderSend failed #",GetLastError());return;}}

// OP_TYPE==1 - последний закрытый был Селл

  if(OP_TYPE==1 && last_profit<0 && Sell==true && DSsig==1)
   
  {int openD=OrderSend(Symbol(),OP_SELLLIMIT,Lots,_selllimit_open,Slip,0,0,NULL,0,0,Red);
  if(openD>0) {return;} if(openD<0) {Print("OrderSend failed #",GetLastError());return;}}

ошибка "3" больше не выходит

теперь думаю про стоп и тейк.

Хочу спросить, можно ли нормализацию стопа и тейка тоже добавить сюда? или их нужно отдельной функцией сделать?

if (_blimit==0)  {_buylimit_open=NormalizeDouble(Bid-step,Digits);DBsig=1;}

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