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

 

좋아 그래서 당신이 사용하는 경우

int stoploss= 50 ;
double stop;

stop=stoploss* Point ();

Print ( DoubleToString (stoploss));

Point() 함수를 사용하면 손절매의 가치를 얻을 수 있으며 각 Bid 및 Ask에서 추가하거나 빼서 중지 가격 수준을 알려야 합니다.

이익을 취하는 경우에도 동일하지만 물론 그 반대입니다.

코드 기반에서 일부 EA를 확인할 수 있습니다. 코더가 EA에서 이러한 작업을 수행하는 방법에 대한 많은 예와 변형이 있습니다.

예를 들어 다음은 Trailing Master https://www.mql5.com/en/code/16136 입니다.

//-------------------------------------------------------------------------
// 1. Main function
//-------------------------------------------------------------------------
void OnTick ( void )
  {
   Comment ( "Copyright © 2016, Il Anokhin\n" + TimeToStr ( TimeCurrent (), TIME_DATE | TIME_SECONDS ));

//--- 1.1. Define pip -----------------------------------------------------
   if ( Digits == 4 || Digits <= 2 ) pip= Point ;
   if ( Digits == 5 || Digits == 3 ) pip= Point * 10 ;

//--- 1.2. Trailing -------------------------------------------------------
   for (i= 0 ;i< OrdersTotal ();i++)
     {
       if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES )== true )
        {
         if ( OrderSymbol ()== Symbol () && TS> 0 && OrderProfit ()> 0 )
           {
             if (UC== true && OrderComment ()==Comm && UM== true && OrderMagicNumber ()==Magic && OrderType ()== OP_BUY && OrderOpenPrice ()+TS*pip<= Bid && OrderStopLoss ()< Bid -TS*pip) w= OrderModify ( OrderTicket (), OrderOpenPrice (), Bid -TS*pip, OrderTakeProfit (), 0 );
             if (UC== true && OrderComment ()==Comm && UM== true && OrderMagicNumber ()==Magic && OrderType ()== OP_SELL && OrderOpenPrice ()-TS*pip>= Ask && ( OrderStopLoss ()> Ask +TS*pip || OrderStopLoss ()== 0 )) w= OrderModify ( OrderTicket (), OrderOpenPrice (), Ask +TS*pip, OrderTakeProfit (), 0 );
             if (UC== true && OrderComment ()==Comm && UM== false && OrderType ()== OP_BUY && OrderOpenPrice ()+TS*pip<= Bid && OrderStopLoss ()< Bid -TS*pip) w= OrderModify ( OrderTicket (), OrderOpenPrice (), Bid -TS*pip, OrderTakeProfit (), 0 );
             if (UC== true && OrderComment ()==Comm && UM== false && OrderType ()== OP_SELL && OrderOpenPrice ()-TS*pip>= Ask && ( OrderStopLoss ()> Ask +TS*pip || OrderStopLoss ()== 0 )) w= OrderModify ( OrderTicket (), OrderOpenPrice (), Ask +TS*pip, OrderTakeProfit (), 0 );
             if (UC== false && UM== true && OrderMagicNumber ()==Magic && OrderType ()== OP_BUY && OrderOpenPrice ()+TS*pip<= Bid && OrderStopLoss ()< Bid -TS*pip) w= OrderModify ( OrderTicket (), OrderOpenPrice (), Bid -TS*pip, OrderTakeProfit (), 0 );
             if (UC== false && UM== true && OrderMagicNumber ()==Magic && OrderType ()== OP_SELL && OrderOpenPrice ()-TS*pip>= Ask && ( OrderStopLoss ()> Ask +TS*pip || OrderStopLoss ()== 0 )) w= OrderModify ( OrderTicket (), OrderOpenPrice (), Ask +TS*pip, OrderTakeProfit (), 0 );
             if (UC== false && UM== false && OrderType ()== OP_BUY && OrderOpenPrice ()+TS*pip<= Bid && OrderStopLoss ()< Bid -TS*pip) w= OrderModify ( OrderTicket (), OrderOpenPrice (), Bid -TS*pip, OrderTakeProfit (), 0 );
             if (UC== false && UM== false && OrderType ()== OP_SELL && OrderOpenPrice ()-TS*pip>= Ask && ( OrderStopLoss ()> Ask +TS*pip || OrderStopLoss ()== 0 )) w= OrderModify ( OrderTicket (), OrderOpenPrice (), Ask +TS*pip, OrderTakeProfit (), 0 );
           }
        }
     }

//--- 1.3. End of main function -------------------------------------------

코더 Il Anokhin 주먹을 볼 수 있는 곳에서 pip를 정의합니다.

그러나 여기에 Дима https://www.mql5.com/en/code/8674 의 E-smart 후행이라는 또 다른 예가 있습니다.


//+------------------------------------------------------------------+

void ModifyStopLossInPoint( int stoploss)
{
bool    result;
double sl = 0 ;
double point = MarketInfo ( OrderSymbol (), MODE_POINT );

if ( OrderType () == OP_BUY ) sl = OrderOpenPrice () + stoploss * point;
if ( OrderType () == OP_SELL ) sl = OrderOpenPrice () - stoploss * point;

result = OrderModify ( OrderTicket (), OrderOpenPrice (),sl, OrderTakeProfit (), 0 ,CLR_NONE);
if (result && UseSound) PlaySound (var_132);
}

//+------------------------------------------------------------------+

일을 하는 것의 미묘한 차이에 주목하십시오.

나는 가장 잘 맞는 것을 찾을 때까지 항상 다양한 시도를 한다.

Trailing Master
Trailing Master
  • 투표: 11
  • 2016.10.27
  • Il Anokhin
  • www.mql5.com
The Expert Advisor that performs order trailing after reaching certain profit.
 
Marco vd Heijden :

좋아, 그래서 당신이 사용한다면 ...

Omg, 읽고 무언가를 시도하기 전에 모든 것에 대한 놀라운 감사를 빠르게 확인하십시오 . 나는 곧 그것을 시도합니다.

한 번 더 큰 감사 @Marco vd Heijden

 
Marco vd Heijden :

개체는 서로의 맨 위에 쌓이기 때문에 차트 이벤트()가 어떤 버튼을 클릭했는지 또는 겹칠 수 있는 다른 개체보다 우선 순위가 가장 높은 개체를 알려주는 것이 중요합니다.

대단히 감사 합니다. 귀하의 의견 이 더 명확 하고 유용합니다 .

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

 
Marco vd Heijden :

좋아 그래서 당신이 사용하는 경우

int stoploss= 50 ;

나는 가장 잘 맞는 것을 찾을 때까지 항상 다양한 시도를 한다.

귀하의 좋은 의견을 이해하고 주문, 손절매 및 이익실현 기능에 대한 몇 가지 좋은 코드를 작성하려고 노력 중입니다. 감사합니다.

그래서 저는 이미 아래 코드와 같은 것을 시도했고 10핍에 대해 EURUSD와 FB 손절매 값 이 모두 맞는지 확인해야 합니다 . (내가 생각하는 바를 알고 싶다면 - 그냥 로그/결과 아래에 예라고 생각합니다. 둘 다 10핍에 대한 올바른 값입니다. )
예: 손절매 값 = 10; 포지션 - 매수
통나무: EURUSD | 가격(요청): 1.05 6 33 / 손절매: 1.05 5 33
통나무: FB | 가격(요청): 119. 6 9 / 손절매: 119. 5 9

( void OnChartevent() 에 의해 아래 함수를 호출합니다)

// this part of code from OnChartEvent()
//---
if ( sparam == _buy_name_btn )
{
     ObjectSetInteger ( 0 , sparam, OBJPROP_STATE , false );
    _Buy_calc_SL_TP();
    
     Print ( " | Click Verify /   " );
}
//---
return ;
void _Buy_calc_SL_TP()
{
     //---
     if ( _StopLoss_ON == true )
    {
       //_Sl = OrderOpenPrice() - _StopLoss *  _Pip;
        _Sl = Ask - _StopLoss *  _Pip;
         Print ( " | Buy Calc SL TP Function / StopLoss: " , _Sl );
    }
     //---
     return ;
}
 

작동하는 것 같습니다.

 

나는 Mr. William 의 코멘트를 EA의 코드 책임자에게 포함시키려고 노력할 것입니다. - 다시 한 번 William에게 감사드립니다. 그레이트 핍의 계산 MQL4
(이 코드 산업이 저에게 매우 광범위하게 보이기 때문에 저를 비난하지 마십시오. 그리고 때때로 저는 제 정신을 잃습니다. 어쨌든 저는 제 Trade Panel EA의 코드를 곧 완성할 수 있기를 바랍니다)

그리고 테스트를 마친 후 테스트 EA의 코드를 공유하겠습니다. 코드가 좋은지/맞는지 아니면 무엇입니까? (저는 전문 코더/프로그래머가 아니기 때문에 작업 중입니다-)

 

Keith Watford :

좋아, 충분히 공평해. 눈이 아파서 당신의 글을 읽을 수 없습니다.
다른 사람들도 그렇게 느끼면 내가 아니라 당신이 그리운 것입니다.

나는 당신의 이 이름을 몰랐습니다. 나는 당신이 @Gumrai를 좋아한다는 것을 알고 있습니다. 그래서 죄송합니다. 당신의 댓글에 대해 조금 화를 냈어요. 그래서 당신은 내 코드 지식이 0 이하일 때 이 코멘트 를 도와주었습니다. 내 모든 의견을 무시하는 데 문제가 없습니다. 도움이 필요하거나 다른 것이 필요합니다. 하지만 당신에게 화난 대답을 해서 미안할 뿐입니다.
 

시장이 닫혀 있고 다른 것은 잘 모르겠습니다 . 하지만 아래 코드와 같은 것을 시도했는데 뭔가 놓친 것 같지만 찾을 수 없습니다.
(제 Trade Panel EA에는 Open Buy 및 Open Sell 위치에 대한 코드가 있지만 이 EA가 어떻게 작동하는지 확신하기 위해 직접 작성하려고 합니다.)

도움과 조언에 미리 감사드립니다.

#define CHANGE   double        ///< Difference of two prices.
#define POINT     int          ///< `CHANGE / _Point`.
#define PIP       double        ///< `POINT / PipsPerPOINT`.
        CHANGE   points_to_change(POINT  n){ return n * _Point                          ;}
        POINT    change_to_points(CHANGE c){ return POINT(c / _Point + 0.5 )            ;}
        CHANGE   pips_to_change  (PIP    n){ return points_to_change(pips_to_points(n));}
        PIP      change_to_pips  (CHANGE c){ return points_to_pips(change_to_points(c));}
        POINT    pips_to_points  (PIP    n){ if ( ( _Digits & 1 ) == 1 )   n *= 10.0 ; return POINT(n);}
        PIP      points_to_pips  (POINT  n){ PIP p = n; if ( ( _Digits & 1 ) == 1 ) p /= 10.0 ; return p;}

string prfx       = "test"         ;
string sellbutton = prfx + "sell" ;
string sounduse   = "tick.wav"     ;

int     stoploss   = 10     ;
int     takeprofit = 10     ;
int     magic      = 12345 ;
int     ticket     = 0      ;
int     slippage   = 3      ;

double lot = 0.01          ;
double sl                 ;

bool    stoploss_on        = true ;
bool    result                    ;
bool    sound_use          = true ;

//---
//---
int OnInit ()
{
     ObjectCreate      ( 0 , sellbutton, OBJ_BUTTON         , 0 , 0 , 0            );
     ObjectSetString   ( 0 , sellbutton, OBJPROP_TEXT       , "Sell"             );
     ObjectSetInteger ( 0 , sellbutton, OBJPROP_XDISTANCE , 20                 );
     ObjectSetInteger ( 0 , sellbutton, OBJPROP_YDISTANCE , 20                 );
     ObjectSetInteger ( 0 , sellbutton, OBJPROP_XSIZE      , 80                 );
     ObjectSetInteger ( 0 , sellbutton, OBJPROP_YSIZE      , 40                 );
     ObjectSetInteger ( 0 , sellbutton, OBJPROP_CORNER     , CORNER_LEFT_UPPER );
     ObjectSetInteger ( 0 , sellbutton, OBJPROP_COLOR      , clrWhite           );
     ObjectSetInteger ( 0 , sellbutton, OBJPROP_BGCOLOR    , clrMaroon          );
     ObjectSetInteger ( 0 , sellbutton, OBJPROP_STATE      , false              );
     ObjectSetInteger ( 0 , sellbutton, OBJPROP_ZORDER     , 1                  );

     Print ( "ObjectsTotal: " , ObjectsTotal () );
     return ( 0 );
}

//---
//---
void OnTick ()
{
     //---

     //---
     return ;
}

//---
//---
void OnDeinit ( const int reason)
{
     //---
     ObjectsDeleteAll ( 0 , prfx );
     //---
     return ;
}

//---
//---
void OnChartEvent ( const int      id     ,
                   const long &   lparam ,
                   const double & dparam ,
                   const string & sparam
                  )
{
     // Sell
     if ( sparam == sellbutton )
    {
         ObjectSetInteger ( 0 , sparam, OBJPROP_STATE , false );
        ticket = Orderfuntions( sellbutton );
    }
     return ;
}

//---
//---
void SellCalcSLTP()
{
     //---
     if ( stoploss_on == true )
    {
         if ( OrderType () == OP_SELL ) sl = OrderOpenPrice () - pips_to_change( stoploss );
         if ( OrderType () == OP_BUY   ) sl = OrderOpenPrice () + pips_to_change( stoploss );

        result = OrderModify ( OrderTicket (), OrderOpenPrice (), sl, OrderTakeProfit (), 0 , CLR_NONE );
         if ( result && sound_use ) PlaySound ( sounduse );
    }
     //---
     return ;
}

//---
//---
int Orderfuntions( string _Order_selector )
{
     // Sell Order
    SellCalcSLTP();
     if ( _Order_selector == sellbutton )
    {
        ticket = OrderSend ( _Symbol , OP_SELL , lot, Bid , slippage, sl, takeprofit, "comment" , magic, 0 , clrMaroon );
    }
     return (ticket);
}
 
괜찮아 보이지만 ordermodify를 사용할 수 없습니다. 먼저 OrderSelect() 함수 로 주문을 선택해야 합니다.
 
Marco vd Heijden :
괜찮아 보이지만 ordermodify를 사용할 수 없습니다. 먼저 OrderSelect() 함수 로 주문을 선택해야 합니다.
좋아요, 곧 시도하겠습니다. 감사해요!