新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 1739 1...173217331734173517361737173817391740174117421743174417451746...1953 新评论 Ivan Butko 2021.11.11 00:58 #17381 Artyom Trishkin #:第一次调用CopyRates()启动了历史数据交换(一个星期不运行,你又会得到同样的结果,好吧,也许不是一个星期,而是一些时间)。 你只需要检查服务器上有多少数据,并与专家顾问的可用数量进行比较。如果低于要求--将EA留到下一次打勾。在下一次打勾时,再次检查。如果在一定数量的尝试中没有获得所需的历史量--那么这个错误应该按要求进行处理。 谢谢你提供的信息! 如果您有时间,请告知如何纠正: 在历史上N个蜡烛前设置了两个相反的目标:Close[N]+50*Point 和 Close[N]-50*Point。 然后有一个条件,即价格应该达到其中一个目标(如果(High[i]>Close[N]+50*Point)或(如果(Low[i]<Close[N]-50*Point) 当条件得到满足时,从Close[N] 到High[i]的距离被写进x[high]=High[i]数组。 然后在任何时候都会随机抛给任何一个图形。 而当通过Print(x[high]) 检查时,10个值中有1-2个显示小于50!一个有12个,另一个有49个。虽然,严格说来是+50*点。8-9个是正确的(超过50),1-2个是不正常的。这不是通过测试器,而是用一个真实的图表,我放置了一个专家顾问(没有任何交易功能);它与历史记录一起工作,并显示不正确的结果。,数值越大,这种错误就越少。我想这可能是传播的干扰,但是......。MT4似乎没有历史上的点差 Artyom Trishkin 2021.11.11 10:12 #17382 Artis98 #:亲爱的论坛用户和有经验的程序员,你们好我需要帮助来完成EA))。请告知如何在代码顾问中添加2个东西。1.情况是这样的:我开了一个订单(第一笔),有TP和SL,有一定的手数(可能是0.01)。如果这个订单在获利时关闭 - 很好,没有任何变化。但是,如果这个(第一笔)订单在SL平仓,紧接着的下一笔订单(第二笔)会以2倍的手数(0.01*2=0.02)开仓。如果第二笔订单在止盈点平仓,那么下一笔订单(第三笔)将以普通手数开仓,即在前一笔(第一笔)在止盈点平仓后,下一笔订单(第二笔)只需要2倍的手数。如果第3笔订单连续第二次在SL中被关闭,手数将继续增加2倍,直到没有TP关闭。我希望我已经详细描述了需要添加的逻辑。现在让我用一个例子来解释:假设我们有一个基本参数为T.p.+300,S.l.的订单,我们必须增加SL运动。- 500.价格向要求的方向移动,并从订单的开盘价中通过+100点。一旦价格从订单的开盘价达到+100,SL应该从基础的-500移动到+90。即:当价格达到与订单开盘价相比+100点时,我们通过设置S,L为+90点将订单转移到盈亏平衡点。之后,如果价格进一步向所需的方向发展并通过另一个+50点--S.L.被移动了50点=>它现在应该是在订单开盘价的+140点。即S.L.首先从它的基本位置移动到离订单开盘价+90点的位置,然后再移动,如果它通过了+50点(- 500 => + 90 => + 140 => + 190等)。如此这般,直到价格达到T.P。或当趋势反转并冲击S.L.时。我希望我详细地描述了一切,我真的希望得到你的帮助,因为通过添加这些缺失的元素,专家顾问就可以准备好了))。如果你有任何问题,请问))))。我在下面粘贴了专家顾问的部分代码。 关于第一点:在你开仓之前,看看之前的仓位是如何关闭的。如果你采取SL,那么这批货应该是两倍。手数不应该增加前一个位置的一半,而是在设置中或代码中的某个地方设置。然后在开仓前,你将检查条件:如果前一个仓位被SL关闭,那么就用双倍的手数开仓。 至于第二个问题。很久以前,我在这个主题中发布了一个跟踪止损的样本。寻找它。最好是在我的信息资料中--你在那里找到它比在这里浏览100多页要快。然后在找到的例子的基础上,你将尝试创建你自己的拖网。 Valeriy Yastremskiy 2021.11.11 10:22 #17383 Artyom Trishkin #:第一次调用CopyRates()启动了历史数据交换(一个星期不运行,你又会得到同样的结果,好吧,也许不是一个星期,而是一些时间)。 你只需要检查服务器上有多少数据,并与专家顾问的可用数量进行比较。如果低于要求--将EA留到下一次打勾。在下一次打勾时,再次检查。如果没有获得所需的尝试量--错误将按要求处理。 我们能否以编程方式获得加载的条数? 我自己只是看每个TF的报价档案中的日期,在计算时尽量不超过它们。 在这种形式下,这项任务可能是不必要的。 当加载适量的条形图时得到一个标志会更正确,但它可能永远不会为一个或另一个符号加载。 Artis98 2021.11.11 11:33 #17384 Artyom Trishkin #:关于第一点:在开仓之前,要看一下前一个仓位的收盘情况。如果通过SL,那么这批货应该是双倍的。手数不应该是前一个位置的手数的两倍,而应该是设置中或代码中某个地方的设置。然后在开仓前,你将检查条件:如果前一个仓位被SL关闭,那么就用双倍的手数开仓。 我想我已经在代码中做了修改。 //+------------------------------------------------------------------+ //| Calculate optimal lot size | //+------------------------------------------------------------------+ double Lots() // Расчет объема лота { int n=0; double Lotscount; double OL=Lot; if(Lot>0) return(LOT()); // "если во внешней переменной "Lot" стоит число больше 0 => будет фиксированный лот без авт. расчёта" Lotscount=AccountFreeMargin()/10000; // раcчёт лота - свободная маржа/9000 => 100/9000=0.01 лота Lotscount=MathMin(15,MathMax(0.01,Lotscount)); if(Lotscount<0.1) Lotscount=NormalizeDouble(Lotscount,2); else { if(Lotscount<1) Lotscount=NormalizeDouble(Lotscount,1); else Lotscount=NormalizeDouble(Lotscount,0); } for (int j = OrdersHistoryTotal()-1; j >= 0; j--) { if (OrderSelect(j, SELECT_BY_POS,MODE_HISTORY)) { if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) { if (OrderProfit()<0) { if (n==0) OL=NormalizeDouble(OrderLots()*K_Martin,DigitsLot); n++; if (OrderProfit()>0) return(Lotscount); } else { if (n==0) {Comment("2");return(Lotscount);} else {Comment("3");return(OL);} } } } } return(Lotscount); } //------------------------------------------------------------------ double LOT() { int n=0; double OL=Lot; for (int j = OrdersHistoryTotal()-1; j >= 0; j--) { if (OrderSelect(j, SELECT_BY_POS,MODE_HISTORY)) { if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) { if (OrderProfit()<0) { if (n==0) OL=NormalizeDouble(OrderLots()*K_Martin,DigitsLot); n++; if (OrderProfit()>0) return(Lot);} } else { if (n==0) {Comment("2");return(Lot);} else {Comment("3");return(OL);} } } } } return(OL); } 还是错了?另外,我不知道如何改变与地段有关的两件事。首先,一个双倍手数的订单应该只开一次,而且只在一个订单上(在有S.L.的订单之后的下一个订单)。第二,我不知道如何添加,就是让它在连续两个S.L.的情况下(连续两个订单被S.L.关闭),第三个订单的开仓手数不会再增加2(2*2*2),而是像第二个订单一样只增加一次(2*2)。 Maxim Kuznetsov 2021.11.11 11:56 #17385 Artis98 #:我想我已经在代码中改变了这一点。或者说这是错的吗?另外,我不知道如何改变地段的两件事。第一种是只做一次双倍手数的订单,而且只做一个订单(在有S.L.的订单之后的下一个订单)。第二,我不知道如何添加,就是让它在连续两个S.L.的情况下(连续两个订单以S.L.关闭),第三个订单不会以再增加2的手数开仓(2*2*2),而是像第二个订单一样只开一次(2*2)。 你有两个订单类型--订单号1--普通手数的订单,以及订单号2--较大手数的订单。地段只按SL类型#1递增。 例如,在 "评论 "中保存订单类型。或者,最好是自己背下来。 把关于你的订单的一切都背下来是一个好习惯。 Artyom Trishkin 2021.11.11 12:07 #17386 Maxim Kuznetsov #:你有两个订单类型--订单号1--普通手数的订单,以及订单号2--增加手数的订单。地段只按SL类型#1递增。例如,在 "评论 "中保存订单类型。或者,最好是自己背下来。 记住关于你的订单的一切,是一个好习惯。 我们不需要背诵任何东西(尤其是背诵需要进一步重建)。他只要知道以前的位置是如何关闭的就足够了。这就是全部。既不需要知道两个,也不需要知道三个,也不需要知道连续的一百个,也不需要知道一百个没有被止损关闭的,只需要知道最后的位置。如果它被止损平仓,那么下一次应该以双倍手数平仓。但是,这批货不应该是前一个位置的货的两倍,而是从程序中设定的正常货。然后,如果关闭的头寸没有达到止损,那么下一个头寸应该以相同的手数打开。如果通过止损平仓,那么下一个仓位的手数要加倍。这就是全部。你不需要知道其他事情。 Maxim Kuznetsov 2021.11.11 12:16 #17387 Artyom Trishkin #:他不需要背诵任何东西(尤其是背诵需要后续恢复)。它只需要知道过去的位置是如何关闭的。这就是全部。他不需要知道两个,或三个,或连续一百个,或没有在止损点关闭,而只需要知道过去的位置。如果它被止损平仓,那么下一次应该以双倍手数平仓。但是,这批货不应该是前一个位置的货的两倍,而是从程序中设定的正常货。然后,如果关闭的头寸没有达到止损,那么下一个头寸应该以相同的手数打开。如果通过止损平仓,那么下一个仓位的手数要加倍。这就是全部。你不需要知道其他事情。 不要告诉人们该怎么做。 你必须记住你的数据并与之一起工作 Artis98 2021.11.11 12:51 #17388 Artyom Trishkin #:他所需要知道的是过去的位置如何关闭。这就是全部。你不需要知道连续两个、三个、一百个或没有连续在止损点关闭,只需要知道过去的位置。如果是在止损点平仓,那么下一次应该是双倍手数。 如果是在止损点平仓,那么下一次应该是双倍手数。 这就是我所需要的,这其实就是问题所在--如何在代码中写出它? Sergey Zhukov 2021.11.11 13:11 #17389 你好! 谁能告诉我如何强制编译器为MT4而非MT5编译? 如果文件的扩展名是*.mq4,我就没事,如果它的扩展名是*.mqh,那么编译器就会把它接受为*.mq5,并发生错误。 Tretyakov Rostyslav 2021.11.11 14:17 #17390 Sergey Zhukov #:你好! 谁能告诉我如何强制编译器为MT4而非MT5编译?如果文件的扩展名是*.mq4,我就没事,如果它的扩展名是*.mqh,那么编译器就会把它接受为*.mq5,并发生错误。 把文件给我们。这是新的东西,我以前从未听说过。 1...173217331734173517361737173817391740174117421743174417451746...1953 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
第一次调用CopyRates()启动了历史数据交换(一个星期不运行,你又会得到同样的结果,好吧,也许不是一个星期,而是一些时间)。
你只需要检查服务器上有多少数据,并与专家顾问的可用数量进行比较。如果低于要求--将EA留到下一次打勾。在下一次打勾时,再次检查。如果在一定数量的尝试中没有获得所需的历史量--那么这个错误应该按要求进行处理。
谢谢你提供的信息!
如果您有时间,请告知如何纠正:
在历史上N个蜡烛前设置了两个相反的目标:Close[N]+50*Point 和 Close[N]-50*Point。
然后有一个条件,即价格应该达到其中一个目标(如果(High[i]>Close[N]+50*Point)或(如果(Low[i]<Close[N]-50*Point)
当条件得到满足时,从Close[N] 到High[i]的距离被写进x[high]=High[i]数组。
然后在任何时候都会随机抛给任何一个图形。
而当通过Print(x[high]) 检查时,10个值中有1-2个显示小于50!一个有12个,另一个有49个。虽然,严格说来是+50*点。8-9个是正确的(超过50),1-2个是不正常的。这不是通过测试器,而是用一个真实的图表,我放置了一个专家顾问(没有任何交易功能);它与历史记录一起工作,并显示不正确的结果。
,数值越大,这种错误就越少。我想这可能是传播的干扰,但是......。MT4似乎没有历史上的点差
亲爱的论坛用户和有经验的程序员,你们好我需要帮助来完成EA))。请告知如何在代码顾问中添加2个东西。
1.情况是这样的:我开了一个订单(第一笔),有TP和SL,有一定的手数(可能是0.01)。如果这个订单在获利时关闭 - 很好,没有任何变化。但是,如果这个(第一笔)订单在SL平仓,紧接着的下一笔订单(第二笔)会以2倍的手数(0.01*2=0.02)开仓。如果第二笔订单在止盈点平仓,那么下一笔订单(第三笔)将以普通手数开仓,即在前一笔(第一笔)在止盈点平仓后,下一笔订单(第二笔)只需要2倍的手数。如果第3笔订单连续第二次在SL中被关闭,手数将继续增加2倍,直到没有TP关闭。我希望我已经详细描述了需要添加的逻辑。
现在让我用一个例子来解释:假设我们有一个基本参数为T.p.+300,S.l.的订单,我们必须增加SL运动。- 500.价格向要求的方向移动,并从订单的开盘价中通过+100点。一旦价格从订单的开盘价达到+100,SL应该从基础的-500移动到+90。即:当价格达到与订单开盘价相比+100点时,我们通过设置S,L为+90点将订单转移到盈亏平衡点。之后,如果价格进一步向所需的方向发展并通过另一个+50点--S.L.被移动了50点=>它现在应该是在订单开盘价的+140点。即S.L.首先从它的基本位置移动到离订单开盘价+90点的位置,然后再移动,如果它通过了+50点(- 500 => + 90 => + 140 => + 190等)。如此这般,直到价格达到T.P。或当趋势反转并冲击S.L.时。
我希望我详细地描述了一切,我真的希望得到你的帮助,因为通过添加这些缺失的元素,专家顾问就可以准备好了))。如果你有任何问题,请问))))。我在下面粘贴了专家顾问的部分代码。
关于第一点:在你开仓之前,看看之前的仓位是如何关闭的。如果你采取SL,那么这批货应该是两倍。手数不应该增加前一个位置的一半,而是在设置中或代码中的某个地方设置。然后在开仓前,你将检查条件:如果前一个仓位被SL关闭,那么就用双倍的手数开仓。
至于第二个问题。很久以前,我在这个主题中发布了一个跟踪止损的样本。寻找它。最好是在我的信息资料中--你在那里找到它比在这里浏览100多页要快。然后在找到的例子的基础上,你将尝试创建你自己的拖网。
第一次调用CopyRates()启动了历史数据交换(一个星期不运行,你又会得到同样的结果,好吧,也许不是一个星期,而是一些时间)。
你只需要检查服务器上有多少数据,并与专家顾问的可用数量进行比较。如果低于要求--将EA留到下一次打勾。在下一次打勾时,再次检查。如果没有获得所需的尝试量--错误将按要求处理。
我们能否以编程方式获得加载的条数?
我自己只是看每个TF的报价档案中的日期,在计算时尽量不超过它们。
在这种形式下,这项任务可能是不必要的。 当加载适量的条形图时得到一个标志会更正确,但它可能永远不会为一个或另一个符号加载。
关于第一点:在开仓之前,要看一下前一个仓位的收盘情况。如果通过SL,那么这批货应该是双倍的。手数不应该是前一个位置的手数的两倍,而应该是设置中或代码中某个地方的设置。然后在开仓前,你将检查条件:如果前一个仓位被SL关闭,那么就用双倍的手数开仓。
我想我已经在代码中做了修改。
还是错了?另外,我不知道如何改变与地段有关的两件事。首先,一个双倍手数的订单应该只开一次,而且只在一个订单上(在有S.L.的订单之后的下一个订单)。第二,我不知道如何添加,就是让它在连续两个S.L.的情况下(连续两个订单被S.L.关闭),第三个订单的开仓手数不会再增加2(2*2*2),而是像第二个订单一样只增加一次(2*2)。
我想我已经在代码中改变了这一点。
或者说这是错的吗?另外,我不知道如何改变地段的两件事。第一种是只做一次双倍手数的订单,而且只做一个订单(在有S.L.的订单之后的下一个订单)。第二,我不知道如何添加,就是让它在连续两个S.L.的情况下(连续两个订单以S.L.关闭),第三个订单不会以再增加2的手数开仓(2*2*2),而是像第二个订单一样只开一次(2*2)。
你有两个订单类型--订单号1--普通手数的订单,以及订单号2--较大手数的订单。地段只按SL类型#1递增。
例如,在 "评论 "中保存订单类型。或者,最好是自己背下来。 把关于你的订单的一切都背下来是一个好习惯。
你有两个订单类型--订单号1--普通手数的订单,以及订单号2--增加手数的订单。地段只按SL类型#1递增。
例如,在 "评论 "中保存订单类型。或者,最好是自己背下来。 记住关于你的订单的一切,是一个好习惯。
我们不需要背诵任何东西(尤其是背诵需要进一步重建)。他只要知道以前的位置是如何关闭的就足够了。这就是全部。既不需要知道两个,也不需要知道三个,也不需要知道连续的一百个,也不需要知道一百个没有被止损关闭的,只需要知道最后的位置。如果它被止损平仓,那么下一次应该以双倍手数平仓。但是,这批货不应该是前一个位置的货的两倍,而是从程序中设定的正常货。然后,如果关闭的头寸没有达到止损,那么下一个头寸应该以相同的手数打开。如果通过止损平仓,那么下一个仓位的手数要加倍。这就是全部。你不需要知道其他事情。
他不需要背诵任何东西(尤其是背诵需要后续恢复)。它只需要知道过去的位置是如何关闭的。这就是全部。他不需要知道两个,或三个,或连续一百个,或没有在止损点关闭,而只需要知道过去的位置。如果它被止损平仓,那么下一次应该以双倍手数平仓。但是,这批货不应该是前一个位置的货的两倍,而是从程序中设定的正常货。然后,如果关闭的头寸没有达到止损,那么下一个头寸应该以相同的手数打开。如果通过止损平仓,那么下一个仓位的手数要加倍。这就是全部。你不需要知道其他事情。
不要告诉人们该怎么做。
你必须记住你的数据并与之一起工作
他所需要知道的是过去的位置如何关闭。这就是全部。你不需要知道连续两个、三个、一百个或没有连续在止损点关闭,只需要知道过去的位置。如果是在止损点平仓,那么下一次应该是双倍手数。 如果是在止损点平仓,那么下一次应该是双倍手数。
这就是我所需要的,这其实就是问题所在--如何在代码中写出它?
你好!
谁能告诉我如何强制编译器为MT4而非MT5编译?
如果文件的扩展名是*.mq4,我就没事,如果它的扩展名是*.mqh,那么编译器就会把它接受为*.mq5,并发生错误。
你好!
谁能告诉我如何强制编译器为MT4而非MT5编译?
如果文件的扩展名是*.mq4,我就没事,如果它的扩展名是*.mqh,那么编译器就会把它接受为*.mq5,并发生错误。