Трейлинг-стопы и трейлинг-профит - страница 6

 
deVries:


OrderComment может быть переписан вашим брокером

вы хотите... Теперь, в соответствии с моим требованием, когда цена будет в прибыли, скажем, 7 пунктов [103.603], стоп лосс

1-ой и 2-ой сделок станет, скажем, 1 пункт прибыли [103.543], а Stop Loss 3-ей сделки останется на уровне 103.386.

сделать extern int BreakEven = 7

(* 10 ) коррекция у 5-значного брокера для получения значения пункта


Ооо, да, это, конечно, недостаток. Вся моя тяжелая работа с вечера теперь напрасна!

Попробовал способ различать сделки в зависимости от функции'order comment' и написал код.

В любом случае, приведенный вами код делает перемещение части Stop Loss на BE или в нужную точку, но все равно моя проблема с "третьей" сделкой не решается.

У меня также есть эта часть кода, перемещающая BE, но я застрял с неперемещающимся SL для третьей сделки.

У меня появилась другая идея, сейчас пробую.

И это было правильно?

string comment_sell="Ордер на продажу";

SellOrder=OrderSend(Symbol(), iOrderType_Sell, LotSize,OpenPrice,Slippage,dStopLossPrice,dTakeProfitPrice, comment_sell ,MagicNumber, 0,Red);

if (OrderComment()=="comment_sell") // ?

 

Является ли это действительным?

Допустим, я прикрепил советника к графику EURUSD.

if (Order_Symbol()==EURUSD)

Будет ли он сравнивать, является ли текущий график EURUSD или нет?

 

Вот способ различать заказы с помощью "магического числа".

Брекеты не сбалансированы.

Возможно ли это?

if (Order_Symbol==EURUSD) 
{ 
int Magic_Number_3=1303
int Magic_Number_2=1302
int Magic_Number_1=1301
}
if (Order_Symbol==GBPUSD) 
{ 
int Magic_Number_3=1603
int Magic_Number_2=1602
int Magic_Number_1=1601
}
if (Order_Symbol==GBPUSD) 
{ 
int Magic_Number_3=8703
int Magic_Number_2=8702
int Magic_Number_1=8701
}


 if (count==3) 
    {
    BuyOrder_1=OrderSend("EURUSD", iOrderType_Buy, LotSize,OpenPrice,Slippage,dStopLossPrice,dTakeProfitPrice_1,NULL,Magic_Number_3, 0,Blue);
     if (BuyOrder_1>0) //Checking if the order was opened or not
      { 
       sLog_CheckBuyConditions = sLog_CheckBuyConditions + sNL + "    Buy order 1 sent successfully. Ticket=" + BuyOrder_1;
        count = count - 1; 
      }
       else 
         {
          iLastError = GetLastError();                               
           sLog_CheckBuyConditions = sLog_CheckBuyConditions + sNL + "    Error sending buy order 1. Error code=" + ErrorDescription(iLastError);
         } 
        }

  if (count==2) 
    {
     BuyOrder_2=OrderSend("EURUSD", iOrderType_Buy, LotSize,OpenPrice,Slippage,dStopLossPrice,dTakeProfitPrice_2,NULL,Magic_Number_2, 0,Blue);
      if (BuyOrder_2>0) 
      { 
      sLog_CheckBuyConditions = sLog_CheckBuyConditions + sNL + "    Buy order 2 sent successfully. Ticket=" + BuyOrder_2;
       count = count - 1; 
      }
     else {
          iLastError = GetLastError();
           sLog_CheckBuyConditions = sLog_CheckBuyConditions + sNL + "    Error sending buy order 2. Error code=" + ErrorDescription(iLastError);
          } 
         }

if (count==1) 
    {
     BuyOrder_3=OrderSend(EURUSD, iOrderType_Buy, LotSize,OpenPrice,Slippage,dStopLossPrice,dTakeProfitPrice_3,NULL,Magic_Number_1, 0,Blue);
      if (BuyOrder_3>0) 
      {
       sLog_CheckBuyConditions = sLog_CheckBuyConditions + sNL + "    Buy order 2 sent successfully. Ticket=" + BuyOrder_3;
        count = count - 1; 
      }
     else {
           iLastError = GetLastError();                               
            sLog_CheckBuyConditions = sLog_CheckBuyConditions + sNL + "    Error sending buy order 2. Error code=" + ErrorDescription(iLastError);
          }  
         }

 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

for(cnt=OrdersTotal()-1;cnt>=0;cnt--)

                       { 

                            if(!OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES)) continue;

                               if(OrderSymbol() == Symbol() && OrderMagicNumber() ==  Magic_Number_3)

                                                      {

                                                          sl     = OrderStopLoss(); // Stop Loss. 

                                                            tStopLoss = NormalizeDouble(OrderStopLoss(), Digits); // Stop Loss. 

                   if(OrderType()==OP_BUY)

                                                  {

                                                     if(Ask> NormalizeDouble(OrderOpenPrice()+TrailingStart* vPoint,Digits)

                                                           && tStopLoss < NormalizeDouble(Bid-(TrailingStop+TrailingStep)*vPoint,Digits))

                                                            {

                                                                tStopLoss = NormalizeDouble(Bid-TrailingStop*vPoint,Digits);                            

                                                                  ticket = OrderModify(OrderTicket(),OrderOpenPrice(),tStopLoss,OrderTakeProfit(),0,Blue);

                                if (ticket > 0)

                                                   {

                                                      Print ("TrailingStop #2 Activated: ", OrderSymbol(), ": SL", tStopLoss, ": Bid", Bid);                            

                                                   }

                                                 else{

                                                     iLastError = GetLastError();

                                                      }

                                                   }//end if(Ask> NormalizeDouble(OrderOpenPrice()+TrailingStart* vPoint,Digits) && tStopLoss < NormalizeDouble(Bid-(TrailingStop+TrailingStep)*vPoint,Digits)){

                                                 }//end if(OrderType()==OP_BUY){ 

 

                               if(OrderSymbol() == Symbol() && OrderMagicNumber() ==  Magic_Number_2)

                                                      {

                                                          sl     = OrderStopLoss(); // Stop Loss. 

                                                            tStopLoss = NormalizeDouble(OrderStopLoss(), Digits); // Stop Loss. 

                   if(OrderType()==OP_BUY)

                                                  {

                                                     if(Ask> NormalizeDouble(OrderOpenPrice()+TrailingStart* vPoint,Digits)

                                                           && tStopLoss < NormalizeDouble(Bid-(TrailingStop+TrailingStep)*vPoint,Digits))

                                                            {

                                                                tStopLoss = NormalizeDouble(Bid-TrailingStop*vPoint,Digits);                            

                                                                  ticket = OrderModify(OrderTicket(),OrderOpenPrice(),tStopLoss,OrderTakeProfit(),0,Blue);

                                if (ticket > 0)

                                                   {

                                                      Print ("TrailingStop #2 Activated: ", OrderSymbol(), ": SL", tStopLoss, ": Bid", Bid);                            

                                                   }

                                                 else{

                                                     iLastError = GetLastError();

                                                      }

                                                   }//end if(Ask> NormalizeDouble(OrderOpenPrice()+TrailingStart* vPoint,Digits) && tStopLoss < NormalizeDouble(Bid-(TrailingStop+TrailingStep)*vPoint,Digits)){

                                                 }//end if(OrderType()==OP_BUY){  

 

                               if(OrderSymbol() == Symbol() && OrderMagicNumber() ==  Magic_Number_1)

                                                      {

                                                          sl     = OrderStopLoss(); // Stop Loss. 

                                                            tStopLoss = NormalizeDouble(OrderStopLoss(), Digits); // Stop Loss. 

                   if(OrderType()==OP_BUY)

                                                  {

                                                                          ticket = OrderModify(OrderTicket(),OrderOpenPrice(),tStopLoss,OrderTakeProfit(),0,Blue);

                                if (ticket > 0)

                                                   {

                                                      Print ("Stop Loss Unchanged");                            

                                                   }

                                                 else{

                                                     iLastError = GetLastError();

                                                      }

                                                   }//end if(Ask> NormalizeDouble(OrderOpenPrice()+TrailingStart* vPoint,Digits) && tStopLoss < NormalizeDouble(Bid-(TrailingStop+TrailingStep)*vPoint,Digits)){

                                                 }//end if(OrderType()==OP_BUY){

 
if (Order_Symbol== "EURUSD") //it has to be a string if you do it this way
{                              //==EURUSD)  fails
int Magic_Number_3=1303
int Magic_Number_2=1302
int Magic_Number_1=1301
}

таким образом, вам придется искать 3 разных магических числа

Мне кажется, можно сделать так

 

Хорошо, после непрерывной напряженной работы (по крайней мере, для меня) советник стал «безошибочным»!

Коротко публикую изменения:

 extern string     Order_Symbol= "EURUSD" ;

int init()
{

}

int start()
{ 
int Magic_Number_1,Magic_Number_2,Magic_Number_3;
bool bOrderClosed;

//////////////////////////////////////SETTING MAGIC NUMBER///////////////////////////////////////////////////

Set_Magic_Number();

//////////////////////////////////////SETTING MAGIC NUMBER COMPLETED/////////////////////////////////////////


//////////////////////////////////////LOCKING MINIMUM PROFIT/////////////////////////////////////////////////

if ( OrdersTotal ()> 0 )
      { 
       for ( int cnt= OrdersTotal ()- 1 ;cnt>= 0 ;cnt--)
        {
         if (! OrderSelect (cnt, SELECT_BY_POS , MODE_TRADES )) continue ;
//-----------------------------------------------------------------------------------------------------------------------

             if ( OrderSymbol () == Symbol () && OrderMagicNumber () ==Magic_Number_1)
                  {
                   if ( OrderProfit ()< 0.03 )
                    {                                                     
                     if ( OrderType ()== OP_BUY )
                      {                                                  
                        bOrderClosed = closeBuyOrder(iOrderType_Buy); //Closing Buy order
                           if (bOrderClosed)
                            {                             
                               Print ( "Buy Order 1 Closed" );              
                            }
                       else {
                             iLastError = GetLastError();                                       
                            } //end else if(bOrderClosed)
                          } //end if(OrderType()==OP_BUY)
//==========================================================================================================================
                         if ( OrderType ()== OP_SELL )
                           {                                                      
                             bOrderClosed = closeSellOrder(iOrderType_Sell); //Closing Sell order
                               if (bOrderClosed)
                                  {
                                     Print ( "Sell Order 1 Closed" );               
                                   }
                               else {    
                                    iLastError = GetLastError();                                
                                   } //end else if(bOrderClosed)
                                  } //end if(OrderType()==OP_SELL)                                            
                                 } // if (OrderProfit()<0.03)                                    
                                } // if(OrderSymbol() == Symbol() && OrderMagicNumber() ==Magic_Number_1)
 //-------------------------------------------------------------------------------------------------------------------------
                         if ( OrderSymbol () == Symbol () && OrderMagicNumber () ==Magic_Number_2)
                            {
                               if ( OrderProfit ()< 0.02 )
                                {                                                    
                                   if ( OrderType ()== OP_BUY )
                                            {                                                       
                                              bOrderClosed = closeBuyOrder(iOrderType_Buy); //Closing Buy order 
                                               if (bOrderClosed)
                                                  {
                                                     Print ( "Buy Order 2 Closed" );          
                                                  }
                                               else {
                                                   iLastError = GetLastError();                                        
                                                  } //end else if(bOrderClosed)
                                               } //end if(OrderType()==OP_BUY)
//==========================================================================================================================
                         if ( OrderType ()== OP_SELL )
                             {                                                       
                               bOrderClosed = closeSellOrder(iOrderType_Sell); //Closing Sell order        
                                 if (bOrderClosed)
                                    {
                                       Print ( "Sell Order 1 Closed" );
                                    }
                                 else {
                                     iLastError = GetLastError();                                        
                                    } //end else if(bOrderClosed)
                                   } //end if(OrderType()==OP_SELL)                                         
                                  } // if (OrderProfit()<0.02)                                    
                                 } // if(OrderSymbol() == Symbol() && OrderMagicNumber() ==Magic_Number_2)
//------------------------------------------------------------------------------------------------------------------------------
                         if ( OrderSymbol () == Symbol () && OrderMagicNumber () ==Magic_Number_3)
                            {
                             Print ( "Don't Close this Third Order" );                                                    
                            } // if(OrderSymbol() == Symbol() && OrderMagicNumber() ==Magic_Number_3)
//-------------------------------------------------------------------------------------------------------------------------------
                           } //end for(cnt=OrdersTotal()-1;cnt>=0;cnt--) 
                          } // if(OrdersTotal()>0)
//////////////////////////////////////MINIMUM PROFIT LOCKED////////////////////////////////////////////////// 

if (TrailingStop> 0 && TrailingStart > 0 ) TrailOrder (TrailingStart, TrailingStop); 

//count open buy orders.

iOpenOrders_Buy = CntOrd(iOrderType_Buy, Symbol ());

//count open sell orders.

iOpenOrders_Sell = CntOrd(iOrderType_Sell, Symbol ()); 

//Conditional Part for Trade


if (Buy condition Met)
{
//Close Open Sell Positions 

double OpenPrice= Ask ;
                 int count= 3 ;
                 double   dTakeProfitPrice_1,dTakeProfitPrice_2,dTakeProfitPrice_3;
                dStopLossPrice = NormalizeDouble (OpenPrice - StopLoss * dPip, Digits );

                dTakeProfitPrice_1 = NormalizeDouble (OpenPrice + TakeProfit_1 * dPip, Digits );
                dTakeProfitPrice_2 = NormalizeDouble (OpenPrice + TakeProfit_2 * dPip, Digits );
                dTakeProfitPrice_3 = NormalizeDouble (OpenPrice + TakeProfit_3 * dPip, Digits );              

iLastError = 0 ;
   if (count== 3 ) 
    {
      BuyOrder_1= OrderSend (Order_Symbol, iOrderType_Buy, LotSize,OpenPrice,Slippage,dStopLossPrice,dTakeProfitPrice_1, "Buy Order" ,Magic_Number_1, 0 ,Blue);
       if (BuyOrder_1> 0 ) //Checking if the order was opened or not
        { 
         count = count - 1 ; 
        }

   else {
          iLastError = GetLastError();                            

        } 
       }
   if (count== 2 ) 
    {
     BuyOrder_2= OrderSend (Order_Symbol, iOrderType_Buy, LotSize,OpenPrice,Slippage,dStopLossPrice,dTakeProfitPrice_2, "Buy Order" ,Magic_Number_2, 0 ,Blue);
       if (BuyOrder_2> 0 ) 
       {
        count = count - 1 ;
       }
   else {
        iLastError = GetLastError();
       } 
      }
   if (count== 1 )
    {
     BuyOrder_3= OrderSend (Order_Symbol, iOrderType_Buy, LotSize,OpenPrice,Slippage,dStopLossPrice,dTakeProfitPrice_3, "Buy Order" ,Magic_Number_3, 0 ,Blue);
       if (BuyOrder_3> 0 ) 
       {      
        count = count - 1 ;
       }
   else {
        iLastError = GetLastError();                             
        }  
       }
      } 

   if (Sell condition met)
    { 

       //Close Open Buy Orders

        OpenPrice= Bid ;
        count= 3 ;                

       double SellOrder_1,SellOrder_2,SellOrder_3;
      dStopLossPrice = NormalizeDouble (OpenPrice + StopLoss * dPip, Digits );                

                dTakeProfitPrice_1 = NormalizeDouble (OpenPrice - TakeProfit_1 * dPip, Digits );
                dTakeProfitPrice_2 = NormalizeDouble (OpenPrice - TakeProfit_2 * dPip, Digits );
                dTakeProfitPrice_3 = NormalizeDouble (OpenPrice - TakeProfit_3 * dPip, Digits );               

      iLastError = 0 ;
       if (count== 3 )
       {
        SellOrder_1= OrderSend (Order_Symbol, iOrderType_Sell , LotSize,OpenPrice,Slippage ,dStopLossPrice ,dTakeProfitPrice_1 , "Sell Order" ,Magic_Number_1, 0 ,Red);               
           if (SellOrder_1> 0 ) //Checking if the order was opened or not
           {   
            count = count - 1 ; 
           }
       else {
            iLastError = GetLastError();                             
           } 
          }
       if (count== 2 )
         {
           SellOrder_2= OrderSend (Order_Symbol, iOrderType_Sell , LotSize,OpenPrice,Slippage ,dStopLossPrice ,dTakeProfitPrice_2 , "Sell Order" ,Magic_Number_2, 0 ,Red);             
             if (SellOrder_1> 0 ) //Checking if the order was opened or not
              {    
                count = count - 1 ; 
              }
         else {
               iLastError = GetLastError();                            
              } 
             }
       if (count== 1 ) 
         {
           SellOrder_3= OrderSend (Order_Symbol, iOrderType_Sell , LotSize,OpenPrice,Slippage ,dStopLossPrice,dTakeProfitPrice_3 , "Sell Order" ,Magic_Number_3, 0 ,Red);                
             if (SellOrder_3> 0 ) //Checking if the order was opened or not
              { 
                count = count - 1 ; 
              }
         else {
               iLastError = GetLastError();                            
              } 
             }
            }
           }

void TrailOrder( double Trailingstart, double Trailingstop)
    {
     int ticket = 0 ;
       double tStopLoss;
       int cnt;
         double vPoint,vSlippage; 
         double sl;
           int Magic_Number_1,Magic_Number_2,Magic_Number_3;
           Set_Magic_Number();

if ( Digits == 3 || Digits == 5 )
    {vPoint = Point * 10 ; vSlippage = Slippage * 10 ;}
     else
    {vPoint = Point ; vSlippage = Slippage;}
RefreshRates ();

if ( OrdersTotal ()> 0 )
{
 for (cnt= OrdersTotal ()- 1 ;cnt>= 0 ;cnt--)
  {       
   if (! OrderSelect (cnt, SELECT_BY_POS , MODE_TRADES )) continue ;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
                         if ( OrderSymbol () == Symbol () && OrderMagicNumber () ==Magic_Number_1)
                          {
                           sl = OrderStopLoss (); // Stop Loss. 
                             tStopLoss = NormalizeDouble ( OrderStopLoss (), Digits ); // Stop Loss. 
                               if ( OrderType ()== OP_BUY )
                                {
                                   if ( Ask > NormalizeDouble ( OrderOpenPrice ()+TrailingStart* vPoint, Digits )
                                  && tStopLoss < NormalizeDouble ( Bid -(TrailingStop+TrailingStep)*vPoint, Digits ))
                                    {
                                     tStopLoss = NormalizeDouble ( Bid -TrailingStop*vPoint, Digits );                           
                                       ticket = OrderModify ( OrderTicket (), OrderOpenPrice (),tStopLoss, OrderTakeProfit (), 0 ,Blue);
                                 if (ticket > 0 )
                                   {
                                     Print ( "TrailingStop #2 Activated: " , OrderSymbol (), ": SL" , tStopLoss, ": Bid" , Bid );                            
                                   }
                                     else {
                                         iLastError = GetLastError();
                                          }
                                         } //end if(Ask> NormalizeDouble(OrderOpenPrice()+TrailingStart* vPoint,Digits) && tStopLoss < NormalizeDouble(Bid-(TrailingStop+TrailingStep)*vPoint,Digits)){
                                        } //end if(OrderType()==OP_BUY){
//-------------------------------------------------------------------------------------------------------------------------------------
                       
 
if ( OrderType ()== OP_SELL )
                              {
                                 if ( Bid < NormalizeDouble ( OrderOpenPrice ()-TrailingStart*vPoint, Digits )
                                   && (sl >( NormalizeDouble ( Ask +(TrailingStop+TrailingStep)*vPoint, Digits )))
                                    || ( OrderStopLoss ()== 0 ))
                                      {               
                                        sl = NormalizeDouble ( Ask +TrailingStop*vPoint, Digits );                              
                                                ticket = OrderModify ( OrderTicket (), OrderOpenPrice (),sl, OrderTakeProfit (), 0 ,Red);                       
                                     if (ticket > 0 )
                                              {
                                               Print ( "Trailing #2 Activated: " , OrderSymbol (), ": SL " ,sl, ": Ask " , Ask );
                                               }
                                           else {
                                               iLastError = GetLastError();
                                              }
                                             } //end if (Bid < NormalizeDouble(OrderOpenPrice()-TrailingStart*vPoint,Digits)
                                            } //end if (OrderType()==OP_SELL)
                                           } // end if(OrderSymbol() == Symbol() && OrderMagicNumber() ==Magic_Number_1) 
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////              
                 if ( OrderSymbol () == Symbol () && OrderMagicNumber () ==Magic_Number_2)
                     {
                      sl = OrderStopLoss (); // Stop Loss.
                       tStopLoss = NormalizeDouble ( OrderStopLoss (), Digits ); // Stop Loss.
                         if ( OrderType ()== OP_BUY )
                         {
                           if ( Ask > NormalizeDouble ( OrderOpenPrice ()+TrailingStart* vPoint, Digits )
                            && tStopLoss < NormalizeDouble ( Bid -(TrailingStop+TrailingStep)*vPoint, Digits ))
                             {
                               tStopLoss = NormalizeDouble ( Bid -TrailingStop*vPoint, Digits );                           
                                ticket = OrderModify ( OrderTicket (), OrderOpenPrice (),tStopLoss, OrderTakeProfit (), 0 ,Blue);
               if (ticket > 0 )
                              {
                                 Print ( "TrailingStop #2 Activated: " , OrderSymbol (), ": SL" , tStopLoss, ": Bid" , Bid );                           
                              }
                           else {
                               iLastError = GetLastError();
                              }
                             } //end if(Ask> NormalizeDouble(OrderOpenPrice()+TrailingStart* vPoint,Digits) && tStopLoss < NormalizeDouble(Bid-(TrailingStop+TrailingStep)*vPoint,Digits)){
                           } //end if(OrderType()==OP_BUY){
//-------------------------------------------------------------------------------------------------------------------------------------
                 if ( OrderType ()== OP_SELL )
                       {
                         if ( Bid < NormalizeDouble ( OrderOpenPrice ()-TrailingStart*vPoint, Digits )
                             && (sl >( NormalizeDouble ( Ask +(TrailingStop+TrailingStep)*vPoint, Digits )))
                               || ( OrderStopLoss ()== 0 ))
                              {   
                               sl = NormalizeDouble ( Ask +TrailingStop*vPoint, Digits );
                                ticket = OrderModify ( OrderTicket (), OrderOpenPrice (),sl, OrderTakeProfit (), 0 ,Red);                                
                         if (ticket > 0 )
                                       {
                                         Print ( "Trailing #2 Activated: " , OrderSymbol (), ": SL " ,sl, ": Ask " , Ask );                                                          
                                       }
                                   else {
                                        iLastError = GetLastError();                                    
                                       }
                                    } //end if (Bid < NormalizeDouble(OrderOpenPrice()-TrailingStart*vPoint,Digits)
                                   } //end if (OrderType()==OP_SELL)
                                  } // end if(OrderSymbol() == Symbol() && OrderMagicNumber() ==Magic_Number_2)
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
               if ( OrderSymbol () == Symbol () && OrderMagicNumber () ==Magic_Number_3)
                     {
                       sl = OrderStopLoss (); // Stop Loss.
                         tStopLoss = NormalizeDouble ( OrderStopLoss (), Digits ); // Stop Loss.                          
                           if ( OrderType ()== OP_BUY )
                               {
                                ticket = OrderModify ( OrderTicket (), OrderOpenPrice (),tStopLoss, OrderTakeProfit (), 0 ,Blue);
                 if (ticket > 0 )
                                {
                                 Print ( "Stop Loss Unchanged" );                           
                                }
                             else {
                                 iLastError = GetLastError();
                                }
                               } //end if(OrderType()==OP_BUY)                           
//------------------------------------------------------------------------------------------------------------------------------
                 if ( OrderType ()== OP_SELL )                                     
                      {                 
                       sl= OrderStopLoss (); // Stop Loss.
                         ticket = OrderModify ( OrderTicket (), OrderOpenPrice (),sl, OrderTakeProfit (), 0 ,Red);                               
                       if (ticket > 0 )
                                      {
                                       Print ( "Trailing #2 Activated: " , OrderSymbol (), ": SL " ,sl, ": Ask " , Ask );                                                                         
                                      }
                                   else {
                                       iLastError = GetLastError();                                 
                                      }
                                     } //end if (OrderType()==OP_SELL)
                                    } // end if(OrderSymbol() == Symbol() && OrderMagicNumber() ==Magic_Number_3)
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
                                  } //end for(cnt=OrdersTotal()-1;cnt>=0;cnt--)
                                } // end if(OrdersTotal()>0)
                               return ( 0 );
                              } // end void TrailOrder(double Trailingstart,double Trailingstop)

 bool closeBuyOrder( int iBuytype)
                              {
                               bool bClosed_;
                                 int Magic_Number_1,Magic_Number_2,Magic_Number_3;
                                 Set_Magic_Number();
                                 if ( OrdersTotal ()> 0 )
                                  {
                                   for ( int Counter= OrdersTotal ()- 1 ;Counter>= 0 ;Counter--)
                                    {
                                     OrderSelect (Counter, SELECT_BY_POS , MODE_TRADES );
                                       if (iBuytype== OP_BUY && OrderType ()== OP_BUY )
                                        {
//------------------------------------------------------------------------------------------------------------------------------------
                                           if ( OrderSymbol ()== Symbol () && OrderMagicNumber ()==Magic_Number_1)
                                             {
                                               RefreshRates ();
                                               OrderClose ( OrderTicket (), OrderLots (), NormalizeDouble ( Bid , Digits ), Slippage);
                                             }
//-------------------------------------------------------------------------------------------------------------------------------------
                                                 if ( OrderSymbol ()== Symbol () && OrderMagicNumber ()==Magic_Number_2)
                                                 {
                                                   RefreshRates ();
                                                     OrderClose ( OrderTicket (), OrderLots (), NormalizeDouble ( Bid , Digits ), Slippage);
                                                 }
//-------------------------------------------------------------------------------------------------------------------------------------
                                                 if ( OrderSymbol ()== Symbol () && OrderMagicNumber ()==Magic_Number_3)
                                                 {
                                                   RefreshRates ();                                                    
                                                     Print ( "Don't Close this Thrid Order" );
                                                 }
//-------------------------------------------------------------------------------------------------------------------------------------
                                              } //if(iBuytype==OP_BUY && OrderType()==OP_BUY)
                                           } //for(int Counter=OrdersTotal()-1;Counter>=0;Counter--)
                                       } //if(OrdersTotal()>0)
                                 return (bClosed_);
                            } //end bool closeBuyOrder(int iBuytype)
//==========================================================================================
                             bool closeSellOrder( int iSelltype)
                              {
                               bool bClosed_;
                               int Magic_Number_1,Magic_Number_2,Magic_Number_3;
                                Set_Magic_Number();
                                 if ( OrdersTotal ()> 0 )
                                  {
                                   for ( int Counter= OrdersTotal ()- 1 ;Counter>= 0 ;Counter--)
                                   {
                                     if (! OrderSelect (Counter, SELECT_BY_POS , MODE_TRADES )) continue ;
                                       if (iSelltype== OP_SELL && OrderType ()== OP_SELL )
                                         {
//------------------------------------------------------------------------------------------------------------------------------------                                              
                                           if ( OrderSymbol ()== Symbol () && OrderMagicNumber ()==Magic_Number_1)
                                             {
                                               RefreshRates ();
                                               bClosed_ = OrderClose ( OrderTicket (), OrderLots (), NormalizeDouble ( Ask , Digits ),Slippage);
                                             }
//-------------------------------------------------------------------------------------------------------------------------------------
                                                 if ( OrderSymbol ()== Symbol () && OrderMagicNumber ()==Magic_Number_2)
                                                 {
                                                   RefreshRates ();
                                                    bClosed_ = OrderClose ( OrderTicket (), OrderLots (), NormalizeDouble ( Ask , Digits ),Slippage);
                                                 }
//-------------------------------------------------------------------------------------------------------------------------------------
                                                 if ( OrderSymbol ()== Symbol () && OrderMagicNumber ()==Magic_Number_3)
                                                 {
                                                   RefreshRates ();
                                                     Print ( "Don't Close this Thrid Order" );
                                                 }
//-------------------------------------------------------------------------------------------------------------------------------------
                                              } //end if(iSelltype==OP_SELL && OrderType()==OP_SELL)
                                             } //for(int Counter=OrdersTotal()-1;Counter>=0;Counter--)
                                           } //end if(OrdersTotal()>0)                                      
                                       return (bClosed_);
                            } //end bool closeSellOrder(int iSelltype)
//==========================================================================================

void Set_Magic_Number()
 {
   int Magic_Number_1,Magic_Number_2,Magic_Number_3;
   if (Order_Symbol== "EURUSD" ) 
    { 
     Magic_Number_1= 1301 ;
     Magic_Number_2= 1302 ;
     Magic_Number_3= 1303 ; 
    }

   if (Order_Symbol== "GBPUSD" ) 
    { 
     Magic_Number_1= 1601 ;
     Magic_Number_2= 1602 ;
     Magic_Number_3= 1603 ;
    }

   if (Order_Symbol== "AUDUSD" ) 
    { 
     Magic_Number_1= 8701 ;
     Magic_Number_2= 8702 ;
     Magic_Number_3= 8703 ;
    }
return ( 0 );
}

У меня возникла путаница с функцией Set_Magic_Number().

Я правильно его определил? Также при вызове его в других функциях, будет ли он работать правильно?

С уважением

 
Arav007:

У меня путаница с функцией Set_Magic_Number().

Правильно ли я ее определил? Также при вызове ее в других функциях, будет ли она работать правильно?

С уважением,

Я прочитал здесь, что ваш символ не "EURUSD".

Вы должны использовать правильный символ

 
deVries:

Я прочитал здесь, что ваш символ не "EURUSD".

Вы должны использовать правильный символ.

Это не проблема. Символ брокера, на котором я тестирую советника - EURUSD,GBPUSD.....

Если я прикреплю советника к брокеру, у которого символ EURUSDpro, я просто добавлю "pro".

Вы просмотрели мой код?

Функция минимальной прибыли - это 'Failure'.

Она просто закрывает все открытые сделки при каждом исполнении, независимо от убытка/прибыли в сделках!

Но моя цель не в этом.

Я хочу, чтобы если сделка вошла в зону прибыли, а затем рынок начал разворачиваться обратно, эта функция "Минимальная прибыль" будет гарантировать, что

чтобы сделка была закрыта с желаемой минимальной прибылью.

И здесь я также не хочу, чтобы эта функция влияла на "третью" сделку.

Я пытался написать что-то подобное, но теперь это не работает.

 
Arav007:

Это не проблема. Символ брокера, на котором я тестирую советника - EURUSD,GBPUSD.....

Если я прикреплю советника к брокеру, где символ EURUSDpro, я просто добавлю 'pro'.

Вы просмотрели мой код?

Функция минимальной прибыли - это 'Failure'.

Она просто закрывает все открытые сделки при каждом исполнении, независимо от убытка/прибыли в сделках!

Но моя цель не в этом.

Я хочу, чтобы если сделка вошла в зону прибыли, а затем рынок начал разворачиваться обратно, эта функция "Минимальная прибыль" будет гарантировать, что

чтобы сделка была закрыта с желаемой минимальной прибылью.

И здесь я также не хочу, чтобы эта функция влияла на "третью" сделку.

Я пытался написать что-то подобное, но теперь это не работает.


Вы слишком усложняете ситуацию, потому что понятия не имеете, как с этим справиться.

Чем больше вы читаете и пытаетесь программировать сами, тем легче становится делать более сложные вещи.

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

вам придется многому научиться.

Если вы начнете с короткой простой программы и сделаете несколько изменений в ней для тестирования.

вы можете узнать, как работает эта программа.

Ваша проблема, с которой вы начали

Посмотрите, как бы я это сделал

//+------------------------------------------------------------------+
//|                                                  MACD Sample.mq4 |
//|                   Copyright 2005-2014, MetaQuotes Software Corp. |
//|                                              https://www.mql4.com |
//+------------------------------------------------------------------+
#property copyright   "2005-2014, MetaQuotes Software Corp."
#property link        "https://www.mql4.com"

input double TakeProfit    =50;
input double Lots          =0.1;
input int    MagicNumber   =16384;
input int    TakeProfit1   = 15;
input int    TakeProfit2   = 25;
input int    TakeProfit3   = 0;
input int    StopLoss      = 100;   
input double BreakEven     =10;
input double BreakEvenSL   =5;
input double TrailingStop  =30;
input double TrailingStep  =30;
input int    SlippagePips  =3;
input double MACDOpenLevel =3.0;
input double MACDCloseLevel=2;
input int    MATrendPeriod =26;

int count,countbuy,countsell;


//++++ These are adjusted for 5 digit brokers.
int     pips2points;      // slippage  3 pips    3=points    30=points
double  pips2dbl;         // Stoploss 15 pips    0.015      0.0150
int     Digitspips;      // DoubleToStr(dbl/pips2dbl, Digitspips)
int     Slip;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
  if(Digits % 2 == 1)  // DE30=1/JPY=3/EURUSD=5 forum.mql4.com/43064#515262
     {pips2dbl = Point*10; pips2points = 10;   Digitspips = 1;}
     else {pips2dbl = Point;    pips2points =  1;   Digitspips = 0;}
     // OrderSend(... Slippage.Pips * pips2points, Bid - StopLossPips * pips2dbl 
  Slip = pips2points * SlippagePips;  //Slippage        
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick(void)
  {
   double MacdCurrent,MacdPrevious;
   double SignalCurrent,SignalPrevious;
   double MaCurrent,MaPrevious;
   int    cnt,ticket,total;
//---
// initial data checks
// it is important to make sure that the expert works with a normal
// chart and the user did not make any mistakes setting external 
// variables (Lots, StopLoss, TakeProfit, 
// TrailingStop) in our case, we check TakeProfit
// on a chart of less than 100 bars
//---
   if(Bars<100)
     {
      Print("bars less than 100");
      return;
     }

//---
   if((countbuy>0)||(countsell>0))
     {
      int CMD;
      double SL,TP,price;
      int LastError = 0;
      RefreshRates();
      if (countbuy>0)
           {
            count=countbuy;
            CMD = OP_BUY;
            price = Ask;
            if(StopLoss>0)SL= price-StopLoss*pips2dbl;
            if(count==3 && TakeProfit1>0)TP= price+TakeProfit1*pips2dbl;
            if(count==2 && TakeProfit2>0)TP= price+TakeProfit2*pips2dbl;
            if(count==1 && TakeProfit3>0)TP= price+TakeProfit3*pips2dbl;
           } 
        else 
           {
            count=countsell;
            CMD = OP_SELL;
            price = Bid;
            if(StopLoss>0)SL= price+StopLoss*pips2dbl;
            if(count==3 && TakeProfit1>0)TP= price-TakeProfit1*pips2dbl;
            if(count==2 && TakeProfit2>0)TP= price-TakeProfit2*pips2dbl;
            if(count==1 && TakeProfit3>0)TP= price-TakeProfit3*pips2dbl;
           }             
      ticket=OrderSend(Symbol(), CMD, Lots, price , Slip, SL, TP,"macd sample",MagicNumber,0,Green);
      if (ticket>0) //Checking if the order was opened or not
           { 
            OrderPrint();
            countbuy--;
            countsell--; 
           }
        else {
              LastError = GetLastError();                               
              if(CMD==OP_BUY)Print("Error sending buy order "+count+ ". Error code=  " + LastError);
              if(CMD==OP_SELL)Print("Error sending sell order "+count+ ". Error code=  " + LastError);
             }     
   if((countbuy>0)||(countsell>0))return;
   } 

//--- to simplify the coding and speed up access data are put into internal variables
   MacdCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0);
   MacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1);
   SignalCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);
   SignalPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1);
   MaCurrent=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,0);
   MaPrevious=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,1);
//--- it is important to enter the market correctly, but it is more important to exit it correctly...   
   total=0;
   for(cnt = OrdersTotal()-1; cnt>=0 ; cnt--)
     {
      if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES)==false)break;
      if(OrderSymbol()!=Symbol()||OrderMagicNumber()!=MagicNumber)continue;      
      if(OrderType()<=OP_SELL)    // check for opened position 
        {
         total++;
         //--- long position is opened
         if(OrderType()==OP_BUY)
           {
            //--- should it be closed?
            if(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious && 
               MacdCurrent>(MACDCloseLevel*pips2dbl))
              {
               //--- close order
               OrderClose(OrderTicket(),OrderLots(),Bid,Slip,Violet);
              }
            //--- check for breakeven  
            if(BreakEven>0)
              {
               if(Bid-OrderOpenPrice()>=pips2dbl*BreakEven)
                 {
                  if(OrderStopLoss()<OrderOpenPrice())
                    {
                     //--- modify order
                     if(OrderTakeProfit()>Point)OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()+(BreakEvenSL*pips2dbl),OrderTakeProfit(),0,Green);
                    }
                 }
              }                   
            //--- check for trailing stop
            if(TrailingStop>0)
              {
               if(OrderOpenPrice()<OrderStopLoss())
                 {
                  if(OrderStopLoss()<Bid-pips2dbl*(TrailingStop+TrailingStep))
                    {
                     //--- modify order
                     OrderModify(OrderTicket(),OrderOpenPrice(),Bid-pips2dbl*TrailingStop,OrderTakeProfit(),0,Green);
                    }
                 }
              }
           }
         else // go to short position
           {
            //--- should it be closed?
            if(MacdCurrent<0 && MacdCurrent>SignalCurrent && 
               MacdPrevious<SignalPrevious && MathAbs(MacdCurrent)>(MACDCloseLevel*pips2dbl))
              {
               //--- close order and exit
               OrderClose(OrderTicket(),OrderLots(),Ask,Slip,Violet);
              }
            //--- check for breakeven  
            if(BreakEven>0)
              {
               if(OrderOpenPrice()-Ask>pips2dbl*BreakEven)
                 {
                  if(OrderStopLoss()>OrderOpenPrice())
                    {
                     //--- modify order
                     if(OrderTakeProfit()>Point)OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()-(BreakEvenSL*pips2dbl),OrderTakeProfit(),0,Green);
                    }
                 }
              }                  
            //--- check for trailing stop
            if(TrailingStop>0)
              {
               if((OrderOpenPrice()>OrderStopLoss())&&(OrderStopLoss()>Point))
                 {
                  if(OrderStopLoss()>(Ask+pips2dbl*(TrailingStop+TrailingStep)))
                    {
                     //--- modify order
                     OrderModify(OrderTicket(),OrderOpenPrice(),Ask+pips2dbl*TrailingStop,OrderTakeProfit(),0,Red);
                    }
                 }
              }
           }
        }
     }
   
   if(total<1)
     {
      countbuy = 0;
      countsell = 0;
      //--- no opened orders identified
      if(AccountFreeMargin()<(3000*Lots))//3trades*1000
        {
         Print("We have no money. Free Margin = ",AccountFreeMargin());
         return;
        }
      //--- check for long position (BUY) possibility
      if(MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious<SignalPrevious && 
         MathAbs(MacdCurrent)>(MACDOpenLevel*pips2dbl) && MaCurrent>MaPrevious)
        {
        countbuy = 3;//we can open
        }
      //--- check for short position (SELL) possibility
      if(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious && 
         MacdCurrent>(MACDOpenLevel*pips2dbl) && MaCurrent<MaPrevious)
        {
        countsell = 3;//we can open
        }      
     }
//---
  }
//+------------------------------------------------------------------+

                                            

не нужны разные входы для Symbol()

3 разных Magicnumbers...

 
Arav007:

Это не проблема. Символ брокера, на котором я тестирую советника - EURUSD,GBPUSD.....

Если я прикреплю советника к брокеру, где символ EURUSDpro, я просто добавлю 'pro'.

Вы просмотрели мой код?

Функция минимальной прибыли - это 'Failure'.

Она просто закрывает все открытые сделки при каждом исполнении, независимо от убытка/прибыли в сделках!

Но моя цель не в этом.

Я хочу, чтобы если сделка вошла в зону прибыли, а затем рынок начал разворачиваться обратно, эта функция "Минимальная прибыль" обеспечит, чтобы

чтобы сделка была закрыта с желаемой минимальной прибылью.

И здесь я также не хочу, чтобы эта функция влияла на "третью" сделку.

Я пытался написать что-то подобное, но теперь это не работает.


Я скомпилировал ваш код 80 ошибок 6 предупреждений

в основном необъявленный идентификатор

Мне нужен ваш код со всеми объявленными идентификаторами.

если файл слишком большой, то прикрепите

скомпилируйте файл и проверьте ошибки, которые вы получаете

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