절반 부지를 폐쇄합니다. - 페이지 18

 


좋아 (업데이트!) 그래서 기본적으로 "반반 등"의 연속 닫기를 제거했습니다. 두 번째 OrderClose( ) 가 호출될 때 제비에 그리고 성공했다. "Close_Half_Order_Buy==True"도 작동하지 않습니다...

이것을 끝내기 위해 누군가의 도움을 받고 싶습니다 :)

(코드의 핵심을 명확하게 하기 위해 많은 "인쇄물"을 제거했습니다.)

 //+--------------------------------------------------------------------------------------------------+
//| Close OP_BUY Half lots @ 1:1 Function                                                            |
//+--------------------------------------------------------------------------------------------------+
void CloseHalfOrder()
{   
   
   static datetime partclosedonce;
   static datetime partclosedtwice; 
   
   double minLot=MarketInfo( Symbol (),MODE_MINLOT);

   double lotStep=MarketInfo( Symbol (),MODE_LOTSTEP);

   double half= MathFloor (OrderLots()/ 2 /lotStep)*lotStep;
   
   double EMA_Bar = iClose( NULL , PERIOD_H1 , 1 );
   double EMA_MA = iMA ( Symbol (), 60 , 21 , 0 , 1 , 0 , 0 );

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

       double FirstTarget_Buy = OrderOpenPrice()+(( OrderTakeProfit()-OrderOpenPrice())/ 2 );
      	Print ( "FirstTarget_Buy: " ,DoubleToStr(FirstTarget_Buy, Digits ));
      
       if (OrderMagicNumber()==MagicNumber)
         if (OrderSymbol()== Symbol ())
             if (OrderLots()>minLot)
               if (OrderOpenTime() != partclosedonce)
            {
            
             if (OrderType()==OP_BUY && Bid >= FirstTarget_Buy+( Point / 2 )) 
               {
               bool Close_Half_Order_Buy=OrderClose(OrderTicket(),half,Bid, 5 ,Blue);
               if (Close_Half_Order_Buy!=TRUE) Print ( "Close_Half_Order_Buy Last Error = " , GetLastError ());
               }
            }
         
       if (Close_Half_Order_Buy==True && OrderOpenPrice() > OrderStopLoss())
         {
         MoveToBreakEven(); 
         }
           if (Close_Half_Order_Buy==True)
               {
               partclosedonce = OrderOpenTime();
               } 
      
      if(partclosedonce != partclosedtwice && OrderOpenTime() != partclosedtwice) // I dont want this to run UNLESS the first OrderClose() is successful.
         {
           if (OrderType()==OP_BUY && EMA_Bar < EMA_MA)
               {
               bool EMA_Buy_Close=OrderClose(OrderTicket(),half,Bid, 5 , CLR_NONE );
               if (EMA_Buy_Close!=TRUE) Print ( "EMA_Buy_Close Last Error = " , GetLastError ());
               if (EMA_Buy_Close==True)partclosedtwice = OrderOpenTime();
               }     
          }        
     }
}


	          
 
누구나?
 
DomGilberto :


좋아 (업데이트!) 그래서 기본적으로 "반반 등"의 연속 닫기를 제거했습니다. 두 번째 OrderClose()가 호출될 때 제비에 그리고 성공했다. "Close_Half_Order_Buy==True"도 작동하지 않습니다...

이것을 끝내기 위해 누군가의 도움을 받고 싶습니다 :)

다음 코드는 (MagicNumber 변수를 선언하고 MoveToBreakEven() 함수를 주석 처리하여) 컴파일되지만 테스트 되지 않았습니다 .

 //+--------------------------------------------------------------------------------------------------+
//| Close OP_BUY Half lots @ 1:1 Function                                                            |
//+--------------------------------------------------------------------------------------------------+
void CloseHalfOrder() {
   static bool FirstBuyTarget_hit = false , SecondBuyTarget_hit = false ;
   int ct = 0 ;
   double minLot = MarketInfo( Symbol (),MODE_MINLOT);
   double lotStep = MarketInfo( Symbol (),MODE_LOTSTEP);
   double EMA_Bar = iClose( NULL , PERIOD_H1 , 1 );
   double EMA_MA = iMA ( Symbol (), 60 , 21 , 0 , 1 , 0 , 0 );
        
   for ( int c = OrdersTotal () - 1 ; c >= 0 ; c--)
       if ( OrderSelect (c,SELECT_BY_POS))
         if (OrderSymbol() == Symbol () && OrderType() <= OP_SELL)
             if (OrderMagicNumber() == MagicNumber) {
               double half= MathFloor (OrderLots()/ 2 /lotStep)*lotStep;
               double FirstTarget_Buy = OrderOpenPrice() + ((OrderTakeProfit() - OrderOpenPrice()) / 2 );
               Print ( "FirstTarget_Buy: " , DoubleToStr(FirstTarget_Buy, Digits ));
                                        
               ct++;
                                        
               if (!FirstBuyTarget_hit)
                   if (OrderType() == OP_BUY && Bid >= FirstTarget_Buy + ( Point / 2 )) {
                     if (OrderClose(OrderTicket(),half,Bid, 5 ,Blue)) {
                        MoveToBreakEven();
                        FirstBuyTarget_hit = true ;
                         break ;
                     }
                     else
                         Print ( "Close_Half_Order_Buy Last Error = " , GetLastError ());
                  }
                                        
               if (FirstBuyTarget_hit && !SecondBuyTarget_hit) 
                   if (OrderType() == OP_BUY && EMA_Bar < EMA_MA) {
                     if (OrderClose(OrderTicket(),half,Bid, 5 , CLR_NONE ))
                        SecondBuyTarget_hit = true ;
                     else
                         Print ( "EMA_Buy_Close Last Error = " , GetLastError ());                    
                  }

               break ;
            }
   if (ct == 0 ) {
      FirstBuyTarget_hit = false ;
      SecondBuyTarget_hit = false ;
   }
}

위의 코드는 통화 쌍당 하나의 주문만 있다고 가정합니다.

 

Omg 도움을 주셔서 정말 감사합니다! 정말 감사합니다 :)

마지막으로 한 가지만 도와주시겠습니까? 현재 고정된 1:2 수익 목표(경성 TP)가 있습니다. 나는 실제로 이것을 순서에서 제거하고 싶습니다. 그러나 위에서 볼 수 있듯이 관련 OrderClose() 함수는 OrderTakeProfit()을 사용하여 OrderClose() 함수가 종료되어야 하는 위치를 계산합니다.

내 질문은 OrderTakeProfit() 가격을 저장하는 방법이 있지만 주문에서 고정하는 대신 OrderClose() @ OrderTakeProfit() 가격을 사용하여 정해진 양의 로트를 마감하고 싶습니까? 그 이유는 때때로 엄청난 이익을 얻을 수 있는 거래가 있기 때문입니다. 하지만 OrderTakeProfit()이 미결 주문으로 고정되어 있기 때문에 모든 로트가 닫히고 해당 출구에서 일부 로트만 부분적으로 닫고 싶습니다. 가격. 나는 큰 주자를 위해 후행 정지를 사용합니다 ... 그것이 의미가 있기를 바랍니다.

그게 다야! 그런 다음 작업을 완료하고 먼지를 제거합니다! 드디어!

업데이트: 위의 코드는 이를 작성하는 좋은 방법입니다. 나는 약간의 플레이를 했지만 정확한 순서로 닫히지 않았습니다. 그것은 여전히 먼저 오는 것의 절반을 닫습니다. 그것은 정적 datetime을 사용하기 전에 가지고 있던 것과 같은 종류입니까? 이견있는 사람?

 
(이 스레드를 다 쓴 느낌)

나는 말 그대로 위의 마지막 2개의 질문이 있고 이것이 완료되었습니까? 내가 알아야 할 것은 OrderTakeProfit() 가격을 어떻게 저장하여 수정할 때 정확한 가격을 사용하여 OrderClose()를 수행할 수 있다는 것뿐입니다. 정적 이중이 작동합니까?
 
DomGilberto :

업데이트: 위의 코드는 이를 작성하는 좋은 방법입니다. 나는 약간의 플레이를 했지만 정확한 순서로 닫히지 않았습니다. 그것은 여전히 먼저 오는 것의 절반을 닫습니다. 그것은 정적 datetime을 사용하기 전에 가지고 있던 것과 같은 종류입니까? 이견있는 사람?

위 코드에 대한 변경 사항을 게시하고 로그/저널 항목(또는 스크린샷)을 게시합니다.

 
DomGilberto :

Omg 도와주셔서 정말 감사합니다! 정말 감사합니다 :)

마지막으로 한 가지만 도와주시겠습니까? 현재 고정된 1:2 수익 목표(경성 TP)가 있습니다. 나는 실제로 이것을 순서에서 제거하고 싶습니다. 그러나 위에서 볼 수 있듯이 관련 OrderClose() 함수는 OrderTakeProfit()을 사용하여 OrderClose() 함수가 종료되어야 하는 위치를 계산합니다.

내 질문은 OrderTakeProfit() 가격을 저장하는 방법이 있지만 주문에서 고정하는 대신 OrderClose() @ OrderTakeProfit() 가격을 사용하여 정해진 양의 로트를 마감하고 싶습니까? 그 이유는 때때로 엄청난 이익을 얻을 수 있는 거래가 있기 때문입니다. 하지만 OrderTakeProfit()이 미결 주문으로 고정되어 있기 때문에 모든 로트가 닫히고 해당 출구에서 일부 로트만 부분적으로 닫고 싶습니다. 가격. 나는 큰 주자를 위해 후행 정지를 사용합니다 ... 그것이 의미가 있기를 바랍니다.

그게 다야! 그런 다음 작업을 완료하고 먼지를 제거합니다! 드디어!

업데이트: 위의 코드는 이를 작성하는 좋은 방법입니다. 나는 약간의 플레이를 했지만 정확한 순서로 닫히지 않았습니다. 그것은 여전히 먼저 오는 것의 절반을 닫습니다. 그것은 정적 datetime을 사용하기 전에 가지고 있던 것과 같은 종류입니까? 이견있는 사람?


이익 실현을 엄청난 수준으로 설정하고 OrderTakeProfit()을 사용하는 관련 OrderClose() 함수 를 계속 사용하여 OrderClose() 함수가 종료되어야 하는 위치를 계산할 수 있습니다. OrderClose() 함수가 종료되어야 하는 계산에서만 변경하십시오 .
 
deVries - 말 그대로 오늘 아침에 깨달았습니다... 다른 수정 사항을 추가하기 시작했습니다... 그리고 나서 첫 번째 주문이 접수될 때부터 바로 변경해야 한다는 것을 깨달았습니다...

열세 - 나는 그것을 전혀 변경하지 않았습니다. 내가 게시한 코드와 같은 방식으로 작동했지만 정적 datetime이 아닌 정적 bool을 사용하고 있습니까? 그것이 백 테스트를 실행할 때 내가 볼 수 있었던 유일한 실제 차이점입니까? 그 외에 이동 평균과 그 아래에 종가가 있는 두 번째 OrderClose() 함수 ; 다른 orderclose()보다 먼저 오는 경우 여전히 닫힙니다.
 
DomGilberto :

열세 - 나는 그것을 전혀 변경하지 않았습니다. 내가 게시한 코드와 같은 방식으로 작동했지만 정적 datetime이 아닌 정적 bool을 사용하고 있습니까? 그것이 백 테스트를 실행할 때 내가 볼 수 있었던 유일한 실제 차이점입니까? 그 외에 이동 평균과 그 아래에 종가가 있는 두 번째 OrderClose() 함수; 다른 orderclose()보다 먼저 오는 경우 여전히 닫힙니다.
물음표를 사용하여 저에게 묻는 것인지 강조 표시된 부분을 말씀하시는 것인지 잘 모르겠습니다. 테스터가 첫 번째 부분 마감보다 두 번째 부분 마감이 먼저 발생했다고 표시하는 경우 전략 테스터 가 생성한 로그/저널의 거래 결과를 게시하여 첫 번째 부분 마감 전에 두 번째 부분 마감(이동 평균)이 발생했음을 보여주세요.
 
Thirteen :
물음표를 사용하여 저에게 묻는 것인지 강조 표시된 부분을 말씀하시는 것인지 잘 모르겠습니다. 테스터가 첫 번째 부분 마감보다 두 번째 부분 마감이 먼저 발생했다고 표시하는 경우 전략 테스터가 생성한 로그/저널의 거래 결과를 게시하여 첫 번째 부분 마감 전에 두 번째 부분 마감(이동 평균)이 발생했음을 보여주세요.

다시 찾아주셔서 감사합니다 Thirteen - 오늘 나중에 로그를 게시하겠습니다 :)