新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 627

 
Sergey Likho:

你能告诉我如何计算一项交易的抵押品吗?


尝试了两种方法

(0.1 * Ask*MarketInfo(Symbol(),MODE_LOTSIZE))/AccountInfoInteger(ACCOUNT_LEVERAGE)


而这个人

FreeMarginCheck=AccountFreeMarginCheck(Symbol(),OP_BUY,0.1);

 double val=AccountFreeMargin()-FreeMarginCheck;



如果我的存款货币是 美元,第一种在欧元兑日元上给出了奇怪的结果。我是否需要在配方中添加一些东西?

第二个也只起作用一次,有时它给出正确的值,有时它给出一些废话(这取决于存款)。

第二种变体是计算定金的正确方法。 更确切地说,变量val显示的是下单后自由资金的价值,变量FreeMarginCheck显示的是定金本身的价值

 
Igor Makanu:

第二个选项是计算保证金的正确方法,或者说你在下单后在val变量中得到自由资金的价值,而变量FreeMarginCheck是保证金本身的价值

你确定吗?

帐户自由边际检查

返回在当前账户中以当前价格打开指定订单后剩余的 自由资金数额。


那里也有一种微妙的东西。

如果柜台交易是开放的,即账户上有一个完整或不完整的锁,该函数可能会给出不正确的值。


 
Sergey Likho:

你确定吗?

是的,你是对的,这完全正确。

返回当前账户中以当前价格打开指定订单后剩余的 自由资金数额

关于未平仓的交易,你需要检查,我不记得了,但很可能是终端写的,应该与计算的数据一致:所有符号的每个方向的交易(买入/卖出)的总手数,然后调用每个符号

AccountFreeMarginCheck()在每个方向传递手数,并将这些结果相加。

今天的市场正在运作,很容易检查,就像这样

#property strict
//+------------------------------------------------------------------+
void OnStart()
  {
   int i,ot,k=OrdersTotal();
   double lot_buy=0.0,lot_sell=0.0;
   string sy=Symbol();
   for(i=0; i<k; i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         ot=OrderType();
         if(OrderSymbol()==sy)
           {
            if(ot==OP_BUY)  lot_buy+=OrderLots();
            if(ot==OP_SELL) lot_sell+=OrderLots();
           }
        }
     }
   double MarginBUY  = AccountFreeMargin()-AccountFreeMarginCheck(sy,OP_BUY,lot_buy);
   double MarginSELL = AccountFreeMargin()-AccountFreeMarginCheck(sy,OP_SELL,lot_sell);
   double MarginALL = MarginBUY+MarginSELL;
   Print("Залог BUY = ",MarginBUY);
   Print("Залог SELL = ",MarginSELL);
   Print("Залог ALL = ",MarginALL);
  }
 

问候,你能告诉我这个功能有什么问题吗?该函数按时间执行交易暂停,参数为暂停开始和暂停结束。
该函数不是从经纪人的服务器上读取时间,而是从计算机上读取时间,尽管TimeCurrent 是规定的。一般来说,交易在暂停期间被关闭,即该功能不工作。

input  bool        p                 = true;    // Trading pause on/off
input  string      TimeStart         = "23:59"; // Start pause
input  string      TimeEnd           = "06:15"; // End of pause


int start() {

   //+----------------------------------------------------------------------------+
   datetime StartPause,EndPause;
   // ---
   StartPause = StrToTime(TimeStart);
   EndPause   = StrToTime(TimeEnd);
   // ---
   if((p && StartPause > EndPause && (TimeCurrent() > StartPause || TimeCurrent() < EndPause)))
   {
     Print(" Pause the EA ");
     return(0);
   }
   //+----------------------------------------------------------------------------+
 
Anatolij Anufriev:

问候,你能告诉我这个功能有什么问题吗?该函数按时间执行交易暂停,参数为暂停开始和暂停结束。
该函数不是从经纪人的服务器上读取时间,而是从计算机上读取时间,尽管TimeCurrent是规定的。一般来说,交易在暂停期间被关闭,这意味着该功能不工作。

取消打印TimeStart和StrToTime(TimeStart)。

然后取消打印TimeCurrent()。

你的TimeStart不是完整的日期时间格式,也就是说,当你运行EA时,时间永远是当前的日、月、年,然后它就会改变?

而在全球范围内......确定交易 小时 和分钟应 与小时和分钟 的服务器时间相比较,你只比较服务器时间比指定时间长的事实。

SZZ:为了避免混淆,你可以把datetime看作是一个int,它就是一个int,比较2个datetime,你就是在比较2个int

浦发银行。

if((p && StartPause > EndPause && (TimeCurrent() > StartPause || TimeCurrent() < EndPause)))

你的代码可能会工作,你应该这样试试。

if((p && StartPause > EndPause && (TimeCurrent() > StartPause && TimeCurrent() < EndPause)))


我通常这样计算时间。

int h = TimeHour(TimeCurrent())。

int m = TimeMinute(TimeCurrent())。

然后将其与EA的设置 进行比较

 
Igor Makanu:

谢谢,我会努力解决的,我只是个初学者),用&&选项代替||我还没有在网上试过,顺便说一下,在测试器中,这段代码是有效的,它从终端读取时间,在暂停期间没有关闭订单,但在网上则不同。

 

你好!在策略测试器中,终端无法启动。我设置了日期,例如(2017,04,01至2018,05,29),按开始,它立即给出了一个停止。在日志中,它说了以下内容。

TestGenerator:从2017.04.01到2018.05.29没有历史数据'EURUSD30'。 等任何一段。我的电脑在工作,我以为它可能没有足够的内存。在家里的电脑上也是如此,重启没有帮助,但可以运行一段时间。我已经从市场上下载了专家顾问,试用。如果有人知道原因,请告知?


 
danil77783:

你好!在策略测试器中,终端无法启动。我设置了日期,例如(2017,04,01至2018,05,29),按开始,它立即给出一个停止。在日志中,它说了以下内容。

TestGenerator:从2017.04.01到2018.05.29没有历史数据'EURUSD30'。 等任何一段。我的电脑在工作,我以为它可能没有足够的内存。在家里的电脑上也是如此,重启没有帮助,但可以运行一段时间。我已经从市场上下载了专家顾问,试用。如果我有什么想法,能否请您给我一个提示?


我认为测试者说没有历史数据,按F2下载历史数据,然后重新启动终端

 
danil77783:

你好!在策略测试器中,终端无法启动。我设置了日期,例如(2017,04,01至2018,05,29),按开始,它立即给出了一个停止。在日志中,它说了以下内容。

TestGenerator:从2017.04.01到2018.05.29没有历史数据'EURUSD30'。 等任何一段。我的电脑在工作,我以为它可能没有足够的内存。在家里的电脑上也是如此,重启没有帮助,但可以运行一段时间。我已经从市场上下载了专家顾问,试用。如果我知道原因,请告知?


没有历史数据 意味着什么吗?

 
Igor Makanu:

我想测试者是在告诉你没有历史数据,按F2下载历史数据,然后重新加载终端

谢谢你!我将试一试。更新终端 是否对它有任何影响?无论它是否更新,尽管它自己会告诉你......。