新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 307 1...300301302303304305306307308309310311312313314...1953 新评论 Artyom Trishkin 2017.09.11 12:46 #3061 forexman77: 我在另一个DC上试了一下,似乎还可以。问题是为什么要打电话。输出0.01,但在机器人上打印出131?在传递给函数时,需要对这些批次进行归一化处理。 forexman77 2017.09.11 12:59 #3062 Artyom Trishkin:当批次被转移到职能部门时,需要对其进行规范化处理。实际上,我写的是我在正常化。自动交易中的手数是有限制的。 你不需要在这里做 "显而易见的船长"。 Artyom Trishkin 2017.09.11 13:01 #3063 forexman77: 实际上,我写的是我在正常化。在自动交易中,对手数有某种限制。 不要在这里说得那么明显。好吧,你自己看看吧,如果你想这样交流的话。 rabanik 2017.09.11 13:35 #3064 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 2017.09.11 14:42 #3065 rabanik: 现在这里是下一个错误的行,如果(Type==0 || Type==2 || Type==4)SL=OrderOpenPrice()-SL*Pp;。 OrderOpenPrice()函数返回同样的错误--表达式无法被评估。乱七八糟的!!!。都整理好了。对不起,我的问题很愚蠢。我有一个int类型的主变量SL。而我正试图再次获得SL与类型双。但系统返回1。谢谢。 6737998 2017.09.11 17:07 #3066 谁能建议如何使EA从某个地方回到它的起点,而不继续执行进一步的操作。 danil77783 2017.09.11 18:04 #3067 你好。问题如下,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); } Alexey Viktorov 2017.09.11 18:18 #3068 6737998:谁能建议如何使EA从某个地方回到它的起点,而不继续执行进一步的操作。 Оператор возврата return - Операторы - Основы языка - Справочник MQL4 docs.mql4.com Оператор возврата return - Операторы - Основы языка - Справочник MQL4 Alexey Viktorov 2017.09.11 18:19 #3069 danil77783:你好。问题如下,EA没有开启卖出交易。你能看一下吗? 什么是TD1,它在哪里被分配了一个值? MosheDayan 2017.09.13 17:26 #3070 朋友们,如何正确地摆脱这种局面...该指标从CSV中画出两条水平线(红色--从一天的开始到一天的结束)蓝色--来自过去几天的梁,在不同的价格水平。但也有一些日子,这些水平有相同的价值/价格。在这种情况下,有什么正确的方法可以使线条重合时,显示Ray(Blue),而红线在图表上不可见,但实际存在......也就是说,它是透明的。 现在 - Draw_Level("Red", red, DRAW_NONE, STYLE_SOLID,0); 它停止画线,但从它下面也看不到Ray。谢谢。 1...300301302303304305306307308309310311312313314...1953 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
我在另一个DC上试了一下,似乎还可以。问题是为什么要打电话。
输出0.01,但在机器人上打印出131?
在传递给函数时,需要对这些批次进行归一化处理。
当批次被转移到职能部门时,需要对其进行规范化处理。
实际上,我写的是我在正常化。自动交易中的手数是有限制的。
你不需要在这里做 "显而易见的船长"。实际上,我写的是我在正常化。在自动交易中,对手数有某种限制。
不要在这里说得那么明显。好吧,你自己看看吧,如果你想这样交流的话。
非常感谢您的答复。
这是整个函数,重点是它打开一个订单,然后通过修改增加恒定的止损和止盈值。
订单被打开,但没有设置止损和止盈(红色的计算函数,其中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()函数返回同样的错误--表达式无法被评估。乱七八糟的!!!。
都整理好了。对不起,我的问题很愚蠢。我有一个int类型的主变量SL。
而我正试图再次获得SL与类型双。但系统返回1。
谢谢。
谁能建议如何使EA从某个地方回到它的起点,而不继续执行进一步的操作。
你好。问题如下,EA并没有开出卖出交易。你能看一下吗?
谁能建议如何使EA从某个地方回到它的起点,而不继续执行进一步的操作。
你好。问题如下,EA没有开启卖出交易。你能看一下吗?
朋友们,如何正确地摆脱这种局面...该指标从CSV中画出两条水平线(红色--从一天的开始到一天的结束)蓝色--来自过去几天的梁,在不同的价格水平。但也有一些日子,这些水平有相同的价值/价格。在这种情况下,有什么正确的方法可以使线条重合时,显示Ray(Blue),而红线在图表上不可见,但实际存在......也就是说,它是透明的。
现在 - Draw_Level("Red", red, DRAW_NONE, STYLE_SOLID,0); 它停止画线,但从它下面也看不到Ray。谢谢。