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

 
novichok2018:

该信息仍然在第12分钟出现。

插入打印,在数组被填充 的函数的开始部分

Print("Range = ", ArrayRange(NewsArr,1));

并显示第二维度上的数值数量

 
Ilya Prozumentov:

我从一切可以看出,NomNews进入While循环时已经处于大于999的状态。那么你需要找出它发生的原因,并在某处重置这个变量。

要检查这一点,请将其写在循环的开头。

是的,在第11分钟,印刷品是1000。

 
Alekseu Fedotov:

插入打印,在数组被填充 的函数的开始部分

并显示第二维度上的数值数量

我在While循环的 开头插入了它,得到了无限的Range = 1000。 我是不是在错误的地方插入了它?

这个数字(或函数)是什么?: datetime TimeNewsFunck(int nomf)

{

string s=NewsArr[0][nomf]。

string time=StringConcatenate(StringSubstr(s,0,4),".",StringSubstr(s,5,2),".",StringSubstr(s,8,2)," ",StringSubstr(s,11,2),":",StringSubstr(s,14,4) )。

return((datetime)(StringToTime(time)+GMTplus*3600))

}

那么它从哪里得到int nomf的值呢?我找不到它。

 
novichok2018:

我把它插在While循环的 开头,得到了无限的Range = 1000。 我把它放在了错误的地方吗?

这个数字(或函数)是什么?: datetime TimeNewsFunck(int nomf)

{

string s=NewsArr[0][nomf]。

string time=StringConcatenate(StringSubstr(s,0,4),".",StringSubstr(s,5,2),".",StringSubstr(s,8,2)," ",StringSubstr(s,11,2),":",StringSubstr(s,14,4) )。

return((datetime)(StringToTime(time)+GMTplus*3600))

}

那么它从哪里得到int nomf的值呢?我还没有找到。

再有就是我尝试过但没能发现的功能。它可能是问题的根源吗?

bool CheckInvestingNews(int &pwr,datetime &mintime)
  {

   bool CheckNews=false; pwr=0; int maxPower=0;
   if(MidleNews || HighNews)
     {
      if(TimeCurrent()-LastUpd>=Upd){Print("Investing.com News Loading...");UpdateNews();LastUpd=TimeCurrent();Comment("");}
      WindowRedraw();
      //---Draw a line on the chart news--------------------------------------------
      if(DrawNewsLines)
        {
         for(int i=0;i<NomNews;i++)
           {
            string Name=StringSubstr("NS_"+TimeToStr(TimeNewsFunck(i),TIME_MINUTES)+"_"+NewsArr[1][i]+"_"+NewsArr[3][i],0,63);
            if(NewsArr[3][i]!="")if(ObjectFind(Name)==0)continue;
            if(OnlySymbolNews && StringFind(ValStr,NewsArr[1][i])<0)continue;
            if(TimeNewsFunck(i)<TimeCurrent() && Next)continue;

            color clrf=clrNONE;
            if(HighNews && StringFind(NewsArr[2][i],"High")>=0)clrf=HighColor;
            if(MidleNews && StringFind(NewsArr[2][i],"Moderate")>=0)clrf=MidleColor;
   //         if(LowNews && StringFind(NewsArr[2][i],"Low")>=0)clrf=LowColor;

            if(clrf==clrNONE)continue;

            if(NewsArr[3][i]!="")
              {
               ObjectCreate(0,Name,OBJ_VLINE,0,TimeNewsFunck(i),0);
               ObjectSet(Name,OBJPROP_COLOR,clrf);
               ObjectSet(Name,OBJPROP_STYLE,LineStyle);
               ObjectSetInteger(0,Name,OBJPROP_WIDTH,LineWidth);
               ObjectSetInteger(0,Name,OBJPROP_BACK,true);
              }
           }
        }
      //---------------event Processing------------------------------------
      int ii;
      for(ii=0;ii<NomNews;ii++)
        {
         int power=0;
         if(HighNews && StringFind(NewsArr[2][ii],"High")>=0){ power=3; MinBefore=HighIndentBefore; MinAfter=HighIndentAfter; }
         if(MidleNews && StringFind(NewsArr[2][ii],"Moderate")>=0){ power=2; MinBefore=MidleIndentBefore; MinAfter=MidleIndentAfter; }
 //        if(LowNews && StringFind(NewsArr[2][ii],"Low")>=0){ power=1; MinBefore=LowIndentBefore; MinAfter=LowIndentAfter; }
         if(NFPNews && StringFind(NewsArr[3][ii],"Nonfarm Payrolls")>=0){ power=4; MinBefore=NFPIndentBefore; MinAfter=NFPIndentAfter; }
         if(power==0)continue;

         if(TimeCurrent()+MinBefore*60>TimeNewsFunck(ii) && TimeCurrent()-MinAfter*60<TimeNewsFunck(ii) && (!OnlySymbolNews || (OnlySymbolNews && StringFind(ValStr,NewsArr[1][ii])>=0)))
           {
            if(power>maxPower){   maxPower=power; mintime=TimeNewsFunck(ii); }
              }else{
            CheckNews=false;
           }
        }
      if(maxPower>0){ CheckNews=true; oppoz=true; }
     }
   pwr=maxPower; 
   return(CheckNews);
  }
 
novichok2018:

然后有一个功能,无论我怎么努力,都没能弄明白。也许这就是问题所在?

只有作者自己会弄清楚。你最好从OnTick()发送代码

 
novichok2018:

是的,在第11分钟,它发出了印刷品1000。

尝试更换

while(!IsStopped())

用这句话。

while(NomNews<300 && !IsStopped())
 
Ilya Prozumentov:

公式中超过((2*psd*usd)*((2*psd*usd)-C))/(C-1))

指数化:^0.5不是*0.5

如果没有一个通过符号和majik看的交易,或没有一个利润或损失,或只有一个对(C=1),我们将得到除以0。

在公式本身之前,你应该检查psd和usd是否>0,并且C !=1。

盈利对的计算是盈利>1,亏损<1,盈利=1的不做分析,即1也要包含在这个或那个组的某个地方。

在你的函数中,最好首先选择与符号和魔法号码相匹配的交易号码,然后检查它们的号码是否有变化,如果有--重新计算zn,如果没有--返回zn(zn在这种情况下不归零,打印时不需要检查!=0)。

Owl停止工作,因为它依赖于变量ww和nn,而当你的函数工作时,它们会改变并破坏owl的算法。

如果有一个代码设计错误,就不会有任何东西被编译。

我只能说谢谢你。这是runet中唯一一个他们帮助我的地方。

现在,打印机生成以下 "Stop_Ma_v_5.1 EURUSD,M15: == Z-count equals = -nan(ind)" 。你能不能告诉我这是什么意思,代码应该返回这个数字?

代码 :

//+------------------------------------------------------------------+
//| Подсчёт z-вероятности. @axe44 Алексей Корольков                  |
//+------------------------------------------------------------------+
  
double Z()
  {
    zn=0;          // z-число
    psd=0;         // кол. положительных сделок
    usd=0;         // количество отрицательных сделок 
    www=0;         // боол переменная 
    nnn=0;         // боол переменная
    kolichestvo=0; // подсчёт закрытых ордеров открытых роботом
    C=0;          // C = количество чередований между отрицательными и положительными сделками
    index=OrdersHistoryTotal(); 
      if(OrdersHistoryTotal()>302) index=301; // берём не более 301 сделки
    //if(index<30) return(0);                 // берём не менее 30
    count=OrdersHistoryTotal();             // считаем от скольки 
    prom=count-index;                       // выделяем только последние сделки
    if (prom<0) prom=0;                     // исключаем ошибки
  
   for( i=prom;i<=count;i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {// далее магия
           pribul=OrderProfit(); 
           if (ww==0&&pribul>1){C++;www=1;nnn=0;}// подсчитываем смену тенденции
           if (nn==0&&pribul<1){C++;www=0;nnn=1;}// подсчитываем смену тенденции 
           if (pribul>1){psd++;}//прибыльные сделки
           if (pribul<1){usd++;}// убыточные сделки
           kolichestvo++;
           }
        }
     }
    /*
Величина Z = (A * (C — 0.5) — B)/   ((B*(B — C))/(C -1))^(1/2), где:
A = количество анализируемых сделок;
B = 2*количество прибыльных сделок * количество убыточных сделок;
C = количество чередований в выборке (чередованием считается каждая пара сделок, 
когда прибыльная сделка сменяет убыточную либо наоборот).
          */ 
            
            if(kolichestvo>30&&psd>0&&usd>0&&C!=1)
            zn=(index*(C-0.5)-2*psd*usd)  /  pow(((2*psd*usd*(2*psd*usd-C))/(C-1)),0.5);
      
     
     
   return(zn);
  }
谢谢你
 
aleksandr bebishev:

Mql5的朋友们,你们能帮我在对冲账户中提出平仓 的请求吗?情况:开了 买入头寸,我们需要用卖出限价来关闭它。问题:我怎样才能正确地写一个请求,准确地关闭所选择的头寸,而不是开新的卖出锁定买入?请写一段带注释的代码!提前感谢您!

由同一符号的一个未平仓订单关闭另一个未平仓订单,但方向相反。

顺序关闭(OrderCloseBy)
intticket,// 要关闭的订单的数量
intopposite,//相反顺序的数字
colorarrow_color// color
);

参数

门票

[in] 要关闭的订单的唯一订单号。

相反地

[一个相反顺序的唯一序列号。

箭头_颜色

[图表上收盘箭头的颜色。如果该参数不存在或其值为CLR_NONE,则箭头不在图表中显示。

返回的值

如果函数成功,返回true;如果有错误,返回false。要获得错误信息,请调用GetLastError()。

例子。

如果(iRSI(NULL,0,14,PRICE_CLOSE,0)>75)
{
OrderCloseBy(order_id,opposite_id;)
return(0);
}

P.S. 本线程只解析MQL4

 
Aliaksei Karalkou:

我只能说谢谢你。这是runet的唯一地方,他们在那里提供了帮助。

现在,打印机生成了 "Stop_Ma_v_5.1 EURUSD,M15: ==Z-Account Equals = -nan(ind)"。你能不能告诉我这是什么意思,代码应该返回这个数字?

代码 :

谢谢你
Nan - NaN - 不是一个数字 - 不是一个数字。试着 Z计算中的数字正常化
 
Aliaksei Karalkou:

一个未平仓的订单被同一工具的另一个未平仓订单关闭,但方向相反。

boolOrderCloseBy(
intticket,// 要关闭的订单的数量
intopposite,//相反顺序的数字
colorarrow_color// color
);

参数

门票

[被关闭的订单的唯一序列号。

相反地

[一个相反顺序的唯一序列号。

箭头_颜色

[图表上收盘箭头的颜色。如果该参数缺失或其值为CLR_NONE,图表中就不会显示箭头。

返回的值

如果函数成功,返回true;如果有错误,返回false。要获得错误信息,请调用GetLastError()。

例子。

如果(iRSI(NULL,0,14,PRICE_CLOSE,0)>75)
{
OrderCloseBy(order_id,opposite_id;)
return(0);
}

P.S. 本线程只解析MQL4

不,任何关于mql4以及mal5的问题都在本线程中处理,因为主要目的是不仅在算法和代码方面提供帮助,而且促进从mql4迁移到mql5。