新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 306 1...299300301302303304305306307308309310311312313...1953 新评论 mila.com 2017.09.09 04:53 #3051 Alexey Viktorov:而且不可能有别的。没有一台电脑知道的年份比1970年少。从经纪人的报价中出现的年份开始。 我明白了)谢谢你。 Alexey Viktorov 2017.09.09 08:29 #3052 Aleksey Vyazmikin:MT5中的代码结果。 SZZY:我改变了代码--它来自错误的ME。我并没有立即理解这个想法。我没有在mql5中做过,我得想办法解决。但你可以在mql4中以如下方式做到这一点。创建两个额外的缓冲区。为N个小节设置一个偏移量,用主缓冲区的最后一个值填充这N个小节。当然,这些额外的缓冲区的索引N+1也要用空值来填充。 Aleksey Vyazmikin 2017.09.09 11:39 #3053 Alexey Viktorov:我并没有立即理解这个想法。我没有在mql5中做过,我得想办法解决。但在mql4中,你可以通过以下方式来实现。创建两个额外的缓冲区。为它们设置一个N条的偏移量,用主缓冲区的最后一个值来填充这N条。当然,这些额外的缓冲区的索引N+1充满了空值。谢谢你的想法--我最初在MT5中是这样做的,然后我优化了它。总之,凌晨4点就去睡觉了(当然,公开的代码并不完整),但用两个缓冲区做了我想做的事。问题是,在MT5中,填充是从左到右,而在MT4中是反过来的。ArraySetAsSeries 函数没有帮助--事实上我重写了所有逻辑。 niktach 2017.09.10 02:13 #3054 下午好,Artem!我想求助于我对TrExp_Nik版本的重做。我想增加将其转移到收支平衡的可能性。 然而,我有限的编程技能不允许我这样做。我决定使用e-MovingInWL,我试图把它的代码整合到我的EA中,但我不能正确地组合变量,或者我不能正确理解第二个盈亏平衡专家顾问的代码。也许,这不是最佳的变体。我想征求您的意见,如何让它变得更好或更容易。 附加的文件: TrExp_Nik_lcvp._4.mq4 47 kb e-MovingInWL.mq4 3 kb Artyom Trishkin 2017.09.10 02:20 #3055 niktach:下午好,Artem!我想求助于我对TrExp_Nik版本的重做。我想增加将其转移到收支平衡的可能性。 然而,我有限的编程技能不允许我这样做。我决定使用e-MovingInWL,我试图将其代码整合到我的EA中,但我不能正确地组合变量,或者说我不能正确理解第二个盈亏平衡专家顾问的代码。也许,这不是最佳的变体。我想征求您的意见,如何改进或简化它。日子过得不错。你到底想做什么?我只看到两个附加代码。如果你需要有人为你做一切事情,那就是自由职业者 的工作。如果你想自己做,那就告诉我你到底在做什么,哪里不明白。 oddball 2017.09.10 16:29 #3056 你好。有什么方法可以以编程方式获得放置在图表上的 "三角形 "图形对象的属性?我指的是顶点的时间和价格坐标,当交互式地打开属性表格时,它们会显示在 "参数 "标签上。我试图使用ObjectGetInteger 和ObjectGetDouble函数,但它们只能获得一个顶点的数据。谢谢你。 Artyom Trishkin 2017.09.10 18:00 #3057 oddball:你好。是否有办法以编程方式获取放置在图表上的 "三角形 "图形对象的属性?我指的是顶点的时间和价格坐标,当交互式地打开属性表格时,这些坐标会显示在 "参数 "标签上。我试图使用ObjectGetInteger和ObjectGetDouble函数,但它们只能获得一个顶点的数据。谢谢你。是的,你可以。而且思想的方向是正确的。你能告诉我你是如何尝试获取参数的吗? rabanik 2017.09.11 11:18 #3058 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) 。} Any questions from newcomers [ARCHIVE] Any rookie question, 编码帮助 forexman77 2017.09.11 11:57 #3059 谁能解释一下为什么在修改订单时出现131"错误的数量"的错误?挂单正常打开,手数是正常的,当输出打印时,最小手数是0.01,这不低于我的交易量(模拟账户)。我重新阅读了论坛上的所有内容,但没能找到问题所在! 我仍然想知道幕后发生了什么,还有什么没有被描述。 forexman77 2017.09.11 12:40 #3060 forexman77:谁能解释一下为什么在修改订单时出现131"错误的数量"的错误?挂单正常打开,手数是正常的,当输出打印时,最小手数是0.01,这不低于我的交易量(模拟账户)。我重新阅读了我的论坛上的所有内容,但我找不到问题所在! 只是不要停止对出现的和未描述的隐藏虫子的惊讶。我在另一家经纪公司试过,但并没有改变我的想法。问题是,当你打电话时,为什么?double MinLot = MarketInfo(Symbol(),MODE_MINLOT); double MaxLot = MarketInfo(Symbol(),MODE_MAXLOT); Alert("MinLot=",MinLot,"MaxLot=",MaxLot); 扣除0.01,而机器人打印出131? 1...299300301302303304305306307308309310311312313...1953 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
而且不可能有别的。没有一台电脑知道的年份比1970年少。从经纪人的报价中出现的年份开始。
MT5中的代码
结果。
SZZY:我改变了代码--它来自错误的ME。我并没有立即理解这个想法。我没有在mql5中做过,我得想办法解决。但你可以在mql4中以如下方式做到这一点。
创建两个额外的缓冲区。
为N个小节设置一个偏移量,用主缓冲区的最后一个值填充这N个小节。
当然,这些额外的缓冲区的索引N+1也要用空值来填充。
我并没有立即理解这个想法。我没有在mql5中做过,我得想办法解决。但在mql4中,你可以通过以下方式来实现。
创建两个额外的缓冲区。
为它们设置一个N条的偏移量,用主缓冲区的最后一个值来填充这N条。
当然,这些额外的缓冲区的索引N+1充满了空值。
谢谢你的想法--我最初在MT5中是这样做的,然后我优化了它。
总之,凌晨4点就去睡觉了(当然,公开的代码并不完整),但用两个缓冲区做了我想做的事。
问题是,在MT5中,填充是从左到右,而在MT4中是反过来的。ArraySetAsSeries 函数没有帮助--事实上我重写了所有逻辑。
下午好,Artem!
我想求助于我对TrExp_Nik版本的重做。我想增加将其转移到收支平衡的可能性。 然而,我有限的编程技能不允许我这样做。我决定使用e-MovingInWL,我试图把它的代码整合到我的EA中,但我不能正确地组合变量,或者我不能正确理解第二个盈亏平衡专家顾问的代码。也许,这不是最佳的变体。我想征求您的意见,如何让它变得更好或更容易。
下午好,Artem!
我想求助于我对TrExp_Nik版本的重做。我想增加将其转移到收支平衡的可能性。 然而,我有限的编程技能不允许我这样做。我决定使用e-MovingInWL,我试图将其代码整合到我的EA中,但我不能正确地组合变量,或者说我不能正确理解第二个盈亏平衡专家顾问的代码。也许,这不是最佳的变体。我想征求您的意见,如何改进或简化它。
日子过得不错。你到底想做什么?我只看到两个附加代码。如果你需要有人为你做一切事情,那就是自由职业者 的工作。
如果你想自己做,那就告诉我你到底在做什么,哪里不明白。
你好。
有什么方法可以以编程方式获得放置在图表上的 "三角形 "图形对象的属性?我指的是顶点的时间和价格坐标,当交互式地打开属性表格时,它们会显示在 "参数 "标签上。我试图使用ObjectGetInteger 和ObjectGetDouble函数,但它们只能获得一个顶点的数据。
谢谢你。
你好。
是否有办法以编程方式获取放置在图表上的 "三角形 "图形对象的属性?我指的是顶点的时间和价格坐标,当交互式地打开属性表格时,这些坐标会显示在 "参数 "标签上。我试图使用ObjectGetInteger和ObjectGetDouble函数,但它们只能获得一个顶点的数据。
谢谢你。
是的,你可以。而且思想的方向是正确的。你能告诉我你是如何尝试获取参数的吗?
当订单通过票据选择时,不需要指定池子 - 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,这不低于我的交易量(模拟账户)。
我重新阅读了论坛上的所有内容,但没能找到问题所在!
我仍然想知道幕后发生了什么,还有什么没有被描述。谁能解释一下为什么在修改订单时出现131"错误的数量"的错误?
挂单正常打开,手数是正常的,当输出打印时,最小手数是0.01,这不低于我的交易量(模拟账户)。
我重新阅读了我的论坛上的所有内容,但我找不到问题所在!
只是不要停止对出现的和未描述的隐藏虫子的惊讶。我在另一家经纪公司试过,但并没有改变我的想法。问题是,当你打电话时,为什么?
扣除0.01,而机器人打印出131?