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

 
kwng111 :


죄송합니다 kwng 귀하의 게시물이 madmax3에 대한 솔루션이 아닌 것으로 보입니다.

void CloseAll()이라는 함수()에서 거래를 수정할 필요가 없습니다.
또한 OrderSymbol( ) 및 OrderMagicNumber( )를 선택해야 합니다.

그리고 프로그램의 이 부분에서

        }
         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 );
    }
}

보류 중인 거래는 계속 수정됩니다.

 

전체 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.

CloseAll() 함수는 거래가 너무 오래 지속되는 경우 지정된 시간에 거래를 마감하기 위해 존재합니다.

코드의 이 부분은 내가 알아내려고 하는 것의 수정된 부분입니다.
(MagicNumber와 Symbol이 있는 것을 볼 수 있지만 보류 중인 주문 만 수정 중입니다)

     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 ());}
 
deVries :
         }
         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 );
    }
}

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

어제 선택이 작동하지 않는다고 들었습니다 . 그리고 반환 코드와 총계를 테스트 해야 합니다.

게시물을 읽고 코드를 수정하는 것을 귀찮게하지 않으려면 우리는 귀찮게 시도하고 도움을주지 않을 것입니다.

 
WHRoeder :

어제 선택이 작동하지 않는다고 들었습니다 . 그리고 반환 코드와 총계를 테스트 해야 합니다.

게시물을 읽고 코드를 수정하는 것을 귀찮게하지 않으려면 우리는 귀찮게 시도하고 도움을주지 않을 것입니다.


나는 위의 두 가지를 모두 수행했는데, 당신은 내가 생각하는 잘못된 사람을 언급하고 있습니다. 저는 deVries가 아닌 원래 포스터이며 코드를 다음과 같이 변경했습니다(이전에 게시됨).

   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 ());}

이제 문제는 미결 주문만 수정하고 동일한 기호에서 두 개의 미결 주문이 동시에 열려 실행 중인 경우에만 보류 중인 주문을 수정한다는 것입니다. 나는 다른 숫자 조합과 OrderSelect 숫자를 시도했지만 여전히 이것에 어리둥절합니다.

 
madmax3 :


나는 위의 두 가지를 모두 수행했는데, 당신은 내가 생각하는 잘못된 사람을 언급하고 있습니다. 저는 deVries가 아닌 원래 포스터이며 코드를 다음과 같이 변경했습니다(이전에 게시됨).

이제 문제는 미결 주문만 수정하고 동일한 기호에서 두 개의 미결 주문이 동시에 열려 실행 중인 경우에만 보류 중인 주문을 수정한다는 것입니다. 나는 다른 숫자 조합과 OrderSelect 숫자를 시도했지만 여전히 이것에 어리둥절합니다.

따라서 열려 있는 주문을 반복해야 하며 위와 같이 Symbol 및 MagicNumber를 확인해야 합니다. . . 그러나 OrderType() <= OP_SELL 도 확인해야 합니다 . . . 2인 경우 일치하는 주문을 계산합니다. . . 그런 다음 다시 루프하고 OrderModify().

배우게 될 유일한 방법은 각 기능에 대한 설명서를 읽고 어떻게 작동하는지 이해하는 것입니다. . . 예: 주문 유형()

 

다양한 코드를 시도했지만 여전히 정확하게 작동하지 않습니다. 두 개의 거래가 열려 있을 때 열린 거래 중 하나를 수정하고 계속 수정합니다. 한 번만 수정하면 되며 두 거래 모두 수정해야 합니다.

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


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



   return ( 0 );
  }}

내가해야 할 일에 대한 제안 사항이 있습니까? 나는 문서 btw를 읽었습니다.

 
주문이 수정되기 전과 수정된 후의 차이점은 무엇입니까? 어떤 변화?
 

처음 두 개의 주문이 설정되고 그 중 하나(이 경우 특정 날짜를 테스트했을 때 판매)가 실행됩니다. 나중에 (아직 존재하는) 두 번째 주문이 실행되고 이 거래는 매수입니다.
매도는 주문 1이고 매수는 주문 2입니다. 매수(주문 2)의 TakeProfit은 16.3핍 수정되었습니다(20핍을 추가하지 않는 이유는 잘 모르겠습니다). 그러면 TakeProfit은 같은 값에서 0.2핍 증가합니다. 분, 그리고 이런 일이 계속 발생하면 TakeProfit은 하루 종일 지속적으로 수정되고 때로는 증가하고 때로는 감소하지만 왜 이런 일이 발생하는지 확실하지 않습니다.

편집: 16.3핍 및 추가 변경 사항도 스프레드의 영향을 받는다고 생각합니까?

 
좋아, 처음으로 돌아갈 수 있을까? . . . 두 개의 주문을 수정하려고 한다는 것을 알고 있습니다. . . 하지만 정확히 무엇을 하려고 합니까? 테일링 SL? 다른 것 ? 당신은 무엇을 달성하려고합니까?
 
매드맥스3 2012.03.09 15:06
WHR로더 :

어제 선택이 작동하지 않는다고 들었습니다 . 반환 코드와 총계를 테스트 해야 합니다.

게시물을 읽고 코드를 수정하는 것을 귀찮게하지 않으려면 우리는 귀찮게 시도하고 도움을주지 않을 것입니다.


나는 위의 두 가지를 모두 수행했습니다. 당신은 잘못된 사람을 언급하고 있습니다.

나는 당신의 직접적인 이전 게시물 을 참조했습니다

매드맥스3 2012.03.09 14:52
전체 EA에 대한 수정된 코드는 다음과 같습니다.
   total= OrdersTotal ();
   if (total< 1 ) 
내가 말한 문제를 여전히 보여줍니다.