[存档!]任何菜鸟问题,为了不使论坛变得混乱。专业人士,不要路过。没有你,哪里都不能去 - 4. - 页 101

 
Zhunko:
将清除以前的评论。
谢谢你
 

大家好!

请帮助我理解MQL4入门手册中的这个例子。就是这个地方。

我在我不明白的地方用红色划线。为什么IndicatorCounted()在Tick 3返回299?自上次指标调用(Tick 2)以来,前一根蜡烛没有变化,而且是第300根蜡烛。所以该函数应该返回300。

还有一个问题:你能不能告诉我,在这张图片中,最后一个条形图的开盘价是在Tick 2还是在Tick 3出现的价格?

感谢所有的人,他们不会与痛苦擦肩而过 :-))

 
Skander:

大家好!

帮我举一个MQL4教程中的例子。就是这个地方。

我在我不明白的地方用红色划线。为什么IndicatorCounted()在Tick 3上会返回299?毕竟

在时间t2,酒吧还没有被认为完成,因为从技术上讲,时间框架周期还没有结束。我们没有办法事先确定这是否是该条的最后一个刻度,或者在下一个条开始之前是否会有更多的刻度。因此,"指标计数 "返回它根据文件 应该返回的东西:在时间t2计算的条数,不包括零条(同样在时间t2),即300-1=299。

 
alsu:

在时间t2,酒吧还没有被认为完成,因为从技术上讲,时间框架周期还没有结束。我们没有办法事先确定这是否是该条的最后一个刻度,或者在下一个条开始之前是否会有更多的刻度。因此,"指标计数 "根据文件 规定返回它应该返回的结果:在时间t2计算的条数,不包括零条(同样在时间t2),即300-1=299。


我明白你的意思了:你描述的是时间t2的情况,但教科书上说,在时间t3,指标计数函数返回的数字与时间t2的相同。我不清楚,它为什么会这样做?这里的这个片段。

还是这里描述的时间t2的情况?

 
Skander:

我明白你的意思了:你描述的是时间t2的情况,但教科书上说,在时间t3,指标计数函数返回的数字与时间t2的相同。我不清楚,它为什么会这样做?这里的这一段。

还是这里描述的时间t2的情况?

不,在时间t3。关键是t3是一个条形图的第一个 刻度线,这意味着,因为还没有对它进行计算,IndicatorCounted()的值还没有时间改变--它只发生在函数start()完成其工作之后。这是非常合乎逻辑的--该函数给出了计算的条数,所以在给定条数的至少一个刻度被计算之前,改变其值是没有意义的。因此,在t3时刻,我们仍然看到价值299,但在下一个tick,它将是300。

是不是更清楚了?

 
伙计们,请告知什么是头文件(MQH),它可以在编辑器中创建。编辑的帮助并没有说什么。
 
Las-tochka:
伙计们,告诉我什么是头文件(MQH),它可以在编辑器中创建。编辑的帮助并没有说什么。

库 有功能,你可以在MetaEditor、Notepad中创建它

汇编是不需要的。在编译时 include包含了专家的必要功能,而Libraries库 ex4也被编译和导入 (即不断访问它以获得必要的f-ms)。
 
Las-tochka:
伙计们建议什么是,头文件(MQH),你可以在编辑器中创建它。编辑的帮助并没有说什么。


我认为MKL中的头文件也值得从这个角度去看。

因为我们知道语言中没有类,但这很方便。可以用头文件来创建某种类。在其中,我们创建了一个描述对象(变量)的环境,并定义了将与该环境一起工作的函数。相当方便(假设项目 足够复杂)。

 
220Volt: 如你所知,这门语言没有课程,但它很方便。你可以使用头文件创建一些类似于类的东西。在其中,我们创建了一个描述对象(变量)的环境,并定义了将与该环境一起工作的函数。相当方便(前提是该项目相当复杂)。

你能不能说得更具体一点?请给我一个例子,好吗?

对于像Las-tochk'i这样的初学者来说,你的这些聪明的信完全说明不了问题。

 
Mathemat:

你能说得更具体些吗?请给我们举个例子。

对于像Las-tochk'i这样的初学者来说,你的这些聪明的信完全说明不了问题。

我想没有人会有兴趣去挖掘别人的代码,这样一个类的例子。

//+------------------------------------------------------------------+
//|                                                  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);
   }
//--------------------------------------------------