루프 및 주문 마감 또는 삭제

 

이것은 내가 보는 가장 일반적인 오류 중 하나입니다. 아마도 부분적으로 Expert Advisor Builder와 같은 쓰레기 같은 것들 때문일 것입니다. 그래서 나중에 참조할 수 있도록 해당 주제에 대한 전용 스레드를 만들 때라고 생각했습니다.

문제

간단한 예를 들어 보겠습니다. 우리는 EA에 대한 모든 미결 주문을 마감하는 기능을 원합니다. 많은 예가 있지만 처음부터 하나 만들어 보겠습니다.

특정 EA에 대한 모든 주문을 닫고 싶기 때문에 루프가 필요합니다. 이 루프 내에 는 주문을 선택하는 코드, 올바른 기호 및 매직 번호인지 확인하는 코드, 마지막으로 주문을 종료하는 코드가 있습니다.

 int PositionIndex;     //  <-- this variable is the index used for the loop

int TotalNumberOfOrders;   //  <-- this variable will hold the number of orders currently in the Trade pool

TotalNumberOfOrders = OrdersTotal ();     // <-- we store the number of Orders in the variable

for (PositionIndex = 0 ; PositionIndex < TotalNumberOfOrders; PositionIndex++)   //  <-- for loop to loop through all Orders
   {
   if ( ! OrderSelect (PositionIndex, SELECT_BY_POS, MODE_TRADES) ) continue ;   // <-- if the OrderSelect fails advance the loop to the next PositionIndex
   
   if ( OrderMagicNumber () == MagicNo       // <-- does the Order's Magic Number match our EA's magic number ? 
      && OrderSymbol () == Symbol ()         // <-- does the Order's Symbol match the Symbol our EA is working on ? 
      && ( OrderType () == OP_BUY           // <-- is the Order a Buy Order ? 
      ||   OrderType () == OP_SELL ) )       // <-- or is it a Sell Order ?

       if ( ! OrderClose ( OrderTicket (), OrderLots (), OrderClosePrice (), Slippage ) )               // <-- try to close the order
         Print ( "Order Close failed, order number: " , OrderTicket (), " Error: " , GetLastError () );   // <-- if the Order Close failed print some helpful information 
      
   } //  end of For loop

이 코드는 좋지 않습니다. . . 그것을 사용하지 마십시오 . . . 그 이유는 다음 섹션에서 설명하겠습니다. . .

설명

위의 코드를 통해 작업해 보겠습니다. . . 라인별, 주문별 주문 . . .

닫고자 하는 다음 주문이 있다고 가정해 보겠습니다. 모두 EA와 동일한 매직 번호와 기호를 갖고 있으므로 코드에서 모두 닫기를 원합니다.

위치 티켓 번호
0 111
1 222
2 333
444
4 555

루프를 통해 첫 번째 실행:

PositionIndex의 초기 값은 0이므로 위치 0의 주문이 선택되고 티켓 번호 111, 이 주문은 성공적으로 삭제되고 나머지 주문은 다음과 같이 위치가 변경됩니다.

위치 티켓 번호
0 222
1 333
2 444
555

루프를 통해 두 번째 실행:

이제 PositionIndex의 값이 1이므로 위치 1의 주문이 선택되고 티켓 번호 333, 이 주문은 성공적으로 삭제되고 나머지 주문은 다음과 같이 위치가 변경됩니다 .

위치 티켓 번호
0 222
1 444
2 555

루프를 통해 세 번째 실행:

이제 PositionIndex의 값이 2이므로 위치 2의 주문이 선택되고 티켓 번호 555, 이 주문은 성공적으로 삭제되고 나머지 주문은 다음과 같이 위치가 변경됩니다 .

위치 티켓 번호
0 222
1 444

루프를 통해 4번째 실행:

이제 PositionIndex의 값 은 3입니다. OrderSelect()는 위치 3에서 Order를 선택하려고 시도하고 실패 하고, continue는 루프의 다음 값으로 코드를 실행합니다. .


다섯 번째이자 마지막 루프 실행:

이제 PositionIndex의 값은 4입니다. OrderSelect()는 위치 4에서 Order를 선택하려고 시도하고 실패 하면 계속은 루프의 다음 값으로 코드를 실행합니다. . . 루프가 완료되었습니다.


이제 2개의 주문, 티켓 222번과 444번이 남았습니다. 티켓은 닫았어야 했지만 닫히지 않았습니다. . . 다음으로 이 문제를 해결하는 방법입니다.

해결책

다음 코드는 미결 주문을 닫거나 보류 주문을 삭제할 때 올바른 접근 방식입니다. . .

주요 차이점은 루프가 ( TotalNumberOfOrders - 1 ) 에서 0 으로 감소 한다는 것입니다.

 int PositionIndex;     //  <-- this variable is the index used for the loop

int TotalNumberOfOrders;   //  <-- this variable will hold the number of orders currently in the Trade pool

TotalNumberOfOrders = OrdersTotal ();     // <-- we store the number of Orders in the variable

for (PositionIndex = TotalNumberOfOrders - 1 ; PositionIndex >= 0 ; PositionIndex --)   //  <-- for loop to loop through all Orders . .   COUNT DOWN TO ZERO !
   {
   if ( ! OrderSelect (PositionIndex, SELECT_BY_POS, MODE_TRADES) ) continue ;   // <-- if the OrderSelect fails advance the loop to the next PositionIndex
   
   if ( OrderMagicNumber () == MagicNo       // <-- does the Order's Magic Number match our EA's magic number ? 
      && OrderSymbol () == Symbol ()         // <-- does the Order's Symbol match the Symbol our EA is working on ? 
      && ( OrderType () == OP_BUY           // <-- is the Order a Buy Order ? 
      ||   OrderType () == OP_SELL ) )       // <-- or is it a Sell Order ?
   
       if ( ! OrderClose ( OrderTicket (), OrderLots (), OrderClosePrice (), Slippage ) )               // <-- try to close the order
         Print ( "Order Close failed, order number: " , OrderTicket (), " Error: " , GetLastError () );   // <-- if the Order Close failed print some helpful information 
      
   } //  end of For loop

다시 한 번 위의 코드를 통해 작업해 보겠습니다. . . 라인별, 주문별 주문 . . .

이전과 동일한 주문이 있습니다.

위치 티켓 번호
0 111
1 222
2 333
444
4 555

루프를 통해 첫 번째 실행:

PositionIndex의 초기 값은 TotalNumberOfOrders - 1이고 5 - 1 = 4 이므로 위치 4의 주문이 선택되고 티켓 번호 555, 이 주문은 성공적으로 삭제되고 나머지 주문은 다음과 같이 위치가 변경됩니다.

위치 티켓 번호
0 111
1 222
2 333
444

루프를 통해 두 번째 실행:

이제 PositionIndex의 값은 3이므로 위치 3의 주문이 선택되고 티켓 번호 444, 이 주문은 성공적으로 삭제되고 나머지 주문은 다음과 같이 위치가 변경됩니다 .

위치 티켓 번호
0 111
1 222
2 333

루프를 통해 세 번째 실행:

이제 PositionIndex의 값이 2이므로 위치 2의 주문이 선택되고 티켓 번호 333, 이 주문은 성공적으로 삭제되고 나머지 주문은 다음과 같이 위치가 변경됩니다 .

위치 티켓 번호
0 111
1 222

루프를 통해 4번째 실행:

이제 PositionIndex의 값 이 1 이므로 위치 1의 주문이 선택되고 티켓 번호 222, 이 주문은 성공적으로 삭제되고 나머지 주문은 다음과 같이 위치가 변경됩니다 .

위치 티켓 번호
0 111

다섯 번째이자 마지막 루프 실행:

이제 PositionIndex의 값은 0입니다 . 따라서 위치 0의 주문이 선택되고 티켓 번호 111, 이 주문이 성공적으로 삭제되었습니다. 값 0은 루프에 대한 마지막 유효한 값입니다 . . . 루프가 완료되었습니다.

일치하는 모든 주문을 성공적으로 삭제했습니다. . .

이 스레드에 대한 링크: 루프 및 주문 마감 또는 삭제

 

좀 더 복잡한 예를 들어 보겠습니다. . .

닫고자 하는 다음 주문이 있고 모두 동일한 매직 번호를 갖지만 일부는 EA와 다른 기호를 갖고 있다고 가정해 보겠습니다. 코드가 EA와 동일한 기호에 대한 주문을 종료하기를 원합니다. EURUSD:

위치 티켓 번호 상징
0 111 EURUSD
1 222 EURUSD
2 333 GBPUSD
444 EURUSD
4 555 EURUSD


루프를 통해 첫 번째 실행:

PositionIndex의 초기 값은 TotalNumberOfOrders - 1이며 5 - 1 = 4 이므로 위치 4의 주문이 선택되고 티켓 번호 555가 지정되며 이 주문은 매직 번호 및 기호와 일치하므로 성공적으로 삭제되고 나머지 주문은 다음과 같이 위치가 변경됩니다. 다음과 같다:

위치 티켓 번호 상징
0 111 EURUSD
1 222 EURUSD
2 333 GBPUSD
444 EURUSD

루프를 통해 두 번째 실행:

이제 PositionIndex의 값은 3이므로 위치 3의 주문, 티켓 번호 444, 이 주문은 매직 넘버와 심볼과 일치하므로 성공적 으로 삭제되고 나머지 주문은 다음과 같이 위치가 변경됩니다 .

위치 티켓 번호 상징
0 111 EURUSD
1 222 EURUSD
2 333 GBPUSD


루프를 통해 세 번째 실행:

