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

 

손절매를 수정하는 가장 좋은 방법은 스프레드에 대해 적절하게 생각하는 것입니다. 스프레드는 Ask와 Bid 사이의 거리입니다. 따라서 Bid를 사용하여 구매 주문 에 손절매를 추가하면 SL이 자동으로 스프레드를 포함하므로 이를 코딩할 필요가 없으며 스프레드를 효과적으로 완전히 무시할 수 있습니다. Ask + SL을 사용한 매도 거래의 경우 동일한 효과가 있습니다. 그러나 조심하십시오 --- 거래량이 적은 시간에는 스프레드가 더 커지고 예상했던 위치에서 SL이 훨씬 멀리 떨어질 수 있습니다 --- 따라서 추가를 방지하기 위해 일부 코드를 추가할 수 있습니다. 설정된 스프레드 크기 이상의 SL.

이제 스프레드에 대한 문제는 오류 130s의 다음 주요 원인이 EA가 여전히 실행되는 동안 가격이 변경되었다는 점에서 벗어났습니다. 이는 실행하는 데 오랜 시간이 걸리는 EA나 서버가 거래를 처리하느라 매우 바쁘기 때문에 EA 실행이 지연될 수 있습니다. 결과는 하나의 틱으로 인해 EA가 실행을 시작했지만 실행이 완료되기 전에 또 다른 틱이 발생하여 가격이 유효하지 않다는 것입니다.

두 경우 모두 RefreshRates를 사용하여 가격을 새로 고쳐야 합니다. while (RefrshRates() == 1) Sleep(5); ------ 또는 대기 시간으로 원하는 대로.

 
BigAl :


두 경우 모두 RefreshRates를 사용하여 가격을 새로 고쳐야 합니다. while (RefrshRates() == 1) Sleep(5); ------ 또는 대기 시간으로 원하는 대로.

코드가 미리 정의된 변수 https://docs.mql4.com/predefined/variables 를 사용하는 경우에만 맞습니다. 코드가 Bid 및 Ask에 대해 MarketInfo를 사용하는 경우 RefreshRates는 아무런 영향을 미치지 않습니다. . .
 
qjol :
AFAIK RefreshRates()는 오류 130과 관련이 없습니다.

RaptorUK를 사용하고 MODE_ASK 등을 사용하면 RefreshRates()가 필요 없다는 데 동의하지만 shinobi의 코드 예제에서와 같이 ....

예를 들어 다음과 같이 주문을 보냅니다.

int 티켓 = OrderSend(Symbol(), OP_BUY, position_size, Ask, SLIPPAGE, initial_stop, TAKEPROFIT, NULL, EXPERT_ID, 0, 녹색);

사전 정의된 변수 ASK가 사용 중이므로 매도/입찰 및 스프레드 값 이 변경되어 오류 130이 발생했을 수 있습니다. 이러한 경우 OrderSend 직전에 RefreshRates()를 사용할 수 있습니다.

 
BigAl :

RaptorUK를 사용하고 MODE_ASK 등을 사용하면 RefreshRates()가 필요 없다는 데 동의하지만 shinobi의 코드 예제에서와 같이 ....

예를 들어 다음과 같이 주문을 보냅니다.

int 티켓 = OrderSend(Symbol(), OP_BUY, position_size, Ask, SLIPPAGE, initial_stop, TAKEPROFIT, NULL, EXPERT_ID, 0, 녹색);

사전 정의된 변수 ASK가 사용 중이므로 요청/입찰 및 스프레드 값이 변경되어 오류 130이 발생했을 수 있습니다. 이러한 경우 OrderSend 직전에 RefreshRates()를 사용할 수 있습니다.

훌륭한 조언을 해주신 모든 분들께 감사드립니다!
지금은 조금 바쁘지만 기회가 되면 귀하의 제안을 모두 시도한 다음 동일한 문제로 이 스레드를 우연히 발견할 수 있는 사람을 위해 요약 게시물을 작성하겠습니다.

감사합니다. 조심하세요!

시노비
 
BigAl : 예를 들어 다음과 같이 주문을 보냅니다.

int 티켓 = OrderSend(Symbol(), OP_BUY, position_size, Ask, SLIPPAGE, initial_stop, TAKEPROFIT, NULL, EXPERT_ID, 0, 녹색);

모든 것을 말하지 않습니다. Bid를 사용하여 initial_stop을 어떻게 계산하고 있습니까?

SLIPPAGE를 어떻게 계산하고 있습니까? 4/5 자리 브로커에 맞게 조정합니까?

 
얘들 아!

잠시 휴식을 취해야 했습니다(이사, 새 직장).
하지만 이제 이 스레드를 시작하고 마침내 이 저주받은 #130 손절매 오류에 대한 해결책을 찾고 싶습니다.

귀하의 모든 조언에 감사드리며 모든 조언을 통합하려고 노력했습니다.

1: 퍼집니다.
오류의 가능한 원인으로 스프레드를 제거하기 위해 stoploss를 다음과 같이 설정했습니다.
입찰가 손절매(장기)
매도+스톱로스(단기)

2: 시장 환율 변경
주문이 발송되기 전에 시장 환율이 변경되는 가능한 원인을 제거하기 위해,
내 코드를 변경하고 Ask 및 Bid의 모든 항목을 다음으로 대체했습니다.
MarketInfo(Symbol(), MODE_ASK) 및 MarketInfo(Symbol(), MODE_BID)

3: 4-5 디지트-브로커
유효하지 않은 자릿수의 가능한 원인을 제거하기 위해 WHRoeders 코드에 따라 정지 손실을 반올림했습니다.
 int      pips2points;     // slippage  3 pips    3=points    30=points
double   pips2dbl;       // Stoploss 15 pips    0.0015      0.00150
int      Digits .pips;     // DoubleToStr(dbl/pips2dbl, Digits.pips)

//init digit adjustment
if ( Digits % 2 == 1 ) {       // DE30=1/JPY=3/EURUSD=5 forum.mql4.com/43064#515262
    pips2dbl    = Point * 10 ; pips2points = 10 ;   Digits .pips = 1 ;
} else {
    pips2dbl    = Point ;    pips2points =   1 ;   Digits .pips = 0 ; 
}

OrderSend ( Symbol (), OP_BUY, position_size, MarketInfo ( Symbol (), MODE_ASK), SLIPPAGE, ( MarketInfo ( Symbol (), MODE_BID) - stoploss) * pips2dbl, TAKEPROFIT, NULL , EXPERT_ID, 0 , Green );
앞서 언급한 바와 같이 필자의 경우 SLIPPAGE 및 TAKEPROFIT 변수는 항상 0입니다. 따라서 그것들도 문제를 일으키지 않아야 합니다.

그래서 모든 제안을 통합했지만 오류는 여전히 지속됩니다. 내가 말할 수있는 한 그것은 이전과 마찬가지로 자주 발생하므로 다른 원인이 있어야합니다.
최근 로그는 다음과 같습니다.

틱 값: 12.50000000
위치 크기: 37.00000000
매도/입찰 1262.00000000/1261.75000000
손절매:12.59610000
position_size: 37
스프레드 0.25000000

오류는 긴 위치를 차지할 수 없습니다. 오류: #130 잘못된 정류장

위의 OrderSend 코드 라인은 기록된 값과 함께 긴 위치를 시도하고 취하는 데 사용되었습니다.
더 많은 아이디어가 있습니까? 원인은 무엇입니까?

감사해요!
시노비
 

ECN 브로커입니까?

WHRoeder 2011.09.15 20:36

ECN 중개인에서는 열고 그 다음 중지를 설정해야 합니다.

 
shinobi :
유효하지 않은 자릿수의 가능한 원인을 제거하기 위해 WHRoeders 코드에 따라 정지 손실을 반올림했습니다.
  1. 내가 게시 한 코드에 반올림이 없었습니다.
  2. ECN 중개인에서는 개설한 다음 중지를 설정해야 합니다.
  3. 금속(여기서 TICKSIZE != Point) 보류 중인 주문의 시작 가격은 반올림되어야 합니다.
     double TS= MarketInfo (pair, MODE_TICKSIZE);
    OOP = MathRound (OOP/TS)*TS;
    나는 정류장에 대해 모른다.
  4. 가치가 무엇이며 무엇을 했다고 생각하는지 더 이상 말하지 마십시오. 코드를 게시합니다.
 

그냥 해

외부 이중 손절매 = 50;

외부 이중 TakeProfit = 50;

그런 다음 구매:

이중 SL = 입찰가 - 손절매 * 포인트 ;

이중 TP = 입찰 + 이익 실현 * 포인트 ;

int Ticket = OrderSend ( Symbol () , 0 , 1 , Ask , 2 , SL , TP , "" , 12345 ) ;

if( 티켓<0) print("오류="GetLastError());

판매를 위해:

더블 SL = 매도 + 손절매 * 포인트 ;

이중 TP = Ask - TakeProfit * 포인트 ;

int 티켓 = OrderSend ( 기호 () , 1 , 1 , Bid , 2 , SL , TP , "" , 12345 ) ;

if( 티켓<0) print("오류="GetLastError());

그런 다음 작동하지 않으면 로그 파일을 게시하십시오.

 
답장을 보내주신 Raptor, WHRoeder 및 SDC에 감사드립니다.

SDC:
다음과 같이 코드를 시도했습니다.
   int result_ticket = - 1 ;
   double stoploss            = 50 ;
   double takeprofit          = 50 ;
   double SL = 0.0 ;
   double TP = 0.0 ;
   if ( long ) {   //take long position
      SL = MarketInfo ( Symbol (), MODE_BID) - stoploss * MarketInfo(Symbol(), MODE_POINT));
      TP = MarketInfo ( Symbol (), MODE_BID) + takeprofit * MarketInfo(Symbol(), MODE_POINT));
      result_ticket = OrderSend ( Symbol (), 0 , 1 , MarketInfo ( Symbol (), MODE_ASK), 2 , SL, TP, "" , 12345 );
   } else {     //take short position
      SL = MarketInfo ( Symbol (), MODE_ASK) + stoploss * MarketInfo(Symbol(), MODE_POINT));
      TP = MarketInfo ( Symbol (), MODE_ASK) - takeprofit * MarketInfo(Symbol(), MODE_POINT));
      result_ticket = OrderSend ( Symbol (), 1 , 1 , MarketInfo ( Symbol (), MODE_BID), 2 , SL, TP, "" , 12345 );
   }

   //check for errors
   if (result_ticket == - 1 ) {
      Log( "error=" + GetLastError ());
       return (- 1 );
   }
유일한 차이점은 Raptor 및 BigAI에서 언급한 RefreshRates 문제를 피하기 위해 Point, Ask 및 Bid를 MarketInfo로 대체했다는 것입니다.
이 간단한 예에서도 문제가 지속됩니다. 나는 아직도 얻는다

#ESZ1,M5: 오프닝 포지션
#ESZ1,M5: 틱값: 12.50000000
#ESZ1,M5: 위치 크기: 1.00000000
#ESZ1,M5: 매도/입찰 1244.50000000/1244.25000000
#ESZ1,M5: 스프레드 0.25000000
#ESZ1,M5: SL: 1244.00000000
#ESZ1,M5: TP: 1245.00000000
#ESZ1,M5: 오류=130

랩터:
저는 현재 테스트를 위해 데모 계정 으로 UWC-Trader를 사용하고 있습니다.
앞서 언급했듯이 저는 선물을 거래하고 있습니다. 예: ESZ1 및 FDXZ1.

W로더:
미안 나도 라운드하지 않습니다. "round"를 "4/5-Digit Brokers에 맞게 조정하십시오. IE 방금 코드를 적용했습니다.
이전 답변에서 사용하는 것처럼 OrderSend도 게시했습니다. 그리고 관련된 모든 변수의 값. 코드의 다른 부분이 흥미로울지 잘 모르겠습니다.
SDC에서 제안한 미니 예제에서 보여주듯이 오류는 이 간단한 코드로 나눌 수 있습니다. 그래서 더 근본적이어야 합니다.

나는 금속을 거래하지 않으므로 반올림이 중요하지 않아야 합니다.

나는 다음에 시도할 것이다:
열기(스톱로스 없음) 후 수정(스톱로스 설정).

귀하의 생각에 다시 한 번 감사드립니다.

시노비