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

 
User_mt5:

ウラジーミル・カルプトフ、そして私?)

確実なことは言えませんが、0.0を試してみてください。


追記:MQL5で「INDICATOR_MINIMUM」「INDICATOR_MAXIMUM」をキャンセルすることができないようです。

 
Vladimir Karputov:

確実なことは言えませんが、0.0を試してみてください。


追記:MQL5で「INDICATOR_MINIMUM」「INDICATOR_MAXIMUM」をキャンセルすることができないようです。

残念...

ご返信ありがとうございました。

(レベルについても同じ問題がありますが、レベル数を 設定することで解決します。)

 
User_mt5:

残念...

返信ありがとうございました。

(レベルに関する問題も実は同じで、レベル数を 設定することで解決します)

実験すれば、すべてがうまくいく。

 
User_mt5:


チャートが保存するプロパティを比較してみました('Stochastic Oscillator'インジケータを例にしています)



<indicator>
name=Stochastic Oscillator
path=
apply=0
show_data=1
scale_inherit=0
scale_line=0
scale_line_percent=50
scale_line_value=0.000000
scale_fix_min=1
scale_fix_min_val=0.000000
scale_fix_max=1
scale_fix_max_val=100.000000
expertmode=0
fixed_height=-1


<indicator>
name=Stochastic Oscillator
path=
apply=0
show_data=1
scale_inherit=0
scale_line=0
scale_line_percent=50
scale_line_value=0.000000
scale_fix_min=0
scale_fix_min_val=-10.500000
scale_fix_max=0
scale_fix_max_val=110.500000
expertmode=0
fixed_height=-1


これは明らかに「bool」型のプロパティですが、MQL5言語からこのプロパティにアクセスすることはできません。

 
Vladimir Karputov:

チャートが保存するプロパティを比較してみました('Stochastic Oscillator'インジケータを例にしています)

これは明らかに「bool」タイプのプロパティですが、MQL5言語内からはこのプロパティにアクセスすることはできません。

はい、残念です。

また、ありがとうございます)

 

問題があるのです。関数(下記参照)を使用すると、ヒストリーからポジションIDごとにTakeProfitとStopLossの値を取得できます(つまり、ポジションがすでにクローズされている場合)。この関数はリアルタイムでは機能しますが、ストラテジーテスターでは、ストップを設定したヒストリーの注文が見えないため、TakeProfitとStopLossを見つけられません(重要:ストップはポジションオープン後に設定されます)。

質問:チケットに基づいてクローズしたポジションのTP/Lossを調べるには、Strategy Testerをどのように使用すればよいですか?

#include <Trade\DealInfo.mqh>
#include <Trade\HistoryOrderInfo.mqh>

CDealInfo deal;
CHistoryOrderInfo ord;


void GetPosStops(ulong ticket, int& tp, int& sl, double& lot){
   HistorySelectByPosition(ticket);
   tp=0;sl=0;
   double open=0, tp_=0, sl_=0;
   string symbol="";
   ENUM_DEAL_TYPE type=-1;
   for(int i=0; i<HistoryDealsTotal(); i++){
      if(!deal.SelectByIndex(i))continue;
      if(deal.Entry() ==DEAL_ENTRY_IN){
         open=deal.Price();
         symbol=deal.Symbol();
         type=deal.DealType();
         lot=deal.Volume();
         break;
      }
   }
   for(int i=0; i<HistoryOrdersTotal(); i++){
      if(!ord.SelectByIndex(i))continue;
      if(tp_==0)tp_=ord.TakeProfit();
      if(sl_==0)sl_=ord.StopLoss();
      if(tp_>0 && sl_>0)break;
   }
   if(symbol !=""){
      double coef=type==DEAL_TYPE_BUY ? 1:-1;
      double point=SymbolInfoDouble(symbol,SYMBOL_POINT);
      if(tp_>0 && coef*tp_>coef*open)
         tp=(int)(MathAbs(tp_-open)/point);
      if(sl_>0 && coef*sl_<coef*open)
         sl=(int)(MathAbs(sl_-open)/point);   
   }
}
 
皆さんこんにちは!
私はちょうどEAをプログラムしようとしていて、統計的な スプレッドコレクターを書く ことから始めたいと思います。
つまり、何をさせたいのか?テスターでは、EAを起動し、一定期間(例えば10日間)のティック履歴のデータを収集します。
そして、次のデータをcsvまたはxlsxファイルに生成します。
期間中の平均スプレッド:サーバー上の00:00 - 09:00、09:00 - 18:00、18:00 - 00:00 (10日間すべて)、この時間の最大スプレッド、10日間全体の最小スプレッド、通貨ペアの平均スプレッド。
このデータを手動で集めるのは本当に疲れています。

自分でなんとかしてくれるプログラムがあると知っていますが...。
もしかしたら、尊敬する目利きの方なら、何から始めたらいいか教えてくれるかもしれませんね。また、そのようなプログラムを書くことは可能なのでしょうか?

回答してくださった方、新参者に共感してくださった方、ありがとうございました。
 

皆さん、こんにちは。もしかしたら、誰かが用意したコードを持っているかもしれません。2つのパラメータがあります、預金=3000とロット0.01すなわち預金3000ロットは0.01になります、今厳密に倍増時すなわち預金6000ロットは0.02になり、9000は0.03になりますどうすればいいのでしょう。

 
Pavel Komarovsky:

皆さん、こんにちは。もしかしたら、誰かが用意したコードを持っているかもしれません。2つのパラメータがあります、預金=3000とロット0.01すなわち預金3000ロットは0.01になります、今厳密に倍増時すなわち預金6000ロットは0.02になり、9000は0.03になりますどうすればいいのでしょう。

だいたいこんな感じです。

//+------------------------------------------------------------------+
//|                                                     Script 1.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//---
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   double start_deposit=3000;
   double start_lot=0.01;
   double deposit=start_deposit;
   for(int i=0; i<10; i++)
     {
      
      double d=MathFloor(deposit/start_deposit);
      Print(i,"#: ,deposit ",DoubleToString(deposit,2),", d ",DoubleToString(d*start_lot,2));
      //---
      deposit=deposit+start_deposit*0.55;
     }
  }
//+------------------------------------------------------------------+

結果

2021.05.04 09:03:15.246 Script 1 (EURUSD,H1)    0#: ,deposit 3000.00, d 0.01
2021.05.04 09:03:15.246 Script 1 (EURUSD,H1)    1#: ,deposit 4650.00, d 0.01
2021.05.04 09:03:15.246 Script 1 (EURUSD,H1)    2#: ,deposit 6300.00, d 0.02
2021.05.04 09:03:15.246 Script 1 (EURUSD,H1)    3#: ,deposit 7950.00, d 0.02
2021.05.04 09:03:15.246 Script 1 (EURUSD,H1)    4#: ,deposit 9600.00, d 0.03
2021.05.04 09:03:15.246 Script 1 (EURUSD,H1)    5#: ,deposit 11250.00, d 0.03
2021.05.04 09:03:15.246 Script 1 (EURUSD,H1)    6#: ,deposit 12900.00, d 0.04
2021.05.04 09:03:15.246 Script 1 (EURUSD,H1)    7#: ,deposit 14550.00, d 0.04
2021.05.04 09:03:15.246 Script 1 (EURUSD,H1)    8#: ,deposit 16200.00, d 0.05
2021.05.04 09:03:15.246 Script 1 (EURUSD,H1)    9#: ,deposit 17850.00, d 0.05
ファイル:
Script_1.mq5  3 kb
 

良い時間です。

バグを見つけるのを手伝ってください・・・。スクリプトでインジケータバッファから バー値(BarsCount)をコピーして、値をループしてシグナルを検出してPrint()に出力しています。簡単そうで、そうでもないですね・・・。ゼロラインを越える以外は、思い通りの信号が得られます。

CROSSOVER_OR_REVERSE

もしかしたら、スクリプトがそのようなことをしてはいけないのかもしれません。 コードとログのスクリーンショットを添付しました。

//+------------------------------------------------------------------+
//|                                                B_O_P_Signals.mq5 |
//|                                  Copyright 2021, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
enum enMaTypes
  {
   ma_sma,    // Simple moving average
   ma_ema,    // Exponential moving average
   ma_smma,   // Smoothed MA
   ma_lwma    // Linear weighted MA
  };
  
input int       inpSmoothPeriod = 14;       // Result smoothing period
input enMaTypes inpSmoothMethod =  ma_sma;  // Result smoothing type
input double    inpLevelUp      =  0.2;     // Level up
input double    inpLevelDown    = -0.2;     // Level down
input int       BarsCount       = 100;

double Mid_line[1] = {0.0};
int handle=0;
double TREND_VAL[];

void OnStart()
  {
      handle = iCustom(_Symbol,PERIOD_CURRENT,"Balance of Market Power",inpSmoothPeriod,inpSmoothMethod,inpLevelUp,inpLevelDown);
      
      CopyBuffer(handle,2,0,BarsCount,TREND_VAL);
      
      ArraySetAsSeries(TREND_VAL,true);
      
      string Signal ="";
      
        for (int i=ArraySize(TREND_VAL)-1; i>=0; i--)
        {
           int k=1;
            if(TREND_VAL[i] != EMPTY_VALUE && TREND_VAL[i] > Mid_line[0] && TREND_VAL[i] > inpLevelUp)
            
               Signal = "TREND_UP";
            else if (TREND_VAL[i] != EMPTY_VALUE && TREND_VAL[i] > Mid_line[0] && TREND_VAL[i] < inpLevelUp)
            
               Signal = "TREND_UP_ROLLBACK_OR_FLAT";
            else if(TREND_VAL[i] >= Mid_line[0] && TREND_VAL[i+k] <= Mid_line[0])
            
               Signal ="CROSSOVER_OR_REVERSE_UP";
            
            else if (TREND_VAL[i] != EMPTY_VALUE && TREND_VAL[i] < Mid_line[0] && TREND_VAL[i] < inpLevelDown)
            
               Signal = "TREND_DN";
            else if (TREND_VAL[i] != EMPTY_VALUE && TREND_VAL[i] < Mid_line[0] && TREND_VAL[i] > inpLevelDown)
            
               Signal = "TREND_DN_ROLLBACK_OR_FLAT";
            else if(TREND_VAL[i] < Mid_line[0] && TREND_VAL[i+k] > Mid_line[0])
            
               Signal = "CROSSOVER_OR_REVERSE_DN";
            else Signal = "UNKNOWN_SIGNAL";
            
            Print(string(i),"_", Signal);
        }
      
   
  }
//+------------------------------------------------------------------+
ファイル:
Question.png  150 kb
理由: