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

 

기본적으로 특정 시간, 특히 23:00 GMT+2에 두 개의 보류 주문을 설정했습니다. 보류 중인 주문 중 하나는 매도 스탑이고 다른 하나는 매수 스탑입니다. 두 주문은 23:00 캔들(이 경우 14핍)에서 시작점까지 같은 거리에 있습니다. 둘 다 TakeProfit이 28핍(이 경우)이고 StopLoss가 55핍입니다.

이제 두 주문이 모두 완료되면(주문이 만료되기 전 23:00 양초에서 시가에서 14핍 상승 및 하락) 두 주문의 이익실현 이 예를 들어 20핍 증가하기를 원합니다. . 따라서 이 경우 새로운 테이크 이익은 58핍입니다. 그러나 정지 손실은 전체적으로 동일하게 유지되어야 합니다. 본질적으로 내가 하려고 하는 것은 일종의 헤징(hedging)입니다.

두 거래가 열리면 가격이 한 방향으로 꽤 갈 것이므로 두 거래의 이익실현이 증가하면 손실을 상쇄하기에 충분합니다. 이익을 얻으려면 한 거래만 열리고 이익 실현에 도달하거나 두 거래가 모두 열리고 한 방향으로 멀리 가지 않고 이익 실현에 도달합니다.

이것이 명확하기를 바랍니다. 그렇지 않은 경우 더 명확해야 하는 사진을 제공하겠습니다.

 
WHRoeder :

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

매드맥스3 2012.03.09 14:52
전체 EA에 대한 수정된 코드는 다음과 같습니다.
내가 말한 문제를 여전히 보여줍니다.
코드의 그 부분은 내가 생각하는 EA의 다른 부분에 대한 것입니다. 보류 중인 주문을 여는 부분이 수정하려는 부분에 전혀 영향을 미치지 않을까요? 죄송합니다. 특히 원본 게시물에서 코드의 일부를 혼동한 것 같습니다. 그러나 나는 특별히 필요한 코드 부분에 대해 언급한 것을 수행했습니다.
 
madmax3 :

이것이 명확하기를 바랍니다. 그렇지 않은 경우 더 명확해야 하는 사진을 제공하겠습니다.

분명합니다. 감사합니다.

따라서 이 주문을 한 번만 수정하면 됩니다. . . 그러면 답은 간단합니다. 23:00 막대를 확인 하고 주문이 열렸어야 하는 TP를 결정해야 합니다. . . 주문이 동일한 TP에 있으면 수정이 필요하고, 동일한 TP에 있지 않으면 이미 수정된 것이므로 다시 수정할 필요가 없습니다. . . 단순한.

 
RaptorUK :

분명합니다. 감사합니다.

따라서 이 주문을 한 번만 수정하면 됩니다. . . 그러면 답은 간단합니다. 23:00 막대를 확인하고 주문이 열렸어야 하는 TP를 결정해야 합니다. . . 주문이 동일한 TP에 있으면 수정이 필요하고, 동일한 TP에 있지 않으면 이미 수정된 것이므로 다시 수정할 필요가 없습니다. . . 단순한.

수정 및 확인은 두 개의 거래가 열린 경우에만 발생해야 합니다. 이 작업을 수행하려면 어떻게 해야 합니까? 이미 가지고 있는 코드에 추가해야 합니까 아니면 다시 시작해야 합니까?

따라서 본질적으로 두 가지 거래(동일한 심볼과 매직 넘버)가 있는 경우 EA는 기존의 보류 중인 주문(현재 실행됨)과 비교하여 열린 거래의 이익실현 을 확인한 다음 동일하면 다음과 같아야 합니다. 변경되고 반복되면 다시 확인하여 동일하지 않으므로 거래를 더 이상 수정하지 않을 것입니다.
 
madmax3 :
1. 수정과 확인은 2개의 거래가 열려있을 때만 이루어져야 하는데 어떻게 해야 하나요? 이미 가지고 있는 코드에 추가해야 합니까 아니면 다시 시작해야 합니까?

2. 따라서 본질적으로 두 개의 거래(동일한 심볼과 매직 넘버)가 있는 경우 EA는 기존의 보류 중인 주문(현재 실행됨)과 비교하여 열린 거래의 이익실현을 확인한 다음 동일하면 변경해야 하며, 루프가 반복되면 다시 확인하여 동일하지 않은지 확인하므로 거래를 더 이상 수정하지 않습니까?

1. 미결 주문을 순환하고, 기호, 매직 넘버를 확인하고, 미결 주문 유형 이 아닌 일치 항목이 있을 때 카운터를 증가시킵니다. . . 2를 셀 경우 주문 확인을 완료하면 올바른 기호와 매직 번호에 대해 2개의 미결 주문이 있습니다. . . . 이제 수정할 수 있습니다. . . 2 참조.

2. 아니오, 활성화되어 더 이상 보류 중이 아닌 경우 보류 중인 주문의 TP를 볼 수 없습니다. EA는 23:00 막대를 확인하고 원래의 TP 무엇인지 알아내야 합니다. . . 그런 다음 이를 2개의 미결 주문의 TP와 비교합니다. . . . 이 정보에서 수정 여부를 결정할 수 있습니다.

 
RaptorUK :

1. 미결 주문을 순환하고, 기호, 매직 넘버를 확인하고, 미결 주문 유형이 아닌 일치 항목이 있을 때 카운터를 증가시킵니다. . . 2를 셀 경우 주문 확인을 완료하면 올바른 기호와 매직 번호에 대해 2개의 미결 주문이 있습니다. . . . 이제 수정할 수 있습니다. . . 2 참조.

2. 아니오, 활성화되어 더 이상 보류 중이 아닌 경우 보류 중인 주문의 TP를 볼 수 없습니다. EA는 23:00 막대를 확인하고 원래의 TP 무엇인지 알아내야 합니다. . . 그런 다음 이를 2개의 미결 주문의 TP와 비교합니다. . . . 이 정보에서 수정 여부를 결정할 수 있습니다.

아, 알겠습니다. 이것이 제가 줄곧 노력해 온 것입니다. 지금까지 주문 중 하나가 수정되었지만(특히 내 테스트에서 주문 2인 구매 주문) 계속 수정됩니다. '중단'을 사용하여 반복되지 않도록 해야 합니까? 또한 2개의 미결 주문만 있을 때 미결 주문을 계산하고 수정하려면 어떻게 해야 합니까? 나는 이것을 위해 OrdersTotal()을 사용하려고 시도했지만 제대로 작동하지 않습니다. 각 주문에 대해 두 개의 개별 코드를 만들 필요가 없다고 생각합니다. 맞습니까?
짝수 번호의 열린 주문만 수정되고 반복적으로 수정된다고 말했듯이 OrderSelect()에 대해 다양한 조합을 시도했지만 여전히 이해할 수 없습니다. 이 EA는 거의 완료되었으므로 그냥 끝내고 싶습니다. 나는 이것을 읽었습니다 https://book.mql4.com/trading/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_BUY)
    ){ OrderModify ( OrderTicket (), OrderOpenPrice (), OrderStopLoss (),Ask+((TakeProfit+ 20 )* Point ), 0 , Blue );}
     return ( 0 );
    
   if (
         OrderSelect (iPos- 1 , SELECT_BY_POS- 1 )                    
    &&   OrderMagicNumber ()  == MagicNumber                
    &&   OrderSymbol ()       == "EURUSD"                 
    && ( OrderType () == OP_SELL)
    ){ OrderModify ( OrderTicket (), OrderOpenPrice (), OrderStopLoss (),Ask+((TakeProfit- 20 )* Point ), 0 , Blue );}
return ( 0 );
  }

TP가 23:00 캔들과 같은지 확인하려면 어떻게 해야 하나요? 열린 주문이 2개 있을 때 수정되는 한 동일한 효과를 얻을 수 있기 때문에 그렇게 필요할까요? 아니면 계속해서 수정되는 주문을 멈추기 위한 것입니까? 예, 문서를 확인했습니다.

감사해요,

매드맥스3

 

두 번째 주문이 수정되기 전에 return(0)으로 인해 start()에서 빠져 나옵니다.

현재 하고 있는 일은 Order by position을 선택하고, 올바른 Magic number가 있는지 확인하고, 올바른 기호인지 확인하고, OP_BUY인지 확인하는 것입니다. . . . 그런 다음 수정합니다. 이미 수정되었는지 여부를 어디에서 결정합니까?

당신 EA 는 중단 에서 복구할 수 있어야 합니다 . .. 주문이 접수되고 MT4가 충돌하는 경우 다시 시작할 때 중단된 위치에서 다시 시작할 수 있어야 합니다.

이것이 주문이 이미 수정되었거나 수정이 필요한지 여부를 결정해야 하는 이유입니다. . . 어떻게 ?

" 특정 시간, 특히 23:00 GMT+2에 두 개의 보류 중인 주문 을 설정했습니다. 보류 중인 주문 중 하나는 매도 스탑이고 다른 하나는 바이 스탑입니다. 두 주문은 모두 오픈에서 동일한 거리에 떨어져 있습니다. 23:00 양초, 이 경우 14핍. 둘 다 TakeProfit은 28핍(이 경우)이고 StopLoss는 55핍입니다. "

23:00 캔들을 참조하여 원래 TP가 어디에 있었는지 계산하고 주문을 확인하고 여전히 원래 TP로 설정되어 있는지 확인할 수 있습니다. 그렇다면 수정할 수 있습니다. . . 그렇지 않은 경우 이미 수정되었으므로 다시 수정하지 마십시오.

주문이 수정되었음을 기록하는 다른 방법이 있습니다. 티켓 번호를 추적합니다. 수정되었을 때 파일에 정보를 기록하고, 다시 수정하려고 할 때 파일을 열고 티켓 번호를 확인하는 등 . . . 원래 TP와 비교하는 것이 훨씬 간단하다고 생각합니다.

 

지금까지 나는 이것을 가지고,

 //+------------------------------------------------------------------+
//|                                                  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 ; 
        
    
}
//---------------------------------------------------------------

 int Handle,                         // File descriptor
   Qnt_Symb;                           // Number of recorded symbols
   string File_Name= "check.csv" ;         // File name
   
    Handle= FileOpen (File_Name, FILE_CSV | FILE_WRITE | FILE_READ , ";" ); //File opening
   

         FileWrite (Handle, "Ticket" , "Magic" , "OTime" , "Type" , "Lots" , "Symbol" , "OPrice" , "S/L" , "T/P" ); 
         
           for ( int iPos = OrdersTotal ()- 1 ; iPos >= 1 ; iPos--)
      {       
       OrderSelect (iPos,SELECT_BY_POS) ;
       FileWrite (
         Handle,
         OrderTicket (),                 //int
         OrderMagicNumber (),           //int
         TimeToStr ( OrderOpenTime ()),   //datetime
         
         OrderLots (),                   //double
         OrderSymbol (),                 //string
         OrderOpenPrice (),             //double
         OrderStopLoss (),               //double
         OrderTakeProfit (),             //double
         TimeToStr ( OrderCloseTime ())   //int
       
        ) ; //end file write
           }   }
           
}
//---------------------------------------------------------------   
 
     
     
   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.

위에 포함된 파일 작성 코드는,

 //---------------------------------------------------------------

 int Handle,                         // File descriptor
   Qnt_Symb;                           // Number of recorded symbols
   string File_Name= "check.csv" ;         // File name
   
    Handle= FileOpen (File_Name, FILE_CSV | FILE_WRITE | FILE_READ , ";" ); //File opening
   

         FileWrite (Handle, "Ticket" , "Magic" , "OTime" , "Type" , "Lots" , "Symbol" , "OPrice" , "S/L" , "T/P" ); 
         
           for ( int iPos = OrdersTotal ()- 1 ; iPos >= 1 ; iPos--)
      {       
       OrderSelect (iPos,SELECT_BY_POS) ;
       FileWrite (
         Handle,
         OrderTicket (),                 //int
         OrderMagicNumber (),           //int
         TimeToStr ( OrderOpenTime ()),   //datetime
         
         OrderLots (),                   //double
         OrderSymbol (),                 //string
         OrderOpenPrice (),             //double
         OrderStopLoss (),               //double
         OrderTakeProfit (),             //double
         TimeToStr ( OrderCloseTime ())   //int
       
        ) ; //end file write
          	FileClose(Handle); }   }
           
}
//---------------------------------------------------------------   

그러나 이러한 오류가 발생합니다.

2012.04.04 15:30:06 2012.01.16 06:25 TimeBasedEA 버전 2: FileOpen - 열린 파일 이 너무 많습니다.

2012.04.04 15:30:06 2012.01.16 06:25 TimeBasedEA 버전 2: FileWrite의 잘못된 핸들 -1

무슨 일이야?

 

도대체 왜 당신은 두 가지 옵션 중 가장 어려운 것을 선택했습니까?

파일 쓰기가 끝나면 파일을 닫아야 합니다. . . 이미 열려 있으면 다시 열 필요가 없습니다.

 //---------------------------------------------------------------

int Handle,                         // File descriptor
    Qnt_Symb;                           // Number of recorded symbols
string File_Name= "check.csv" ;         // File name
   
Handle= FileOpen (File_Name, FILE_CSV | FILE_WRITE | FILE_READ , ";" ); //File opening     File opened here, outside the loop
   

FileWrite (Handle, "Ticket" , "Magic" , "OTime" , "Type" , "Lots" , "Symbol" , "OPrice" , "S/L" , "T/P" ); 
         
for ( int iPos = OrdersTotal ()- 1 ; iPos >= 1 ; iPos--)
   {       
   OrderSelect (iPos,SELECT_BY_POS);
   FileWrite (
         Handle,
         OrderTicket (),                 //int
         OrderMagicNumber (),           //int
         TimeToStr ( OrderOpenTime ()),   //datetime   //  this is a string - Time  to  String
         
         OrderLots (),                   //double
         OrderSymbol (),                 //string
         OrderOpenPrice (),             //double
         OrderStopLoss (),               //double
         OrderTakeProfit (),             //double
         TimeToStr ( OrderCloseTime () )   //int     //  this is a string - Time  to  String
       
        ) ; //end file write

   FileClose (Handle);       //  why close the file inside the loop when it was opened outside the loop ?
   }   
}    //  what is this code inside of ?
           
}  // end of start
//--------------------------------------------------------------- 

for 루프가 잘못되었습니다. . . 마지막 주문 위치는 1 이 아닌 0 입니다.

 
RaptorUK :

도대체 왜 당신은 두 가지 옵션 중 가장 어려운 것을 선택했습니까?

파일을 이용하여 수정 및 확인 하는 방식이 아닌가요? 아니면 수정(마지막 수정 이전의 내 게시물)과 파일 코드(추가 수정이 발생하지 않도록 하기 위한 것)의 두 코드를 모두 결합해야 합니까?