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

 

@Konstantin Nikitin  Вам проще! вы спец! Я учусь! switch вообще пока не использовал! 

if(!OrderSelect(i,SELECT_BY_POS)) continue;
     if(OrderSymbol()!=Symbol()) continue;
А это как прочитать? Если (Ордер не выбран) продолжить;
                     Если (Текущий Символ не равен Символу) продолжить; Так? Или как?
 

Rewerpool:

А это как прочитать? Если (Ордер не выбран) продолжить;

Если (Текущий Символ не равен Символу) продолжить; Так? Или как?

Оператор continue

 

@Konstantin Nikitin Понял, значит так:         Поправите, если что!

if(!OrderSelect(i,SELECT_BY_POS)) continue;
Если (Ордер не выбран ордер) начать цикл снова; //(Вернутся в начало функции)
if(OrderSymbol()!=Symbol()) continue;
Если (ОрдерСимвола не равен текущему Графику)начать цикл снова; //(Вернутся в начало функции)


Да ещё вот вопрос: !OrderSelect - Это значит: Не Ордер или Не выбран Ордер?

 
Rewerpool:

Понял, значит так:         Поправите, если что!

Если ордер не выбран, выбирается следующий элемент цикла

Да ещё вот вопрос: !OrderSelect - Это значит: Не Ордер или Не выбран Ордер?

Операции и выражения и там смотрим Логические операции

 
@Konstantin Nikitin Собрал так: 
 void STOP_TAKE()
   int tip,Ticket;
   double OOP,OSL,OTP;
   int SPREAD    = (int)MarketInfo(Symbol(),MODE_SPREAD);
   if (stoploss<STOPLEVEL) stoploss=0; 
   if (takeprofit<STOPLEVEL) takeprofit=0; 

for(int i=0; i<OrdersTotal(); i++)
{
     if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
     if(OrderSymbol()!=Symbol()) continue;
     
     int tip = OrderType();
     if(tip!=OP_BUY && tip!=OP_BUYSTOP && tip!=OP_BUYLIMIT) continue;
     
     // переменные которые будут использоваться в любых ордерах
     int Ticket = OrderTicket();
     double OOP = OrderOpenPrice();
     
     //---
     switch( OrderMagicNumber() )
     {
          case Magic:    //----------Если Ордера Советника
               {
                if(tip<2)
           {
            OSL = OrderStopLoss();
            OTP = OrderTakeProfit();
            if ((OSL==0&&stoploss!=0)||(OTP==0&&takeprofit!=0))
            {  
              if (tip==OP_BUY || tip==OP_BUYSTOP || tip==OP_BUYLIMIT)             
               {
                  if (takeprofit!=0) TP = NormalizeDouble(OOP + takeprofit*Point,Digits); else TP=OTP;
                  if (stoploss!=0)   SL = NormalizeDouble(OOP - (stoploss+SPREAD)* Point,Digits); else SL=OSL;       
                  if (OrderModify(Ticket,OOP,SL,TP,0,White)) Print("STOP_TAKE",Ticket," SL ",OSL," -> ",SL,"   TP ",OTP," -> ",TP);
                  else Print(Symbol()," Error STOP_TAKE",GetLastError(),"  Ticket ",Ticket);
               }                                         
               if (tip==OP_SELL || tip==OP_SELLSTOP || tip==OP_SELLLIMIT)        
               {
                  if (takeprofit!=0) TP = NormalizeDouble(OOP - takeprofit*Point,Digits); else TP=OTP;
                  if (stoploss!=0)   SL = NormalizeDouble(OOP + (stoploss+SPREAD)* Point,Digits); else SL=OSL;             
                  if (OrderModify(Ticket,OOP,SL,TP,0,White)) Print("STOP_TAKE",Ticket," SL ",OSL," -> ",SL,"   TP ",OTP," -> ",TP);
                  else Print(Symbol()," Error STOP_TAKE",GetLastError(),"  Ticket ",Ticket);
               } 
            }
         }
               }
               break;

          default:       //----------Если Ордера Оператора 
               {
                 {
                if(tip<2)
           {
            OSL = OrderStopLoss();
            OTP = OrderTakeProfit();
            if ((OSL==0&&stoploss!=0)||(OTP==0&&takeprofit!=0))
            {  
              if (tip==OP_BUY || tip==OP_BUYSTOP || tip==OP_BUYLIMIT)             
               {
                  if (takeprofit!=0) TP = NormalizeDouble(OOP + takeprofit*Point,Digits); else TP=OTP;
                  if (stoploss!=0)   SL = NormalizeDouble(OOP - (stoploss+SPREAD)* Point,Digits); else SL=OSL;       
                  if (OrderModify(Ticket,OOP,SL,TP,0,White)) Print("STOP_TAKE",Ticket," SL ",OSL," -> ",SL,"   TP ",OTP," -> ",TP);
                  else Print(Symbol()," Error STOP_TAKE",GetLastError(),"  Ticket ",Ticket);
               }                                         
               if (tip==OP_SELL || tip==OP_SELLSTOP || tip==OP_SELLLIMIT)        
               {
                  if (takeprofit!=0) TP = NormalizeDouble(OOP - takeprofit*Point,Digits); else TP=OTP;
                  if (stoploss!=0)   SL = NormalizeDouble(OOP + (stoploss+SPREAD)* Point,Digits); else SL=OSL;             
                  if (OrderModify(Ticket,OOP,SL,TP,0,White)) Print("STOP_TAKE",Ticket," SL ",OSL," -> ",SL,"   TP ",OTP," -> ",TP);
                  else Print(Symbol()," Error STOP_TAKE",GetLastError(),"  Ticket ",Ticket);
               } 
            }
         }
               }
               }
     }
}
Правильно?
 

добавил ещё так:


6

 

Зачем вообще так писать? 

if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
     if(OrderSymbol()!=Symbol()) continue;

Если только ставить советник на один символ, а работать он будет на всех? И магик свой увидит!

Совсем запутался!

 

Друзья, кто знает как реализовать: советник может получить абсолютное значение индикатора, например iStohastic(). А как определить что индикатор покинул зону перекупленности или перепроданности?

Визуально например как индикатор Стохастик с уровнями 80 и 20.

 

Rewerpool: Ну вот так вроде без ошибок.

void STOP_TAKE(void)
{
   int SPREAD    = (int)MarketInfo(Symbol(),MODE_SPREAD);
   if (stoploss<STOPLEVEL) stoploss=0; 
   if (takeprofit<STOPLEVEL) takeprofit=0;

     for(int i=0; i<OrdersTotal(); i++)
     {
          if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
          if(OrderSymbol()!=Symbol()) continue;
     
          int tip = OrderType();
          if(  tip!=OP_BUY && tip!=OP_BUYSTOP && tip!=OP_BUYLIMIT &&
               tip!=OP_SELL && tip!=OP_SELLSTOP && tip!=OP_SELLLIMIT ) continue;
     
          // переменные которые будут использоваться в любых ордерах
          int Ticket = OrderTicket();
          double    OOP = OrderOpenPrice(),
                    OSL = OrderStopLoss(),
                    OTP = OrderTakeProfit();
     
          //---
          if( OrderMagicNumber() == Magic )
          { //----------Если Ордера Советника
               switch(tip)
               {
                    case OP_BUY:
                    case OP_BUYSTOP:
                    case OP_BUYLIMIT:
                         {
                              if (takeprofit!=0) TP = NormalizeDouble(OOP + takeprofit*Point,Digits); else TP=OTP;
                              if (stoploss!=0)   SL = NormalizeDouble(OOP - (stoploss+SPREAD)* Point,Digits); else SL=OSL;
                              if (OrderModify(Ticket,OOP,SL,TP,0,White)) Print("STOP_TAKE",Ticket," SL ",OSL," -> ",SL,"   TP ",OTP," -> ",TP);
                              else Print(Symbol()," Error STOP_TAKE",GetLastError(),"  Ticket ",Ticket);
                         }
                         break;
                         // end case
                         
                    default:
                         {
                              if (takeprofit!=0) TP = NormalizeDouble(OOP - takeprofit*Point,Digits); else TP=OTP;
                              if (stoploss!=0)   SL = NormalizeDouble(OOP + (stoploss+SPREAD)* Point,Digits); else SL=OSL;             
                              if (OrderModify(Ticket,OOP,SL,TP,0,White)) Print("STOP_TAKE",Ticket," SL ",OSL," -> ",SL,"   TP ",OTP," -> ",TP);
                              else Print(Symbol()," Error STOP_TAKE",GetLastError(),"  Ticket ",Ticket);
                         } // end case
               } // end switch

          }
          else
          { //----------Если Ордера Оператора
               switch(tip)
               {
                    case OP_BUY:
                    case OP_BUYSTOP:
                    case OP_BUYLIMIT:
                         {
                              if (takeprofit!=0) TP = NormalizeDouble(OOP + takeprofit*Point,Digits); else TP=OTP;
                              if (stoploss!=0)   SL = NormalizeDouble(OOP - (stoploss+SPREAD)* Point,Digits); else SL=OSL;       
                              if (OrderModify(Ticket,OOP,SL,TP,0,White)) Print("STOP_TAKE",Ticket," SL ",OSL," -> ",SL,"   TP ",OTP," -> ",TP);
                              else Print(Symbol()," Error STOP_TAKE",GetLastError(),"  Ticket ",Ticket);
                         }
                         break;
                         // end case
                         
                    default:
                         {
                              if (takeprofit!=0) TP = NormalizeDouble(OOP - takeprofit*Point,Digits); else TP=OTP;
                              if (stoploss!=0)   SL = NormalizeDouble(OOP + (stoploss+SPREAD)* Point,Digits); else SL=OSL;             
                              if (OrderModify(Ticket,OOP,SL,TP,0,White)) Print("STOP_TAKE",Ticket," SL ",OSL," -> ",SL,"   TP ",OTP," -> ",TP);
                              else Print(Symbol()," Error STOP_TAKE",GetLastError(),"  Ticket ",Ticket);
                         } // end case
               } // end switch
          } // end if
     } // end for
} // end STOP_TAKE
Хотя у вас совершенно одинаковая логика при модификации ордеров советника и других. Зачем вам именно их различать не совсем понятно. Но сам принцип думаю вам пригодиться.
 
@Konstantin Nikitin  УСЕК ПОРВЕРИМ!! СПАСИБО за разбор!!!
Причина обращения: