初学者的问题 MQL5 MT5 MetaTrader 5 - 页 841

 
Vitaly Muzichenko:

kodobase上有很多库,也有一篇文章

这是一篇著名的文章,但不是正确的文章。

每次都要定义,很不方便。

 
double Bid  double Ask  double Close[]  double Low[]  и так далее


Codebase里有很多库,但我想问的是,有没有人知道一些特定的库,可以一劳永逸地实现山寨化

 
Stefan Stoyanov:
这篇文章是众所周知的 这是不对的。

代码库里有很多库,但我想问的是具体的库,如果有人知道的话。

你需要采取2-3个库,并从它们中建立一个你自己的库--完整的。

 
Vitaly Muzichenko:

我们需要采取2-3个图书馆,并利用它们来建立一个我们自己的图书馆--一个完整的图书馆。


图书馆索引在哪里,它将告诉我们某个图书馆的用途以及如何与之沟通?

一般来说,我不想收集和制作图书馆。
我关于准备好的库的存在的问题,如果我将再次创建它们,最好是通过文章工作
 
Stefan Stoyanov:

图书馆索引在哪里,它将告诉我们某个图书馆的用途以及如何与之沟通?

一般说来,我不想建立和制作图书馆。
我的问题是关于现成的库的存在,如果我打算再次建立它们,最好是通过文章来工作

它很容易建立,你要花更长的时间在论坛上写,给自己制造麻烦。

下面是其中的一些内容。

#ifdef __MQL5__
datetime iTime(string symb,ENUM_TIMEFRAMES tf,int index) {
datetime Arr[1];
  return((CopyTime(symb,tf,index,1,Arr)==1)?Arr[0]:WRONG_VALUE);
 }
//-------------------------------------------------------------------------------------------------------
double iOpen(string symb,ENUM_TIMEFRAMES tf,int index) {
double Arr[1];
  return((CopyOpen(symb,tf,index,1,Arr)==1)?Arr[0]:WRONG_VALUE);
 }
//-------------------------------------------------------------------------------------------------------
double iClose(string symb,ENUM_TIMEFRAMES tf,int index) {
double Arr[1];
  return((CopyClose(symb,tf,index,1,Arr)==1)?Arr[0]:WRONG_VALUE);
 }
//-------------------------------------------------------------------------------------------------------
double iLow(string symb,ENUM_TIMEFRAMES tf,int index) {
double Arr[1];
  return((CopyLow(symb,tf,index,1,Arr)==1)?Arr[0]:WRONG_VALUE);
 }
//-------------------------------------------------------------------------------------------------------
double iHigh(string symb,ENUM_TIMEFRAMES tf,int index) {
double Arr[1];
  return((CopyHigh(symb,tf,index,1,Arr)==1)?Arr[0]:WRONG_VALUE);
 }
//-------------------------------------------------------------------------------------------------------
double AccountFreeMarginCheck(const string Symb,const int Cmd,const double dVolume) {
 double Margin;
   return(::OrderCalcMargin((ENUM_ORDER_TYPE)Cmd, Symb, dVolume,
          ::SymbolInfoDouble(Symb,(Cmd==::ORDER_TYPE_BUY) ? ::SYMBOL_ASK : ::SYMBOL_BID),Margin) ?
          ::AccountInfoDouble(::ACCOUNT_MARGIN_FREE) - Margin : -1);
 }
#endif
 

我发现这个代码

我想问的是,这段代码是否可以简化为一个带有某种名称的文件,这样它就不会每次都被重置,而只是停留在文件夹中。



// Позволяет, как в MT4, работать с таймсериями: Open[Pos], High[Pos], Low[Pos], Close[Pos], Time[Pos], Volume[Pos].
// А так же задает привычные MT4-функции: iOpen, iHigh, iLow, iClose, iTime, iVolume.
#define  DEFINE_TIMESERIE(NAME,FUNC,T)                                                                         \
  class CLASS##NAME                                                                                           \
  {                                                                                                           \
  public:                                                                                                     \
    static T Get( const string Symb, const int TimeFrame, const int iShift )                                  \
    {                                                                                                         \
      T tValue[];                                                                                             \
                                                                                                              \
      return((Copy##FUNC((Symb == NULL) ? _Symbol : Symb, _Period, iShift, 1, tValue) > 0) ? tValue[0] : -1); \
    }                                                                                                         \
                                                                                                              \
    T operator []( const int iPos ) const                                                                     \
    {                                                                                                         \
      return(CLASS##NAME::Get(_Symbol, _Period, iPos));                                                       \
    }                                                                                                         \
  };                                                                                                          \
                                                                                                              \
  CLASS##NAME  NAME;                                                                                           \
                                                                                                              \
  T i##NAME( const string Symb, const int TimeFrame, const int iShift )                                       \
  {                                                                                                           \
    return(CLASS##NAME::Get(Symb,  TimeFrame, iShift));                                                        \
  }

DEFINE_TIMESERIE(Volume, TickVolume, long)
DEFINE_TIMESERIE(Time, Time, datetime)
DEFINE_TIMESERIE(Open, Open, double)
DEFINE_TIMESERIE(High, High, double)
DEFINE_TIMESERIE(Low, Low, double)
DEFINE_TIMESERIE(Close, Close, double)





 

我以前是这样定义开场白 的。


  MqlRates mrate[];          // To be used to store the prices, volumes and spread of each bar  
   ArraySetAsSeries(mrate,true);
   if(CopyRates(_Symbol,_Period,0,3,mrate)<0)
     {
      Print("Error copying rates/history data - error:",GetLastError(),"!!");
      return(0);
     }
   double close=mrate[0].close; double open=mrate[0].open;
   double high=mrate[0].high;   double low=mrate[0].low;


这个方法和你的一样吗?

//-------------------------------------------------------------------------------------------------------
double iOpen(string symb,ENUM_TIMEFRAMES tf,int index) {
double Arr[1];
  return((CopyOpen(symb,tf,index,1,Arr)==1)?Arr[0]:WRONG_VALUE);
 }
//------------------------------------------------------------------------------




 
Stefan Stoyanov :

我发现这个代码

我想问的是,这段代码是否可以简化为一个带有某种名称的文件,这样它就不会每次都重置,而只是停留在文件夹中

在工作文件的开头添加这一行。

 #include  "your_file.mqh" 

将your_file.mqh放在你终端的 "include "文件夹中。

 
呃!!!。扩展名....mq5,当然会有一个错误
附加的文件:
 
Stefan Stoyanov:
呃!扩展名....mq5,当然会有一个错误

不要把代码放在OnTick()里面。

就像我在上一篇文章中所说的那样,在文件your_file.mqh中加入defines到你的 expert_file.mq5中。

 
Kirill Belousov:

不要把代码放在OnTick()里面。

就像我在之前的帖子中说的那样,在文件your_file.mqh中加入defines到你的 expert_file.mq5中。

我已经做了。谢谢!