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

 
vladzeit:

谢谢你提供的例子。

能否请你澄清一下...如果我理解正确的话。

我们告诉OrderGetInteger采取明确的日期时间类型,这就是=(datetime)OrderGetInteger?

这条规则是否适用于所有没有明确类型或与被赋值的变量类型不匹配的函数? 或者这只是一种特殊情况?

我想了解这是否是一个规则,或者只是一个需要记住的特殊情况。

这不是一个特殊的情况。如果你把一个不同类型的值写进一个类型的变量,编译器会警告你。而从哪个变量中获取数据,则由你决定。

在你的情况下--当从一个长类型 的函数中返回一个明确的数据时间值时,当然是安全的,你应该明确指定你从函数中得到的值的类型。

但是如果你把一个双倍的值带入int-variable,那么就要看你是否明白这样的赋值不会丢失数据。如果你确定返回值适合于int,那么就明确指定int,如果你不知道,那么就把它作为一个双倍变量。

 
Artyom Trishkin:

这不是一个特殊的情况。如果你把另一种类型的值写入一种类型的变量中,编译器会警告你。而从哪个变量中获取数据,则由你决定。

在你的例子中--当从一个长类型 的函数中返回一个明确的数据时间值时,当然是安全的,你应该明确指定你从函数中得到的值的类型。

但是如果你把一个双倍的值带入int-variable,那么你必须明白,在这样的赋值过程中不会有数据丢失。如果你确定返回的值适合于int,就明确指定int,如果你不知道,就把它放入一个双倍变量。

谢谢你的详细回答。明白了。

 

(大家下午好))。


我已经掌握了MT4,但MT5 .... 我不明白((())没有很多例子,那些例子也没有解释我需要的东西。

请告知如何使用MT5与MT4代码中的一些样本或给我一些类似情况的指标链接。


1.

if(Period()<=PERIOD_H4 && TimeHour(Time[h])==0 && TimeMinute(Time[h])==0)


2.

while(A<1)
  {
   ObjectDelete("MB");
   OP=iOpen(NULL,Timeframe,br);
   CL=iClose(NULL,Timeframe,br);
 if(OP>CL)
   bear=(OP-CL)/_Point;
 if(SizeCandles*FactorCandleы <= bear)
   A=2;
 if(br>iBars(NULL,Timeframe))
  {
   Lab("MB", " No Bear candle", 4, 510, 1, clrWhite);
   break;
  }
   br++;
  }


3.我不明白如何用iMa手柄做元素对比...我知道结构!!!。试过了,但MT5不象MT4那样清晰...

   
 for(int i=limit; i>0 && !IsStopped(); i--)
   {
   ma1=iMA(NULL,Period(),Ma1,0,MAMethod1,MAPrice1,i);
   ma2=iMA(NULL,Period(),Ma2,0,MAMethod2,MAPrice2,i);
   ma3=iMA(NULL,Period(),Ma3,0,MAMethod3,MAPrice3,i);
   ma4=iMA(NULL,Period(),Ma4,0,MAMethod4,MAPrice4,i);
   MA=iMA(NULL,Period(),MAPeriod,0,MAMethod,MAPrice,i);
//----
 if(filtercase==true && xPer==Period())
  {
//--- High signal
 if(Open[i]<Close[i] && MA>Open[i] && MA<Close[i] && ma1>ma2 && ma1<ma3 && MA<ma4)  
   ExtLineBuffer1[i]=High[i]+shiftmap*_Point;
 if(ShowPeriod==false && xPeriod==Period())
   ExtLineBuffer1[i]=0.0;
//--- Low signal
 if(Open[i]>Close[i] && MA<Open[i] && MA>Close[i] && ma1<ma2 && ma1>ma3 && MA>ma4)  
   ExtLineBuffer2[i]=Low[i]-shiftmap*_Point;
 if(ShowPeriod==false && xPeriod==Period())
   ExtLineBuffer2[i]=0.0;
  } 
 

在MT5中编程的一般差异已经被理解了!但我还不会编程(骰子不加)))))

对我来说,在头脑中倾听MT5的这些部分和模块很重要....。我在MT4中很快就理解了逻辑,但MT5只有 "dice"....

谢谢你的提示))))。

 
请将我的机器人的固定手数改为%手数。代码在我的私人信息中。
 
Sprut112:
请将我的机器人的固定手数改为%手数。私下里的代码。

自由职业者

 
kopeyka2:

(祝大家下午好))。


我已经掌握了MT4,但MT5 .... 我不明白((())没有很多例子,那些例子也没有解释我需要的东西。

请告知如何使用MT5与MT4代码中的一些样本或给我一些类似情况的指标链接。


1.


2.


3.我不明白如何用iMa手柄做元素对比...我知道结构!!!。试过了,但MT5不象MT4那样清晰...

在MT5中编程的一般差异已经被理解了!但我还不会编程(骰子不加)))))

对我来说,在头脑中倾听MT5的这些部分和模块很重要....。我在MT4中很快就理解了逻辑,但MT5只有 "dice"....

谢谢你的提示))))。

首先,仔细阅读文件。"获取时间序列和指标"一节。

应该清楚如何获得时间,将其 "放入 "结构中,然后分别获得小时和分钟。

还有CopyBuffer可以通过其句柄获得指标值。

如果你仍然有问题...


 
kopeyka2:

(祝大家下午好))。


我已经掌握了MT4,但MT5 .... 我不明白((())没有很多例子,那些例子也没有解释我需要的东西。

请告知如何使用MT5与MT4代码中的一些样本或给我一些类似情况的指标链接。


1.


2.


3.我不明白如何用iMa手柄做元素对比...我知道结构!!!。试过了,但MT5不象MT4那样清晰...

在MT5中编程的一般差异已经被理解了!但我还不会编程(骰子不加)))))

对我来说,在头脑中倾听MT5的这些部分和模块很重要....。在MT4中,我很快就理解了这个逻辑,但MT5只有 "立方体"....

谢谢你的提示))))。

如果你需要比较一个时间框架的几个时间序列,可以使用一个数组,如MqlRates->,并使用CopyRates来填充这个数组

将时间存储在MqlDateTime 结构中是很方便的--使用TimeToStruct 将时间从数据时间 转换为MqlDateTime 结构。

现在你的例子1将看起来像这样。

//+------------------------------------------------------------------+
//|                                                      Test_en.mq5 |
//+------------------------------------------------------------------+
#property script_show_inputs
//--- input parameters
int InpBarTime=3; // Bar where we compare the time
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   MqlRates rates[];
   ArraySetAsSeries(rates,true);

   int start_pos  =0;                           // start position 
   int count=(InpBarTime<10)?10:InpBarTime+1;   // data count to copy 

   int result=CopyRates(Symbol(),Period(),start_pos,count,rates);
   if(result!=count)
     {
      Print("Ordered: ",IntegerToString(count),", received ",IntegerToString(result));
     }

//--- example 1
// if(Period()<=PERIOD_H4 && TimeHour(Time[h])==0 && TimeMinute(Time[h])==0)
   MqlDateTime SDateTime;
   TimeToStruct(rates[InpBarTime].time,SDateTime); // Converts a value of datetime type into a structure variable MqlDateTime
   if(Period()<=PERIOD_H4 && SDateTime.hour==0 && SDateTime.min==0)
     {

     }
  }
//+------------------------------------------------------------------+
附加的文件:
Test_en.mq5  3 kb
 
请告诉我是否有这样的规定。
在mql5中,一个同样的任务可以用多种方式解决。
如果我在一段代码中引用一个类的实例,比如说。CSymbolInfo. m_symbol.Ask()...等等。
而在同一段代码中,我分配了一个Ask值,而没有引用到类。
double Ask=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits)。

问题:这是否会导致错误或在一个代码甚至一个函数的范围内是正常的?

 
kopeyka2:

(祝大家下午好))。


我已经掌握了MT4,但MT5 .... 我不明白((())没有很多例子,那些例子也没有解释我需要的东西。

请告知如何使用MT5与MT4代码中的一些样本或给我一些类似情况的指标链接。


1.


2.


3.我不明白如何用iMa手柄做元素对比...我知道结构!!!。试过了,但MT5不象MT4那样清晰...

在MT5中编程的一般差异已经被理解了!但我还不会编程(骰子不加)))))

对我来说,在头脑中倾听MT5的这些部分和模块很重要....。在MT4中,我很快就理解了这个逻辑,但MT5只有 "立方体"....

谢谢你的提示))))。

使用指标工作--以MA Force 代码为例

第1步:在全局程序层面上声明变量handle_iMA,它将存储指示器手柄。

int    handle_iMA;                           // variable for storing the handle of the iMA indicator

第二步:在OnInit()中创建一个指标,并返回handle_iMA 变量。

//--- create handle of the indicator iMA
   handle_iMA=iMA(m_symbol.Name(),Inp_MA_period,Inp_MA_ma_period,Inp_MA_ma_shift,
                  Inp_MA_ma_method,Inp_MA_applied_price);
//--- if the handle is not created 
   if(handle_iMA==INVALID_HANDLE)
     {
      //--- tell about the failure and output the error code 
      PrintFormat("Failed to create handle of the iMA indicator for the symbol %s/%s, error code %d",
                  m_symbol.Name(),
                  EnumToString(Inp_MA_period),
                  GetLastError());
      //--- the indicator is stopped early 
      return(INIT_FAILED);
     }

第3步:在OnTick()中提出请求--从指标中复制一定数量的数据(计数)到ma[] 数组中。

   double ma[],force[];
   ArraySetAsSeries(ma,true);
   ArraySetAsSeries(force,true);
   int start_pos=0,count=InpTrendBars+3;
   if(!iGetArray(handle_iMA,0,start_pos,count,ma) || 
      !iGetArray(handle_iForce,0,start_pos,count,force))
     {
      PrevBars=0;
      return;
     }

第4步:与指标数据数组合作,比较其元素。

   bool trend_up=(ma[1]>ma[2]);
   bool trend_down=(ma[1]<ma[2]);
 
vladzeit:
请告诉我是否有这样的规定。
在mql5中,一个同样的任务可以用多种方式解决。
如果我在一段代码中引用一个类的实例,比如说。CSymbolInfo. m_symbol.Ask()...等等。
而在同一段代码中,我分配了一个Ask值,而没有引用到类。
double Ask=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits)。

问题:这是否会导致错误或在一个代码甚至一个函数的范围内是正常的?

最好不要混淆,使用一种方法:要么交易类CSymbolInfo,要么系统函数,如SymbolInfoXXXX。