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

 
Marco vd Heijden :

또는 드래그가 감지되면 카운터를 시작할 수 있습니다. 여러 가지 방법이 있습니다 .,

(나는 지금 나를 위해 그것을 할 수 있는 한 가지 방법을 "가지고 있다" - 당신의 최근 코멘트에서 그런 식으로)
Mr. Marco 당신이 내 하루를 구해줘서 고마워요.

지금은 아니지만 나중에 이 ' SLTP ' 기능 에 몇 가지 기능 을 추가하려고 합니다. 나는 그것에 대한 스크립트를 작성하기 시작하기 전에 그것에 대해 많은 것을 조사해야 할 필요가 있습니다.

당신에게 최선을 다합니다!

 

내 기억이 맞다면 - 오래전에 " Order Modifier " EA 가 다음과 같은 작업을 하는 것을 본 적이 있습니다. 드래그하는 동안 업데이트되지 않은 것, 내가 " Drag OFF " 드래그 라인을 드래그한 후 드래그한 다음 " Stop Loss and Take Profit " 값은 한 번만 변경될 수 있습니다.
그래서 나는 당신의 최신 댓글을 세 번 이상 읽었고 드래그하는 동안 업데이트를 중지할 수 있도록 조금 더 변경하려고 시도했습니다.

Q: 그럼 불가능한가요?

미리 감사드립니다.

 

부울 플래그 drag == 1 동안 업데이트를 비활성화하는 데 동일한 플래그를 사용할 수 있습니다.

내가 말했듯이 여기에 카운터를 시작할 수도 있습니다.

//+------------------------------------------------------------------+
//|                                                  Drag Hline2.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

double price;
bool drag;
int cnt= 0 ;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- create timer
   EventSetTimer ( 1 );
   ObjectCreate ( 0 , "line" , OBJ_HLINE , 0 , 0 , Ask );
   price= ObjectGetDouble ( 0 , "line" , OBJPROP_PRICE , 0 );
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//--- destroy timer
   EventKillTimer ();

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

  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer ()
  {
//---
   if (price!= ObjectGetDouble ( 0 , "line" , OBJPROP_PRICE , 0 ))
     {
      drag= 1 ;
     }

   if (drag== 1 )
     {
      cnt++;       // increase counter
        {
         if (cnt>= 2 ) // if counter == 2 seconds
           {
            price= ObjectGetDouble ( 0 , "line" , OBJPROP_PRICE , 0 ); // store new value
             Print ( " New price: " , DoubleToString (price));
             PlaySound ( "ok.wav" );
            cnt= 0 ;   // reset counter
            drag= 0 ; // reset drag
           }
        }
     }
  }
//+------------------------------------------------------------------+

또는 단순히 while 루프를 사용하면 매우 잘 작동합니다.

//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer ()
  {
//---
   while (price!= ObjectGetDouble ( 0 , "line" , OBJPROP_PRICE , 0 ))
    {
     PlaySound ( "ok.wav" );
     price= ObjectGetDouble ( 0 , "line" , OBJPROP_PRICE , 0 );
     Comment (price);
    }
  }
//+------------------------------------------------------------------+
그것은 단지 그들이 (내가 끌기를 멈출 때) 둘 다 같아질 때까지 가격을 업데이트하는 동안 (나는 끌고 있는 동안) 말하는 것입니다
 
Marco vd Heijden :

부울 플래그 drag == 1 동안 업데이트를 비활성화하는 데 동일한 플래그를 사용할 수 있습니다.
내가 말했듯이 여기에 카운터를 시작할 수도 있습니다.
또는 단순히 while 루프를 사용하면 매우 잘 작동합니다.
그것은 단지 그들이 (내가 끌기를 멈출 때) 둘 다 같아질 때까지 가격을 업데이트하는 동안 (나는 끌고 있는 동안) 말하는 것입니다

( 및 귀하의 코드 )

얼마나 훌륭한 모범을 보이는 사람입니까?! 정말 매우 유용한 댓글 입니다. 감사합니다. 그리고 이제 그 라인(디자인 및 기능 )에 대해 더 많은 것을 추가하려고 합니다.
(이 질문에 대해 나를 비난하지 마십시오. 그래픽 개체에 사용하고 있는 " graphics() "가 있으며 Init()를 통해 호출하고 있으며 OnTimer()를 통해 호출해야 합니다. 내 질문은 : 내가 잘못하고 있습니까? )

당신에게 최선을!

 

이미 존재하기 때문에 개체를 생성 하지 못한 오류 4200이 발생할 수 있습니다.

따라서 객체를 (재) 생성하거나 수정하기 전에 객체가 존재하는지 확인해야 합니다.