이제 PositionIndex의 값은 2이므로 위치 2의 주문이 선택되고 티켓 번호 333, 이 주문은 마법 번호와 일치하지만 기호는 일치 하지 않으므로 삭제되지 않고 나머지 주문은 변경되지 않습니다 .

위치 티켓 번호 상징
0 111 EURUSD
1 222 EURUSD
2 333 GBPUSD

루프를 통한 4번째 실행:

이제 PositionIndex의 값 은 1 이므로 위치 1의 주문이 선택되고 티켓 번호는 222, 이 주문은 매직 넘버와 심볼과 일치하므로 성공적으로 삭제되고 나머지 주문은 다음과 같이 위치가 변경 됩니다 .

위치 티켓 번호 상징
0 111 EURUSD
1 333 GBPUSD

다섯 번째이자 마지막 루프 실행:

이제 PositionIndex의 값은 0입니다 . 따라서 위치 0의 주문이 선택되고 티켓 번호 111, 이 주문이 성공적으로 삭제되었습니다. 값 0은 루프에 대한 마지막 유효한 값입니다 . . . 루프가 완료되었습니다.

일치하는 모든 주문을 성공적으로 삭제했으며 기호와 일치하지 않는 하나의 주문인 티켓 번호 333이 현재 위치 0에 있습니다. . .

위치 티켓 번호 상징
0 333 GBPUSD


이 스레드에 대한 링크: 루프 및 주문 마감 또는 삭제

 

중요한 설명에 대해 Raptor에게 감사드립니다.

와이.

 
이것은 쓰레기의 왕 전문가 고문 빌더 나에게 매우 도움이됩니다! 오, 내가 어떻게 결과 코드를 해킹하는 것을 즐깁니까? 감사합니다.
 

우와. 주문 마감에 대한 모든 정보입니다.

지난 137번의 거래를 통해 하루에 50핍 이상의 핍을 지속적으로, 매일(평균) 실패 없이 순조롭게 하려면 얼마나 많은 정보가 필요한지 궁금합니다.

그런 일을 하는 방법을 저에게 보여 주십시오. 그러면 매우 유용한 정보로 간주하겠습니다. 구루는 영원히 귀하의 직함입니다. 아멘.

 
CFx :

우와. 주문 마감에 대한 모든 정보입니다.

지난 137번의 거래를 통해 하루에 50핍 이상의 핍을 지속적으로, 매일(평균) 실패 없이 순조롭게 하려면 얼마나 많은 정보가 필요한지 궁금합니다.

나는 핍에 관심이 없습니다. . . 내가 그들로 무엇을 할 수 있습니까? 나는 그것을 보낼 수 없습니다, GBPPIPS 비율은 무엇입니까? 당신은 성공을 핍으로 계산함으로써 당신의 무지를 보여줍니다. . .
 
CFx :

지난 137번의 거래를 통해 하루에 50핍 이상의 핍을 지속적으로, 매일(평균) 실패 없이 순조롭게 하려면 얼마나 많은 정보가 필요한지 궁금합니다.

그런 일을 하는 방법을 저에게 보여 주십시오. 그러면 매우 유용한 정보로 간주하겠습니다. 구루는 영원히 귀하의 직함입니다. 아멘.

  1. 주제를 벗어난 정보로 스레드를 가로채지 마세요.
  2. 당신이 규칙을 읽지 않았기 때문에 우리는 당신에게 MetaQuotes Language 4와 자동 거래에 관한 것 이외의 어떤 토론도 금지 된다는 것을 보여주지 않을 것입니다
 

Raptor, 나는 mql4.이 스레드가 다시 한 번 내 의심을 없애는 데 도움이 된다는 것을 게시물을 한 눈에 알 수 있습니다. 좋은 일을 계속하십시오.tnx

 

또 다른 아이디어:

 for (PositionIndex = 0 ; PositionIndex < OrdersTotal () ; PositionIndex ++)   //  <-- for loop to loop through all Orders . .   COUNT DOWN TO ZERO !
   {
   if ( ! OrderSelect (PositionIndex, SELECT_BY_POS, MODE_TRADES) ) continue ;   // <-- if the OrderSelect fails advance the loop to the next PositionIndex
   
   if ( OrderMagicNumber() == MagicNo       // <-- does the Order's Magic Number match our EA's magic number ? 
      && OrderSymbol() == Symbol ()         // <-- does the Order's Symbol match the Symbol our EA is working on ? 
      && ( OrderType() == OP_BUY           // <-- is the Order a Buy Order ? 
      ||   OrderType() == OP_SELL ) )       // <-- or is it a Sell Order ?
   
         add_trade_to_close_queue( OrderTicket());   // <--  You need to model the queue mechanism ...
      
   } //  end of For loop


문안 인사.

 
abstract_mind :


또 다른 아이디어:


문안 인사.

예, MT4의 논리를 이해하십시오. 카운터 증가 또는 감소를 코딩하는 것은 귀하에게 달려 있습니다.