初心者の方からの質問 MQL5 MT5 MetaTrader 5 - ページ 1128

 

こんにちは、私はシステム関数OrderCalcProfitの奇妙な動作を持っている、私は計算でボリュームパラメータが無視されている、すなわち、利益サイズが常にボリューム1.0に対して計算されるような気がします。

異なるデモ口座の異なる通貨ペアでテスターで確認しようとしています。

1.1.0では正しく計算されています。calc_profi101.pngを参照してください。

2.2回目以降の関数の呼び出しは、1.0のボリュームに基づいて利益の結果を返し、ボリュームの値は無視されます。スクリーンショット(calc_profit02.png)を参照 - ボリューム0.5を渡したが、結果はまだ1.0と同じである。

何が問題なのか、教えてください。感謝

ファイル:
 
aveshoff:

こんにちは、私はシステム関数OrderCalcProfitの奇妙な動作を持っている、私は計算でボリュームパラメータが無視されている、すなわち、利益サイズが常にボリューム1.0に対して計算されるような気がします。

異なるデモ口座の異なる通貨ペアでテスターで確認しようとしています。

1.1.0では正しく計算されています。calc_profi101.pngを参照してください。

2.2回目以降の関数の呼び出しは、1.0のボリュームに基づいて利益の結果を返し、ボリュームの値は無視されます。スクリーンショット(calc_profit02.png)を参照 - ボリューム0.5を渡したが、結果はまだ1.0と同じである。

何が問題なのか、教えてください。感謝

答えはヘルプに書いてあると思います。

"...利潤

[out] 関数が成功した場合、計算された利益値を保持する変数。利益見積もりの値は多くの要因に左右され、市場環境の変化に応じて変化する可能 性がある ..."


追記:あくまで推測ではありますが。

 
aveshoff:

こんにちは、私はシステム関数OrderCalcProfitの奇妙な動作を持っている、私は計算でボリュームパラメータが無視されている、すなわち、利益値は常にボリューム1.0に対して計算されるように感じています。

異なるデモ口座の異なる通貨ペアでテスターで確認しようとしています。

1.1.0では正しく計算されています。calc_profi101.pngを参照してください。

2.2回目以降の関数の呼び出しは、1.0のボリュームに基づいて利益の結果を返し、ボリュームの値は無視されます。スクリーンショット(calc_profit02.png)を参照 - ボリューム0.5を渡したが、結果はまだ1.0と同じである。

何が問題なのか、教えてください。感謝

これが試験官です。すべて正常に動作しています。

//+------------------------------------------------------------------+
//|                                             OrderProfitCheck.mq5 |
//|                              Copyright © 2019, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2019, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
#include <Trade\AccountInfo.mqh>
CAccountInfo      m_account;                    // object of CAccountInfo class
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   string symbol=Symbol();
   ENUM_ORDER_TYPE trade_operation=ORDER_TYPE_BUY;
   double volume=1.0;
   double price_open=1.09350;
   double price_close=1.0930;
   double profit=m_account.OrderProfitCheck(symbol,trade_operation,volume,price_open,price_close);
   Print("Volume 1.0, profit -> ",DoubleToString(profit,2));
   volume=0.5;
   profit=m_account.OrderProfitCheck(symbol,trade_operation,volume,price_open,price_close);
   Print("Volume 0.5, profit -> ",DoubleToString(profit,2));
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

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

  }
//+------------------------------------------------------------------+

と結果が出ました。

2019.09.30 07:47:21.688 OrderProfitCheck (EURUSD,H1)    Volume 1.0, profit -> -50.00
2019.09.30 07:47:21.688 OrderProfitCheck (EURUSD,H1)    Volume 0.5, profit -> -25.00
ファイル:
 
教えてもらえますか?使用する端末の言語をプログラムで知ることは可能ですか、またどのように知ることができますか?
 
Uladzimir Izerski:
ヒントを教えてください。使用中の端末の言語をプログラムで調べることは可能ですか、また、どのように調べればよいのでしょうか。

私はこれをロシア語の端末言語か、別の場合は英語で出力 されていると判断しています。

   if(InpTrailingStop!=0 && InpTrailingStep==0)
     {
      string err_text=(TerminalInfoString(TERMINAL_LANGUAGE)=="Russian")?
                      "Трейлинг невозможен: параметр \"Trailing Step\" равен нулю!":
                      "Trailing is not possible: parameter \"Trailing Step\" is zero!";
      //--- when testing, we will only output to the log about incorrect input parameters
      if(MQLInfoInteger(MQL_TESTER))
        {
         Print(__FILE__," ",__FUNCTION__,", ERROR: ",err_text);
         return(INIT_FAILED);
        }
      else // if the Expert Advisor is run on the chart, tell the user about the error
        {
         Alert(__FILE__," ",__FUNCTION__,", ERROR: ",err_text);
         return(INIT_PARAMETERS_INCORRECT);
        }
     }


追記:TERMINAL_LANGUAGE列挙からすべての言語を保存したつもりだったのですが、それが見つかりません。失われたに違いない・・・。

 
皆さんこんにちは、誰かSLでそれはちょうど反転しないが、また多くまたは多くを追加することをここに追加するのを助けることができます。そして、TPがトリガーされると、1ロット分戻ることになります。
input double   Lot=1;
input int      TakeProfit = 6;
input int      Stoploss   = 6;

int TP;
int SL;

CTrade trader;
bool Invertor;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {

   TP = TakeProfit;
   SL = Stoploss;

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

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

   double points;

   if(!PositionSelect(_Symbol))
     {
      if(Invertor)
         trader.Buy(Lot);
      else trader.Sell(Lot);
     }
   else
     {
      if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
        {
         points=(SymbolInfoDouble(_Symbol,SYMBOL_BID)-PositionGetDouble(POSITION_PRICE_OPEN))/_Point;
         if(points>=TP)
           {
            trader.PositionClose(_Symbol);
            Invertor=true;
           }

         if(points<=-SL)
           {
            trader.PositionClose(_Symbol);
            Invertor=false;
           }
        }
      if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
        {
         points=(PositionGetDouble(POSITION_PRICE_OPEN)-SymbolInfoDouble(_Symbol,SYMBOL_ASK))/_Point;
         if(points>=TP)
           {
            trader.PositionClose(_Symbol);
            Invertor=false;
           }
         if(points<=-SL)
           {
            trader.PositionClose(_Symbol);
            Invertor=true;
           }
        }
     }   
  }
 
Andrey990:
皆さんごきげんよう、SLではロールオーバーだけでなく、ロット以上の追加になることをここで誰か助けてください。そして、TPがトリガーされると、1ロット分戻ることになります。

1.文字で位置を選択するような関数は、絶対に使わないでください。リスト内のインデックスで位置を選択する機能を使用します。

2.ポジションがどのようにクローズされたかを知るには、OnTradeTransaction でENUM_DEAL_REASON 列挙体を見る必要があります。

ENUM_DEAL_REASONを使用した例です。

ストップロス テイクプロフィット

ストップロスで決済する場合は2倍のボリューム、テイクプロフィットで決済する場合は最小のボリュームを設定します。ストップロスやテイクプロフィットが発動した結果、取引が行われたことを検出するには、OnTradeTransactionを使用します。ビルド1625から、ENUM_DEAL_REASONという素晴らしい列挙があります: ENUM_DEAL_REASON 説明DEAL_REASON_SL ストップロスが発生したことによる操作 DEAL_REASON_TP テイクプロフィットが発生したことによる操作...OnTradeTransaction で追跡可能。つまり、このトレードがテイクプロフィットまたはストップロスのトリガーの結果であったことを、簡単に、そして最も重要なことに、確実に判断することができるようになったのです。現時点(ビルド1626)では、このEAはライブでのみテストできます - チャート上か、実際のデータを使ったデバッグモード(MetaEditorでF5)のどちらかで。OnTradeTransactionプロシージャでテイクプロフィットかストップロスのどちらをトリガーしたかを判断します。

コードベース|2017.07.13 07:42|Vladimir Karputov|EAs|MetaTrader 5

 

第三者のプログラムに口座のログイン情報を入力して、口座を管理したり、ポジションをオープン/クローズ したりすることは可能ですか?

それとも、アカウントにインストールされたロボットを通じてのみなのでしょうか?

 

MQL4からMQL5へインジケーターを移行していますが、バッファと「プロット」についての質問です。このインジケータは、2つのバッファと1つのプロットを持ちます。

#property indicator_buffers 2
#property indicator_plots 1

SetIndexBuffer(0,Array1,INDICATOR_CALCULATIONS)を設定します。
SetIndexBuffer(1,Array2,INDICATOR_DATA)を設定します。


もし、1つ目のバッファが計算などに使われ、2つ目のバッファがプロットされるべきものであるならば

まず、SetIndexBuffer()関数ですでにINDICATOR_CALCULATIONSが設定されている場合、最初のバッファにDRAW_NONEを設定する必要があるのでしょうか。

PlotIndexSetInteger(?,PLOT_DRAW_TYPE,DRAW_NONE);

次に、2番目のバッファだけを描画する場合、PlotIndexSetInteger()にはクエスチョンマーク(?)ではなく、どのようなインデックスを設定すればよいのでしょうか?

PlotIndexSetInteger(?,PLOT_DRAW_TYPE,DRAW_HISTOGRAM);


3つ目は、DRAW_HISTOGRAMタイプのスタイルを2つ使用した場合、それぞれに色を設定して、Volumesインジケーターのように緑と赤のバーが交互に並ぶヒストグラムを得ることができますが、DRAW_HISTOGRAM2を 使用した場合、1つのバーにも2つの色を設定できるのか、このスタイルでは1つの色のみが設定されているのかです。

 
The_Sheikh:

MQL4からMQL5へインジケーターを移行していますが、バッファと「プロット」についての質問です。このインジケータは、2つのバッファと1つのプロットを持ちます。

#property indicator_buffers 2
#property indicator_plots 1

SetIndexBuffer(0,Array1,INDICATOR_CALCULATIONS)を設定します。
SetIndexBuffer(1,Array2,INDICATOR_DATA)を設定します。


もし、1つ目のバッファが計算などに使われ、2つ目のバッファがプロットされるべきものであるならば

まず、SetIndexBuffer()関数ですでにINDICATOR_CALCULATIONSが設定されている場合、最初のバッファにDRAW_NONEを設定する必要があるのでしょうか。

PlotIndexSetInteger(?,PLOT_DRAW_TYPE,DRAW_NONE);

次に、2番目のバッファだけを描画する場合、PlotIndexSetInteger()でクエスチョンマーク(?)の代わりにどのようなインデックスを設定すればよいのでしょうか。

PlotIndexSetInteger(?,PLOT_DRAW_TYPE,DRAW_HISTOGRAM);


3つ目は、DRAW_HISTOGRAMタイプのスタイルを2つ使用した場合、それぞれに色を設定して、Volumesインジケーターのように緑と赤のバーが交互に並ぶヒストグラムを得ることができますが、DRAW_HISTOGRAM2を 使用した場合、1つのバーにも2つの色を設定できるのか、このスタイルでは1つの色のみが設定されているのかです。

どうしてそんなに自分に厳しいんだ?表示したいバッファを先に設定し、その後に補助バッファを設定することに何か問題があるのでしょうか?

DRAW_HISTOGRAМ2 では、3つのバッファが定義されており、最初に2つの値バッファ、次に色バッファという順序が必須である。しかし、DRAW_HISTOGRAM と DRAW_HISTOGRAM2 には、DRAW_HISTOGRAM がゼロからバッファ内の値まで描画するのに対し、DRAW_HISTOGRAM2 はある バッファの値から別のバッファの値まで描画するという違いがある。

理由: