多个订单问题 - 页 3

 
luisneves:


嗨,克罗尼。

是的,我有很多东西要学....。现在明白了,当需要从一个函数外部访问一个值时,必须是在全局。

这是不对的,而且也是一个坏主意。

把你的一些代码变成一个函数 的部分原因是为了能够重复使用这些代码。 如果函数被硬编码为与特定的全局变量一起工作,它就会变得不那么灵活。 你应该考虑把变量传递给用户定义的函数......不要总是使用全局声明的变量。 例如。

//+--------------------------------------------------------------------------------+
//| ToStr function - calls DoubleToString (double, Digits) and returns the string  |
//+--------------------------------------------------------------------------------+
string ToStr(double ValueToString)
   {
   return (DoubleToStr(ValueToString, Digits));
   }

//+--------------------------------------------------------------------------------+

......这并没有使用全局声明的变量,它使用的是调用时传递给它的变量 ......

Print("Bid price is: ", ToStr(Bid) );
 
luisneves:


嗨,克罗尼。

是的,我有很多东西要学....,现在明白了,当需要一个值从外部获取时,必须在全球的一个函数。

外部的值要乘以10,因为EA也必须在5位数的经纪商上运行。我正在使用这个代码块来自动获取,但从WHRoeder得到的建议与金属不兼容。

金属对的价差可能是可变的。这就是为什么我使用代码来从止损位出来。

关于这个问题,"但我已经调整了你的输入参数,使所有的订单不是在几乎相同的时间打开。也许你必须验证默认参数。"

在我看来(如果不是的话,对不起......),OpenDistance保持为2点,ReturnDistance现在也是2点。我现在看到的是,订单打开了,但不是在2点的差距。这是在一个ECN经纪商(IC Markets)的平台上运行的一个测试器。这是否有一些重要性?

事实上,订单不是在同一时间打开的,但似乎没有考虑到开放距离和回报距离,以获得正确的距离来打开订单。

你在代码中写道。

我加入了黑体字的一行,以调用函数OpenOppositeOrder,这里不确定这是否正确。另外,我不知道现在的点数与2点前的最后一个点数(OpenDistance)的比较在哪里。

如果我开始用我的问题来烦扰你,请原谅。

致以最崇高的敬意

路易斯



嗨,克罗尼。

我只是更加注意为什么要问点差是多少,而只是寻找测试者的问题。这里的点差是50(5位数),所以实际上是5。嗯...我将重新启动平台并确认。

路易斯

 
RaptorUK:

这不是真的,而且也是一个坏主意。

把一些代码做成函数的部分原因是为了能够重复使用这些代码。 如果函数被硬编码为与特定的全局变量一起工作,它就会变得不那么灵活。 你应该考虑把变量传递给用户定义的函数 ......不要总是使用全局声明的变量。 例如。

......这并没有使用全局声明的变量,它使用的是调用时传递给它的变量 ......


嗨,RaptorUK。

谢谢你的干预,使我保持正确的方向......

顺便问一下,你有没有听说过像我提到的关于测试器的问题,也就是说,此刻的点差是50,而上周五 不是?

最好的问候

路易斯

 
luisneves:


嗨,RaptorUK。

谢谢你的干预,使我保持在正确的方向......

最好的问候

路易斯

是的,这个函数的想法并不是真的要把它们都声明为无效....。我只是在你的void MM()中删除了LotSize的声明,让EA再次进行交易......-我想我们以后再谈这个问题... :-)

关于 "不在2点水平上开仓 "的问题
例如,我没有测试数据,而且点差超过2点(我可以调整它,但如果我没有点差数据,这有什么用呢)。所有这些都使我很难测试一些可靠的封闭止损。


16:21:09 _help_53198_markettorderdecnqv80 输入。EquityPercent=1; FixedLotSize=0.01; Multiplier=2; LotDigits=2; StopLoss=50; TakeProfit=20; TrailingStop=2; MinimumProfit=3; Slippage=3; OpenDistance=2; ReturnDist=1; MinStop=1; MagicNumber=8012013; MaxOrders=7;
EURUSD,M1: 在1.43310处打开#1买入0.01 EURUSD ok
EURUSD,M1:下达#1初始买入指令
EURUSD,M1: 修改#1买入0.01 EURUSD at 1.43310 sl: 1.42810 tp: 1.43510 ok
EURUSD,M1: 打开#2卖出0.01 EURUSD在1.43257 OK
EURUSD,M1:下达2号相反的卖出指令
EURUSD,M1: 修改#2卖出0.01 EURUSD at 1.43257 sl: 1.43757 tp: 1.43057 ok
EURUSD,M1: 打开#3买入0.01 EURUSD在1.43283 OK
EURUSD,M1:下达3号相反的买入指令
EURUSD,M1: 修改#3买入0.01 EURUSD at 1.43283 sl: 1.42783 tp: 1.43483 ok
EURUSD,M1: 打开#4卖出0.01 EURUSD在1.43230 OK
EURUSD,M1:下达4号相反的卖出指令
EURUSD,M1: 修改#4卖出0.01 EURUSD at 1.43230 sl: 1.43730 tp: 1.43030 ok
EURUSD,M1: 打开#5买入0.01 EURUSD在1.43280 OK
EURUSD,M1:下达5号相反的买入指令
EURUSD,M1: 修改#5买入0.01 EURUSD at 1.43280 sl: 1.42780 tp: 1.43480 ok
EURUSD,M1: 打开#6卖出0.01 EURUSD在1.43200 OK
EURUSD,M1:下达6号相反的卖出指令
EURUSD,M1: 修改#6卖出0.01 EURUSD at 1.43200 sl: 1.43700 tp: 1.43000 ok
EURUSD,M1: 打开#7买入0.01 EURUSD在1.43250 OK
EURUSD,M1:下达7号相反的买入指令
EURUSD,M1: 修改#7买入0.01 EURUSD at 1.43250 sl: 1.42750 tp: 1.43450 ok
EURUSD,M1: 修改#7买入0.01 EURUSD at 1.43250 sl: 1.43267 tp: 1.43450 ok
EURUSD,M1: 修改 #7 在1.43250买入0.01 EURUSD sl: 1.43283 tp: 1.43450 ok
EURUSD,M1: 修改 #3 在1.43283买入0.01 EURUSD sl: 1.43300 tp: 1.43483 ok
EURUSD,M1: 修改 #5 在1.43280买入0.01 EURUSD sl: 1.43300 tp: 1.43480 ok
EURUSD,M1: 修改 #7 在1.43250买入0.01 EURUSD sl: 1.43300 tp: 1.43450 ok
测试者:在1.43300(1.43300 / 1.43340)处止损#3
测试员:止损5号在1.43300 (1.43300 / 1.43340)
测试者:止损7号在1.43300 (1.43300 / 1.43340)
EURUSD,M1:LastClosedTicket=7
EURUSD,M1:带有ticketnr的订单:7击中了SL!关闭所有未结订单
EURUSD,M1: 平仓#6在1.43200卖出0.01 EURUSD sl: 1.43700 tp: 1.43000 at price 1.43340
EURUSD,M1: 收盘 #4 卖出 0.01 EURUSD at 1.43230 sl: 1.43730 tp: 1.43030 at price 1.43340
EURUSD,M1: 收盘#2,在1.43257卖出0.01欧元,sl: 1.43757,p: 1.43057,价格1.43340
EURUSD,M1: 收盘#1 买入0.01 EURUSD at 1.43310 sl: 1.42810 tp: 1.43510 at price 1.43300

从我的角度来看,它做的是你想要的。我从来没有改变过你对OpenOpposite的计算,也没有打开初始订单。

 
kronin:

是的,这个函数的想法并不是真的要把它们都声明为void....。我只是在你的void MM()中删除了LotSize的声明,让EA再次进行交易......-我想我们以后再谈这个问题... :-)

关于 "不在2个点的水平点上开仓 "的问题
例如,我没有tick数据来测试,而且点差超过2点(我可以调整它,但如果我没有tick数据,这有什么用?)所有这些都使我很难测试一些可靠的封闭止损。


16:21:09 _help_53198_markettorderdecnqv80 输入。EquityPercent=1; FixedLotSize=0.01; Multiplier=2; LotDigits=2; StopLoss=50; TakeProfit=20; TrailingStop=2; MinimumProfit=3; Slippage=3; OpenDistance=2; ReturnDist=1; MinStop=1; MagicNumber=8012013; MaxOrders=7;
EURUSD,M1: 在1.43310处打开#1买入0.01 EURUSD ok
EURUSD,M1:下达#1初始买入指令
EURUSD,M1: 修改#1买入0.01 EURUSD at 1.43310 sl: 1.42810 tp: 1.43510 ok
EURUSD,M1: 打开#2卖出0.01 EURUSD在1.43257 OK
EURUSD,M1:下达2号相反的卖出指令
EURUSD,M1: 修改#2卖出0.01 EURUSD at 1.43257 sl: 1.43757 tp: 1.43057 ok
EURUSD,M1: 打开#3买入0.01 EURUSD在1.43283 OK
EURUSD,M1:下达3号相反的买入指令
EURUSD,M1: 修改#3买入0.01 EURUSD at 1.43283 sl: 1.42783 tp: 1.43483 ok
EURUSD,M1: 打开#4卖出0.01 EURUSD在1.43230 OK
EURUSD,M1:下达4号相反的卖出指令
EURUSD,M1: 修改#4卖出0.01 EURUSD at 1.43230 sl: 1.43730 tp: 1.43030 ok
EURUSD,M1: 打开#5买入0.01 EURUSD在1.43280 OK
EURUSD,M1:下达5号相反的买入指令
EURUSD,M1: 修改#5买入0.01 EURUSD at 1.43280 sl: 1.42780 tp: 1.43480 ok
EURUSD,M1: 打开#6卖出0.01 EURUSD在1.43200 OK
EURUSD,M1:下达6号相反的卖出指令
EURUSD,M1: 修改#6卖出0.01 EURUSD at 1.43200 sl: 1.43700 tp: 1.43000 ok
EURUSD,M1: 打开#7买入0.01 EURUSD在1.43250 OK
EURUSD,M1:下达7号相反的买入指令
EURUSD,M1: 修改#7买入0.01 EURUSD at 1.43250 sl: 1.42750 tp: 1.43450 ok
EURUSD,M1: 修改#7买入0.01 EURUSD at 1.43250 sl: 1.43267 tp: 1.43450 ok
EURUSD,M1: 修改 #7 在1.43250买入0.01 EURUSD sl: 1.43283 tp: 1.43450 ok
EURUSD,M1: 修改 #3 在1.43283买入0.01 EURUSD sl: 1.43300 tp: 1.43483 ok
EURUSD,M1: 修改 #5 在1.43280买入0.01 EURUSD sl: 1.43300 tp: 1.43480 ok
EURUSD,M1: 修改 #7 在1.43250买入0.01 EURUSD sl: 1.43300 tp: 1.43450 ok
测试者:在1.43300(1.43300 / 1.43340)处止损#3
测试员:止损5号在1.43300 (1.43300 / 1.43340)
测试者:止损7号在1.43300 (1.43300 / 1.43340)
EURUSD,M1:LastClosedTicket=7
EURUSD,M1:带有ticketnr的订单:7击中了SL!关闭所有未结订单
EURUSD,M1: 平仓#6在1.43200卖出0.01 EURUSD sl: 1.43700 tp: 1.43000 at price 1.43340
EURUSD,M1: 收盘 #4 卖出 0.01 EURUSD at 1.43230 sl: 1.43730 tp: 1.43030 at price 1.43340
EURUSD,M1: 收盘#2,在1.43257卖出0.01欧元,sl: 1.43757,p: 1.43057,价格1.43340
EURUSD,M1: 收盘#1 买入0.01 EURUSD at 1.43310 sl: 1.42810 tp: 1.43510 at price 1.43300

从我的角度来看,它做的是你想要的。我从来没有改变过你对OpenOpposite的计算,也没有打开初始订单。


嗨,克罗尼。

我从另一个经纪商那里下载了另一个平台,将等待再次测试并让你知道结果。

再次感谢您

路易斯

 

嗨,Kronin。

我刚刚确认,在测试器中,点差已经跳到了5个点(50)。 所以今天在测试器中,你的代码显示工作正常,现在我把它放在ECN模拟账户 中,再看看。

最好的问候

路易斯

 

嗨,克罗尼。

有一个问题。

当EA启动时,它不应该等待价格偏离2个点后再打开第一个订单吗?

当第二个订单有条件打开时,它就会在正确的位置打开。

祝贺你

路易斯

 
luisneves:

嗨,克罗尼。

有一个问题。

当EA启动时,它不应该等待价格偏离2个点后再打开第一个订单 吗?

当第二个订单有条件打开时,它就会在正确的位置打开。

祝贺你

路易斯

嗨,路易斯

好吧,根据策略应该是这样的,但根据代码当然不是这样的......

if(OpenDistance*pt && BuyAllowed) //<-- this doesn't make any sense.

上述内容被理解为if(2*0.0001 && true) 。任何不同于0的数字表达都被解释为真。因此,如果BuyAllowed为真,表达式总是为真。

对不起,我没有注意到一个系列的第一次开盘,因为它只有2个点,我没有注意到任何异常。

试试这个。

//global scope
double BuyTrigger,SellTrigger;

//init function
BuyTrigger=Ask+OpenDistance*pt;
SellTrigger=Bid-OpenDistance*pt;

//start function
  OTCurrentTick=OrdersTotal();                   //reinit OrderTotal   <<-- this is already there, place the 4 lines below after this line
  if(OTCurrentTick==0&&OTLastTick>0){
     BuyTrigger=Ask+OpenDistance*pt;
     SellTrigger=Bid-OpenDistance*pt;
  }

if(Ask>BuyTrigger && BuyAllowed)                // <-- use this instead of if(OpenDistance*pt && BuyAllowed)

if(Bid<SellTrigger && SellAllowed)
 

嗨,Kronin。

很抱歉,我对代码的理解有局限性,让你感到厌烦,不过现在学习还不算太晚,我正尽力去研究你所提供的代码。

现在,我正在测试使用的最佳设置,并将介绍你最后的代码更新。

感谢你在这些问题上继续支持我(冒险......我是说....)。

路易斯

 

嗨,Kronin。

你的修改是有效的。你已经限制了最大的订单,但是否有可能让它们全部关闭?

我试着用下面的代码来做,但似乎不起作用。

if(LastClosedTicket>0|| OrdersTotal()>= MaxOrders)

致以最崇高的敬意

路易斯