EA에 필요한 단순 코드(2개의 미결 주문 수정)

 

나는 특정 기호의 두 거래가 열려 있을 때 두 거래의 이익실현을 수정하는 코드를 작성하려고 했습니다. 본질적으로,

OrdersTotal=2인 경우

다양한 OrderSelect 기능 을 시도했지만 작동하지 않는 것 같습니다. 누구든지 이런 종류의 작업을 실행하는 데 필요한 코드를 제공할 수 있습니까?

감사해요,

매드맥스3

 
작동하지 않는 코드를 보여주세요. . . 그것은 당신이 배우는 가장 좋은 방법입니다.
 
 int total= OrdersTotal ();
 if (total> 1 )
                   OrderSelect (total+ 1 , SELECT_BY_POS, MODE_TRADES);
                   
   if ( OrderType ()==OP_BUY)  
   OrderModify ( OrderTicket (), OrderOpenPrice (), OrderStopLoss (),Ask+((TakeProfit+ 20 )* Point ), 0 , Blue );
   
   if ( OrderType ()==OP_SELL)
   OrderModify ( OrderTicket (), OrderOpenPrice (), OrderStopLoss (),Ask+((TakeProfit- 20 )* Point ), 0 , Blue );

제가 사용한 코드입니다.

저도 이거 써봤는데,

   string Symb= Symbol ();                         // Symbol
//------------------------------------------------------------------------------- 2 --
   for ( int i= 1 ; i<= OrdersTotal (); i++)           // Cycle searching in orders
     {
       if ( OrderSelect (i- 1 ,SELECT_BY_POS)==true) // If the next is available
        {                                       // Analysis of orders:
         int Tip= OrderType ();                   // Order type
         if ( OrderSymbol ()!=Symb||Tip> 1 ) continue ; // The order is not "ours"
         double SL= OrderStopLoss ();             // SL of the selected order
         double TP    = OrderTakeProfit ();
         {TP=Ask+(TakeProfit+ 20 * Point );

이것은 전체 EA( 업데이트됨 )입니다.

//+------------------------------------------------------------------+
//|                                                  TimeBasedEA.mq4 |
//|                      Copyright © 2008, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
//changed by:       "forex4capital@yahoo.ca"
//changed again by: madmax3

// Time frame: M5 and higher

extern int      MagicNumber = 20080122 ;
extern double DistancefromAsk;
extern double DistancefromBid;
extern double   TakeProfit  = 28 ;
extern double   StopLoss    = 55 ;
extern double   Lots        = 0.1 ;
extern int      StartHour   = 2300 ;       // Open Trade time
extern bool     OpenBuy     = true;
extern bool     OpenSell    = true;
extern int      NumBuys     = 1 ;
extern int      NumSells    = 1 ;
extern int      Slippage    = 2 ;

//+------------------------------------------------------------------+
//|                        S T A R T                                 |
//+------------------------------------------------------------------+
int start()
  {
   int cnt, ticket, total;
       if ( TimeDayOfWeek ( TimeCurrent ())== 5 && TimeCurrent ()>= StrToTime ( "22:59" )) { CloseAll(); return ( 0 ); }
   int ct;
//-------------------------------------+
   if ( Bars < 100 )
     {
       Print ( "bars less than 100" );
       return ( 0 );  
     }
//-------------------------------------+

//-------------------------------------+
   if (TakeProfit< 10 )
     {
       Print ( "TakeProfit less than 10" );
       return ( 0 );   // check TakeProfit
     }
//-------------------------------------+

   ct = Hour () * 100 + Minute ();
   total= OrdersTotal ();
   if (total< 1 ) 
     {
       // no opened orders identified
       if ( AccountFreeMargin ()<( 1000 *Lots))
        {
         Print ( "We have no money. Free Margin = " , AccountFreeMargin ());
         return ( 0 );  
        }
       // check for long position (BUY) possibility
       if (ct == StartHour && Close[ 1 ]>Open[ 1 ] && OpenBuy)
       //if(ct == StartHour && High[1]<Open[0] && OpenBuy)
        {
         for ( cnt = 0 ; cnt < NumBuys; cnt++)
         {
           ticket= OrderSend ( Symbol (),OP_BUYSTOP,Lots,Ask+(DistancefromAsk* Point ),Slippage,Bid-(StopLoss* Point ),Ask+(TakeProfit* Point ), "" ,MagicNumber, TimeCurrent ()+ 39600 , CLR_NONE );
           ticket= OrderSend ( Symbol (),OP_SELLSTOP,Lots,Bid-(DistancefromBid* Point ),Slippage,Ask+(StopLoss* Point ),Bid-(TakeProfit* Point ), "" ,MagicNumber, TimeCurrent ()+ 39600 , CLR_NONE ); 
           if (ticket> 0 )
           {
             if ( OrderSelect (ticket,SELECT_BY_TICKET,MODE_TRADES)) Print ( "BUY order opened : " , OrderOpenPrice ());
           }

          
           else Print ( "Error opening BUY order : " , GetLastError ()); 
           

         }
         return ; 
        }
       // check for short position (SELL) possibility
       if (ct == StartHour && Close[ 1 ]<Open[ 1 ] && OpenSell)
       //if(ct == StartHour && Low[1]>Open[0] && OpenSell)
        {
         for ( cnt = 0 ; cnt < NumSells; cnt++)
         {
           ticket= OrderSend ( Symbol (),OP_SELLSTOP,Lots,Bid-(DistancefromAsk* Point ),Slippage,Ask+(StopLoss* Point ),Bid-(TakeProfit* Point ), "" ,MagicNumber, TimeCurrent ()+ 39600 , CLR_NONE );
           ticket= OrderSend ( Symbol (),OP_BUYSTOP,Lots,Ask+(DistancefromBid* Point ),Slippage,Bid-(StopLoss* Point ),Ask+(TakeProfit* Point ), "" ,MagicNumber, TimeCurrent ()+ 39600 , CLR_NONE );
           if (ticket> 0 )
           {
             if ( OrderSelect (ticket,SELECT_BY_TICKET,MODE_TRADES)) Print ( "SELL order opened : " , OrderOpenPrice ());
           }
           else Print ( "Error opening SELL order : " , GetLastError ());
         } 
         return ; 
        
    
}

     }
 
     for ( int iPos = OrdersTotal ()- 1 ; iPos >= 0 ; iPos--) if (
         OrderSelect (iPos, SELECT_BY_POS)                     // Only my orders w/
    &&   OrderMagicNumber ()  == MagicNumber                 // my magic number
    &&   OrderSymbol ()       == "EURUSD"                  // and my pair.
    ){ OrderModify ( OrderTicket (), OrderOpenPrice (), OrderStopLoss (),Ask+((TakeProfit+ 20 )* Point ), 0 , Blue );
       if (! OrderSelect (iPos, SELECT_BY_POS))
   Alert ( "OrderSelect failed: " , GetLastError ());}


   return ( 0 );
  }
  
  
  
   void CloseAll()
{
   for ( int cnt= OrdersTotal ()- 1 ;cnt>= 0 ;cnt--)
   {
       OrderSelect (cnt, SELECT_BY_POS, MODE_TRADES);
       if ( OrderMagicNumber ()!=MagicNumber) continue ;
         
       //
       //
       //
       //
       //
         
       if ( OrderType ()==OP_BUY || OrderType ()==OP_SELL)
      {
         for ( int c= 0 ; c< 3 ; c++)
         {
             RefreshRates ();
             if ( OrderType ()==OP_BUY)
                  { double cp = Bid;}  
             else   {        cp = Ask;}
               
             OrderClose ( OrderTicket (), OrderLots (),cp, 0 , Yellow );
               int err= GetLastError ();
               if (err== 4 || err== 136 || err== 137 || err== 138 || err== 146 )
               {
                   Sleep ( 5000 ); continue ;
               }  
               break ;                     
         }
         break ;
      }
   }





}

// the end.
 

코드의 첫 번째 비트에서. . . .

 OrderSelect (total+ 1 , SELECT_BY_POS, MODE_TRADES);

여기에서 존재하지 않는 주문을 선택하고 있습니다. 4개의 주문이 있는 경우 총 주문은 4가 되고 포지션 번호는 0, 1, 2 & 3이 됩니다. . . 위치 5를 선택했습니다. OrderSelect() 는 bool을 반환합니다. 이 반환 값을 확인했다면 그것이 거짓 임을 알았을 것이고 무언가 잘못되었다는 것을 알았을 것입니다.

 

코드의 두 번째 비트는 문제가 없는 한 괜찮아 보입니다. . . . 왜 이 줄의 시작 부분에 { 가 있습니까?

{  TP=Ask+(TakeProfit+ 20 * Point );
 
RaptorUK :

코드의 첫 번째 비트에서. . . .

여기에서 존재하지 않는 주문을 선택하고 있습니다. 4개의 주문이 있는 경우 총 주문은 4가 되고 포지션 번호는 0, 1, 2 & 3이 됩니다. . . 위치 5를 선택했습니다. OrderSelect() 는 bool을 반환합니다. 이 반환 값을 확인했다면 그것이 거짓 임을 알았을 것이고 무언가 잘못되었다는 것을 알았을 것입니다.


반환 값은 어떻게 확인합니까? 저널에서 그것을 찾을 수 없습니다. btw 저는 MQL의 멍청한 놈입니다. 나는 단지 내가 보는 코드를 이해하려고 노력합니다.

주문 선택에 관해서는 여러 가지 다른 번호를 시도했지만 여전히 작동하지 않으며 자체적으로 '합계'도 시도했습니다. 두 가지 주문을 선택하려면 어떻게 해야 합니까?

감사해요,

매드맥스3

 

아, 왜 { 거기에 있었는지 모르겠습니다. 실수, 지금 제거 했습니다.

두 번째 코드를 개발하려면 어떻게 해야 합니까?

 
  1. madmax3 :
    반환 값은 어떻게 확인합니까?
     if (! OrderSelect (...))
       Alert ( "OrderSelect failed: " , GetLastError ());

  2.  int total= OrdersTotal ();
     if (total> 1 )
    이로 인해 EA는 다른 차트 및 수동 거래 를 포함하여 서로 호환되지 않습니다.
         for ( int iPos = OrdersTotal ()- 1 ; iPos >= 0 ; iPos--) if (
             OrderSelect (iPos, SELECT_BY_POS)                     // Only my orders w/
        &&   OrderMagicNumber ()  == Magic.Number                 // my magic number
        &&   OrderSymbol ()       == chart.symbol                 // and my pair.
        ){
            :

 

좋아, 나는 지금까지 이것을 가지고있다.

 for ( int iPos = OrdersTotal ()- 1 ; iPos >= 0 ; iPos--) if (
         OrderSelect (iPos, SELECT_BY_POS)                     // Only my orders w/
    &&   OrderMagicNumber ()  == MagicNumber                 // my magic number
    &&   OrderSymbol ()       == "EURUSD"                  // and my pair.
    ){ OrderModify ( OrderTicket (), OrderOpenPrice (), OrderStopLoss (),Ask+((TakeProfit+ 20 )* Point ), 0 , Blue );
       if (! OrderSelect (iPos, SELECT_BY_POS))
   Alert ( "OrderSelect failed: " , GetLastError ());}

첫 번째 줄에서 다양한 번호를 시도했지만 EA는 이제 미결 주문을 수정하는 데 필요한 동안 보류 중인 주문을 수정하는 것으로 보이며 두 가지가 있는 경우에만 미결 주문을 수정합니다. 또한 계속해서 순서를 수정하는 것 같습니다.

또한 EA는 다음과 같이 작동합니다.

  • 특정 시간에 먼저 두 개의 보류 주문(매도 및 매수 정지)을 배치합니다.
  • 주문이 이행되지 않으면 특정 시간에 만료됩니다.
  • 두 주문이 모두 열리면 두 열린 거래의 이익 실현을 수정해야 합니다.
이미 열린 거래를 수정하려면 OrderSelect를 수정해야 합니까?
 
madmax3 :

좋아, 나는 지금까지 이것을 가지고있다.

첫 번째 줄에서 다양한 번호를 시도했지만 EA는 이제 미결 주문을 수정하는 데 필요한 동안 보류 중인 주문을 수정하는 것으로 보이며 두 가지가 있는 경우에만 미결 주문을 수정합니다. 또한 계속해서 순서를 수정하는 것 같습니다.

또한 EA는 다음과 같이 작동합니다.

  • 특정 시간에 먼저 두 개의 보류 주문(매도 및 매수 정지)을 배치합니다.
  • 주문이 이행되지 않으면 특정 시간에 만료됩니다.
  • 두 주문이 모두 열리면 두 열린 거래의 이익실현을 수정해야 합니다.

그런 다음 OrderType()도 선택합니다.
 
//+------------------------------------------------------------------+
//|                                                  TimeBasedEA.mq4 |
//|                      Copyright © 2008, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
//changed by:       "forex4capital@yahoo.ca"
//changed again by: madmax3

// Time frame: M5 and higher

extern int     MagicNumber = 20080122;
extern double DistancefromAsk;
extern double DistancefromBid;
extern double  TakeProfit  = 28;
extern double  StopLoss    = 55;
extern double  Lots        = 0.1;
extern int     StartHour   = 2300;      // Open Trade time
extern bool    OpenBuy     = true;
extern bool    OpenSell    = true;
extern int     NumBuys     = 1;
extern int     NumSells    = 1;
extern int     Slippage    = 2;

//+------------------------------------------------------------------+
//|                        S T A R T                                 |
//+------------------------------------------------------------------+
int start()
  {
   int cnt, ticket, total;
      if (TimeDayOfWeek(TimeCurrent())==5 && TimeCurrent()>=StrToTime("22:59")) { CloseAll(); return(0); }
   int ct;
//-------------------------------------+
   if(Bars<100)
     {
      Print("bars less than 100");
      return(0);  
     }
//-------------------------------------+

//-------------------------------------+
   if(TakeProfit<10)
     {
      Print("TakeProfit less than 10");
      return(0);  // check TakeProfit
     }
//-------------------------------------+

   ct = Hour() * 100 + Minute();
   total=OrdersTotal();
   if(total<1) 
     {
      // no opened orders identified
      if(AccountFreeMargin()<(1000*Lots))
        {
         Print("We have no money. Free Margin = ", AccountFreeMargin());
         return(0);  
        }
      // check for long position (BUY) possibility
      if(ct == StartHour && Close[1]>Open[1] && OpenBuy)
      //if(ct == StartHour && High[1]<Open[0] && OpenBuy)
        {
         for ( cnt = 0; cnt < NumBuys; cnt++)
         {
           ticket=OrderSend(Symbol(),OP_BUYSTOP,Lots,Ask+(DistancefromAsk*Point),Slippage,Bid-(StopLoss*Point),Ask+(TakeProfit*Point),"",MagicNumber,TimeCurrent()+39600,CLR_NONE);
           ticket=OrderSend(Symbol(),OP_SELLSTOP,Lots,Bid-(DistancefromBid*Point),Slippage,Ask+(StopLoss*Point),Bid-(TakeProfit*Point),"",MagicNumber,TimeCurrent()+39600,CLR_NONE); 
           if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
           }

          
           else Print("Error opening BUY order : ",GetLastError()); 
           

         }
         return; 
        }
      // check for short position (SELL) possibility
      if(ct == StartHour && Close[1]<Open[1] && OpenSell)
      //if(ct == StartHour && Low[1]>Open[0] && OpenSell)
        {
         for ( cnt = 0; cnt < NumSells; cnt++)
         {
           ticket=OrderSend(Symbol(),OP_SELLSTOP,Lots,Bid-(DistancefromAsk*Point),Slippage,Ask+(StopLoss*Point),Bid-(TakeProfit*Point),"",MagicNumber,TimeCurrent()+39600,CLR_NONE);
           ticket=OrderSend(Symbol(),OP_BUYSTOP,Lots,Ask+(DistancefromBid*Point),Slippage,Bid-(StopLoss*Point),Ask+(TakeProfit*Point),"",MagicNumber,TimeCurrent()+39600,CLR_NONE);
           if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());
           }
           else Print("Error opening SELL order : ",GetLastError());
         } 
         return; 
        }
        for (int i =1; i < OrdersTotal(); i++) {
    if(OrderSelect(i+1, SELECT_BY_POS, MODE_TRADES)) {
        OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit+20)*Point),0,Blue);
    }
}

     }
 


   return(0);
  }
  
  void CloseAll()
{
   for(int cnt=OrdersTotal()-1;cnt>=0;cnt--)
   {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if (OrderMagicNumber()!=MagicNumber) continue;
         
      //
      //
      //
      //
      //
         
      if (OrderType()==OP_BUY || OrderType()==OP_SELL)
      {
         for(int c=0; c<3; c++)
         {
            RefreshRates();
            if (OrderType()==OP_BUY)
                  { double cp = Bid;}  
            else  {        cp = Ask;}
               
            OrderClose(OrderTicket(),OrderLots(),cp,0,Yellow);
               int err=GetLastError();
               if(err==4 || err==136 || err==137 || err==138 || err==146)
               {
                  Sleep(5000); continue;
               }  
               break;                     
         }
         break;
      }
   }
 { 
 int total=OrdersTotal();
 if(total>1)
                   OrderSelect(total+1, SELECT_BY_POS, MODE_TRADES);
                   
   if(OrderType()==OP_BUY)  
   OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit+20)*Point),0,Blue);
   
   if(OrderType()==OP_SELL)
   OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit-20)*Point),0,Blue);

} 

}



// the end.


	          
사유: