エキスパートアドバイザー - 雑多な質問 - ページ 8

 

では、もしあなたが

int stoploss=50;
double stop;

stop=stoploss*Point();

Print(DoubleToString(stoploss));

Point()関数を使用すると、ストップロスの値が得られ、それをビッドとアスクそれぞれから足したり引いたりすることで、ストップロスの価格水準を知ることができます。

テイクプロフィットも同様ですが、もちろん逆も同様です。

コードベースのEAをチェックすると、コーダーがEAでどのようにこれらのことを行っているか、多くの例とバリエーションがあります。

例えば、Trailing Masterhttps://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 fistが pipを定義しているのを見ることができます。

しかし、これはДимаhttps://www.mql5.com/en/code/8674 からのE-smart trailingと呼ばれる別の例です。


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

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、ちょうどクイックチェックアウト 驚くべきすべてのためのありがとうございます。私はすぐにそれを試してみます。

もう1度、Marco vd Heijdenに 大感謝です。

 
Marco vd Heijden:

オブジェクトは互いに重なり合っているので、どのボタンやオブジェクトをクリックすると、重なり合う可能性のある他のオブジェクト よりも最優先されるかをchartevent ()に知らせることが重要です。

私は、より明確に、より有用 であるあなたのコメントが 好きです。

よろしくお願いします。

 
Marco vd Heijden:

そうですか、もしあなたが

int stoploss=50;

私はいつも、一番うまくいく方法を見つけるまで、いろいろなことを試しています。

私は、あなたの良いコメントを理解し、私の注文、ストップロス、テイクプロフィットの関数に良いコードを書こうとしているのです。

EURUSDとFBのストップロスの 値が10pipsで合って いるか確認したい のですが?( もし私が何を考えているか知りたいのであれば、私は以下のログ/結果の両方が10 pipsのための正しい値であると思うだけです。)
例: ストップロス値 = 10; ポジション - BUY
ログ: EURUSD|価格(アスク):1.05633|ストップロス:1.05533
log: FB|価格(アスク):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;
}
 

動作しているようです。

 

William 氏のコメントをEAのコードの頭に入れるようにします。素晴らしいピップス計算 MQL4
(このコード業界は私にとっては非常に広く見えるので、私を責めないでください。)

そして、私のテストEAのコードが完成したら、そのコードが良いものかどうか、正しいものかどうか、共有したいと思います(私はプロのコーダー/プログラマーではないので、現在取り組んでいるところです)

 

Keith Watford:

OK、公平に。私は目が痛くなるので、あなたの投稿のいくつかを読むのが面倒です。
他の人も同じように感じているなら、私ではなく、あなたが見逃しているのです。

私はあなたのこの名前を知りませんでした。私はあなたが@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()関数で 注文を選択する必要があります。
いいね、早速やってみるよ。ありがとうございます。