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

 
DomGilberto :

이것은 나의 for 루프 동안 저널에 인쇄되고 있습니다. 보류 중인 구매 중지 주문의 경우 60 EMA가 OrderStopLoss보다 크면 보류 중인 주문을 닫고 새 SL로 새 주문을 엽니다. 60EMA 뒤에 있음), 1:2 보상을 즐기기 위해 이익실현을 조정하고 포인트 및 내 위험 프로필(예: 2%)의 스탑을 기준으로 로트를 변경합니다.

따라서 이 모든 작업이 완료되면 OrderSend 내의 "LotSize" 사용자 정의 변수인 "Current Lot"가 작동하는데 서버가 수신할 수 없는 잘못된 크기의 로트를 보내는 것입니까? "0.18215"? 어쨌든 주문이 실제로 전송되었음에도 불구하고 이것이 문제가 될 수 있습니다. 이 질문은 "이것이 "OrderType==OP_BUY"를 호출할 수 없는 이유와 더 관련이 있습니까?

이를 수정하고 이미 가지고 있는 것과 동일한 방식으로 로트 크기를 검증해야 합니다. . . 이미 가지고 있는 코드를 기반으로 별도의 기능 을 코딩할 수도 있습니다. . . 예를 들어:

 double ValidateLots( double PositionSize)
   {
   double LotStep, MinLot;

   LotStep = MarketInfo( Symbol (), MODE_LOTSTEP);
   MinLot  = MarketInfo( Symbol (), MODE_MINLOT);
   
   return ( MathFloor (PositionSize / LotStep) * LotStep);
   }


OrderSend()에서 LotSize를 사용하는 대신 ValidateLots(LotSize)를 사용합니다.

나는 이것이 당신의 문제를 일으키는지 의심스럽습니다. . .

 
흠 - 예, 방금 가지고 놀았습니다. 어쨌든 서버는 0.00(소수점 2자리)만 허용하므로 주문이 방금 전송된 것으로 보입니다. 따라서 나머지 숫자는 거의 관련이 없습니다.

으악! 너무 실망스럽습니다.

왜 이것이 문제인지 알 수 없고 "OP_BUY"를 선택할 수 없습니다... 아마 이 주제를 다 써버렸지만 어둠 속에서 마지막으로 찌르는 것이 정말 감사할 것입니다. 저를 도와주셔서 감사합니다!!
 if (direction== 0 ){ <<< //--Buy--// This gets called upon if all the set-up is apparent.
      
       double bsl=buy_stop_price;
       double btp=buy_takeprofit_price;
      LotSize = (RiskedAmount/(pips_to_bsl/pips))/ 10 ; //--// ( in process of changing at the moment )
      
       if (OpenOrdersThisPair( Symbol ())== 0 )  //--//<--- No order open = then open one...
      {
       int BuyTicketOrder = OrderSend ( Symbol (),OP_BUYSTOP,LotSize,buyPrice, 3 ,bsl,btp, NULL ,MagicNumber, 0 ,Green); //--//<-- This is the first Order to be placed.
      }
      
         if (OrderStopLoss()< iMA ( NULL , 0 ,MA_Period, 0 , 1 , 0 , 0 )-MA_PadAmount*pips) //--//<<-- This will 99% of the time be true and the order above will be cancelled and looped in the "for" until the order is triggered.
         {
         
               for ( int b= OrdersTotal ()- 1 ; b >= 0 ; b--) 
                  {
    
                     if ( OrderSelect (b,SELECT_BY_POS,MODE_TRADES)== true )
                     {
                     Print ( " Stop loss value for the order is " , OrderStopLoss());
                     }
    
                     else if ( OrderSelect (b,SELECT_BY_POS,MODE_TRADES)== false )
                     {
                     Print ( " OrderSelect failed error code is " , GetLastError ());
                     }
                     if (OrderMagicNumber()==MagicNumber)
                         if (OrderSymbol()== Symbol ())
                           if (OrderType()==OP_BUYSTOP)
                               if (OrderStopLoss()< iMA ( NULL , 0 ,MA_Period, 0 , 1 , 0 , 0 )-MA_PadAmount*pips)
                                 //if(OpenOrdersThisPair(Symbol())==1)
                                 { 
                                 DeleteOrder = OrderDelete(OrderTicket());
                                 if (DeleteOrder!=TRUE) Print ( "Buy Delete Order Last Error = " , GetLastError ());
                                 }
                                  
                                 if (OpenOrdersThisPair( Symbol ())== 0 ) //<<-- If there are no open orders = place a new order.
                                  { 
                                   int NewBuyOrder = OrderSend ( Symbol (),OP_BUYSTOP,LotSize,buyPrice, 3 ,bsl,btp, NULL ,MagicNumber, 0 ,Green); 
                                   if (NewBuyOrder == - 1 ) Print ( "New Buy Order Last Error = " , GetLastError ());
                                   if (NewBuyOrder > 0 ) Print ( "NEW BUY ORDER:- Lots to open: " , DoubleToStr(LotSize, Digits ), " Entry Price: " , DoubleToStr(buyPrice, Digits ), 
                                   " Buy Stop Loss: " , DoubleToStr(bsl, Digits ), " Buy Take Profit: " , DoubleToStr(btp, Digits ), " Magic Number is: " , DoubleToStr(MagicNumber, Digits ));  
                                  } 
                  }
             } 
       }
 
