打开相反的订单 - 页 2 1234 新评论 Simon Gniadkowski 2012.12.17 17:10 #11 你不能这样做来调整4/5位数经纪商的滑点,这毫无意义。 滑点必须是一个int,所以是一个整数,对于4位数的经纪商,滑点是以Pips为单位的,所以滑点=3意味着3个Pips,对于5位数的经纪商,滑点是以点数为单位的,所以滑点=3意味着3点或0。所以为了补偿,对于5位数的经纪商,滑点数字必须乘以10,即30 ... 30点=3点。所以这个代码是错误的 ... . int init() { if (Digits ==3 || Digits ==5) pt = 10 * Point; else pt = Point; Slippage = Slippage * pt; } Simon Gniadkowski 2012.12.17 17:20 #12 试试这个修改后的OpenOppositeOrder()函数. .void OpenOppositeOrder() { int Op; for(int Counter = OrdersTotal()-1; Counter >= 0; Counter--) { if(OrderSelect(Counter,SELECT_BY_POS,MODE_TRADES)) // only continue if the OrderSelect() worked { if(OrderSymbol() == Symbol()&& OrderMagicNumber() == MagicNumber) { Op = OrderType(); if(Op == OP_BUY && Bid < OrderOpenPrice()) { Ticket = OrderSend(Symbol(), OP_SELL, LotSize, Bid, Slippage, 0, 0, "Sell Order", MagicNumber, 0, Red); if(Ticket > 0) { Print("Opposite Sell order placed # ", Ticket); AddLimitsSell(); } else { Print("Order Send failed, error # ", GetLastError() ); } } if(Op == OP_SELL && Ask > OrderOpenPrice()) { Ticket = OrderSend(Symbol(), OP_BUY, LotSize, Ask, Slippage, 0, 0, "Buy Order", MagicNumber, 0, Green); if(Ticket > 0) { Print("Opposite Buy order placed # ", Ticket); AddLimitsBuy(); } else { Print("Order Send failed, error # ", GetLastError() ); } } } } } } 18081961 2012.12.18 13:08 #13 RaptorUK:试试这个修改后的OpenOppositeOrder()函数 . . 嗨,RaptorUk。在这之前,感谢您到目前为止提供的帮助。现在EA开始工作了。我已经做了其他的修改,如果一个订单有利润,如何关闭所有的订单,这是确定的,但正如你已经看到的和预测的,这个策略的工作是必要的,达到利润的订单的手数增加,以弥补以前的订单。 所以我在这里处理一个混乱。我需要确认上一个订单是否有利润,我想用OrderProfit()的方式来调整下一个订单的手数,但是,难道我不需要关闭前一个订单来获得这个信息吗?这里是打开一个相反订单的代码,工作正常(感谢您),在这里我引入了额外的代码,以发现之前的订单是否有利润。我的方法正确吗?谢谢你路易斯 void OpenOppositeOrder() { // LastOrder Loss Compensation int Orders; Orders= OrdersTotal(); if (Orders>0) { for(i=0;i<Orders;i++) { OrderSelect(i,SELECT_BY_POS,MODE_TRADES); if(OrderSymbol()==Symbol()&& OrderMagicNumber()== MagicNumber) { lastprofit = OrderProfit(); lastlot = OrderLots(); } } } mlots=0; if (lastprofit<0)mlots=NormalizeDouble(lastlot*Multiplier,Digits); else mlots=LotSize; //+------------------------------------------------------------------+ //Open Opposite Order int Op; for(int Counter = OrdersTotal()-1; Counter >= 0; Counter--) { if(OrderSelect(Counter,SELECT_BY_POS,MODE_TRADES)) { if(OrderSymbol() == Symbol()&& OrderMagicNumber() == MagicNumber) { Op = OrderType(); if(Op == OP_BUY && Bid < OrderOpenPrice()) { if(Martingale)ilots=mlots;else ilots=LotSize; Ticket = OrderSend(Symbol(), OP_SELL, ilots, Bid, UseSlippage, 0, 0, "Sell Order", MagicNumber, 0, Red); if(Ticket > 0) { Print("Opposite Sell order placed # ", Ticket); AddLimitsSell(); } else { Print("Order Send failed, error # ", GetLastError() ); } } if(Op == OP_SELL && Ask > OrderOpenPrice()) { if(Martingale)ilots=mlots;else ilots=LotSize; Ticket = OrderSend(Symbol(), OP_BUY, ilots, Ask, UseSlippage, 0, 0, "Buy Order", MagicNumber, 0, Green); if(Ticket > 0) { Print("Opposite Buy order placed # ", Ticket); AddLimitsBuy(); } else { Print("Order Send failed, error # ", GetLastError() ); } } } } } } Simon Gniadkowski 2012.12.18 15:47 #14 luisneves: 嗨,RaptorUk。首先感谢你们到目前为止所提供的帮助。现在EA开始工作了。我已经做了其他的修改,如果一个订单有利润,如何关闭所有的订单,这是确定的,但正如你已经看到的和预测的,这个策略的工作是必要的,达到利润的订单的手数增加,以补偿以前的订单。 所以我在这里处理一个混乱的问题。我需要确认上一个订单是否有利润,我想用OrderProfit()的方式来调整下一个订单的手数,但是,难道我不需要关闭前一个订单来获得这个信息吗?这里是打开一个相反订单的代码,工作正常(感谢您),在这里我引入了额外的代码,以发现之前的订单是否有利润。我的方法是否正确? 我怀疑这将会给你带来问题 . .mlots = NormalizeDouble(lastlot * Multiplier, Digits);例如,如果结果是1.12316734 手,你在5位数的平价上的NormalizeDouble()将把它改为1.12316,这将不符合手数步骤的要求。. ...你需要使用一些数学方法,使你修改的手数是手数的倍数 MarketInfo(Symbol(),MODE_LOTSTEP) 18081961 2012.12.19 20:45 #15 RaptorUK:我怀疑这将会给你带来问题 . .例如,如果结果是1.12316734 手,你在5位数的面值上的NormalizeDouble()将把它变成1.12316,这将不符合Lot Step的要求。......你需要使用一些数学方法来使你修改的手数是手数的倍数 MarketInfo(Symbol(),MODE_LOTSTEP) 嗨,RaptorUK。关于你的建议,我正在寻找保持我的手数是手数的倍数的方法,我正在寻找关于这个问题的文件。现在我有另一个问题(更多的问题...)为了在当前价格之上和之下建立订单,我想使用一条线,一旦Ea开始运行,我就将价格与仍然存在的线进行比较。第一个问题来了,我怎么能用价格的差异来比较这条线?这是我到目前为止的代码。在这里,我怎样才能给出比较的名称,因为如果我把iHigh放在priceline后面,它就不起作用了。谢谢你在这些问题上提供的任何线索。路易斯priceline=iHigh(Symbol(),0,0); ObjectCreate("highline",OBJ_HLINE,0,0,Bid); ObjectSet("highline",OBJPROP_COLOR,LimeGreen); ObjectSet("highline",OBJPROP_WIDTH,1); WindowRedraw();这似乎根本不起作用(...)if(Bid > priceline+Distance*pt) { // Open buy order while(IsTradeContextBusy()) Sleep(10); RefreshRates(); Ticket=OrderSend(Symbol(),OP_BUY,LotSize,Ask,UseSlippage,0,0,"Buy Order",MagicNumber,0,Green); if(Ticket>0)AddLimitsBuy(); }我把删除对象放在这里,因为我需要在关闭所有订单时删除这一行,我这样做对吗?void CloseAll() { int i,Op,Error; int Total=OrdersTotal(); if(Total>0) { for(int pos=OrdersTotal()-1;pos>=0;pos--) if(OrderSelect(pos,SELECT_BY_POS) && OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol()) { Op=OrderType(); if(Op==OP_BUY) { OrderClose(OrderTicket(),OrderLots(),Bid, UseSlippage, Yellow); } if(Op==OP_SELL) { OrderClose(OrderTicket(),OrderLots(),Ask, UseSlippage, Yellow); } else { ObjectDelete("highline"); } } } } Simon Gniadkowski 2012.12.19 21:05 #16 luisneves:这似乎根本不起作用 (...)我把删除对象放在这里,因为我需要在关闭所有订单时删除这一行,我这样做对吗? 好的,我想我明白你想做什么,你想检查Bid与你的线相比的位置,要做到这一点,你需要得到线的位置 ... ...使用ObjectGet() 的对象名称和对象属性索引OBJPROP_TIME1,这将返回线所处的价格。 你的ObjectDelete()调用在我看来没有问题,我特别不喜欢使用ObjectsDeleteAll(),我认为它既懒惰又危险 ......或者至少给别人带来了不便。 18081961 2012.12.20 10:06 #17 RaptorUK:好的,我想我明白你想做什么,你想检查Bid与你的线相比的位置,要做到这一点,你需要得到线的位置 ...... 使用ObjectGet(),对象名称和对象属性索引OBJPROP_TIME1,这将返回线所处的价格。 你的ObjectDelete()调用在我看来没有问题。 嗨,RaptorUK。我试图关闭所有的订单,如果有一个订单获利平仓,但当这种情况发生时,一个挂单仍然开放,但关闭的指令包含在CloseAll()函数中。关于这个问题有什么线索吗?谢谢你提供的任何帮助。路易斯int GoToClose() { int pos; { for(int Profit=OrdersTotal()-1;pos>=0;pos--) if(OrderSelect(Profit,SELECT_BY_POS) && OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol() && OrderProfit()+OrderSwap()+OrderCommission()>0||OrdersTotal()> MaxOrders)CloseAll(); } } //+---------------------------------------------------------------------------+ void CloseAll() { int Op,Error; for(int pos=OrdersTotal()-1;pos>=0;pos--) if(OrderSelect(pos,SELECT_BY_POS) && OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol()) { Op=OrderType(); if(Op==OP_BUY) { RefreshRates(); OrderClose(OrderTicket(),OrderLots(),Bid, UseSlippage, Yellow); } if(Op==OP_SELL) { RefreshRates(); OrderClose(OrderTicket(),OrderLots(),Ask, UseSlippage, Yellow); } if(Op==OP_SELLSTOP||OP_BUYSTOP||OP_SELLLIMIT||OP_BUYLIMIT) { RefreshRates(); OrderDelete(OrderTicket()); } else Print("Error opening BUY Stop Order : ",GetLastError()); } } Simon Gniadkowski 2012.12.20 10:33 #18 luisneves: 嗨,RaptorUK。我试图关闭所有的订单,如果有一个订单获利平仓,但当这种情况发生时,一个挂单仍然开放,但关闭的指令包含在CloseAll()函数中。关于这个问题有什么线索吗? 你需要了解表达式是如何工作的......你不能这样做......。if(Op == OP_SELLSTOP || OP_BUYSTOP || OP_SELLLIMIT || OP_BUYLIMIT)这是一个类似的情况,但不完全相同:https://www.mql5.com/en/forum/141790......的结果是什么? WhatValue = (5 || 4 || 3 || 2 );|| 是一个布尔运算符,所以只对布尔起作用 . . 这个结果是一个bool的结果值 . .( Op == OP_SELLSTOP ). .. 如果你想在你的值上使用位操作符,那么你可以使用这个 . . .int WhatValue = (5 | 4 | 3 | 2 );. . . . 但这不是你想做的事。 18081961 2012.12.20 10:52 #19 RaptorUK:你需要了解表达式是如何工作的......你不能这样做......。这与这个情况类似,但不完全相同:https://www.mql5.com/en/forum/141790 什么是结果......。 || 是一个布尔运算符,所以只对布尔运算有效 . . 这个结果是一个bool的结果值... .... .. 如果你想在你的值上使用位操作符,那么你可以使用这个 . . .. . . 但这并不是你想做的事。 嗨,RaptorUK。我明白了,但现在考虑到这一点,我已经修改了代码,挂单仍然存在......void CloseAll() { int Op,Error; for(int pos=OrdersTotal()-1;pos>=0;pos--) if(OrderSelect(pos,SELECT_BY_POS) && OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol()) { Op=OrderType(); if(Op==OP_BUY) { RefreshRates(); OrderClose(OrderTicket(),OrderLots(),Bid, UseSlippage, Yellow); } if(Op==OP_SELL) { RefreshRates(); OrderClose(OrderTicket(),OrderLots(),Ask, UseSlippage, Yellow); } if(Op==OP_SELLSTOP) { RefreshRates(); OrderDelete(OrderTicket()); } if(Op==OP_BUYSTOP) { RefreshRates(); OrderDelete(OrderTicket()); } else Print("Error opening BUY Stop Order : ",GetLastError()); } } Simon Gniadkowski 2012.12.20 11:23 #20 luisneves: 嗨,RaptorUK。我明白了,但现在考虑到这一点,我已经修改了代码,挂单仍然存在。 如果它有一个与MagicNumber 不同的Magic Number,或者它是针对EA运行的符号以外的符号,或者如果它是一个OP_SELLLIMIT或OP_BUYLIMIT,都有可能。......另外,你需要检查你的OrderDelete()和OrderClose()调用的返回值。 你为什么需要调用RefreshRates()? 我并不是说要把它们去掉,但你能解释一下你为什么要在这里调用RefreshRates()吗?什么是函数的返回值?我如何使用它们? 1234 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
你不能这样做来调整4/5位数经纪商的滑点,这毫无意义。
滑点必须是一个int,所以是一个整数,对于4位数的经纪商,滑点是以Pips为单位的,所以滑点=3意味着3个Pips,对于5位数的经纪商,滑点是以点数为单位的,所以滑点=3意味着3点或0。所以为了补偿,对于5位数的经纪商,滑点数字必须乘以10,即30 ... 30点=3点。
所以这个代码是错误的 ... .
试试这个修改后的OpenOppositeOrder()函数. .
试试这个修改后的OpenOppositeOrder()函数 . .
嗨,RaptorUk。
在这之前,感谢您到目前为止提供的帮助。现在EA开始工作了。我已经做了其他的修改,如果一个订单有利润,如何关闭所有的订单,这是确定的,但正如你已经看到的和预测的,这个策略的工作是必要的,达到利润的订单的手数增加,以弥补以前的订单。 所以我在这里处理一个混乱。我需要确认上一个订单是否有利润,我想用OrderProfit()的方式来调整下一个订单的手数,但是,难道我不需要关闭前一个订单来获得这个信息吗?
这里是打开一个相反订单的代码,工作正常(感谢您),在这里我引入了额外的代码,以发现之前的订单是否有利润。我的方法正确吗?
谢谢你
路易斯
嗨,RaptorUk。
首先感谢你们到目前为止所提供的帮助。现在EA开始工作了。我已经做了其他的修改,如果一个订单有利润,如何关闭所有的订单,这是确定的,但正如你已经看到的和预测的,这个策略的工作是必要的,达到利润的订单的手数增加,以补偿以前的订单。 所以我在这里处理一个混乱的问题。我需要确认上一个订单是否有利润,我想用OrderProfit()的方式来调整下一个订单的手数,但是,难道我不需要关闭前一个订单来获得这个信息吗?
这里是打开一个相反订单的代码,工作正常(感谢您),在这里我引入了额外的代码,以发现之前的订单是否有利润。我的方法是否正确?
我怀疑这将会给你带来问题 . .
例如,如果结果是1.12316734 手,你在5位数的平价上的NormalizeDouble()将把它改为1.12316,这将不符合手数步骤的要求。. ...你需要使用一些数学方法,使你修改的手数是手数的倍数 MarketInfo(Symbol(),MODE_LOTSTEP)
我怀疑这将会给你带来问题 . .
例如,如果结果是1.12316734 手,你在5位数的面值上的NormalizeDouble()将把它变成1.12316,这将不符合Lot Step的要求。......你需要使用一些数学方法来使你修改的手数是手数的倍数 MarketInfo(Symbol(),MODE_LOTSTEP)
嗨,RaptorUK。
关于你的建议,我正在寻找保持我的手数是手数的倍数的方法,我正在寻找关于这个问题的文件。
现在我有另一个问题(更多的问题...)
为了在当前价格之上和之下建立订单,我想使用一条线,一旦Ea开始运行,我就将价格与仍然存在的线进行比较。
第一个问题来了,我怎么能用价格的差异来比较这条线?
这是我到目前为止的代码。在这里,我怎样才能给出比较的名称,因为如果我把iHigh放在priceline后面,它就不起作用了。
谢谢你在这些问题上提供的任何线索。
路易斯
这似乎根本不起作用(...)
我把删除对象放在这里,因为我需要在关闭所有订单时删除这一行,我这样做对吗?
这似乎根本不起作用 (...)
我把删除对象放在这里,因为我需要在关闭所有订单时删除这一行,我这样做对吗?
好的,我想我明白你想做什么,你想检查Bid与你的线相比的位置,要做到这一点,你需要得到线的位置 ... ...使用ObjectGet() 的对象名称和对象属性索引OBJPROP_TIME1,这将返回线所处的价格。
你的ObjectDelete()调用在我看来没有问题,我特别不喜欢使用ObjectsDeleteAll(),我认为它既懒惰又危险 ......或者至少给别人带来了不便。
好的,我想我明白你想做什么,你想检查Bid与你的线相比的位置,要做到这一点,你需要得到线的位置 ...... 使用ObjectGet(),对象名称和对象属性索引OBJPROP_TIME1,这将返回线所处的价格。
你的ObjectDelete()调用在我看来没有问题。
嗨,RaptorUK。
我试图关闭所有的订单,如果有一个订单获利平仓,但当这种情况发生时,一个挂单仍然开放,但关闭的指令包含在CloseAll()函数中。关于这个问题有什么线索吗?
谢谢你提供的任何帮助。
路易斯
嗨,RaptorUK。
我试图关闭所有的订单,如果有一个订单获利平仓,但当这种情况发生时,一个挂单仍然开放,但关闭的指令包含在CloseAll()函数中。关于这个问题有什么线索吗?
你需要了解表达式是如何工作的......你不能这样做......。
if(Op == OP_SELLSTOP || OP_BUYSTOP || OP_SELLLIMIT || OP_BUYLIMIT)
这是一个类似的情况,但不完全相同:https://www.mql5.com/en/forum/141790
......的结果是什么?
|| 是一个布尔运算符,所以只对布尔起作用 . .
这个结果是一个bool的结果值 . .
. .. 如果你想在你的值上使用位操作符,那么你可以使用这个 . . .
. . . . 但这不是你想做的事。
你需要了解表达式是如何工作的......你不能这样做......。
这与这个情况类似,但不完全相同:https://www.mql5.com/en/forum/141790
什么是结果......。
|| 是一个布尔运算符,所以只对布尔运算有效 . .
这个结果是一个bool的结果值... ...
. .. 如果你想在你的值上使用位操作符,那么你可以使用这个 . . .
. . . 但这并不是你想做的事。
嗨,RaptorUK。
我明白了,但现在考虑到这一点,我已经修改了代码,挂单仍然存在......
嗨,RaptorUK。
我明白了,但现在考虑到这一点,我已经修改了代码,挂单仍然存在。
如果它有一个与MagicNumber 不同的Magic Number,或者它是针对EA运行的符号以外的符号,或者如果它是一个OP_SELLLIMIT或OP_BUYLIMIT,都有可能。......另外,你需要检查你的OrderDelete()和OrderClose()调用的返回值。
你为什么需要调用RefreshRates()? 我并不是说要把它们去掉,但你能解释一下你为什么要在这里调用RefreshRates()吗?
什么是函数的返回值?我如何使用它们?