오류 #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