DomGilberto :
흠 - 예, 방금 가지고 놀았습니다. 어쨌든 서버는 0.00(소수점 2자리)만 허용하므로 주문이 방금 전송된 것으로 보입니다. 따라서 나머지 숫자는 거의 관련이 없습니다.

으악! 너무 실망스럽습니다.

왜 이것이 문제인지 알 수 없고 "OP_BUY"를 선택할 수 없습니다... 아마 이 주제를 다 써버렸지만 어둠 속에서 마지막으로 찌르는 것이 정말 감사할 것입니다. 저를 도와주셔서 감사합니다!!

나는 당신이 당신의 모든 코드를 보여줄 필요가 있다고 생각합니다. . .

여기에 몇 가지 문제가 있습니다.

       int BuyTicketOrder = OrderSend ( Symbol (),OP_BUYSTOP,LotSize,buyPrice, 3 ,bsl,btp, NULL ,MagicNumber, 0 ,Green); //--//<-- This is the first Order to be placed.
      }
       //  where are you checking the return value from the OrderSend() and reporting errors ?

         if (OrderStopLoss()< iMA ( NULL , 0 ,MA_Period, 0 , 1 , 0 , 0 )-MA_PadAmount*pips)     //  where is the OrderSelect() ?
 
모든 코드가 여기에 맞지 않습니까? 그래도 pastebin에 올렸어?

- http://pastebin.com/eaY1wKbN

구문에 대해 죄송합니다. 모든 것을 보는 것이 조금 더 어렵지만 MQL4가 없습니까? 그래서 그것을 C++ 아래에 두십시오.
 
DomGilberto :
모든 코드가 여기에 맞지 않습니까? 그래도 pastebin에 올렸어?

- http://pastebin.com/eaY1wKbN

구문에 대해 죄송합니다. 모든 것을 보는 것이 조금 더 어렵지만 MQL4가 없습니까? 그래서 그것을 C++ 아래에 두십시오.

괜찮아요 . . .

당신이 이것을 할 때. . .

 //+--------------------------------------------------------------------------------------------------+
//| Close OP_BUY Half lots @ 1:1 Function                                                            |
//+--------------------------------------------------------------------------------------------------+

   if ( OrderSelect (OrderTicket(),SELECT_BY_TICKET,MODE_TRADES)== true && OpenOrdersThisPair( Symbol ())== 1 && OrderType()==OP_BUY)
     {

. . . 어떤 주문이 이미 선택되어 있습니까? 보류 주문이었나? 이미 주문을 선택하지 않은 경우 OrderTicket()이 실패하면 OrderSelect()가 실패합니다. 이 코드가 정말 필요합니까? 나중에 주문을 선택하고 해당 기호와 Magic Number 및 유형을 확인하는 루프가 있습니다. . .

이것도 수정이 필요합니다. . .

         if (OrderMagicNumber()==MagicNumber)
             if (OrderSymbol()== Symbol ())

               Print ( "Current Bid: " ,DoubleToStr(Bid, Digits ), " FirstTarget_Buy: " ,DoubleToStr(FirstTarget_Buy, Digits ));

         if (OrderType()==OP_BUY && Bid>=FirstTarget_Buy+( Point / 2 )) // Doesn't seem to even go further than this as I do not get an error from OrderClose?
           {
             Print ( "Bid >= FirstTarget_Buy - Current Bid: " ,DoubleToStr(Bid, Digits ), " FirstTarget_Buy: " ,DoubleToStr(FirstTarget_Buy, Digits ));
             bool Close_Half_Order_Buy=OrderClose(OrderTicket(),half,Bid, 3 , CLR_NONE );
             if (Close_Half_Order_Buy!=TRUE) Print ( "Close_Half_Order_Buy Last Error = " , GetLastError ());
           }

. . . 일부 중괄호를 추가하십시오. . .

         if (OrderMagicNumber()==MagicNumber)
             if (OrderSymbol()== Symbol ())
               {
               Print ( "Current Bid: " ,DoubleToStr(Bid, Digits ), " FirstTarget_Buy: " ,DoubleToStr(FirstTarget_Buy, Digits ));

               if (OrderType()==OP_BUY && Bid>=FirstTarget_Buy+( Point / 2 )) // Doesn't seem to even go further than this as I do not get an error from OrderClose?
                 {
                 Print ( "Bid >= FirstTarget_Buy - Current Bid: " ,DoubleToStr(Bid, Digits ), " FirstTarget_Buy: " ,DoubleToStr(FirstTarget_Buy, Digits ));
                 bool Close_Half_Order_Buy=OrderClose(OrderTicket(),half,Bid, 3 , CLR_NONE );
                 if (Close_Half_Order_Buy!=TRUE) Print ( "Close_Half_Order_Buy Last Error = " , GetLastError ());
                 }
               }
 

Ok - 수행 중인 작업과 요점을 명확하게 하기 위해 더 많은 인쇄물을 사용했습니다. 아래에 붙여넣었습니다.

위에서 질문한 "Close OP_BUY Half Lot @ 1:1 Function" 지점에서 선택되는 "Order Select for Closing:-..."이 있는 줄입니다. 이 선택 시점에서 티켓 번호가 다른 것 같습니까? "...&& OrderType()==OP_BUY" 부분을 삭제했는데, 이 부분이 "if" 문에 없을 때 나머지 부분을 인쇄하는 것 같습니다... 이것이 좀 더 명확해 졌습니까?

"First Buy Order Placed:-"는 시작 시 진행되는 첫 번째 OrderSend 기능 입니다.
"구매 주문 확인:-" MA가 > OrderStopLoss()인 경우 보류 중인 주문을 삭제하고 다시 여는 for 루프 내의 하나입니다.
"NEW BUY ORDER:-"는 for 루프 내부에 배치되는 새 주문입니다.
"청산 주문 선택:-..." - 위에서 이미 언급했듯이 이 부분은 로트의 절반을 청산하기 위해 선택되는 부분입니다.

혼란스러웠다면 죄송합니다. 방금 이 부분을 추가했기 때문에 위의 pastebin 링크에서 이것을 볼 수 없습니다... 단순한 인쇄 기능일 뿐입니다. :)

 2013.08 . 02 13 : 33 : 57    2013.02 . 01 15 : 00   trendfishing_play_ground EURUSD,H1: Current Bid: 1.35972 FirstTarget_Buy: 1.37931
2013.08 . 02 13 : 33 : 57    2013.02 . 01 15 : 00   trendfishing_play_ground EURUSD,H1: FirstTarget_Buy: 1.37931 // This is the price where half the lots will close.
2013.08 . 02 13 : 33 : 57    2013.02 . 01 15 : 00   trendfishing_play_ground EURUSD,H1: Order Lots Open = 0.18
2013.08 . 02 13 : 33 : 57    2013.02 . 01 15 : 00   trendfishing_play_ground EURUSD,H1: Order Ticker Number = 9
2013.08 . 02 13 : 33 : 57   2013.02 . 01 15 : 00   trendfishing_play_ground EURUSD,H1: The Lots to close is : 0.09000
2013.08 . 02 13 : 33 : 57    2013.02 . 01 15 : 00   trendfishing_play_ground EURUSD,H1: The Lotstep is : 0.01000
2013.08 . 02 13 : 33 : 57    2013.02 . 01 15 : 00   trendfishing_play_ground EURUSD,H1: The minimum lots are: 0.01000
2013.08 . 02 13 : 33 : 57    2013.02 . 01 15 : 00   trendfishing_play_ground EURUSD,H1: Order Select for closing:- Lots open: 0.18 Entry Price: 1.3679 Buy Stop Loss: 1.3565 Buy Take Profit: 1.3907 Magic Number is : 1234 Order Ticket Number: 9
2013.08 . 02 13 : 33 : 57    2013.02 . 01 15 : 00   trendfishing_play_ground EURUSD,H1: NEW BUY ORDER:- Lots to open: 0.18215 Entry Price: 1.36790 Buy Stop Loss: 1.35649 Buy Take Profit: 1.39072 Magic Number is : 1234.00000 Order Ticket Number: 8
2013.08 . 02 13 : 33 : 57    2013.02 . 01 15 : 00   trendfishing_play_ground EURUSD,H1: open # 9 buy stop 0.18 EURUSD at 1.36790 sl: 1.35649 tp: 1.39072 ok
2013.08 . 02 13 : 33 : 57    2013.02 . 01 15 : 00   trendfishing_play_ground EURUSD,H1: delete # 8 buy stop 0.18 EURUSD at 1.36790 sl: 1.35649 tp: 1.39072 ok
2013.08 . 02 13 : 33 : 57    2013.02 . 01 15 : 00   trendfishing_play_ground EURUSD,H1: Checking Buy Order:- Lots to open: 0.18 Entry Price: 1.3679 Buy Stop Loss: 1.3565 Buy Take Profit: 1.3907 Magic Number is : 1234 Order Ticket Number: 8
2013.08 . 02 13 : 33 : 57    2013.02 . 01 15 : 00   trendfishing_play_ground EURUSD,H1: First Buy Order placed:- Lots to open: 0.18215 Entry Price: 1.36790 Buy Stop Loss: 1.35649 Buy Take Profit: 1.39072 Magic Number is : 1234.00000 Order Ticket Number: 7
 
