初学者的问题 MQL4 MT4 MetaTrader 4 - 页 133

 
Aliaksandr Kryvanos:

你好!

谁能建议一个类似于MT5中的MaxLotCheck()的替换方法,用于MT4,谢谢

没有任何功能本身。你必须写你自己的。加上所有的检查,它应该适合于10-20行。

 
Ihor Herasko:

没有任何功能本身。你必须写你自己的。加上所有的检查,它应该适合于10-20行。

好的,但公式本身呢?

 
Aliaksandr Kryvanos:

好吧,但这里的公式本身呢?

让我们来看看来源。

//+------------------------------------------------------------------+
//| Access functions OrderCalcMargin(...).                           |
//| INPUT:  name            - symbol name,                           |
//|         trade_operation - trade operation,                       |
//|         price           - price of the opening position,         |
//|         percent         - percent of available margin [1-100%].   |
//+------------------------------------------------------------------+
double CAccountInfo::MaxLotCheck(const string symbol,const ENUM_ORDER_TYPE trade_operation,
                                 const double price,const double percent) const
  {
   double margin=0.0;
//--- checks
   if(symbol=="" || price<=0.0 || percent<1 || percent>100)
     {
      Print("CAccountInfo::MaxLotCheck invalid parameters");
      return(0.0);
     }
//--- calculate margin requirements for 1 lot
   if(!OrderCalcMargin(trade_operation,symbol,1.0,price,margin) || margin<0.0)
     {
      Print("CAccountInfo::MaxLotCheck margin calculation failed");
      return(0.0);
     }
//---
   if(margin==0.0) // for pending orders
      return(SymbolInfoDouble(symbol,SYMBOL_VOLUME_MAX));
//--- calculate maximum volume
   double volume=NormalizeDouble(FreeMargin()*percent/100.0/margin,2);
//--- normalize and check limits
   double stepvol=SymbolInfoDouble(symbol,SYMBOL_VOLUME_STEP);
   if(stepvol>0.0)
      volume=stepvol*MathFloor(volume/stepvol);
//---
   double minvol=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MIN);
   if(volume<minvol)
      volume=0.0;
//---
   double maxvol=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MAX);
   if(volume>maxvol)
      volume=maxvol;
//--- return volume
   return(volume);
  }
ENUM_ORDER_TYPE 和OrderCalcMargin需要在此替换。
 
百胜)的来源...谢谢你
 

仍然不清楚....

margin = MarketInfo(Symbol(), MODE_MARGINREQUIRED)

и

double margin;

OrderCalcMargin(ORDER_TYPE_BUY,Symbol(),1.0,SymbolInfoDouble(Symbol(),SYMBOL_ASK),margin);


返回不同的保证金数量以开立1手

 
Aliaksandr Kryvanos:

仍然不清楚....

margin = MarketInfo(Symbol(), MODE_MARGINREQUIRED)

и

double margin;

OrderCalcMargin(ORDER_TYPE_BUY,Symbol(),1.0,SymbolInfoDouble(Symbol(),SYMBOL_ASK),margin);


返回不同的开仓手数的保证金

你们显然是在不同的终端上进行比较))。上面是MT4,下面是MT5。因此,服务器是不同的,交易条件是不同的。最简单的事情是不同的杠杆。

你实际得到了什么,价值是什么?

 

是的,这是正确的,杠杆是不同的,一个是1/300,另一个是1/2000。

谢谢

 

大家好!

我的EA使用多步骤搜索进入点,为此它首先从一开始就检查历史信号,然后实时工作。所以在策略测试器中,历史记录一切正常,但当我实时运行时,它不能正确扫描历史记录,错过了信号,这可能是什么问题?

也许有一个显而易见的答案,因为代码片段相当大,不能在这里公布,所以我还没有给出代码。

 
ArturR:

大家好!

我的EA使用多步骤搜索进入点,为此它首先从一开始就检查历史信号,然后实时工作。所以在策略测试器中,历史记录一切正常,但当我实时运行时,它不能正确扫描历史记录,错过了信号,这可能是什么问题?

也许有一个显而易见的答案,因为代码片段相当大,不能在这里公布,所以我还没有给出代码。

一件一件地进行调试。将历史扫描分离到脚本中。用Alert()输出详细信息:首先是历史中的条数,开始和结束日期,...然后再进行扫描的过程。把它全部写到一个文件中 可能更方便
 
STARIJ:
一步一步地进行调试。将历史扫描分离成一个脚本。使用Alert()输出详细信息:首先,历史上的条数,开始和结束日期,......。然后再进行扫描的过程。把它全部写到一个文件中 可能更方便

谢谢你的提示,我将阅读如何做到这一点。

我还有一个问题,当我运行实时调试时,Metatrader4总是在瑞士法郎上运行,有谁知道该如何调整才能使其在我需要的货币对上运行?

这是其他时间段的指标值,显然在测试器中没有被考虑。我也找到了正确配对的方法。 谢谢你的参与 )