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

 
Alexey Viktorov:
表示色をclrNONEに設定する。

つまり、バッファだけを出力して、変数は別に出力できないのですか?

 
psyman:

つまり、バッファだけを出力して、変数は別に出力できないのですか?

そう、それしかないんです。そして、もう一つ便利なトリックがあります。SetIndexLabel(0, ""); を設定すると、これらの値はデータウィンドウ に表示されなくなるのです。また、iCustom()関数さえも使えなくなります。
 
Igor Makanu:

回答ありがとうございました。

つまり、私が理解しているのは、バッファを作成し、そのバッファに

をRSI値で作成し、このバッファにiMAOnArray()で供給する。

EAでこれをやって、サブウィンドウでEAを テストするときに表示されるようになった方はいらっしゃいますか?

通常、iCustomによるEAテストは低調です。

 

https://www.mql5.com/ru/docs/strings/stringadd の例からコードを取り出し、スクリプトに貼り付けました。MQL4、MQL5でも結果は同じです。


HE      0       22:42:49.015    Test Script (EURUSD,H1) time for 'c = a + b' = 235 milliseconds, i = 1000000
OH      0       22:42:50.187    Test Script (EURUSD,H1) time for 'StringAdd(a,b)' = 1156 milliseconds, i = 1000000
EP      0       22:42:50.781    Test Script (EURUSD,H1) time for 'StringConcatenate(c,a,b)' = 594 milliseconds, i = 1000000


よりもStringAdd()やStringConcatenate()の 方が高速に動作するはずなのですが、どうでしょうか?なぜそうでないのか。

 
Northwest:

iCustomは通常、Expert Advisorのテストを遅くします。

インジケータバッファのメモリの割り当ては、MQLスクリプトではなく、端末で行われるため、それは真実ではない、通常は逆です、これらの問題は、指標の非最適な計算の問題であり、多くの初心者が1つの指標の呼び出しに - ティック、過去のデータの全体の長さを計算します。

MQLの基本を理解された方は、記事を読んでみてください、全て書いてありますよ。

https://www.mql5.com/ru/articles/4602


ノースウエスト

EAでこれをやって、サブウィンドウでEAをテストするときに表示されるようになった人はいますか?

EAとインジケーターの違い、インジケーターのバッファがあるものとないもの、トレーディング機能があるものとないもの......誰も読んでないですね。

ZZY: サブウィンドウはインジケータしか作成できません。サブウィンドウを作成した場合、Expert Advisorhttps://www.mql5.com/ru/docs/constants/objectconstants/enum_object を使用して、このサブウィンドウにグラフィックオブジェクトを追加することができます。

ZSYZZ:サブウィンドウはテンプレート適用で取得可能、数ヶ月前にトピックがあったが、今までは他のことに問題があるのでは?

Как перенести расчетную часть любого индикатора в код эксперта
Как перенести расчетную часть любого индикатора в код эксперта
  • www.mql5.com
Когда программист создает советник, который получает сигналы от индикаторов, он всякий раз сталкивается с вопросом: использовать обращение к индикатору или перенести код индикатора в советник? Причины этому могут быть различные: желание сохранить в тайне используемые индикаторы и стратегию в целом, необходимость распространения советника единым...
 
Igor Makanu:

インジケータバッファのメモリの割り当ては、MQLスクリプトではなく、ターミナルによって行われるため、通常、これらの問題は、インジケータ内の非最適な計算の問題であり、多くの初心者は、1つのインジケータコール - ティックで、彼らは過去のデータの全体の長さを計算する真実ではありません

MQLの基本を理解された方は、記事を読んでみてください、昔から書かれています。

https://www.mql5.com/ru/articles/4602


エキスパートアドバイザーとインジケーターの違い、インジケーターバッファがある人とない人、トレーディング機能がある人とない人......誰も読んでいない。

ZZY: サブウィンドウはインジケータしか作成できません。サブウィンドウを作成した場合、Expert Advisorhttps://www.mql5.com/ru/docs/constants/objectconstants/enum_object を使用してこのサブウィンドウにグラフィカルオブジェクトを追加することができます。

ZSYZZ:サブウィンドウはテンプレートを適用することで取得できる、数ヶ月前のトピックですが、ここまでくると何か別の問題があるような気がします

すみません。言い方が悪かったかもしれませんが

テストに使うつもりはないが、実行するつもりはない。

テスト時のインジケーターチャート上での可視化については、もし

ビルトインインジケーターの機能を使用する場合、テストの過程でチャートに描画される

まさにその通りです。

しかし、EAのコードに統合された何らかのインジケータ計算のカスタムコードを使用する場合、このインジケータは

は、EAをテストする過程で表示されなくなります。

iCustomについては、テストの過程で使用すると、EAがチャートに表示されるようになります

インジケータとインジケータのコードは、EAと一緒に1つのex4にコンパイルすることができますが、私はそれを必要としません。

この件に関してiCustomを回避する方法があれば知りたかったのですが、なければそれも問題ありません。

包括的なご回答をいただき、誠にありがとうございました。

 

Artemは、ここにインジケーターのテンプレートを投稿しました、以下はOnCalculateからの 部分です。

//--- Проверка количества доступных баров (1 - минимально, 4 - оптимально для большинства расчётов. Но всё "по месту"...)
   if(rates_total<4) return 0;
//--- Проверка и расчёт количества просчитываемых баров
   int limit=rates_total-prev_calculated; // 0 - пришел новый тик, новый бар формироваться не начал. 1 - пришел новый тик и начал формироваться новый бар.
   if(limit>1) 
               // если вписать "limit>0", то на нулевом баре будет расчёт только нулевого бара, на каждом новом баре будет полный перерасчёт всей истории
               // если вписать "limit>1", то на нулевом баре будет расчёт только нулевого бара, на открытии нового бара - пересчёт первого и нулевого,
               // при подгрузке истории и на первом запуске - перерасчёт всей истории
     {
      limit=rates_total-1;
      // здесь должна быть инициализация всех используемых буферов индикатора необходимыми значениями (обычно EMPTY_VALUE и 0)
     }

使っているのですが、一つ疑問があります)

フルヒストリーの計算にlimit=rates_totalではなく、limit=rates_total- 1を使用するのはなぜですか

 
psyman:

フルヒストリーの計算にlimit=rates_total-1が 使われ、limit=rates_totalない のはなぜですか?

確認しようとすると、すぐに「範囲 外」になってしまいます - バーの番号が0から...合計 -1 , プログラミングではよくある状況です - 番号は0から始まります。わかりやすい例として、配列 double x[5] を宣言し、最後の要素 x[5] = 100 に何かを書き込もうとします。

ZS: まだ聞かれていない質問に答えると...。OrderTotal() も0からOrderTotal()-1までの数字が入ります ;)

 
Igor Makanu:

ZS: まだ聞かれていない質問に答えて...。OrderTotal()も0からOrderTotal()-1までナンバリングされている;)

ところで疑問が生じたのですが、今、私は配列に平均値を勝つことができません、私は5で行うが、どのようなテーマで書くために、私は知らない、それがここにあるようにします。

このインジケータは開閉差を計算し、その上にМАを構築します。デバッグのためにMA=2を選択しましたが、SimpleMAOnBufferとiMAOnArrayを使用すると、説明のつかないラインシフトが発生し、iMAOnArrayは最後のバーでゼロ値を表示します。


//+------------------------------------------------------------------+
//|                                                        _null.mq4 |
//|                        Copyright 2014, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_separate_window
#include <MovingAverages.mqh>

#property indicator_buffers 4
#property indicator_plots   2
//--- plot OC
#property indicator_label1  "OC"
#property indicator_type1   DRAW_COLOR_HISTOGRAM
#property indicator_color1  clrSteelBlue, clrRed,clrGreen
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1

#property indicator_label2  "MA1"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrBrown
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1


//--- indicator buffers
double   OC[], OC_color[], MA1_buf[];
input int MA1=2;

int OnInit()
  {
  
   IndicatorSetString(INDICATOR_SHORTNAME,"t1");
   
   SetIndexBuffer(0,OC,INDICATOR_DATA);
   SetIndexBuffer(1,OC_color,INDICATOR_COLOR_INDEX);
   
   SetIndexBuffer(2, MA1_buf,INDICATOR_DATA); 
   //PlotIndexSetInteger(2,PLOT_DRAW_BEGIN,50);

     
//--- indicator buffers mapping

   
//---
   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[])
{

//--- Проверка количества доступных баров (1 - минимально, 4 - оптимально для большинства расчётов. Но всё "по месту"...)
   if(rates_total<4) return 0;
//--- Проверка и расчёт количества просчитываемых баров
   int limit=rates_total-prev_calculated; // 0 - пришел новый тик, новый бар формироваться не начал. 1 - пришел новый тик и начал формироваться новый бар.
   //if(limit>1) 
   
               // если вписать "limit>0", то на нулевом баре будет расчёт только нулевого бара, на каждом новом баре будет полный перерасчёт всей истории
               // если вписать "limit>1", то на нулевом баре будет расчёт только нулевого бара, на открытии нового бара - пересчёт первого и нулевого,
               // при подгрузке истории и на первом запуске - перерасчёт всей истории
     {
     limit=rates_total-1;
           // здесь должна быть инициализация всех используемых буферов индикатора необходимыми значениями (обычно EMPTY_VALUE и 0)
     }
   for(int i=limit; i>=0 && !IsStopped(); i--)
     {
      // необходимые действия по расчёту индикатора
     
     OC[i]=fmax(open[i],close[i])-fmin(open[i],close[i]);
     if(OC[i]>0.001)
      {   OC_color[i]=1;
      }
      }  
   
 /*  for(int k=limit; k>=0 && !IsStopped(); k--)
     {
   
     MA1_buf[k]=iMAOnArray(OC,0,MA1,k,MODE_SMA,0);
     }
*/
      SimpleMAOnBuffer(rates_total,prev_calculated,0,MA1,OC,MA1_buf);

//--- return value of prev_calculated for next call
   return(rates_total);
  }




double iMAOnArray(double &array[],
                      int total,
                      int period,
                      int ma_shift,
                      int ma_method,
                      int shift)
  {
   double buf[],arr[];
   if(total==0) total=ArraySize(array);
   if(total>0 && total<=period) return(0);
   if(shift>total-period-ma_shift) return(0);
   switch(ma_method)
     {
      case MODE_SMA :
        {
         total=ArrayCopy(arr,array,0,shift+ma_shift,period);
         if(ArrayResize(buf,total)<0) return(0);
         double sum=0;
         int    i,pos=total-1;
         for(i=1;i<period;i++,pos--)
            sum+=arr[pos];
         while(pos>=0)
           {
            sum+=arr[pos];
            buf[pos]=sum/period;
            sum-=arr[pos+period-1];
            pos--;
           }
         return(buf[0]);
        }
      case MODE_EMA :
        {
         if(ArrayResize(buf,total)<0) return(0);
         double pr=2.0/(period+1);
         int    pos=total-2;
         while(pos>=0)
           {
            if(pos==total-2) buf[pos+1]=array[pos+1];
            buf[pos]=array[pos]*pr+buf[pos+1]*(1-pr);
            pos--;
           }
         return(buf[shift+ma_shift]);
        }
      case MODE_SMMA :
        {
         if(ArrayResize(buf,total)<0) return(0);
         double sum=0;
         int    i,k,pos;
         pos=total-period;
         while(pos>=0)
           {
            if(pos==total-period)
              {
               for(i=0,k=pos;i<period;i++,k++)
                 {
                  sum+=array[k];
                  buf[k]=0;
                 }
              }
            else sum=buf[pos+1]*(period-1)+array[pos];
            buf[pos]=sum/period;
            pos--;
           }
         return(buf[shift+ma_shift]);
        }
      case MODE_LWMA :
        {
         if(ArrayResize(buf,total)<0) return(0);
         double sum=0.0,lsum=0.0;
         double price;
         int    i,weight=0,pos=total-1;
         for(i=1;i<=period;i++,pos--)
           {
            price=array[pos];
            sum+=price*i;
            lsum+=price;
            weight+=i;
           }
         pos++;
         i=pos+period;
         while(pos>=0)
           {
            buf[pos]=sum/weight;
            if(pos==0) break;
            pos--;
            i--;
            price=array[pos];
            sum=sum-lsum+price*period;
            lsum-=array[i];
            lsum+=price;
           }
         return(buf[shift+ma_shift]);
        }
      default: return(0);
     }
   return(0);
  }
 
psyman:

関連する質問なのですが、5でやっているとはいえ、配列平均化で悩んでいるのですが、どの科目で書けばいいのかわからず、こちらにさせてください。

MT5ではデフォルトで左端のバーがバー0、MT4では右端のバーがバー0で、インジケーターバッファも 同じ数字になっています。

ZS: 残念ながら、私はMT5には関わりたくありません。自分のアイデアを確認するにはMT4で十分ですし、MT5で準備を見るだけで、MT5を使って何かを書いても誰にも見せることはありません )))