당신이 사용할 수있는:

   if ( ObjectFind ( 0 , "Long" )< 0 )
     {
       //Object does not exist

     }
  
and/or

   if ( ObjectFind ( 0 , "Long" )>= 0 )
     {
       // Object already exists
    
     }
 
Marco vd Heijden :

당신이 사용할 수있는:

흠, 이것은 저에게 정말 새로운 기능 입니다.
그것에 대해 조사한 후에 시도해 볼 수 있습니다. (많이 봤지만 저한테는 안씁니다.)

정말 감사합니다.

 

#가격을 픽셀로 변환 - 열기

나는 이익실현 기능 을 위해 "HLine"을 사용합니다.
나는 개체가 거의 없으며( Label, RecLabel... 등) 개체가 " HLine " 개체와 함께 이동할 수 있기를 바랍니다. 그래서 나는 기능 아래에서 발견되었습니다. 그러나 " X "를 변환하고 싶지 않습니다. Price만 Y로 변환하고 싶습니다.
나는 아래 코드로 아무것도 시도하지 않았습니다.
Q:
이 문제를 해결하는 데 도움이 될 수 있는지 확인하고 싶습니다.
(내가 그것이 나를 도울 수 있다는 것을 안다면 나는 내 관심사를 위해 그것을 시도하기 시작할 것입니다).
Q: 그리고 " HLine "으로 움직일 수 있는 일부 개체에 대한 방법이 있습니까?

// this is just example for that what I am thinking
datetime time = 0 ; // I just want to ignore this because I just want to give to X = 20; fixed mode ( should not change ever )
double price = ObjectGetDouble ( 0 , "line" , OBJPROP_PRICE , 0 );

int x,y;

ChartTimePriceToXY ( long chart_id, int sub_window, datetime time, double price, int & x, int & y );

미리 감사드립니다.

 

여러 가지 방법으로 많은 일을 할 수 있으므로 좀 더 구체적이어야 합니다.

이러한 함수는 OnChartEvent() 함수에서 사용됩니다.

ChartPriceToXY - 좌표에 대한 가격 시간 변환을 제공합니다. 이것이 정말 필요한 것입니까?

아마도 ChartXYToTimePrice ()를 의미합니까?

https://www.mql5.com/en/docs/chart_operations/chartxytotimeprice

값이 필요하지 않은 경우 아래 예를 참조하여 0으로 전달하면 됩니다.

//+------------------------------------------------------------------+
//|                                                    CrossHair.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
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- create some lines
   ObjectCreate ( 0 , "X" , OBJ_HLINE , 0 , 0 , Ask );           // X = Horizontal Axis (time==0)
   ObjectCreate ( 0 , "Y" , OBJ_VLINE , 0 , TimeCurrent (), 0 ); // Y = Vertical Axis (price==0)      
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//--- clean up  
   ObjectsDeleteAll ( 0 , 0 , EMPTY );  
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
//---
  
  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent ( const int id,
                   const long &lparam,
                   const double &dparam,
                   const string &sparam)
  {
//--- If this is an event of a mouse click on the chart
   if (id== CHARTEVENT_CLICK )
     {
       //--- Prepare variables
       int       x     =( int )lparam;
       int       y     =( int )dparam;
       datetime time  = 0 ;
       double    price = 0 ;
       int       window= 0 ;
       //--- Convert the X and Y coordinates in terms of date/time
       if ( ChartXYToTimePrice ( 0 ,x,y,window,time,price))
        {
         ObjectMove ( 0 , "X" , 0 , 0 ,price); // notice time==0 because horizontal axis
         ObjectMove ( 0 , "Y" , 0 ,time, 0 );  // notice price==0 because vertical axis
        }
       else
         Print ( "ChartXYToTimePrice return error code: " , GetLastError ());
       Print ( "+--------------------------------------------------------------+" );
     }
  }  
//+------------------------------------------------------------------+



Documentation on MQL5: Chart Operations / ChartXYToTimePrice
Documentation on MQL5: Chart Operations / ChartXYToTimePrice
  • www.mql5.com
Chart Operations / ChartXYToTimePrice - Reference on algorithmic/automated trading language for MetaTrader 5
 

나는 이미 그 문서를 읽었지만 귀하의 최신 의견이 나올 때까지 명확하게 이해하지 못했습니다. 사실 코드 아래에서 어려움을 겪고 있기 때문에 아직 시도하지 않았습니다. 좋은 결과를 얻기 위해 이미 몇 가지 방법을 시도했지만 할 수 없습니다.
Mr. Marco
는 내 개체 이동 문제에 사용할 수 있다고 생각하는 최근의 훌륭한 의견에 감사드립니다.

고민에 대한 해결책을 찾기 위해 정말 많은 시간을 보냈지만 좋은 결과를 얻지 못했습니다.
그러나 어쨌든 나는 (현재 오픈 포지션) 이익실현 가격을 얻을 수 있습니다. 이는 내가 "hline"하고 싶은 물건이 이익실현 가격을 자체적으로 호출할 수 있고 그것은 일입니다. 그리고 그것은 단지 초기에 작동합니다. 네, " Init() "에 있기 때문에 압니다. 그러나 " OnTimer() "에 넣으려고했지만 id가 올바르게 작동하지 않습니다.

내가 무엇을 배울 수 있는지 파악하고 이 문제를 해결하는 데 도움이 되는 정보를 알려주십시오.
7시간 후에 이 문제에 대해 다시 조사를 시작하겠습니다.
내가 좋은 댓글을 받으면 그것은 나에게 더 좋을 것입니다.

// init()------------------------------------------------------------

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

     ObjectCreate     (
                         "#" + IntegerToString ( OrderTicket () ) + " -" + "tphline" , // name
                         OBJ_HLINE ,
                         0 ,       // subwindow
                         0 ,       // time
                        tpprice // price1
                    );
    tpprice =
     ObjectGetDouble (
                         0 ,
                         "#" + IntegerToString ( OrderTicket () ) + " -" + "tphline" , // name
                         OBJPROP_PRICE , 0
                    );

}
// ontimer() --------------------------------------------------------

if   ( tpprice != ObjectGetDouble ( 0 , "#" + IntegerToString ( OrderTicket () ) + " -" + "tphline" , OBJPROP_PRICE , 0 ) )
{
    tpdrag = 1 ;
}

if   ( tpdrag == 1 )
{
    tpprice = ObjectGetDouble ( 0 , "#" + IntegerToString ( OrderTicket () ) + " -" + "tphline" , OBJPROP_PRICE , 0 );
     Print ( "tpdrag: " , tpdrag, " - Price: " , DoubleToString ( tpprice, Digits ) );

     // actually here is a graphical objects functin()
     // here one of them
     // also which one soon I will try to  below objects could moves together " tphline " - but I can't take a time to research about your latest comment and so...
     ObjectCreate ( "recl object" , OBJ_RECTANGLE , 0 , 0 , tpprice ); // I feel I could add something to " string name " - I already tried few things not good results

    tpdrag = 0 ;
}

//---
return ;

미리 감사드립니다.
당신에게 최선을!

 

도구 탭 아래에 있는 스타일러를 사용하세요.

나는 당신이 무엇을 성취하려고 하는지 전혀 알지 못하기 때문에 당신이 이 일을 하고자 하는 것이 결코 좋지 않다고 추측해야 합니다.

그러나 여기에서 예를 볼 수 있습니다.

//+------------------------------------------------------------------+
//|                                                    Stealth 4.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 ))
                          {
                           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" );
                                }
                             }
                          }
                       }
                     if ( ObjectFind ( 0 , "#" + IntegerToString ( OrderTicket ())+ "-SL" )>= 0 )
                       {
                         if ( Ask < ObjectGetDouble ( 0 , "#" + IntegerToString ( OrderTicket ())+ "-SL" , OBJPROP_PRICE , 0 ))
                          {
                           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 SL Profit = " + DoubleToString ( OrderProfit (), 2 ));
                                 ObjectDelete ( 0 , "#" + IntegerToString ( OrderTicket ())+ "-TP" );
                                 ObjectDelete ( 0 , "#" + IntegerToString ( OrderTicket ())+ "-SL" );
                                }
                             }
                          }
                       }
                    }
                   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 ))
                          {
                           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" );
                                }
                             }
                          }
                       }
                     if ( ObjectFind ( 0 , "#" + IntegerToString ( OrderTicket ())+ "-SL" )>= 0 )
                       {
                         if ( Bid > ObjectGetDouble ( 0 , "#" + IntegerToString ( OrderTicket ())+ "-SL" , OBJPROP_PRICE , 0 ))
                          {
                           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 SL Profit = " + DoubleToString ( OrderProfit (), 2 ));
                                 ObjectDelete ( 0 , "#" + IntegerToString ( OrderTicket ())+ "-TP" );
                                 ObjectDelete ( 0 , "#" + IntegerToString ( OrderTicket ())+ "-SL" );
                                }
                             }
                          }
                       }
                    }
                   break ;
                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+


따라서 ObjectGetDouble을 직접 사용할 수 있다는 것을 알 수 있습니다. 객체 자체가 값을 보유하고 있기 때문에 값을 다른 double에 복사할 필요가 없으며, 라인을 드래그하면 값이 자동으로 변경되고 다음에 읽을 때 표시됩니다. 그것.