오류 #130 유효하지 않은 손절매에 대한 도움이 필요합니다. - 페이지 3

[삭제]  
같은 문제. 손절매 = 0 및 이익실현 = 0으로 주문이 잘 열립니다.
그러나 OrderModify는 실패합니다.

아래 코드는 지난 포스팅의 위 코드 다음에 실행한 코드입니다.

   bool modify = false;
   entry_price = OrderOpenPrice ();
   if ( long ) {  
      SL = MarketInfo ( Symbol (), MODE_BID) - stoploss * MarketInfo ( Symbol (), MODE_POINT);
      TP = MarketInfo ( Symbol (), MODE_BID) + takeprofit * MarketInfo ( Symbol (), MODE_POINT);
      modify = OrderModify (result_ticket, entry_price, SL, TP, Red );  
   } else {    
      SL = MarketInfo ( Symbol (), MODE_ASK) + stoploss * MarketInfo ( Symbol (), MODE_POINT);
      TP = MarketInfo ( Symbol (), MODE_ASK) - takeprofit * MarketInfo ( Symbol (), MODE_POINT);
      modify = OrderModify (result_ticket, entry_price, SL, TP, Green ); 
   }
   Log( "[5] SL: " + SL);
   Log( "[5] TP: " + TP);
   
   if (!modify) {
      Log( "error=" + GetLastError ());
       return (- 1 );
   }

로그 목록:

#ESZ1,M5: 오프닝 포지션
#ESZ1,M5: 틱값: 12.50000000
#ESZ1,M5: 위치 크기: 1.00000000
#ESZ1,M5: 매도/입찰 1242.00000000/1241.75000000
#ESZ1,M5: 스프레드 0.25000000
#ESZ1,M5: 오픈 #13679252 1.00 구매 #ESZ1 at 1242.00 확인
#ESZ1,M5: 주문 13679252가 성공적으로 열렸습니다.
#ESZ1,M5: SL: 1241.25000000
#ESZ1,M5: TP: 1242.25000000
#ESZ1,M5: 오류=130

따라서 처음 열고 손절매를 설정해도 작동하지 않는 것 같습니다 :-/
 

스프레드는 0.25

#ESZ1,M5: 스프레드 0.25000000

알겠습니다. 에서 매수를 엽니다. . 1242.00 (문의)

#ESZ1,M5: 오픈 #13679252 1.00 구매 #ESZ1 at 1242.00 확인

#ESZ1,M5: 주문 13679252가 성공적으로 열렸습니다.

그런 다음 입찰 가격 + 2 * 스프레드 및 SL에서 TP로 수정하려고합니다. 입찰가 - 2 * 스프레드

#ESZ1,M5: SL: 1241.25000000

#ESZ1,M5: TP: 1242.25000000

FreezeLevel이 0.50이면 문제입니다. . 당신의 FreezeLevel은 무엇입니까?

 
shinobi :
같은 문제. 손절매 = 0 및 이익실현 = 0으로 주문이 잘 열립니다.
그러나 OrderModify는 실패합니다.

4/5 자리 중개인을 위해 조정하지 않습니다. 먼저 열지 않고 설정이 중지됩니다.

이전 에 답변 한 대로

 

예, 아마도 ECN 중개인과 거래하고 있을 것입니다. 제로 스탑으로 주문을 개설한 다음 50핍 SL 및 TP에 문제가 있으므로 주문이 열린 후 수정해야 합니다. 따라서 Raptor가 말한 것처럼 프리즈레벨과 스탑레벨을 확인하십시오. 사례

또한 OrderModify() 코드를 확인하십시오 .... 아마도 그렇게 작동하지만 OrderOpenPrice()를 수행하기 전에 OrderSelect()를 사용 하여 주문을 선택해야 한다고 생각합니다.

[삭제]  
도움을 주셔서 다시 한 번 감사드립니다!
아아 #130은 여전히 밤에 나를 괴롭힌다 ;)

다음 시도는 다음과 같습니다.

   double stoploss = 50 ;
   double SL = 0.0 ;
   
   //open position
   if ( long )  //take long position
      result_ticket = OrderSend ( Symbol (), 0 , 1 , MarketInfo ( Symbol (), MODE_ASK), 2 , 0 , 0 , "" , 12345 );  
   else      //take short position
      result_ticket = OrderSend ( Symbol (), 1 , 1 , MarketInfo ( Symbol (), MODE_BID), 2 , 0 , 0 , "" , 12345 ); 
   //check for errors
   if (result_ticket == - 1 ) {
      Log( "error=" + GetLastError ());
       return (- 1 );
   }
   Log( "Order " +result_ticket+ " Successfully Opened" );

   //select order
   if (! OrderSelect (result_ticket, SELECT_BY_TICKET)) {
      Log( "error=" + GetLastError ());
       return (- 1 );
   }    
   entry_price = OrderOpenPrice ();
   
   //check stoplevel
   double stoplevel = MarketInfo ( Symbol (), MODE_STOPLEVEL);
   Log( "Stoplevel: " + stoplevel);
   Log( "stoploss: " + stoploss);
   if (stoploss < stoplevel)
      stoploss = stoplevel + 1 ;

   //checl freezelevel
   double freezelevel = MarketInfo ( Symbol (), MODE_FREEZELEVEL);
   Log( "Freezelevel: " + freezelevel);
   Log( "stoploss: " + stoploss);
   if (stoploss < freezelevel)
      stoploss = freezelevel + 1 ;
   
   if ( long )
      SL = MarketInfo ( Symbol (), MODE_BID) - stoploss * MarketInfo ( Symbol (), MODE_POINT);
   else
      SL = MarketInfo ( Symbol (), MODE_ASK) + stoploss * MarketInfo ( Symbol (), MODE_POINT);
   Log( "SL: " + SL*pips2dbl);
   if (! OrderModify (result_ticket, entry_price, SL* pips2dbl, 0 , Red )) {
      Log( "error=" + GetLastError ());
       return (- 1 );
   }
   Log( "Stoploss successfully set" );

보시다시피 takeprofit을 사용하지 않고 예제를 단순화했습니다. 오류는 확실히 손절매로 인해 발생하므로 이익실현이 필요하지 않습니다.
먼저 손절매가 0인(및 이익실현) 주문을 열고 나중에 OrderModify를 사용하여 손절매를 설정하려고 합니다.
그 전에 Mode_Stoplevel 및 Mode_Freezelevel을 확인 하고 필요한 경우 stoploss를 조정합니다. (초기에는 stoploss가 50이지만 Mode_Stoplevel이 75이기 때문에 아래 로그에서 조정이 발생합니다. 그런 다음 stoploss를 Mode_Stoplevel + 1로 설정하므로 76입니다.)

RaptorUK 및 SDC:
MarketInfo(MODE_FREEZELEVEL)는 0을 반환합니다. Freezelevel이 문제라고 생각하지 않습니다.
로그 파일에 출력을 포함했습니다.

SDC:
확인하기 위해 OrderOpenPrice를 호출하기 전에 OrderSelect도 삽입했습니다. 로그에서 OrderSelect가 작동했음을 알 수 있습니다. 그렇지 않으면 코드가 지금까지 진행되지 않았을 것입니다(exit -1).

W로더:
나는 SDC의 간단한 예를 따랐다. 그러나 이제 위에서 볼 수 있듯이 stoploss를 설정할 때 pips 4/5 Digit 조정을 사용하여 확장했습니다. 손절매와 이익실현이 0으로 설정된 상태에서 먼저 주문이 시작된 다음 OrderModify로 손절매가 설정된 것을 볼 수도 있습니다. S/L 및 T/P가 0으로 설정된 아래 로그에서 볼 수 있듯이 주문은 성공적으로 시작되지만 OrderModify를 사용하여 다음 단계에서 S/L을 설정할 수 없습니다.

전체 로그는 다음과 같습니다.

 #ESZ1,M5: loaded successfully 
#ESZ1,M5: Date: 2011/11/15 9:24
#ESZ1,M5: Symbol: #ESZ1
#ESZ1,M5: Depot: 56489.95000000
#ESZ1,M5: Stop Level [Points]: 75.00000000
#ESZ1,M5: Freeze Level [Points]: 0.00000000
#ESZ1,M5: Spread [Points]: 25.00000000
#ESZ1,M5: Min/Max Lot: 0.01000000/1000.00000000
#ESZ1,M5: Point: 0.01000000
#ESZ1,M5: Tick Size: 0.25000000
#ESZ1,M5: Tick Value: 12.50000000
#ESZ1,M5: Digits: 2.00000000
#ESZ1,M5: Contract: 2011.09.14 00:00-2011.12.16 23:59
#ESZ1,M5: Init successfully completed.
#ESZ1,M5: initialized

#ESZ1,M5: Opening Position
#ESZ1,M5: tickvalue: 12.50000000
#ESZ1,M5: Ask/Bid 1250.50000000/1250.25000000
#ESZ1,M5: Spread 0.25000000
#ESZ1,M5: pos size: 1
#ESZ1,M5: open #13697436 sell 1.00 #ESZ1 at 1250.25 ok 
#ESZ1,M5: Order 13697436 Successfully Opened
#ESZ1,M5: Stoplevel: 75.00000000
#ESZ1,M5: stoploss: 50.00000000
#ESZ1,M5: Freezelevel: 0.00000000
#ESZ1,M5: stoploss: 76.00000000
#ESZ1,M5: SL: 12.51260000
#ESZ1,M5: error=130

지속적인 도움에 진심으로 감사드리며 문제를 좁힐 수 있을 것 같습니다. :)
그렇다면 다른 무엇이 문제가 될 수 있습니까? 내가 시도할 수 있는 다른 것이 있습니까?

시노비
 
RaptorUK :

스프레드는 0.25

#ESZ1,M5: 스프레드 0.25000000

알겠습니다. 에서 매수를 엽니다. . 1242.00 (문의)

#ESZ1,M5: 오픈 #13679252 1.00 구매 #ESZ1 at 1242.00 확인

#ESZ1,M5: 주문 13679252가 성공적으로 열렸습니다.

그런 다음 입찰 가격 + 2 * 스프레드 및 SL에서 TP로 수정하려고합니다. 입찰가 - 2 * 스프레드

당신의 STOP_LEVEL 3 * 스프레드가 아닌가요? 정류장이 너무 가깝습니다. . .

 #ESZ1,M5: Stoplevel: 75.00000000
#ESZ1,M5: stoploss: 50.00000000
[삭제]  
이봐 랩터,

예, 그래서 여기에서 stoplevel을 확인 합니다(위의 코드에서).

   double stoplevel = MarketInfo ( Symbol (), MODE_STOPLEVEL);
   Log( "Stoplevel: " + stoplevel);
   Log( "stoploss: " + stoploss);
   if (stoploss < stoplevel)
      stoploss = stoplevel + 1 ;

따라서 마지막 예에서 손절매는 76으로 설정되었으며 이는 3*Spread +1입니다.
충분히 멀리 떨어져 있어야 하지 않을까요?
 
shinobi :
이봐 랩터,

예, 그래서 여기에서 stoplevel을 확인합니다(위의 코드에서).


따라서 마지막 예에서 손절매는 76으로 설정되었으며 이는 3*Spread +1입니다.
충분히 멀리 떨어져 있어야 하지 않을까요?
예, 그래야 합니다. . . 하지만 여기에 반올림 문제가 있는지 그리고 SL이 STOP_LEVEL에서 0.25 이상 떨어지도록 가장 가까운 0.25(S&P500은 0.25 단계로 이동)로 반올림해야 하는지 궁금합니다. . . 당신이 내 말을 이해한다면?
[삭제]  
좋은 아이디어지만 역시 도움이 되지 않았습니다.
여기 내가 한 일이 있습니다.

먼저 double을 가장 가까운 double로 반올림하는 사용자 정의 함수 를 작성했습니다.
 double DoubleRound( double number, double step)
{
     double mod = MathMod (number, step);
     if (mod < step/ 2.0 )
      step = 0 ;
     double rounded = number - mod + step;
     return (rounded);
}

그것은 당신이 기대하는 것을합니다. DoubleRound(1237.687360000)로 호출하면 1237.50을 반환합니다.

그런 다음 OrderModify를 호출하기 직전에 S/L에서 사용했습니다. 그리고 #ESZ1에 대해 0.25인 MODE_TICKVALUE를 사용했습니다.
그래서:

   //round to nearest Tickvalue   
   SL = DoubleRound(SL, MarketInfo ( Symbol (), MODE_TICKVALUE));

 
  Log( "SL: " + SL);
   if (! OrderModify (result_ticket, entry_price, SL* pips2dbl, 0 , Red )) {
      Log( "error=" + GetLastError ());
       return (- 1 );
   }

로그에서 반올림이 제대로 작동했음을 알 수 있습니다. 그러나 손절매는 여전히 거부되었습니다:/

 #ESZ1,M5: loaded successfully 
#ESZ1,M5: Date: 2011/11/16 7:44
#ESZ1,M5: Symbol: #ESZ1
#ESZ1,M5: Depot: 56364.95000000
#ESZ1,M5: Stop Level [Points]: 75.00000000
#ESZ1,M5: Freeze Level [Points]: 0.00000000
#ESZ1,M5: Spread [Points]: 25.00000000
#ESZ1,M5: Min/Max Lot: 0.01000000/1000.00000000
#ESZ1,M5: Point: 0.01000000
#ESZ1,M5: Tick Size: 0.25000000
#ESZ1,M5: Tick Value: 12.50000000
#ESZ1,M5: Digits: 2.00000000
#ESZ1,M5: Contract: 2011.09.14 00:00-2011.12.16 23:59
#ESZ1,M5: Opening Position
#ESZ1,M5: Ask/Bid 1240.00000000/1239.75000000
#ESZ1,M5: Spread 0.25000000
#ESZ1,M5: open #13708089 sell 1.00 #ESZ1 at 1239.75 ok 
#ESZ1,M5: Order 13708089 Successfully Opened
#ESZ1,M5: Stoplevel: 75.00000000
#ESZ1,M5: Freezelevel: 0.00000000
#ESZ1,M5: stoploss: 76.00000000
#ESZ1,M5: SL: 1237.50000000
#ESZ1,M5: error=130

다른 문제가 무엇인지 상상할 수 없습니다! 이 #130은 정말 끈질깁니다!!!
 

당신은 판매 를 열었습니다

#ESZ1,M5: 오픈 #13708089 1.00 판매 #ESZ1 1239.75 ok

그리고 그 아래 에 SL을 설정하려고 했습니다. . .

#ESZ1,M5: SL: 1237.50000000

#ESZ1,M5: 오류=130