DomGilberto :

Ok - 수행 중인 작업과 요점을 명확하게 하기 위해 더 많은 인쇄물을 사용했습니다. 아래에 붙여넣었습니다.

위에서 질문한 "Close OP_BUY Half Lot @ 1:1 Function" 지점에서 선택되는 "Order Select for Closing:-..."이 있는 줄입니다. 이 선택 시점에서 티켓 번호가 다른 것 같습니까? "...&& OrderType()==OP_BUY" 부분을 삭제했는데, 이 부분이 "if" 문에 없을 때 나머지 부분을 인쇄하는 것 같습니다... 이것이 좀 더 명확해 졌습니까?

"First Buy Order Placed:-"는 시작 시 진행되는 첫 번째 OrderSend 기능입니다.
"구매 주문 확인:-" MA가 > OrderStopLoss()인 경우 보류 중인 주문을 삭제하고 다시 여는 for 루프 내의 하나입니다.
"NEW BUY ORDER:-"는 for 루프 내부에 배치되는 새 주문입니다.
"청산 주문 선택:-..." - 위에서 이미 언급했듯이 이 부분은 로트의 절반을 청산하기 위해 선택되는 부분입니다.

혼란스러웠다면 죄송합니다. 방금 이 부분을 추가했기 때문에 위의 pastebin 링크에서 이것을 볼 수 없습니다... 단순한 인쇄 기능일 뿐입니다. :)


첨부된 . . . 그것은 당신이 무엇을하려고하는지에 대한 최선의 추측입니다. . .
파일:
dom.mq4  24 kb
 

아 굉장합니다 - 감사합니다. 올바른 방향으로 나아가는 큰 단계입니다. for 루프 안에 있기 때문에 절반과 절반 @ price...를 한 번만 수행하는 대신 닫고 싶어한다고 생각합니다. 뿐만 아니라 가격이 >= 내가 원하는 출구 가격으로 오자마자 반쯤 닫히지 않는 것 같고, 오히려 그것을 넘어서서 가격이 내가 원하는 출구 가격으로 다시 낮아지면 닫힙니다 - 이상합니다. ... 도와주셔서 감사합니다! 시간 내주셔서 정말 감사합니다!!


업데이트: 또한, 나는 전략 테스터 를 실행하기 전에 전문가 속성(extern int)을 변경하면 닫기 절반이 전혀 작동하지 않는다는 것을 방금 알아냈습니다. 닫기 절반에 영향을 미치는 것은 "MA_PadAmount"입니다. 이것이 얼마나 많은 핍으로 추적하는 손절매에 패드로 추가하고 싶은 포인트와 주문의 진입 가격에 패드로 넣을 수 있는 핍 수를 지정할 수 있는 "OrderPrice_PadAmount"...

 
DomGilberto :
아 굉장합니다 - 감사합니다. 올바른 방향으로 나아가는 큰 단계입니다. for 루프 안에 있기 때문에 절반과 절반 @ price...를 한 번만 수행하는 대신 닫고 싶어한다고 생각합니다. 뿐만 아니라 가격이 >= 내가 원하는 출구 가격에 도달하자마자 반쯤 닫히지 않는 것 같고, 오히려 그것을 넘어서서 가격이 내가 원하는 출구 가격으로 다시 낮아지면 닫힙니다. 이상합니다. ... 도와주셔서 감사합니다! 시간 내주셔서 정말 감사합니다!!
for 루프가 아니라 절반이 이미 닫혔다는 것을 알 수 있는 방법이 없습니다. . . 어떻게 처리할 계획이었습니까?
 
예 - for 루프를 제거 했을 때 문자 그대로 방금 알아냈습니다. OrderTicket 번호가 처음 선택되었을 때부터 추적하는 경우 OrderClose가 작업을 완료하고 true를 반환하면 OrderTicket 번호가 다르기 때문에 이를 확인할 수 있습니다. 따라서 루프가 중단됩니다. 새로운 주문이 들어올 때까지 기다리시겠습니까?

어떻게 작성해야 할지 잘 모르겠지만 대략적으로 올바른 줄에 있습니까?