专家顾问 - 杂项问题 - 页 8

 

好的,所以如果你用

int stoploss=50;
double stop;

stop=stoploss*Point();

Print(DoubleToString(stoploss));

通过使用Point()函数,应该可以得到你的止损值,然后你必须从买入价和卖出价中分别加上或减去该值,以得到你的止损价格水平。

同样的方法也适用于获利,当然是相反的。

你可以查看代码库中的一些EA,那里有很多例子和变化,说明编码员如何在他们的EA中做这些事情。

例如,这里有一个叫做 "拖曳大师 "的例子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用 拳头定义点。

但这里是另一个名为E-smart trailing的例子,来自Димаhttps://www.mql5.com/en/code/8674


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

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:

对象是相互堆叠的,所以让chartevent()知道在什么按钮上的点击或对象比其他可能重叠的对象 具有最高的优先权很重要

非常感谢,我喜欢你的评论,你的评论清楚,更有用

祝你一切顺利。

 
Marco vd Heijden:

好吧,如果你使用

int stoploss=50;

我总是尝试各种方法,直到我找到最有效的方法。

我只是想理解你的评论,然后为我的订单、止损和止盈功能写一些好的代码--谢谢你。

所以,我已经尝试了类似下面的代码,我需要确定 欧元兑美元和FB的止损值 都是正确的,为10点?(如果你想知道我在想什么--只是我认为是的,下面的日志/结果都是10点的正确值。)
例如: stoploss value = 10; Position - BUY
log: EURUSD | 价格(ask): 1.05633/ 止损: 1.05533
log: FB | 价格(ask): 119.69/ 止损: 119.59

( 我通过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;
}
 

似乎是在工作。

 

我将尝试把威廉先生 的意见纳入EA的代码中--再次感谢威廉。伟大的Pip的计算MQL4
(请不要责怪我,因为这个代码行业对我来说非常广泛,有时我失去了理智--无论如何,我希望我能尽快完成我的贸易面板EA的代码)

我将在完成后分享我的测试EA的代码,以了解该代码是否良好/正确或什么?(因为我不是专业的编码/程序员 - 我正在努力 - )

 

Keith Watford:

好吧,很公平。我懒得读你的一些帖子,因为它伤害了我的眼睛。
如果其他人有同样的感觉,那么是你们错过了,不是我。

我不知道你的这个名字。我只知道你像一个@Gumrai,所以对不起,我对你的评论有点生气。所以你在我的代码知识为零的时候帮我做了这个评论。没有问题,可以忽略我所有的评论,需要帮助或其他的东西。但我只需要为我对你的愤怒回答道歉。
 

市场已经关闭,我也不清楚其他的事情。但我尝试了下面的代码,我觉得我错过了什么,但我找不到。
(我想说的是,我的贸易面板 EA有买入和卖出的代码,但我想用手写出来,我确定这个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()函数 选择一个订单。
很好,我很快就会尝试。谢谢!
原因: