[ARCHIVE!] フォーラムを散らかさないように、どんなルーキーの質問でも。プロフェッショナルは、通り過ぎないでください。あなたなしではどこにも行けない - 4. - ページ 101

 
Zhunko:
以前のコメントをクリアします。
ありがとうございました。
 

皆さん、こんにちは。

MQL4の入門書から、この例を理解するのに役立ってください。ここがそうです。

わからないところは赤で下線を引いています。IndicatorCounted()がTick 3で299を返すのはなぜですか?前回の指標呼び出し(Tick 2)から、前回のローソク足は変化しておらず、300本目のローソク足となります。ですから、この関数は300を返すはずです。

もう一つ質問です。この画像で最後のバーのOpenはTick 2に来た価格なのかTick 3に来た価格なのか、教えてください。

この苦しみを乗り越えようとするすべての人に感謝します :-))

 
Skander:

みなさん、こんにちは。

MQL4チュートリアルの例で助けてください。ここがそうです。

わからないところは赤で下線を引きました。IndicatorCounted()がTick 3で299を返すのはなぜですか?結局のところ

時刻t2では、技術的にまだタイムフレーム期間が終了していないため、バーはまだ終了していないとみなされます。これがバーの最後のティックなのか、次のバーが始まるまでにもっとティックがあるのか、事前に判断する方法はないのです。その結果、Indicator Countedは、ドキュメントに よると、ゼロバー(再び時刻t2)を除く時刻t2でカウントされたバーの数、すなわち300-1=299を返すことになります。

 
alsu:

時刻t2では、技術的にまだタイムフレーム期間が終了していないため、バーはまだ終了していないとみなされます。これがバーの最後のティックなのか、次のバーが始まるまでにもっとティックがあるのか、事前に判断する方法はないのです。その結果、Indicator Countedは、ドキュメントに よると、ゼロバー(再び時刻t2)を除く時刻t2でカウントされたバーの数、すなわち300-1=299を返すことになります。


なるほど、時刻t2での状況を記述していますが、教科書には時刻t3でIndicator Counted関数が時刻t2と同じ数を返すと書いてありますね。なぜそうなるのか、私にはよくわかりません。こちらのフラグメント。

それとも、ここに書かれているのは時刻t2での状況でしょうか?

 
Skander:

なるほど、時刻t2での状況を記述していますが、教科書には時刻t3でIndicator Counted関数が時刻t2と同じ数を返すと書いてありますね。なぜそうなるのか、私にはよくわかりません。この段落はここです。

それとも、ここに書かれているのは時刻t2での状況でしょうか?

いいえ、時刻t3においてです。ポイントはt3がバーの最初の ティックであり、それはまだ計算が行われていないので、IndicatorCounted()の値がまだ変化する時間がないことを意味します - それは関数start()が仕事を終えた後にのみ起こります。この関数は計算されたバーの数を表示するので、与えられたバーの少なくとも1ティックが計算されるまで、この値を変更する意味はありません。したがって、t3 の時点ではまだ 299 と表示されていますが、次のティックでは 300 になっています。

よりクリアになりましたか?

 
ヘッダーファイル(MQH)とは何か、エディターで作成できるのか、皆さん、ご教示ください。エディターズヘルプには何も書いていない。
 
Las-tochka:
皆さん、ヘッダーファイル(MQH)とは何か教えてください、エディターで作成できます。エディターズヘルプには何も書いていない。

ライブラリ 関数を使えば、MetaEditorやNotepad...で作成 することができます。

コンパイルは必須ではありません。コンパイル時に必要な関数をエキスパートにインクルードし、Libraries ライブラリex4をコンパイルしてインポート する(つまり、必要なf-msを常に参照する)。
 
Las-tochka:
皆さんは、ヘッダーファイル(MQH)とは何か、エディターで作成することができるのか、アドバイスしてください。エディターズヘルプには何も書いていない。


MKLのヘッダーファイルもこのような角度から見てみるのも良いかと思います。

のように、言語にはクラスが存在しないが、これは便利である。ヘッダーファイルで何らかのクラスを作成することができます。その中で、対象物を記述する環境(変数)を作り、この環境と連携する関数を定義する。かなり便利です(プロジェクトが 十分に複雑であることが前提ですが)。

 
220Volt: ご存知の通り、語学の授業はありませんが、便利なんです。ヘッダーファイルを使って、クラスのようなものを作ることができます。その中で、対象物を記述する環境(変数)を作り、この環境と連携する関数を定義する。かなり便利です(ただし、プロジェクトがかなり複雑であることが条件)。

もう少し具体的に教えてください。具体的な例を教えてください。

ラストークの ような初心者には、このような巧妙な手紙は全く意味がないのです。

 
Mathemat:

もう少し具体的に教えてください。何かしらの例を挙げてください。

ラストークの ような初心者にとって、あなたのこのスマートな手紙は全く意味をなさない。

このようなクラスの例である他人のコードを掘り起こすことに興味を持つ人はいないと思います。

//+------------------------------------------------------------------+
//|                                                  WaveCounter.mq4 |
//|                                                             Паха |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Паха"

#define wC_SHADECOLOR   C'121,0,0'
#define wC_NAMEPART  "WaveCounter"
//#define NEW_LINE_COLOR  DarkKhaki
#define NEW_LINE_STILE  2
#define NEW_LINE_RAY 0
#define SCARP_LINE_STILE   1
//#define SCARP_LINE_COLOR White

#include <WaveCounterCore.mqh>
///////////////////////////////////////////////////////////////////// Var
string wC_sName = "";
int wC_iTimeframe;
int wC_iDirection;
bool wC_bFirst;
int iwC_iLockBar;
double wC_dSizePorog[][2];
//------------------------ rez
int wC_iMoveBar[2];
double wC_dMovePrice[2];
bool wC_bScarp;
int wC_iStop;
/////////////////////////////////////////////////////////////////////
/*
//-------------------------------------------------- private
bool wC_vn_getWaveSizeArray();
//-------------------------------------------------- public
string wC_Create(bool bSizeFilter,
                  bool bAddToExtr);
bool wC_Check(string &sName, 
               bool bFromBegin, 
               bool bFirst);
bool wC_IsScarp();
int wC_IsStop();
bool wC_Redraw();
*/
/////////////////////////////////////////////////////////////////////

string wC_Create(bool bSizeFilter,
                  bool bAddToExtr)
   {
   //----
   string sShadeName[2] = {"wC_Shade1", "wC_Shade2"};
   
   //--//
      if(ObjectFind(sShadeName[0]) < 0)
         {
         Shade_create( sShadeName[0], wC_SHADECOLOR );
         return("");
         }
      
      if(ObjectFind(sShadeName[1]) < 0)
         {
         Shade_create( sShadeName[1], wC_SHADECOLOR );
         return("");
         }
   //--\\
   
   if( ! Shade_attach(sShadeName, false) ) 
      return("");      
   if( ! Shade_direction(wC_iDirection, 0, 1) )
      return("");
   if( ! Shade_minTimeframe(0) )
      return("");
   wC_iTimeframe = Shade_getTimeframe();
   int iCorrectIndex[2] = {0, 1};
   Shade_correctKoord(iCorrectIndex); 
   
   datetime datPoint0;
   double dPoint0, dPoint1;
   if(wC_iDirection == 2)
      {
      if( ! Shade_getPointTimePrice(0, CONTMOV1,  false, datPoint0, dPoint0) )
         return("");
      }
   else
      {
      if( ! Shade_getPointTimePrice(0, CONTMOV1,  true, datPoint0, dPoint0) )
         return("");
      } 

   if(bSizeFilter)
      {
      if( ! wC_vn_getWaveSizeArray() )
         return("");
         
      int iIndexPoroga[1];
      if( ! MyInputBox("Индекс порога", iIndexPoroga) )
         return("");
      if( iIndexPoroga[0] < 0  || iIndexPoroga[0] + 1 > ArrayRange(wC_dSizePorog, 0) )
         {
         Alert("Недопустимый индекс");
         return("");
         }
         
      if(wC_iDirection == 2)
         dPoint1 = dPoint0 + wC_dSizePorog[ iIndexPoroga[0] ][0] * dPoint0;
      else
         dPoint1 = dPoint0 - wC_dSizePorog[ iIndexPoroga[0] ][0] * dPoint0;
      iwC_iLockBar = MYEMPTY;
      }
   else
      {
      if(wC_iDirection == 2)
         {
         if( ! Shade_getPoint(1, CONTMOV2, true, iwC_iLockBar) )
            return(false);
         dPoint1 = iHigh(NULL, wC_iTimeframe, iwC_iLockBar);
         }
      else
         {
         if( ! Shade_getPoint(1, CONTMOV2, false, iwC_iLockBar) )
            return(false);
         dPoint1 = iLow(NULL, wC_iTimeframe, iwC_iLockBar); 
         }
      if(dPoint1 == 0)
         return(false);
      if(bAddToExtr)
         iwC_iLockBar --;
      }

   if( ! Fun_partOfName(wC_sName) )
      return("");   
   wC_sName = StringConcatenate(wC_sName, wC_NAMEPART);
   
   if( ! ObjectCreate(wC_sName, OBJ_TREND, 0, datPoint0, dPoint0, datPoint0, dPoint1) )
      return("");
   if( ! ObjectSetText(wC_sName, "2") )
      return("");
   if( ! ObjectSet(wC_sName, OBJPROP_RAY, NEW_LINE_RAY) )
      return("");
   if( ! ObjectSet(wC_sName, OBJPROP_COLOR, Fun_ColorFromPanel()) )
      return("");
   if( ! ObjectSet(wC_sName, OBJPROP_STYLE, NEW_LINE_STILE) )
      return("");
   
   Fun_deleteObjects(sShadeName);
   return(wC_sName); 
   }
//--------------------------------------------------

bool wC_vn_getWaveSizeArray()
   {
   static bool bSizePorogInit = false;
   if(bSizePorogInit)
      return(true);
   string sSymbol = Symbol();
   if( sSymbol == "USDCHF" )
      {
      if(ArrayResize(wC_dSizePorog, ArrayRange(prop_dWaveSizeUSDCHF, 0)) < 0)
         return(false);
      if(ArrayCopy(wC_dSizePorog, prop_dWaveSizeUSDCHF) < 1)
         return(false);
      bSizePorogInit = true;
      return(true);
      }
         
   if( sSymbol == "AUDJPY" )
      {
      if(ArrayResize(wC_dSizePorog, ArrayRange(prop_dWaveSizeAUDJPY, 0)) < 0)
         return(false);
      if(ArrayCopy(wC_dSizePorog, prop_dWaveSizeAUDJPY) < 1)
         return(false);
      bSizePorogInit = true;
      return(true);
      }
         
   if( sSymbol == "EURUSD" )
      {
      if(ArrayResize(wC_dSizePorog, ArrayRange(prop_dWaveSizeEURUSD, 0)) < 0)
         return(false);
      if(ArrayCopy(wC_dSizePorog, prop_dWaveSizeEURUSD) < 1)
         return(false);
      bSizePorogInit = true;
      return(true);
      }
         
   if( sSymbol == "EURGBP" )         
      {
      if(ArrayResize(wC_dSizePorog, ArrayRange(prop_dWaveSizeEURGBP, 0)) < 0)
         return(false);
      if(ArrayCopy(wC_dSizePorog, prop_dWaveSizeEURGBP) < 1)
         return(false);
      bSizePorogInit = true;
      return(true);
      }
     
   if( sSymbol == "EURJPY" )           
      {
      if(ArrayResize(wC_dSizePorog, ArrayRange(prop_dWaveSizeEURJPY, 0)) < 0)
         return(false);
      if(ArrayCopy(wC_dSizePorog, prop_dWaveSizeEURJPY) < 1)
         return(false);
      bSizePorogInit = true;
      return(true);
      }
         
   if( sSymbol == "GBPUSD" )            
      {
      if(ArrayResize(wC_dSizePorog, ArrayRange(prop_dWaveSizeGBPUSD, 0)) < 0)
         return(false);
      if(ArrayCopy(wC_dSizePorog, prop_dWaveSizeGBPUSD) < 1)
         return(false);
      bSizePorogInit = true;
      return(true);
      }
         
   if( sSymbol == "USDCAD" )            
      {
      if(ArrayResize(wC_dSizePorog, ArrayRange(prop_dWaveSizeUSDCAD, 0)) < 0)
         return(false);
      if(ArrayCopy(wC_dSizePorog, prop_dWaveSizeUSDCAD) < 1)
         return(false);
      bSizePorogInit = true;
      return(true);
      }
         
   if( sSymbol == "USDJPY" )            
      {
      if(ArrayResize(wC_dSizePorog, ArrayRange(prop_dWaveSizeUSDJPY, 0)) < 0)
         return(false);
      if(ArrayCopy(wC_dSizePorog, prop_dWaveSizeUSDJPY) < 1)
         return(false);
      bSizePorogInit = true;
      return(true);
      }
         
   if( sSymbol == "AUDUSD" )            
      {
      if(ArrayResize(wC_dSizePorog, ArrayRange(prop_dWaveSizeAUDUSD, 0)) < 0)
         return(false);
      if(ArrayCopy(wC_dSizePorog, prop_dWaveSizeAUDUSD) < 1)
         return(false);
      bSizePorogInit = true;
      return(true);
      }
      
   Alert("У символа нет размерного массива, или он не прописан в функции Tl_vn_getWaveSizeArray()");
   return(false);
   }
//--------------------------------------------------

bool wC_Check(string &sName, 
               bool bFromBegin, 
               bool bFirst)
   {
   if(StringFind(sName, wC_NAMEPART) == -1)
      return(false);
   wC_bScarp = false;
   wC_iStop = -1;
   wC_sName = sName;
   string sDescrip = ObjectDescription(sName);
   int iID = StrToInteger(sName);
   if(iID == 0)
      return(false);
      
   datetime datLastTime;
   if(sDescrip == "1"  &&  ! bFirst)
      {
      datLastTime = FL_LastTime();
      if(datLastTime == -1)
         datLastTime = MYEMPTY;
      if( ! tlC_Load(iID, datLastTime) )
         return(false);
      wC_bFirst = false;
      if(bFromBegin)
         if( ! tlC_SeekToBegin())
            return(false);
      }
   else
      {
      if(sDescrip == "2"  &&  bFirst)
         {
         int iBeginBar = iBarShift(NULL, wC_iTimeframe, ObjectGet(sName, OBJPROP_TIME1), true);
         if(iBeginBar == -1)
            return(false);
         datLastTime = FL_LastTime();
         if(datLastTime == -1)
            datLastTime = MYEMPTY;
         if( ! tlC_Attach(iID, wC_iDirection, wC_iTimeframe, iBeginBar, ObjectGet(sName, OBJPROP_PRICE2), iwC_iLockBar, datLastTime) )
            return(false); 
         if(iwC_iLockBar != MYEMPTY)
            tlC_SetStops(false, MYEMPTY);
         wC_bFirst = true;
         }
      else
         return(false);
      }
   
   if( ! tlC_Check() )
      return(false);
      
   wC_bScarp = tlC_IsScarp();
   wC_iStop = tlC_IsStop();
   tlC_GetCurView(wC_iMoveBar, wC_dMovePrice);
   if(wC_bScarp)
      {
      int iTempVar;
      double dTempVar;
      tlC_GetCurPos(iTempVar, dTempVar);
      wC_iMoveBar[1] = iTempVar;
      wC_dMovePrice[1] = dTempVar;
      }
   
   return(true);
   }
//--------------------------------------------------

bool wC_IsScarp()
   {
   return(wC_bScarp);
   }
//--------------------------------------------------

int wC_IsStop()
   {
   return(wC_iStop);
   }
//--------------------------------------------------