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

 
Alexey Viktorov:

而且不可能有别的。没有一台电脑知道的年份比1970年少。从经纪人的报价中出现的年份开始。

我明白了)谢谢你。
 
Aleksey Vyazmikin:

MT5中的代码

结果。


SZZY:我改变了代码--它来自错误的ME。

我并没有立即理解这个想法。我没有在mql5中做过,我得想办法解决。但你可以在mql4中以如下方式做到这一点。

创建两个额外的缓冲区。

为N个小节设置一个偏移量,用主缓冲区的最后一个值填充这N个小节。

当然,这些额外的缓冲区的索引N+1也要用空值来填充。

 
Alexey Viktorov:

我并没有立即理解这个想法。我没有在mql5中做过,我得想办法解决。但在mql4中,你可以通过以下方式来实现。

创建两个额外的缓冲区。

为它们设置一个N条的偏移量,用主缓冲区的最后一个值来填充这N条。

当然,这些额外的缓冲区的索引N+1充满了空值。


谢谢你的想法--我最初在MT5中是这样做的,然后我优化了它。

总之,凌晨4点就去睡觉了(当然,公开的代码并不完整),但用两个缓冲区做了我想做的事。

问题是,在MT5中,填充是从左到右,而在MT4中是反过来的。ArraySetAsSeries 函数没有帮助--事实上我重写了所有逻辑。

 

下午好,Artem!

我想求助于我对TrExp_Nik版本的重做。我想增加将其转移到收支平衡的可能性。 然而,我有限的编程技能不允许我这样做。我决定使用e-MovingInWL,我试图把它的代码整合到我的EA中,但我不能正确地组合变量,或者我不能正确理解第二个盈亏平衡专家顾问的代码。也许,这不是最佳的变体。我想征求您的意见,如何让它变得更好或更容易。

附加的文件:
 
niktach:

下午好,Artem!

我想求助于我对TrExp_Nik版本的重做。我想增加将其转移到收支平衡的可能性。 然而,我有限的编程技能不允许我这样做。我决定使用e-MovingInWL,我试图将其代码整合到我的EA中,但我不能正确地组合变量,或者说我不能正确理解第二个盈亏平衡专家顾问的代码。也许,这不是最佳的变体。我想征求您的意见,如何改进或简化它。

日子过得不错。你到底想做什么?我只看到两个附加代码。如果你需要有人为你做一切事情,那就是自由职业者 的工作。

如果你想自己做,那就告诉我你到底在做什么,哪里不明白。

 

你好。

有什么方法可以以编程方式获得放置在图表上的 "三角形 "图形对象的属性?我指的是顶点的时间和价格坐标,当交互式地打开属性表格时,它们会显示在 "参数 "标签上。我试图使用ObjectGetInteger 和ObjectGetDouble函数,但它们只能获得一个顶点的数据。

谢谢你。

 
oddball:

你好。

是否有办法以编程方式获取放置在图表上的 "三角形 "图形对象的属性?我指的是顶点的时间和价格坐标,当交互式地打开属性表格时,这些坐标会显示在 "参数 "标签上。我试图使用ObjectGetInteger和ObjectGetDouble函数,但它们只能获得一个顶点的数据。

谢谢你。

是的,你可以。而且思想的方向是正确的。你能告诉我你是如何尝试获取参数的吗?

 
Artyom Trishkin:

当订单通过票据选择时,不需要指定池子 - MODE_TRADES在这里是多余的 - 当通过票据选择时,这个参数被忽略,订单从两个列表中的一个选择 - 从已关闭的列表或从市场头寸列表中选择 - 这取决于头寸 是否已关闭

在根据票据成功选择订单后,为了了解订单是从两个列表中的哪一个中选择出来的,有必要检查平仓时间 - 如果它高于零,那么订单已经被关闭,并从历史订单列表中选择,否则 - 订单仍在市场中。

但是为了了解你哪里有错误,你需要附上代码--给出更多的信息,因为这一行原则上没有错误(除了你没有检查函数的返回结果,你使用了一个修饰符,在这种情况下被忽略了,而且在闭合括号后没有";")。


非常感谢您的答复。

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

订单被打开,但没有设置止损和止盈(红色的计算函数,其中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) {
color CL;
double Pp = MarketInfo(Symb, MODE_POINT);
if (Type==0) CL=Blue;
if (Type==1) CL=Red;
if (Type==2 || Type==4) CL=DarkTurquoise;
if (Type==3 || Type==5) CL=Orange;
//verview volume
if(MarketInfo(Symb, MODE_LOTSTEP)==0.01) DG=2; else DG=1;
if (Lot<MarketInfo(Symb,MODE_MINLOT))Lot=MarketInfo(Symb,MODE_MINLOT);
if (Lot>MarketInfo(Symb,MODE_MAXLOT)Lot=MarketInfo(Symb,MODE_MAXLOT);
if (Lot*MarketInfo(Symb,MODE_MARGINREQUIRED) >AccountEquity(){
PnC(StringConcatenate("Not enough money to open trade",Type," )。",DoubleToStr(Lot,DG)),0);
return;
}
//检查挂单
/*
double Slv = MarketInfo(Symb, MODE_STOPLEVEL)*Pp;
if (Type>1) {
if (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);
if (Type>1) {
if (Type==2 && Tek_Ask - OP < Slv) OP = Tek_Ask - Slv;
如果(类型==3 && OP - Tek_Bid < Slv)OP = Tek_Bid + Slv;
如果(类型==4 && OP - Tek_Ask < Slv)OP = Tek_Ask + Slv
if (Type==5 && Tek_Bid - OP < Slv) OP = Tek_Bid - Slv;
}
// check stops
if (SL!=0 || TP! =0) {
if (Mode==0) {
if (MathAbs(OP-SL)<Slv && SL!=0) {
if (Type==0 || Type==2 || Type==4) SL=OP-Slv; else SL=OP+Slv;
}
if (MathAbs(OP-TP)<Slv && TP!=0) {
if (Type==0 || Type==2 || Type==4) TP=OP+Slv; else TP=OP-Slv;
}
}else{
if (SL*Pp<Slv && SL!=0) SL=Slv/Pp;
if (TP*Pp<Slv && TP!=0) TP=Slv/Pp;
}
}
// october
for(int k=0;k<=TryToTrade;k++) {
if (Type==0) OP=MarketInfo(Symb,MODE_ASK);
if (Type==1) OP=MarketInfo(Symb,MODE_BID);
PnC(StringConcatenate("Trying to open an order, type:",Type," volume: " ,Lot," price: " ,OP),0);
if (IsTradeAllowed()){
int Ticket=OrderSend(Symb,Type,Lot,NormalizeDouble(OP,MarketInfo(Symb,MODE_DIGITS)),3,0,0,NULL,Tek_Magic,0,CL);
}else{ PnC(StringConcatenate("Canot open order " ,k),0; )Sleep(3000); continue; }
if (Ticket >= 0) { PnC(StringConcatenate("Order opened " ,Ticket),0); break; }
LastError=Fun_Error(GetLastError());
if (LastError==0) {
RefreshRates(); Sleep(WaitTime);
if (k==TryToTrade) return(false); }
if (LastError==1) return(false);
if (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;
if (Type==1 || Type==3 || Type==5) TP=OrderOpenPrice()-TP*Pp;
}
}

for(k=0;k<=TryToTrade;k++) {
PnC(StringConcatenate("Trying to set stops on an order:",Ticket," s/l: ",SL," t/p: ",TP),0);
if (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());
if (LastError==0) {
RefreshRates(); Sleep(WaitTime);
if (k==TryToTrade) return(false); }
if (LastError==1) return(false);
if (LastError==2) { Work=false; return(false); }
}
return(true) 。

}

 

谁能解释一下为什么在修改订单时出现131"错误的数量"的错误?

挂单正常打开,手数是正常的,当输出打印时,最小手数是0.01,这不低于我的交易量(模拟账户)。

我重新阅读了论坛上的所有内容,但没能找到问题所在!

我仍然想知道幕后发生了什么,还有什么没有被描述。
 
forexman77:

谁能解释一下为什么在修改订单时出现131"错误的数量"的错误?

挂单正常打开,手数是正常的,当输出打印时,最小手数是0.01,这不低于我的交易量(模拟账户)。

我重新阅读了我的论坛上的所有内容,但我找不到问题所在!

只是不要停止对出现的和未描述的隐藏虫子的惊讶。

我在另一家经纪公司试过,但并没有改变我的想法。问题是,当你打电话时,为什么?

double MinLot = MarketInfo(Symbol(),MODE_MINLOT);
double MaxLot = MarketInfo(Symbol(),MODE_MAXLOT);
Alert("MinLot=",MinLot,"MaxLot=",MaxLot);  

扣除0.01,而机器人打印出131?