MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 1256

 
Vladimir Pastushak:

入力パラメータの種類を知るにはどうしたらよいですか?

そのような呼び出しがまだコードになかった場合、コンパイラ自体は、テンプレート関数の呼び出しの瞬間に型を置換し、コンパイラは、別の関数のコピーを作成し、それ自体を設定します - よく、論理的にかのように - テンプレート


このような関数でどのように型を定義するかという質問であれば

typename

UPD: 上記の例に、パラメータタイプprintersを追加しました。

#define  PRINT(VAL) Print(#VAL," = ",VAL, ", typename = ", typename(VAL))
template<typename T1, typename T2>
int myfunc(T1 val1=0, T2 val2=0)
{
   Print(__FUNCSIG__);
   PRINT(val1);
   PRINT(val2);
   return((int) (val1 + val2));
}

//+------------------------------------------------------------------+
void OnStart()
{
   int i1 = 2, i2 = 3;
   Print(myfunc(i1, i2));
   double d1 = 10.0, d2 = 30.0;
   Print(myfunc(d1, d2));
}
//+------------------------------------------------------------------+

2020.09.16 18:58:21.679 tst (EURUSD,M5) int myfunc<int,int>(int,int)である。

2020.09.16 18:58:21.680 tst (EURUSD,M5) val1 = 2, typename = int

2020.09.16 18:58:21.681 tst (EURUSD,M5) val2 = 3, typename = int

2020.09.16 18:58:21.681 tst (EURUSD,M5) 5

2020.09.16 18:58:21.681 tst (EURUSD,M5) int myfunc<double,double>(double,double)

2020.09.16 18:58:21.681 tst (EURUSD,M5) val1 = 10.0, typename = double

2020.09.16 18:58:21.681 tst (EURUSD,M5) val2 = 30.0, typename = double

2020.09.16 18:58:21.681 tst (EURUSD,M5) 40


UPD: このサンプルに__FUNCSIG__ を追加しました。

 

午後
MQL5でインジケータを作成 する際、不思議なことに直面します(別サブウィンドウにインジケータ、4行)。

初期バッファの記述は以下の通りです。

//------------------------------------------------------------------
#property indicator_buffers   6
#property indicator_plots     4
//-------------------------------------------------------------------
// == RSI ==
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrMagenta
#property indicator_style1  STYLE_SOLID
#property indicator_width1  2
//------------------------------------------------------------------
// == MA_fast ==
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrBlue
#property indicator_style2  STYLE_SOLID
#property indicator_width2  2
//------------------------------------------------------------------
// == MA_slow ==
#property indicator_type3   DRAW_COLOR_LINE
#property indicator_color3  clrWhite, clrBlack
#property indicator_style3  STYLE_SOLID
#property indicator_width3  3
//------------------------------------------------------------------
// == MA_slow_glob ==
#property indicator_type4   DRAW_COLOR_LINE
#property indicator_color4  clrYellow, clrRed
#property indicator_style4  STYLE_SOLID
#property indicator_width4  2
//------------------------------------------------------------------
//--- buffers (массивы под буферы индикатора)
//--------------------------------------------------------------------
double      RSI[];                                                         // буфер под RSI
//--------------------------------------------------------------------
double      MAr1_fast[];                                                   // буфер под быструю МА
double      MAr2_slow[];                                                   // буфер под медленную МА
double      MAr2_slowColor[];                                              // буфер под цвета медленной МА
//--------------------------------------------------------------------
double      MAr3_slow_glob[];                                              // буфер под глобальную медленную МА
double      MAr3_slow_globColor[];                                         // буфер под цвета глобальной медленной МА
//--------------------------------------------------------------------

次はOnInitです。

   //--------------------------------------------------------------------
   SetIndexBuffer       (0,   RSI,                 INDICATOR_DATA);
   ArraySetAsSeries     (     RSI,                 true);
   PlotIndexSetString   (0,   PLOT_LABEL,          "RSI(" + IntegerToString(RSI_per) + ")");
   PlotIndexSetInteger  (0,   PLOT_SHOW_DATA,      true);
   PlotIndexSetInteger  (0,   PLOT_DRAW_BEGIN,     RSI_per);
   PlotIndexSetDouble   (0,   PLOT_EMPTY_VALUE,    EMPTY_VALUE);
   //--------------------------------------------------------------------
   SetIndexBuffer       (1,   MAr1_fast,           INDICATOR_DATA);
   ArraySetAsSeries     (     MAr1_fast,           true);
   PlotIndexSetString   (1,   PLOT_LABEL,          "MA (" + IntegerToString(MA_fast_period) + "), EMA");
   PlotIndexSetInteger  (1,   PLOT_SHOW_DATA,      true);
   PlotIndexSetInteger  (1,   PLOT_DRAW_BEGIN,     MA_fast_period);
   PlotIndexSetDouble   (1,   PLOT_EMPTY_VALUE,    EMPTY_VALUE);
   //--------------------------------------------------------------------
   SetIndexBuffer       (2,   MAr2_slow,           INDICATOR_DATA);
   ArraySetAsSeries     (     MAr2_slow,           true);
   PlotIndexSetString   (2,   PLOT_LABEL,          "MA (" + IntegerToString(MA_slow_period) + "), SMA");
   PlotIndexSetInteger  (2,   PLOT_SHOW_DATA,      true);
   PlotIndexSetInteger  (2,   PLOT_DRAW_BEGIN,     MA_slow_period);
   PlotIndexSetDouble   (2,   PLOT_EMPTY_VALUE,    EMPTY_VALUE);
   //--------------------------------------------------------------------
   SetIndexBuffer       (3,   MAr2_slowColor,      INDICATOR_COLOR_INDEX);
   ArraySetAsSeries     (     MAr2_slowColor,      true);
   PlotIndexSetDouble   (3,   PLOT_EMPTY_VALUE,    EMPTY_VALUE);
   //--------------------------------------------------------------------
   SetIndexBuffer       (4,   MAr3_slow_glob,      INDICATOR_DATA);
   ArraySetAsSeries     (     MAr3_slow_glob,      true);
   PlotIndexSetString   (4,   PLOT_LABEL,          "MA (" + IntegerToString(MA_slow_glob_period) + "), SMA");
   PlotIndexSetInteger  (4,   PLOT_SHOW_DATA,      true);
   PlotIndexSetInteger  (4,   PLOT_DRAW_BEGIN,     MA_slow_glob_period);
   PlotIndexSetDouble   (4,   PLOT_EMPTY_VALUE,    EMPTY_VALUE);
   //--------------------------------------------------------------------
   SetIndexBuffer       (5,   MAr3_slow_globColor, INDICATOR_COLOR_INDEX);
   ArraySetAsSeries     (     MAr3_slow_globColor, true);
   PlotIndexSetDouble   (5,   PLOT_EMPTY_VALUE,    EMPTY_VALUE);
   //--------------------------------------------------------------------

基本的には、最初の2本は単色、次の2本は2色(キンクで色が変わる)です。

バイカラーはDRAW_COLOR_LINEの描き方によるものです。

質問:1行目(上記コードのバッファ2と3)は完全に描画され、OnInitでそのために書かれたコードはすべて動作します。
2行目は何らかの理由で表示され、例えば線は動作しません。

PlotIndexSetString   (4,   PLOT_LABEL,          "MA (" + IntegerToString(MA_slow_glob_period) + "), SMA");
I.e. データウィンドウに設定したテキストではなく、バッファの代わりにインジケータの名前だけが表示されます。線自体は引かれていて、それは当然のように多色であるが。
ナンバリングシフトに仕掛けがあるのでは?例えば、コードの上の方で、最後の行を#propertyディレクティブで宣言すると、以前から4つのバッファが使われているので、インデックスが5ではなく、4になってしまうのはなぜでしょうかね。また、#propertyで宣言した場合の行番号と、OnInitで配列とリンクした場合のバッファ番号には、全く関係がないのでしょうか?

上記のコードのどこが問題なのか、アドバイスをお願いします。DRAW_COLOR_LINE...描画メソッド
を使って、少なくとも2本の線を描画するインジケータの例をどなたか見つけていただけるかもしれません。

もう一つ関連する質問ですが、カラフルなラインバッファーはどのように結ばれているのでしょうか?つまり、カラーバッファに値を入れたら、この色を使って他のバッファから線に色をつけるべきだということを、コンパイルされたコードはどうやって知ることができるのでしょうか?

 
satorifx:

午後
MQL5でインジケータを作成 する際、不思議なことに直面します(別サブウィンドウにインジケータ、4行)。

初期バッファの記述は以下の通りです。

次はOnInitです。

基本的には、最初の2本は単色、次の2本は2色(キンクで色が変わる)です。

バイカラーはDRAW_COLOR_LINEの描き方によるものです。

質問:1行目(上記コードのバッファ2と3)は完全に描画され、OnInitでそのために書かれたコードはすべて動作します。
2行目は何らかの理由で表示され、例えば線は動作しません。

I.e. データウィンドウに設定したテキストではなく、バッファの代わりにインジケータの名前だけが表示されます。線自体は引かれていて、それは当然のように多色であるが。
ナンバリングシフトに仕掛けがあるのでは?例えば、コードの上の方で、最後の行を#propertyディレクティブで宣言すると、以前から4つのバッファが使われているので、インデックスが5ではなく、4になってしまうのはなぜでしょうかね。また、#propertyで宣言した場合の行番号と、OnInitで配列とリンクした場合のバッファ番号には、全く関係がないのでしょうか?

上記のコードのどこが問題なのか、アドバイスをお願いします。DRAW_COLOR_LINE...描画メソッド
を使って、少なくとも2本の線を描画するインジケータの例をどなたか見つけていただけるかもしれません。

もう一つ関連する質問ですが、カラフルなラインバッファーはどのように結ばれているのでしょうか?つまり、カラーバッファに値を入れたら、この色を使って他のバッファから線に色をつけるべきだということを、コンパイルされたコードはどうやって知ることができるのでしょうか?

マッピングは、バッファとは異なる番号が振られています。

PlotIndexSetString   (3,   PLOT_LABEL,          "MA (" + IntegerToString(MA_slow_glob_period) + "), SMA");

これでうまくいくはずです。

 

皆さん、こんにちは。

ストップロスを変更する関数を作りました。しかし、それが動作すると、EURUSD,H1: OrderModify error 130と表示されます。

そして、その価格はストップロスを設定すべき場所からは程遠い。

以下はその機能です。

void open_bu(string walpa, int op)
{
bool err;
int spred=(int)MarketInfo(walpa,MODE_SPREAD);
double point=MarketInfo(walpa,MODE_POINT);
int digits=(int)MarketInfo(walpa,MODE_DIGITS);
for(int is=OrdersTotal()-1; is>=0; is--)
 {
  if(OrderSelect(is, SELECT_BY_POS, MODE_TRADES) && OrderSymbol()==walpa)
   {
    if(OrderType()==op && NormalizeDouble(OrderStopLoss(),digits) < NormalizeDouble(OrderOpenPrice()+spred*point, digits) )
     {
      err=OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(OrderOpenPrice()+spred*point, digits), OrderProfit(), 0, clrNONE);
      if(!err) error(GetLastError());
     }
    if(OrderType()==op && (NormalizeDouble(OrderStopLoss(),digits) > NormalizeDouble(OrderOpenPrice()-spred*point, digits) || OrderStopLoss()==0))
     {
      Print(walpa,"  ",spred,"   ",point,"   ",digits,"     ",NormalizeDouble(OrderOpenPrice()-spred*point, digits));
      err=OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(OrderOpenPrice()-spred*point, digits), OrderProfit(), 0, clrNONE);
      if(!err) error(GetLastError());
     }
   }
 }
return;
}
 
ごきげんよう。移動平均線の傾斜角度を測定するEAを作り たいのですが、そのEAは強い価格衝動にアラートを出すもので、できればタイムラグが小さいものが望ましいです。MA の角度を測定する方法、またはパルスが発生したことを「EA に伝える」方法をご教示ください。もしかしたら、すでに知られている方法があるのかもしれませんね。あるいは、例えばインパルス計算をベースにしたフリーのインジケーターなど?
 

フラクタルの3本の棒のうち、棒の番号を求める関数を書きました。オンラインチャートでは、正しく検出されているようです。しかし、テスターでの目視テスト では、それは嘘になります。どなたかプロの方にコードを見ていただき、エラーを発見していただけませんか?

一番ありがたいですね。

//+----------------------------------------------------------------------------+
//|  Описание : Возвращает номер бара трёхбарного фарактала по его номеру.     |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента        ("" или NULL - текущий символ)     |
//|    tf - таймфрейм                       (    0       - текущий ТФ)         |
//|    nf - номер экстремума                (    0       - последний)          |
//+----------------------------------------------------------------------------+
int BarLocExtr(string sy="0", int tf=0, int ne=0, int mode=MODE_UPPER)
{
 if(sy=="" || sy=="0") sy=Symbol();
 int nlext=0,k=iBars(sy,tf);
 nlext=0;
 if(mode==MODE_UPPER)
   {
    for (int i=2; i<=k; i++)
     {
      if(High[i]>High[i+1] && High[i]>High[i-1])
        {
         nlext++;
         
         if(nlext>ne) return(i);
        }
     }    
   }        
 if(mode==MODE_LOWER)
   {
    for (i=2; i<=k; i++)
     {
      if(Low[i+1]>Low[i] && Low[i-1]>Low[i])
        {
         nlext++;
         if(nlext>ne) 
           {
            //Print("i=",i," Low[i+1]=",Low[i+1]," Low[i]=",Low[i]," Low[i-1]=",Low[i-1]);
            return(i); 
           }
        }
     }    
   }       
    Print("Бар локального экстремума не найден");
    return(-1);     
  }
Как в MetaTrader 5 быстро разработать и отладить торговую стратегию
Как в MetaTrader 5 быстро разработать и отладить торговую стратегию
  • www.mql5.com
Скальперские автоматические системы по праву считаются вершиной алгоритмического трейдинга, но при этом они же являются и самыми сложными для написания кода. В этой статье мы покажем, как с помощью встроенных средств отладки и визуального тестирования строить стратегии, основанные на анализе поступающих тиков. Для выработки правил входа и...
 

こんにちは。テスターで1ヶ月後にインジケータが動かなくなるようにするには、どのようなコードを追加すればよいですか?すなわち、私はすべてOKを書きましたしかし、バックテストを行うと、再び動作します。(mgl4)

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
  datetime data=D'2020.09.16 20:07';  // Time Block
    if(TimeCurrent()>data)  
      {
       Print("Демонстрационный период закончился, покупайте индикатор :)");
       Alert("Демонстрационный период закончился, покупайте индикатор :)");
       return(INIT_FAILED);
     } 
  
  
  if(IsTesting() && TimeCurrent() >= D'2020.09.16 20:07')// для тестировщиков, ограничение работы по времени
{
    Comment("Демонстрационный период закончился, покупайте индикатор :)  Демонстрационный период закончился, покупайте индикатор :)   Демонстрационный период закончился, покупайте индикатор :)");
    return(0);
}    
     
ファイル:
 

こんにちは。

開店 日の注文終了サイクルに条件を付けて、金曜日に開店した注文が終了しない ようにしたかったのです。

while (OrdersTotal()>0)
    { 
      if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES))  
        {   
            if ((OrderMagicNumber()==Magic) && (TimeDayOfWeek(OrderOpenTime())<5)) 
            {    
               if (OrderType()==OP_BUY)          result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(nameSym,MODE_BID),MarketInfo(nameSym,MODE_DIGITS)),3,CLR_NONE); 
               if (OrderType()==OP_SELL)  result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(nameSym,MODE_ASK),MarketInfo(nameSym,MODE_DIGITS)),3,CLR_NONE); 
            
                 if(result!=TRUE) { error=GetLastError();
                    Print("LastError = ",error, " ",Symbol()); }
                 else error=0; 
            }
            else  Print("NoMagic ", OrderMagicNumber());  // for Debug
         }
        else Print( "Error when order select ", GetLastError());
   
     } 
 
Tabazhan_Dajhiov:

こんにちは。テスターで1ヶ月後にインジケータが動かなくなるようにするには、どのようなコードを追加すればよいですか?すなわち、私はすべてOKを書きましたしかし、バックテストを行うと、再び動作します。(mgl4)

このコードはOnInitではなく、OnTick()に記述する必要があります。

 
Yerkin Sagandykov:

こんにちは。

注文開始 日の注文終了サイクルに条件を付けて、金曜日に開いたものが終了しない ようにしたかった。

この方法で試してみてください。

for(int is=OrdersTotal()-1; is>=0; is--)
    { 
      if(OrderSelect(is,SELECT_BY_POS,MODE_TRADES))  
        {   
            if ((OrderMagicNumber()==Magic) && (TimeDayOfWeek(OrderOpenTime())<5)) 
            {    
               if (OrderType()==OP_BUY)   result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(nameSym,MODE_BID),MarketInfo(nameSym,MODE_DIGITS)),3,CLR_NONE); 
               if (OrderType()==OP_SELL)  result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(nameSym,MODE_ASK),MarketInfo(nameSym,MODE_DIGITS)),3,CLR_NONE); 
            
                 if(result!=TRUE) { error=GetLastError();
                    Print("LastError = ",error, " ",Symbol()); }
                 else error=0; 
            }
            else  Print("NoMagic ", OrderMagicNumber());  // for Debug
         }
        else Print( "Error when order select ", GetLastError());
   
     }