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

 
Vladimir Karputov:

最適化はAGENT(あなたの場合、LOCAL AGENTS)によって行われます。

ローカルエージェントのログを表示 するには:ログタブを右クリックし、エージェントフォルダへ移動します。

それが、エラーが出ないんです。ファイアウォールか何かの問題かもしれません。

ファイル:
 
Aleksandr Dziuba:

それが、エラーが出ないんです。ファイヤーウォールとかあるんじゃね?

1回のテスト、1回のパスで実行する。最適化ではなく、あくまで一本道。その方法でログを見ることができるようになります。

 
Vladimir Karputov:

1つのテストを実行する - 1つのパス。最適化ではなく、一気通貫で。そうすれば、確実にログを見ることができます。

ビジュアルってどういうこと?さて、ログを取得しました。そこに悪いところはないと思います。パラメータは全て渡される。走っても、出力は2万。

ファイル:
20200924.log  17 kb
 
Aleksandr Dziuba:

ビジュアルってどういうこと?さて、ログを取得しました。何も問題ないと思います。パラメータはすべて渡される。実行もされましたが、出力Balanceは20000で、今もそのままです。

そこで、エラーが発生した場合や取引操作ができない場合にエラーメッセージを 表示するようにコードを変更します。あるいは一般に、コードが間違っていてシグナルを出さない。奇跡は起きない。

Документация по MQL5: Константы, перечисления и структуры / Коды ошибок и предупреждений / Ошибки компиляции
Документация по MQL5: Константы, перечисления и структуры / Коды ошибок и предупреждений / Ошибки компиляции
  • www.mql5.com
Импортируемая функция не может иметь такого параметра (нельзя передавать указатель, класс или структуру, содержащую динамический массив, указатель, класс и т.д.) Недопустимый возвращаемый тип. Например, такая ошибка будет выдана для функций, импортированных из...
 
Vladimir Karputov:

そこで、エラーが発生した場合や、取引が実行できない場合にエラーメッセージを 表示するようにコードを変更します。または、コードに不具合があり、全く信号が出ない。奇跡は起きない。

そうですね。

そのため、Ontickに最適化は含まれていません。OnInitを処理中です。しかし、On-Tickは生成されない。ここで問題です。

入出力にプリントポイント( )を組み込みましたが、ログに書き込まれるのはInitのみです。

追伸

エラー処理をしています。習慣の力。私は1987年からプログラムを書いています。

 
Aleksandr Dziuba:

そうですね。

一般的に、Ontickには最適化が含まれていません。OnInit を処理する。しかし、On Tickは生成されない。問題です。

入出力にプリントポイント( )を組み込みましたが、ログに書き込まれるのはInitのみです。

追伸

エラー処理をしています。習慣の力。私は1987年からプログラムを書いています。

コードなしで助けられるのはテレパスだけだ--そして今、テレパスは皆、残念なことに休暇中だ。

 
Vladimir Karputov:

コードがなければ、テレパスしか助けられない。そして今、幸運にもテレパスは全員休暇中だ。

その理由がわかりました。Ontickでは、なぜか指標が再計算されません(再計算されたバーの数が表示されません)。引用元を更新する必要があるかもしれませんね。

それにもかかわらず、私は感謝の気持ちを失ってしまったのです。頭が良くなった。過去ログがどこに書かれているのかがわかった。

 

MQL4→MQL5でシンプルなインジケータを変換したが、最後の数バーでシグナルが出ない。原因究明をお願いします。ソースコードと結果は添付のとおりです。変換したものもここに貼り付けておきます。

#property indicator_chart_window
#property indicator_plots   4
#property indicator_buffers 4
#property indicator_color1 PaleVioletRed
#property indicator_color2 DeepSkyBlue
#property indicator_color3 Red
#property indicator_color4 LimeGreen

input int  dist2           = 21;       // Distance#2
input int  dist1           = 14;       // Distance#1

double b1[];
double b2[];
double b3[];
double b4[];

int    handle_atr;
int    min_rates_total;
double atr[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit() {

   SetIndexBuffer(0,b1,INDICATOR_DATA);
   SetIndexBuffer(1,b2,INDICATOR_DATA);
   SetIndexBuffer(2,b3,INDICATOR_DATA);
   SetIndexBuffer(3,b4,INDICATOR_DATA);
   
   ArraySetAsSeries(b1,true);
   ArraySetAsSeries(b2,true);
   ArraySetAsSeries(b3,true);
   ArraySetAsSeries(b4,true);

   PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_LINE);
   PlotIndexSetInteger(1,PLOT_DRAW_TYPE,DRAW_LINE);
   PlotIndexSetInteger(2,PLOT_DRAW_TYPE,DRAW_ARROW);
   PlotIndexSetInteger(3,PLOT_DRAW_TYPE,DRAW_ARROW);

      PlotIndexSetInteger(2,PLOT_ARROW,159);
      PlotIndexSetInteger(3,PLOT_ARROW,159);
   
   ResetLastError();
   handle_atr = iATR(NULL,PERIOD_CURRENT,50);
   if(handle_atr==INVALID_HANDLE) {
      Print("   ***   ATR handle was unable to create. Error ",GetLastError());
      return INIT_FAILED;
   }

   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE);
   PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,EMPTY_VALUE);
   PlotIndexSetDouble(2,PLOT_EMPTY_VALUE,EMPTY_VALUE);
   PlotIndexSetDouble(3,PLOT_EMPTY_VALUE,EMPTY_VALUE);
   
   PlotIndexSetString(0,PLOT_LABEL,"SuperSignals Upper");
   PlotIndexSetString(1,PLOT_LABEL,"SuperSignals Lower");
   PlotIndexSetString(2,PLOT_LABEL,"SuperSignals Sell");
   PlotIndexSetString(3,PLOT_LABEL,"SuperSignals Buy");

        return INIT_SUCCEEDED;
   
}
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &High[],
                const double &Low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[]) {
                
   int counted_bars=prev_calculated;
   int i,limit;
   
   ArraySetAsSeries(Low,true);
   ArraySetAsSeries(High,true);

   if(counted_bars<0) return 0;
   if(counted_bars>0) counted_bars--;
           limit=rates_total-counted_bars;
           limit=MathMax(limit,dist1);
           limit=MathMax(limit,dist2);

   for (i = limit-1; i >= 0; i--) {
         int hhb1 = ArrayMaximum(High,i-dist1/2,dist1);
         int llb1 = ArrayMinimum(Low, i-dist1/2,dist1);
         int hhb  = ArrayMaximum(High,MathMax(0,i-dist2/2),dist2);
         int llb  = ArrayMinimum(Low, MathMax(0,i-dist2/2),dist2);

            b1[i] = EMPTY_VALUE;
            b2[i] = EMPTY_VALUE;
            b3[i] = EMPTY_VALUE;
            b4[i] = EMPTY_VALUE;
         
         ArraySetAsSeries(atr,true);
         int copied=CopyBuffer(handle_atr,0,0,limit,atr);
         if (copied<=0) Print("   ***   ATR failed to copy.");
         double tr = atr[i];

                      b1[i] = High[hhb];
                      b2[i] = Low[llb];
         if (i==hhb1) b3[i] = High[hhb1]+tr/2;
         if (i==llb1) b4[i] = Low[llb1] -tr/2;
    }
   
   return rates_total;
}
//+------------------------------------------------------------------+

その結果


 
Grigori.S.B:

MQL4→MQL5でシンプルなインジケータを変換したが、最後の数バーでシグナルが出ない。原因究明をお願いします。ソースコードと結果は添付のとおりです。変換したものもここに貼り付けておきます。

その結果


プラットフォーム間で論理的に行われていないことが原因である可能性があります

入力パラメータの違いにご注意ください

エムティーフォー

ArrayMaximum
Ищет в одномерном числовом массиве максимальный элемент.

int  ArrayMaximum(
   const void&   array[],             // массив для поиска
   int           count=WHOLE_ARRAY,   // количество проверяемых
   int           start=0              // с какого индекса начинаем поиск
   );

MT5

ArrayMaximum
Ищет максимальный элемент в первом измерении многомерного числового массива.

int  ArrayMaximum(
   const void&   array[],             // массив для поиска
   int           start=0,             // с какого индекса начинаем поиск
   int           count=WHOLE_ARRAY    // количество проверяемых
   );
 
Vitaly Muzichenko:

プラットフォーム間で論理的に行われていないことが原因である可能性があります。

入力パラメータの違いに注意

エムティーフォー

MT5

Vitaliyさん、ありがとうございます。

この場所の変数の順番は正しいです。 変換中に入れ替わりました。また、iHighest/iLowest関数は MQL4に搭載されていました。

これは別格です。もう、頭を悩ませています。

理由: