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

 
forexman77:

我在另一个DC上试了一下,似乎还可以。问题是为什么要打电话。

输出0.01,但在机器人上打印出131?

在传递给函数时,需要对这些批次进行归一化处理。

 
Artyom Trishkin:

当批次被转移到职能部门时,需要对其进行规范化处理。


实际上,我写的是我在正常化。自动交易中的手数是有限制的。

你不需要在这里做 "显而易见的船长"。
 
forexman77:

实际上,我写的是我在正常化。在自动交易中,对手数有某种限制。

不要在这里说得那么明显。

好吧,你自己看看吧,如果你想这样交流的话。

 
rabanik:

非常感谢您的答复。

这是整个函数,重点是它打开一个订单,然后通过修改增加恒定的止损和止盈值。

订单被打开,但没有设置止损和止盈(红色的计算函数,其中OrderSelect(Ticket,SELECT_BY_TICKET,MODE_TRADES)给出一个错误(() )

//开单功能,变量:符号、订单类型、手数、开仓价、TP和SL计算方法(0-设置在价格中,1-设置在应从开仓价计算的点数中)、止损、获利)

//Symbol/Pair, open order type - pending, open price, switch = 1, SL B TP - stop loss and take profit values are constant!

bool SendOrder(string Symb,int Type, double OP,int Mode) {
颜色CL。
double Pp = MarketInfo(Symb,MODE_POINT);
如果(Type==0)CL=Blue。
如果(类型==1)CL=红色。
如果(类型==2 ||类型==4)CL=DarkTurquoise。
如果(Type==3 || Type==5)CL=Orange。
//核实数量
如果(MarketInfo(Symb,MODE_LOTSTEP)==0.01) DG=2; 否则 DG=1。
如果(Lot<MarketInfo(Symb,MODE_MINLOT))Lot=MarketInfo(Symb,MODE_MINLOT)。
如果(Lot>MarketInfo(Symb,MODE_MAXLOT))Lot=MarketInfo(Symb,MODE_MAXLOT)。
如果(Lot*MarketInfo(Symb,MODE_MARGINREQUIRED)>AccountEquity()){
PnC(StringConcatenate("Not enough money to open trade",Type," volume: " ,DoubleToStr(Lot,DG)),0)。
返回。
}
// 检查未决订单
/*
double Slv = MarketInfo(Symb,MODE_STOPLEVEL)*Pp;
如果(类型>1) {
如果(Type==2 &&MarketInfo(Symb,MODE_ASK)-OP<Slv) OP=MarketInfo(Symb,MODE_ASK)-Slv;
如果(Type==3 && OP-MarketInfo(Symb,MODE_BID)<Slv) OP=MarketInfo(Symb,MODE_BID)+Slv;
如果(Type==4 && OP-MarketInfo(Symb,MODE_ASK)<Slv) OP=MarketInfo(Symb,MODE_ASK)+Slv;
if (Type==5 && MarketInfo(Symb,MODE_BID)-OP<Slv) OP=MarketInfo(Symb,MODE_BID)-Slv;
}
*/
RefreshRates()。
int Min_Dist = MarketInfo(Symb,MODE_STOPLEVEL); //限制止损/止盈水平,单位为点。最小距离
double Tek_Ask = MarketInfo(Symb,MODE_ASK); //最后收到的交易价格。它被存储在预定义的变量Ask中,用于当前的符号
double Tek_Bid = MarketInfo(Symb,MODE_BID); //最后收到的投标价格。它被存储在当前符号的预定义变量Bid中
double Tek_Point = MarketInfo(Symb,MODE_POINT); //以报价货币计算的点数大小。它被存储在当前符号的预定义变量Point中。
int Tek_Digits = MarketInfo(Symb,MODE_DIGITS);//符号价格中小数点后的数字。对于当前符号,它被存储在预定义的变量Digits中。

double Slv = NormalizeDouble(Min_Dist*Tek_Point,Tek_Digits);
如果(类型>1) {
如果(Type==2 && Tek_Ask - OP < Slv) OP = Tek_Ask - Slv;
如果(Type==3 && OP - Tek_Bid < Slv) OP = Tek_Bid + Slv;
如果(Type==4 && OP - Tek_Ask < Slv) OP = Tek_Ask + Slv;
如果(Type==5 && Tek_Bid - OP < Slv) OP = Tek_Bid - Slv;
}
// 检查停止
如果(SL!=0 || TP!=0) {
如果(Mode==0){
如果(MathAbs(OP-SL)<Slv && SL!=0) {
如果(Type==0 || Type==2 || Type==4)SL=OP-Slv;否则SL=OP+Slv。
}
如果(MathAbs(OP-TP)<Slv && TP!=0) {
如果(Type==0 || Type==2 || Type==4)TP=OP+Slv;否则TP=OP-Slv。
}
}else{
如果(SL*Pp<Slv && SL!=0)SL=Slv/Pp。
如果(TP*Pp<Slv && TP!=0)TP=Slv/Pp。
}
}
//开场
for(int k=0;k<=TryToTrade;k++) {
如果(Type==0)OP=MarketInfo(Symb,MODE_ASK)。
如果(Type==1)OP=MarketInfo(Symb,MODE_BID)。
PnC(StringConcatenate("Tempted to open an order, type:",Type," volume:",Lot," price:",OP),0)。
如果(IsTradeAllowed()){
int Ticket=OrderSend(Symb,Type,Lot,NormalizeDouble(OP,MarketInfo(Symb,MODE_DIGITS)),3,0,0,NULL,Tek_Magic,0,CL)。
}else{ PnC(StringConcatenate("Cannot open order " ,k),0); Sleep(3000); continue; }
if (Ticket >= 0) { PnC(StringConcatenate("Order opened " ,Ticket),0); break; }
LastError=Fun_Error(GetLastError())。
如果(LastError==0){
RefreshRates(); Sleep(WaitTime);
如果(k==TryToTrade)返回(false); }
如果(LastError==1)返回(false)。
如果(LastError==2) { Work=false; return(false); }
}
//设置止损
OrderSelect(Ticket,SELECT_BY_TICKET,MODE_TRADES);
if (SL==0 && TP==0) return;
if (Mode==1) {
if (SL!=0) {
if (Type==0 || Type==2 || Type==4) SL=OrderOpenPrice()-SL*Pp;
if (Type==1 || Type==3 || Type==5) SL=OrderOpenPrice()+SL*Pp;
}
if (TP!=0) {
if (Type==0 || Type==2 || Type==4) TP=OrderOpenPrice()+TP*Pp;
如果(类型==1 ||类型==3 ||类型==5)TP=OrderOpenPrice()-TP*Pp;
}
}

for(k=0;k<=TryToTrade;k++) {
PnC(StringConcatenate("Trying to set stops on order: " ,Ticket," s/l: " ,SL," t/p: " ,TP),0)。
如果(IsTradeAllowed()){
//TickeT=OrderModify(Ticket,NormalizeDouble(OrderOpenPrice(),MarketInfo(Symb,MODE_DIGITS)),NormalizeDouble(Symb,MarketInfo(Symb,MODE_DIGITS)),NormalizeDouble(TP,MarketInfo(Symb,MODE_DIGITS),0,CLR_NONE) 。)
TickeT=OrderModify(Ticket,NormalizeDouble(OrderOpenPrice(),MarketInfo(Symb,MODE_DIGITS)),NormalizeDouble(SL,MarketInfo(Symb,MODE_DIGITS)),NormalizeDouble(TP,MarketInfo(Symb,MODE_DIGITS),0,CLR_NONE) 。)
}else{ PnC(StringConcatenate("Cannot modify order " ,k),0); Sleep(3000); continue; }
if (TickeT == true) { PnC(StringConcatenate("Order modified ",Ticket),0); break; }
LastError=Fun_Error(GetLastError())。
如果(LastError==0){
RefreshRates(); Sleep(WaitTime);
如果(k==TryToTrade)返回(false); }
如果(LastError==1)返回(false)。
如果(LastError==2) { Work=false; return(false); }
}
return(true)。

}

现在,下一个错误的行如果(Type==0 || Type==2 || Type==4)SL=OrderOpenPrice()-SL*Pp;。 OrderOpenPrice()函数返回同样的错误--表达式无法被评估。乱七八糟的!!!。
 
rabanik:
现在这里是下一个错误的行,如果(Type==0 || Type==2 || Type==4)SL=OrderOpenPrice()-SL*Pp;。 OrderOpenPrice()函数返回同样的错误--表达式无法被评估。乱七八糟的!!!。

都整理好了。对不起,我的问题很愚蠢。我有一个int类型的主变量SL。

而我正试图再次获得SL与类型双。但系统返回1。

谢谢。

 

谁能建议如何使EA从某个地方回到它的起点,而不继续执行进一步的操作。

 

你好。问题如下,EA并没有开出卖出交易。你能看一下吗?

 if (Digits==3||Digits==5) {sl=SL*10*Point;}
         else if (Digits==4||Digits==2) {sl=SL*Point;}
            if (OrdersTotal()==0)
              {
                if (Close[1]>TD2)
                OrderSend (Symbol(),OP_BUY,Lot,Ask,10,Ask-sl,0,NULL,Magic,0,clrBlue);
                else if (Close[1]<TD1)
                OrderSend (Symbol(),OP_SELL,Lot,Bid,10,Bid+sl,0,NULL,Magic,0,clrRed);
              }
 
6737998:

谁能建议如何使EA从某个地方回到它的起点,而不继续执行进一步的操作。

Оператор возврата return - Операторы - Основы языка - Справочник MQL4
Оператор возврата return - Операторы - Основы языка - Справочник MQL4
  • docs.mql4.com
Оператор возврата return - Операторы - Основы языка - Справочник MQL4
 
danil77783:

你好。问题如下,EA没有开启卖出交易。你能看一下吗?

什么是TD1,它在哪里被分配了一个值?
 

朋友们,如何正确地摆脱这种局面...该指标从CSV中画出两条水平线(红色--从一天的开始到一天的结束)蓝色--来自过去几天的梁,在不同的价格水平。但也有一些日子,这些水平有相同的价值/价格。在这种情况下,有什么正确的方法可以使线条重合时,显示Ray(Blue),而红线在图表上不可见,但实际存在......也就是说,它是透明的。

现在 - Draw_Level("Red", red, DRAW_NONE, STYLE_SOLID,0); 它停止画线,但从它下面也看不到Ray。谢谢。

原因: