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

 

이미 예제에 있습니다.

주문을 닫을 때 OrderClose() 함수 의 부울 반환 값을 사용하고 함수가 성공하면 주문과 관련된 개체를 제거할 수 있습니다.

                           bool close= OrderClose ( OrderTicket (), OrderLots (), OrderClosePrice (), 3 , clrBlue );
                             {
                               if (close== 0 )
                                {
                                 Alert ( " Order Close Error! # " + IntegerToString ( OrderTicket ()));
                                }
                               if ( close== 1 )
                                {
                                 Alert ( " Order: " + IntegerToString ( OrderTicket ())+ " Closed due to TP Profit = " + DoubleToString ( OrderProfit (), 2 ));
                                 ObjectDelete ( 0 , "#" + IntegerToString ( OrderTicket ())+ "-TP" );
                                 ObjectDelete ( 0 , "#" + IntegerToString ( OrderTicket ())+ "-SL" );
                                }
                             }
 
Marco vd Heijden :

이미 예제에 있습니다.
주문을 닫을 때 OrderClose() 함수 의 부울 반환 값을 사용하고 함수가 성공하면 주문과 관련된 개체를 제거할 수 있습니다.

이미 알고, 이미 시도했습니다. 내가 뭔가를 잘못했을 수도 있습니다. 나는 다시 한 번 시도할 것이지만, 묻고 싶기 전에 나는 OrderClose()를 사용하고 싶지 않습니다. (때로는 수동으로 주문을 마감하기도 함)
Q: 주문이 마감된 후 OrderClose() 없이 주문 개체를 삭제할 수 있습니까?

미리 감사드립니다.

 

Order Close() 함수의 반환 값은 작업의 성공 여부를 결정하므로 수동으로 주문을 닫는 경우 약간 다른 메커니즘을 설계하고 사용해야 합니다.

주문 목록의 섀도 복사본을 만들어 실제 목록과 비교할 수 있으며 수동으로 주문을 마감하여 변경 사항이 있을 때마다 변경된 사항을 찾아 해당 개체를 제거할 수 있습니다.

그러나 더 쉬운 방법은 OrderTicket()이 활성 주문 풀에 여전히 존재하는지 확인하여 수동으로 주문을 마감했기 때문에 사라지면 개체가 자동으로 제거되는지 확인하는 것입니다.

따라서 설정 방법에 따라 다릅니다.

이 시점에서 나는 당신이 취하는 방향이 나중에 추가하고 싶을 수도 있는 추가 작업과 다소 관련이 있기 때문에 결국 당신이 하고자 하는 것 이상을 시도하고 살펴보아야 한다고 말하고 싶습니다.


객체 생성은 이미 완전히 자동화되어 있으므로 객체 제거에 대해서도 동일한 작업을 수행하는 것이 좋습니다. 그러면 나중에 이에 대해 걱정할 필요가 없습니다.

이를 위해 간단히 사용할 수 있습니다.

OrdersHistoryTotal ()

그리고 히스토리 풀

MODE_HISTORY

간단합니다. 주문 내역 풀이 스캔되고 각 주기마다 코드에서 OrderTicket() 번호와 관련된 개체가 있는지 확인하고 일치하는 개체가 있으면 개체가 자동으로 삭제됩니다.

이렇게 하려면 다른 루프를 추가하기만 하면 되지만 이번에는 히스토리 풀 위에 추가됩니다.

예를 참조하십시오.

//+------------------------------------------------------------------+
//|                                                ObjectsRemove.mq4 |
//|      Copyright 2017, Marco vd Heijden, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, Marco vd Heijden, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property version    "1.00"
#property strict

static input int takeprofit= 500 ; // Take Profit
static input int stoploss= 500 ;   // Stop Loss
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- create timer
   EventSetTimer ( 1 );

//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//--- destroy timer
   EventKillTimer ();

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
//---

  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer ()
  {
   for ( int order= OrdersTotal (); order>= 0 ; order--)
     {
       bool selected= OrderSelect (order, SELECT_BY_POS );
        {
         if (selected== 1 )
           {
             if ( Symbol ()== OrderSymbol ()) // only for current chart symbol
              {
               switch ( OrderType ())
                 {
                   case OP_BUY : // for buy order
                    {
                     // if objects not found - create them
                     if ( ObjectFind ( 0 , "#" + IntegerToString ( OrderTicket ())+ "-TP" )< 0 )
                       {
                         ObjectCreate ( 0 , "#" + IntegerToString ( OrderTicket ())+ "-TP" , OBJ_HLINE , 0 , 0 , OrderOpenPrice ()+takeprofit* Point ());
                         ObjectSet ( "#" + IntegerToString ( OrderTicket ())+ "-TP" , 7 , 3 );
                       }
                     if ( ObjectFind ( 0 , "#" + IntegerToString ( OrderTicket ())+ "-SL" )< 0 )
                       {
                         ObjectCreate ( 0 , "#" + IntegerToString ( OrderTicket ())+ "-SL" , OBJ_HLINE , 0 , 0 , OrderOpenPrice ()-stoploss* Point ());
                         ObjectSet ( "#" + IntegerToString ( OrderTicket ())+ "-SL" , 7 , 3 );
                       }
                     // if objects exist
                     if ( ObjectFind ( 0 , "#" + IntegerToString ( OrderTicket ())+ "-TP" )>= 0 )
                       {
                         if ( Bid > ObjectGetDouble ( 0 , "#" + IntegerToString ( OrderTicket ())+ "-TP" , OBJPROP_PRICE , 0 ))
                          {
                           PlaySound ( "alert2.wav" ); // OrderClose now removed...
                          }
                       }
                     if ( ObjectFind ( 0 , "#" + IntegerToString ( OrderTicket ())+ "-SL" )>= 0 )
                       {
                         if ( Ask < ObjectGetDouble ( 0 , "#" + IntegerToString ( OrderTicket ())+ "-SL" , OBJPROP_PRICE , 0 ))
                          {
                           PlaySound ( "alert2.wav" ); // OrderClose now removed...
                          }
                       }
                    }
                   break ;

                   case OP_SELL : // for sell order
                    {
                     // if objects not found - create them
                     if ( ObjectFind ( 0 , "#" + IntegerToString ( OrderTicket ())+ "-TP" )< 0 )
                       {
                         ObjectCreate ( 0 , "#" + IntegerToString ( OrderTicket ())+ "-TP" , OBJ_HLINE , 0 , 0 , OrderOpenPrice ()-takeprofit* Point ());
                         ObjectSet ( "#" + IntegerToString ( OrderTicket ())+ "-TP" , 7 , 3 );
                       }
                     if ( ObjectFind ( 0 , "#" + IntegerToString ( OrderTicket ())+ "-SL" )< 0 )
                       {
                         ObjectCreate ( 0 , "#" + IntegerToString ( OrderTicket ())+ "-SL" , OBJ_HLINE , 0 , 0 , OrderOpenPrice ()+stoploss* Point ());
                         ObjectSet ( "#" + IntegerToString ( OrderTicket ())+ "-SL" , 7 , 3 );
                       }
                     // if objects exist
                     if ( ObjectFind ( 0 , "#" + IntegerToString ( OrderTicket ())+ "-TP" )>= 0 )
                       {
                         if ( Ask < ObjectGetDouble ( 0 , "#" + IntegerToString ( OrderTicket ())+ "-TP" , OBJPROP_PRICE , 0 ))
                          {
                           PlaySound ( "alert2.wav" ); // OrderClose now removed...
                          }
                       }
                     if ( ObjectFind ( 0 , "#" + IntegerToString ( OrderTicket ())+ "-SL" )>= 0 )
                       {
                         if ( Bid > ObjectGetDouble ( 0 , "#" + IntegerToString ( OrderTicket ())+ "-SL" , OBJPROP_PRICE , 0 ))
                          {
                           PlaySound ( "alert2.wav" ); // OrderClose now removed...
                          }
                       }
                    }
                   break ;
                 }
              }
           }
        }
     }
//+------------------------------------------------------------------+
//--- delete objects when order is closed
   for ( int order= OrdersHistoryTotal ()- 1 ; order>= 0 ; order--)
     {
       bool selected= OrderSelect (order, SELECT_BY_POS , MODE_HISTORY );
        {
         if (selected== 1 )
           {
             // if objects are still found - Delete them
             if ( ObjectFind ( 0 , "#" + IntegerToString ( OrderTicket ())+ "-TP" )>= 0 )
              {
               ObjectDelete ( 0 , "#" + IntegerToString ( OrderTicket ())+ "-TP" );
              }
             if ( ObjectFind ( 0 , "#" + IntegerToString ( OrderTicket ())+ "-SL" )>= 0 )
              {
               ObjectDelete ( 0 , "#" + IntegerToString ( OrderTicket ())+ "-SL" );
              }
           }
        }
     }
//+------------------------------------------------------------------+    
  } // end OnTimer() function
//+------------------------------------------------------------------+

따라서 이제 가상 이익 실현 및 손절매 라인을 완전히 자동으로 추가하고 이러한 라인을 완전히 자동으로 제거할 수 있습니다.

물론 이 예는 히스토리 풀을 지속적으로 스캔하고 있습니다...

또한 주문 수를 보유하는 정수를 추가하면 OrdersTotal()과 비교되며 무언가가 변경될 때마다 개체 제거 코드를 실행할 수 있습니다.

또는 간단한 카운터(60)를 추가할 수 있습니다. 그러면 코드 조각은 제거해야 할 항목이 있는 경우 1분에 한 번만 확인합니다.

 

이봐! 완벽하게 작동합니다! 정말 감사합니다!

나는 조금 변했다. 지금까지는 문제 없이 작동합니다.

//--- delete objects when order is closed
   for ( int order= OrdersHistoryTotal ()- 1 ; order>= 0 ; order--)
     {
       bool selected= OrderSelect (order, SELECT_BY_POS , MODE_HISTORY );
        {
         if (selected== 1 )
           {
             // if objects are still found - Delete them
             ObjectsDeleteAll ( 0 , "#" + IntegerToString ( OrderTicket () ) ); // for arrows
             ObjectsDeleteAll ( 0 , _prefix + " #" + IntegerToString ( OrderTicket () ) ); // order, sl, tp, price objects
           }
        }
     }

문제가 있으면 알려주세요.
다시 한 번 정말 감사합니다.

 

아마도 아무도 내 질문을 이해하지 못할 것입니다. 그러나 나는 여전히 그것에 대한 좋은 의견이 필요합니다. 이제 이미지로 내 질문을 명확히하려고합니다.
질문: 또한 손절매, 트레이드 패널 개체 앞에서 이익을 취하십시오. 지난 시간으로 인해 객체가 생성 된다는 것을 알고 있습니다. 그러나 저를 이해하신다면 "손절매 및 이익실현" 라인 없이 Trade Panel 객체가 다른 모든 객체 앞에 있어야 하는 방법을 알려주십시오.

혼합된 개체

OBJPROP_BACK을 사용할 수 있다는 것을 알고 있지만 사용하고 싶지 않습니다. 나는 둘 다 같은 라인과 가격을 볼 필요가 있습니다. 그것에 대해 좋은 의견을 얻을 수 있기를 바랍니다.


열기, 손절매, 이익실현, 가격 라인 " 생성 및 삭제 "는 모두 기능입니다. 이제 OnChartEvent()에 해당 함수를 넣어야 하기 때문에 분할하려고 합니다. 하지만 물어보기 전에.
Q: 해당 함수를 OnChartEvent()에 넣으면 해당 함수가 내 수동 주문에 영향을 미칠 수 없습니까?

지금 작업 중입니다.

도와주세요. 미리 감사드립니다.

 

Onchartevent() 는 OnTImer() 함수 와 다른 차트 이벤트가 있을 때만 코드를 실행하지 않습니다.

그래서 당신은 당신이하고있는 일을 정확히 알아야합니다.

예를 들어 스캔 코드를 사용하는 경우:

if ( Bid > ObjectGetDouble ( 0 , "#" + IntegerToString ( OrderTicket ())+ "-SL" , OBJPROP_PRICE , 0 ))

가격이 선을 넘었는지 확인하려면 OnChartEvent()에서 작동하지 않습니다.

또한 자동화된 예제를 사용하려는 경우

if ( ObjectFind ( 0 , "#" + IntegerToString ( OrderTicket ())+ "-TP" )< 0 )
   {
     ObjectCreate ( 0 , "#" + IntegerToString ( OrderTicket ())+ "-TP" , OBJ_HLINE , 0 , 0 , OrderOpenPrice ()-takeprofit* Point ());
     ObjectSet ( "#" + IntegerToString ( OrderTicket ())+ "-TP" , 7 , 3 );
   }

이것은 작동하지 않거나 개체를 생성하지 않습니다.

코드를 다시 작성해야 합니다.

또한 H_LINE 개체를 OBJPROP_BACK으로 설정할 수 있습니다. 이 개체는 여전히 볼 수 있고 패널 아래에 있으므로 문제가 되지 않습니다.

 

정말 훌륭하고 유용한 댓글 입니다. 이제 추가로 무엇을 할 수 있는지 알기 위해 적어도 한 번은 시도해야 한다는 것을 확실히 압니다.

빠른 답변과 도움이 되는 댓글 감사합니다.

 
Marco vd Heijden :

코드를 다시 작성 해야 합니다.

(나는 이미 당신의 의견을 주의 깊게 읽었지만 한 번만 시도하고 싶었습니다. 마침내 당신이 말했듯이 OnTimer()처럼 작동하지 않습니다. )

어머나! 해당 블록 코드의 모든 것을 변경해야 합니까?
이제 네 가지 기능이 있습니다. OnChartEvent()에 넣으려고 합니다. 나는 이미 한 가지 업데이트가 손실을 중지 하고 이익 가격을 취하기 위해 Print() 라는 업데이트를 보았습니다.
OrderModify()는 작동하지 않습니다.

8~10시간 후에 이 문제에 대해 다시 시도할 것입니다.
나는 단지 좋은 의견이 필요합니다. 나는 그것을 얻을 수 있기를 바랍니다.

미리 감사드립니다.

void OnChartEvent ( const int id, const long & lparam, const double & dparam, const string & sparam)
  {
   if (id== CHARTEVENT_OBJECT_DRAG ) // I already tried with take profit object - there was not any effects
     {
      SL_TPcreateobjects();
      SL_TPdrags();
      SL_TPmodify();
      deleteobjs();
     }
  }
// if objects not found - create them
SL_TPcreateobjects()
  {
   for ( int i= OrdersTotal ()- 1 ; i>= 0 ; i--)
     {
       if (! OrderSelect (i, SELECT_BY_POS , MODE_TRADES )) continue ;
       if ( Symbol ()!= OrderSymbol ()) continue ;

       if ( ObjectFind ( 0 , "#" + IntegerToString ( OrderTicket ())+ "-TP" )< 0 )
        {
         ObjectCreate ( 0 , "#" + IntegerToString ( OrderTicket ())+ "-TP" , OBJ_HLINE , 0 , 0 ,takeprofit);
        }
     }
  }
// if objects exist
SL_TPdrags()
  {
   for ( int i= OrdersTotal ()- 1 ; i>= 0 ; i--)
     {
       if (! OrderSelect (i, SELECT_BY_POS , MODE_TRADES )) continue ;
       if ( Symbol ()!= OrderSymbol ()) continue ;

       if ( ObjectFind ( 0 , "#" + IntegerToString ( OrderTicket ())+ "-TP" )>= 0 )
        {
         if (TP_Price!= ObjectGetDouble ( 0 , "#" + IntegerToString ( OrderTicket ())+ "-TP" , OBJPROP_PRICE , 0 ))
           {
            TP_drag= 1 ;
            TP_Price= ObjectGetDouble ( 0 , "#" + IntegerToString ( OrderTicket ())+ "-TP" , OBJPROP_PRICE , 0 );
           }
         if (TP_drag== 1 )
           {
             if (TP_Price== ObjectGetDouble ( 0 , "#" + IntegerToString ( OrderTicket ())+ "-TP" , OBJPROP_PRICE , 0 ))
              {
               Print ( "Take Profit Price:" , DoubleToString (TP_Price, Digits ));
               TP_drag= 0 ;
              }
           }
        }
     }
  }
// order closed - delete junks
deleteobjs()
{
   for ( int i= OrdersHistoryTotal ()- 1 ; i>= 0 ; i--)
    {
     bool Selected= OrderSelect (i, SELECT_BY_POS , MODE_HISTORY );
     if (Selected== 1 )
       {
         ObjectsDeleteAll ( 0 , "#" + IntegerToString ( OrderTicket ())+ "-TP" );
       }
    }
}
// ordermodify()
SL_TPmodify()
{
  Order_Modify= OrderModify ( OrderTicket (), OrderOpenPrice (),SL_Price,TP_Price, 0 ,CLR_NONE);
}
//+------------------------------------------------------------------+
 

이러한 기능 은 차트 이벤트가 발생할 때만 실행됩니다.

적어도 그것이 당신이 여기에서 보여주는 것입니다.

Chartevent는 누군가가 차트의 버튼이나 다른 것을 눌렀을 때 인터럽트 루틴에 대한 트리거입니다.

이제 완전히 자동화된 예를 들어 버튼 아래에 두었습니다. 아무도 누르지 않으면 아무 일도 일어나지 않습니다.

 
Marco vd Heijden :

이러한 기능 은 차트 이벤트가 발생할 때만 실행됩니다.
적어도 그것이 여기에서 보여주는 것입니다.
Chartevent는 누군가가 차트의 버튼이나 다른 것을 눌렀을 때 인터럽트 루틴에 대한 트리거입니다.
이제 완전히 자동화된 예를 들어 버튼 아래에 두었습니다. 아무도 누르지 않으면 아무 일도 일어나지 않습니다.

최근 댓글이 너무 단순해 보일 수 있지만 실제로는 그 댓글이 올바른 방향을 보여주었습니다.
이제 드래그를 사용하려고 하는 문제를 해결합니다.

그리고 이제 HLine 개체와 함께 움직이는 다른 그래픽 개체에 대해 연구하기 시작했습니다.

훨씬 더 고마워요!
당신에게 최선을!


정직한_knave :

또한 라인을 얼마나 자주 이동하는지 생각해 보십시오. 1초에 한번인가요? 아마 아닐 것입니다.
OnChartEvent()에 코드를 입력합니다.

void OnChartEvent ( const int id, const long & lparam, const double & dparam, const string & sparam)
  {
   if (id== CHARTEVENT_OBJECT_DRAG && sparam== "line" ) // the chart event of dragging the line
고마워요! 이 댓글이 정말 많은 도움이 되었어요!
사유: