전문 고문 - 기타 질문 - 페이지 29

 
honest_knave :
이름을 만들기 위해 OrderTicket을 받는 곳에 코드를 게시하십시오.

(누군가 코드가 필요할 때 - 빨리 게시하기를 미룬다 - OBJECT_**** 함수 를 사용하기 때문에 객체 문서와 약간 다름)

아래 코드는 OnTick()에 있습니다.

for (i= OrdersTotal ()- 1 ;i>= 0 ;i--)
  {
   if (! OrderSelect (i, SELECT_BY_POS , MODE_TRADES )) continue ;
   if ( Symbol ()!= OrderSymbol ()) continue ;
   ObjectCreate ( 0 , "#" + IntegerToString ( OrderTicket ())+ " -" + "Object Button" , OBJ_BUTTON , 0 , 0 , 0 );
  }

이제 아래와 같이 OnChartEvent()로 해당 객체를 호출하려고 합니다.

if (id== CHARTEVENT_OBJECT_CLICK && sparam== "#" + IntegerToString ( OrderTicket ())+ " -" + "Object Button" )
  {
   // when click this button - do something...
  }

미리 감사드립니다.

 
그것은 orderloop 내부가 아니므로 OrderTicket()을 알지 못합니다.
 
Marco vd Heijden :
orderloop 내부가 아니므로 OrderTicket()을 알지 못합니다.
그럼 기회가 없을까요?
 
Max Enrik :
그럼 기회가 없을까요?

대부분의 일들이 가능합니다. 그러나 나는 당신이 달성하려는 것이 무엇인지 확실하지 않습니다. 이 버튼은 무엇입니까? 클릭하면 무엇을 하시겠습니까?

원하는 결과를 얻을 수 있지만 접근 방식을 변경해야 할 수도 있습니다.

 
honest_knave :

대부분의 일들이 가능합니다. 그러나 나는 당신이 달성하려는 것이 무엇인지 확실하지 않습니다. 이 버튼은 무엇입니까? 클릭했을 때 무엇을 하시겠습니까?

원하는 결과를 얻을 수 있지만 접근 방식을 변경해야 할 수도 있습니다.


내 목적은 이 버튼 개체 가 티켓을 클릭할 때 티켓 번호와 수익을 표시할 수 있다는 것입니다.

모바일에서 이 댓글을 작성했습니다. 따라서 10시간 후에 이 문제에 대한 조사를 시작하겠습니다. 귀하의 의견에 감사드립니다.
 
Max Enrik :

내 목적은 이 버튼 개체 가 티켓을 클릭하면 해당 주문 클라우드가 닫힐 때 티켓 번호와 수익을 표시할 수 있다는 것입니다.

모바일에서 이 댓글을 작성했습니다. 따라서 10시간 후에 이 문제에 대한 조사를 시작하겠습니다. 귀하의 의견에 감사드립니다.

이러한 버튼을 식별하는 개체 이름에 고유한 태그가 있어야 합니다. "#"을 사용하는 것 같습니다.

if (id== CHARTEVENT_OBJECT_CLICK && StringSubstr (sparam, 0 , 1 )== "#" ) // this is one of your order buttons being clicked

그런 다음 나머지 개체 이름이나 버튼 텍스트에서 주문 번호를 추출합니다.

이 단계에서는 OrderTicket()을 사용할 필요가 없습니다.

 

그의 물건은 주문표로 식별됩니다.

"#" + IntegerToString ( OrderTicket ())+ " -" + "Object Button"

그래서 모든 개체는 개체가 속한 순서를 찾을 수 있도록 문자열 이름에 티켓 번호가 있습니다.

이것은 모든 객체가 문자열 이름에 "#"을 포함한다는 것을 의미합니다.

따라서 기본적으로 버튼 클릭 시 그는 먼저 개체 문자열 이름에서 주문 티켓 번호를 추출한 다음 orderselectloop를 실행해야 하며, 선택한 orderticket이 버튼 문자열 이름에서 추출한 orderticket 번호와 일치할 때 주문을 찾은 것입니다.

또는 그는 단순히

SELECT_BY_TICKET

차트 이벤트 내에서 순서를 선택합니다.

이제 그가 개체에 티켓 번호/이름만 제공하고 다른 것은 제공하지 않으면 훨씬 쉬울 것입니다.

ObjectCreate ( 0 ," IntegerToString ( OrderTicket ()), OBJ_BUTTON , 0 , 0 , 0 );

그러면 그는 티켓을 직접 선택하거나 숫자를 비교할 수 있기 때문입니다.

 

나는 마지막 날 OrderSelect() 루프를 시도했습니다. 이제 먼저 곧 다시 한 번 시도해 보겠습니다.
그런 다음 귀하의 최신 의견을 깊이 연구하겠습니다.

소중한 시간 내주셔서 감사합니다.

 

test.mq4 파일에서 아래 코드를 시도하여 아래 코드가 완벽하게 작동하고 지금까지 아무런 문제가 발생하지 않았지만 여전히 테스트 중입니다.

Q: 아래 코드가 좋지 않다면 개선할 수 있습니까?

if (id== CHARTEVENT_OBJECT_CLICK )
  {
   for (i= OrdersTotal ()- 1 ; i>= 0 ; i--)
     {
       if (! OrderSelect (i, SELECT_BY_POS , MODE_TRADES )) continue ;
       if ( OrderSymbol ()!= Symbol ()) continue ;

       if (sparam== "#" + IntegerToString ( OrderTicket ())+ " -" + "Object Button" )
        {
         if (! OrderClose ( OrderTicket (), OrderLots (), OrderClosePrice (), 3 ,CLR_NONE))
           {
             Print ( "# Error " , GetLastError ());
           }
        }
     }
  }

미리 감사드립니다.

(나는 그것을 위해 노력하고있다)

 

피상적인 검사는 그것이 작동해야 함을 시사합니다. 하지만 효율성을 높일 수 있습니다.

차트에 얼마나 많은 다른 개체를 그렸는지 생각해 보십시오. 해당 개체 중 *임의*를 클릭하면 모든 단일 주문을 반복하여 일치하는 항목을 찾으려고 합니다. 많은 개체는 아마도 주문과 관련이 없을 것입니다. 이것은 비효율적입니다.

그래서 "#"에 대한 sparam의 첫 번째 문자를 확인 하는 것이 좋습니다. 이렇게 하면 개체가 주문과 관련된 것으로 자동 식별됩니다.

또한 주문을 반복할 필요가 없습니다. 개체 이름 및/또는 개체 텍스트에 이미 티켓 번호가 포함되어 있습니다. 그래서 거기에서 티켓 번호를 추출하고 주문을 닫으십시오.

예시:

주문을 엽니다. 티켓 번호 12345 가 부여됩니다.

이름이 " #12345 "인 OBJ_BUTTON 을 만듭니다.

OnChartEvent()의 코드는 다음과 같습니다(컴파일되지 않음, 테스트되지 않음, 늦은 밤...).

if (id== CHARTEVENT_OBJECT_CLICK && StringSubstr (sparam, 0 , 1 )== "#" ) // this is an order button
  {
   int ticket=( int ) StringSubstr (sparam, 1 ); // extract the ticket number
   if ( OrderSelect (ticket, SELECT_BY_TICKET )) // select the order
     {
       if (! OrderClose ( OrderTicket (), OrderLots (), OrderClosePrice (), 3 ,CLR_NONE)) // close the order
        {
         Print ( "# Error " , GetLastError ());
        }
     }
  }
(실패한 경우 OrderSelect도 처리하고 싶을 것입니다.)