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

 
lil_lil:

我一次关闭4个头寸,如何在计算损失的功能中把它们算作一个连续的头寸?

由于滑移,它们可能会以相同的价格收盘,时间也可能不同。

审判。

如果经纪人允许反击平仓,我们应该开一个反击订单,其数量等于累计平仓订单的数量,以确定收盘价。然后收盘价就固定了,你可以悠闲地执行4笔交易,关闭相反的订单。

 

你能告诉我如何确定保证金的计算方式吗?

一些经纪商对每个头寸收取保证金。而有些经纪人,只在买入和卖出的数量上有差异。(即,如果账户是全额锁定,那么保证金为零)


如何以编程方式确定保证金的计算方法?

 

你好。我正在寻找MA之上的分形。

在寻找MA之上的分形时,我记住了一个条形,然后从这个条形中寻找分形,如果它小于我找到的第一个分形,那么就是真的

在评论中不断虚假

Comment(f_ma(Symbol(),0,i));
//+----------------------------------------------------------------------------+

bool f_ma(string sy="0",int tf=0,int nf=0) 
  {
   if(sy=="" || sy=="0") sy=Symbol();
   double f=0,MA=0,fr1,fr2;
   int    d=MarketInfo(sy,MODE_DIGITS),s;
   if(d==0) if(StringFind(sy,"JPY")<0) d=4; else d=2;
   int    i,k=iBars(sy,tf),kf,num_bar;

   for(i=nf+2; i<k; i++) 
     {
      f=iFractals(sy,tf,MODE_UPPER,i);
      MA=iMA(NULL,0,35,0,MODE_EMA,PRICE_CLOSE,i);
      if(f!=0) 
        {
        // kf++;
         if(f>MA) {num_bar=i; fr1=NormalizeDouble(f, d);continue;}
         
        }
     }
     //
      for(i=nf+ num_bar; i<k; i++) 
     {
      f=iFractals(sy,tf,MODE_UPPER,i);
      if(f!=0) 
        {
        fr2=NormalizeDouble(f, d);
        if(fr2<fr1) return(true);
        }
     }
     
     
   return(false);
  }
 
Ghabo:

你好。我正在寻找MA之上的分形。

在寻找MA之上的分形时,我记住了一个条形,然后从这个条形中寻找分形,如果它小于我找到的第一个分形,那么就是真的

在评论中不断虚假

问题出在这一行

         if(f>MA) {num_bar=i; fr1=NormalizeDouble(f, d);continue;}


如果发现一个分形,并且它在MA之上,我们应该中断周期而不是继续它。在找到第一个分形之后,还会有另一个分形和第三个分形,以此类推。

 
Alexey Viktorov:

问题出在这一行


如果发现一个分形,并且它在MA之上,我们应该中断周期而不是继续它。在找到第一个分形之后,还会有另一个分形和第三个分形,以此类推。

谢谢你。替换为break;现在它总是真的。但条件if(fr2<fr1) 不满足。
 
Ghabo:
谢谢你。替换为break;现在它总是真的。但条件if(fr2<fr1) 不满足。

所以我们必须在显示函数的结果之前添加这个条件。这有什么难的?

 
Alexey Viktorov:

所以你必须在函数输出结果之前添加这个条件。这有什么难的?

如果不满足条件,该函数不是应该返回false吗?

#property strict
#property indicator_chart_window
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
if(rates_total<100) return(0);
int limit=rates_total-prev_calculated;
if(limit>200)limit=200;
   for(int i=limit; i>0; i--)
     {
     
     
     Comment(f_ma(Symbol(),0,i));
     }
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
  //-------------------
  bool f_ma(string sy="0",int tf=0,int nf=0) 
  {
   if(sy=="" || sy=="0") sy=Symbol();
   double f=0,MA=0,fr1,fr2;
   int    d=MarketInfo(sy,MODE_DIGITS),s;
   if(d==0) if(StringFind(sy,"JPY")<0) d=4; else d=2;
   int    i,k=iBars(sy,tf),kf,num_bar;

   for(i=nf+2; i<k; i++) 
     {
      f=iFractals(sy,tf,MODE_UPPER,i);
      MA=iMA(NULL,0,35,0,MODE_EMA,PRICE_CLOSE,i);
      if(f!=0) 
        {
        // kf++;
         if(f>MA) {num_bar=i; fr1=NormalizeDouble(f, d);break;}
         
        }
     }
     //
      for(i=nf+ num_bar; i<k; i++) 
     {
      f=iFractals(sy,tf,MODE_UPPER,i);
      if(f!=0) 
        {
        fr2=NormalizeDouble(f, d);
        if(fr2<fr1) return(true);
        }
     }
     
     
   return(false);
  }
  
 
Ghabo:

如果不满足条件,该函数不是应该返回false吗?

检查iFractals是否返回0或空值。

 
Alexey Viktorov:

检查iFractals是否返回0或空值。

数据窗口 里有一个空值。用if(f!=EMPTY_VALUE)替换了if(f!=0),结果没有变化。
 
Ghabo:
数据窗口 里有一个空值。用if(f!=EMPTY_VALUE)替换了if(f!=0),结果没有变化。

1.我说的是检查,而不是更换。如果没有分形,iFractals返回0。我不经常使用它,自然也不会用这种琐事来堵塞未干的记忆残片。

2.这个函数虽然写得很糟糕,但仍能正常工作。

3.最后一个值显示在注释中。将其替换为

     Print("************ ", f_ma(Symbol(), 0, 0));
看看它打印了多少次
2018.07.30 21:02:43.656 00 EURUSD.e,H1: ************ true
原因: