多个订单问题 - 页 2

 

你好,Raptor。

在Tester中,当TrailingStop关闭时,所有订单都会关闭,但在Demo中,只有通过TrailingStop关闭的订单才会关闭,任何未平仓的订单仍旧开放。

在你建议的代码之上使用以下代码,其逻辑是。

"找到最后一个订单的条件,如果是平仓,那么执行代码开始关闭所有剩余的未平仓订单。"

有什么线索表明为什么会发生这种情况?

致以最崇高的敬意

路易斯

int OrdType, GLError;
   double OrderClosed;
   RefreshRates();
   
    for(int Closed = OrdersTotal()-1;Closed >= 0; Closed--) 
      if(OrderSelect(Closed,SELECT_BY_POS,MODE_HISTORY)
        && OrderMagicNumber()== MagicNumber
        && OrderSymbol()== Symbol())
        {//29
        OrderClosed = OrderCloseTime();
        if(OrderClosed!=0)
           {//30                                  
   for(int OrderPos = OrdersTotal()-1; OrderPos >= 0; OrderPos--)       
      if(OrderSelect(OrderPos, SELECT_BY_POS, MODE_TRADES)
         && OrderMagicNumber()== MagicNumber 
         && OrderSymbol()== Symbol())                                       
         {//31
         OrdType = OrderType();
         if(OrdType == OP_BUY || OrdType==OP_SELL)
           {//32
           if(!OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(),RealSlippage, Yellow))
               GLError = GetLastError();
           }//32                                         
          }//31
       }//30
     }//29 
    
  if(GLError > 0) Print("Error Closing/Deleting Order, error # ", GLError, " for ticket: ", OrderTicket());           
  return(0);
  }//0 
 
luisneves:

你好,Raptor。

在Tester中,当TrailingStop关闭时,所有的订单都被关闭,但在Demo中,只有通过TrailingStop关闭的订单才会关闭,任何未平仓的订单仍旧开放。

在你建议的代码之上使用以下代码,其逻辑是。

"找到最后一个订单的条件,如果是平仓,那么执行代码开始关闭所有剩余的未平仓订单。"

有什么线索表明为什么会发生这种情况?

你不能这样做....

    for(int Closed = OrdersTotal()-1;Closed >= 0; Closed--)    // OrdersTotal is the total of open orders
      if(OrderSelect(Closed,SELECT_BY_POS,MODE_HISTORY)        //  this is looping through the closed orders

也许你想用OrderssHistoryTotal() 已关闭订单 的OrderCloseTime()永远不会==0

 
luisneves:

.....

我在代码中使用BuyTicket和SellTicket来避免开多个订单,但似乎这不是正确的方法。

.....

当有条件开启第三个 订单时,问题就来了,等等。在这里,尽管有开仓的条件,而且代码对第二笔开仓处理得很好,但为什么代码在这里不起作用?

我知道你稍微改变了最初的主题,也许第一个问题已经讨论到了尽头(对我来说,这很好)。
如果你还想跟进最初的问题,你必须解释一下,因为我不太明白你在寻找什么。

我所调整的第一个片段可以防止代码打开多个订单。你似乎对它不满意,因此你删除了(或只是没有添加)它,但通过使用BuyTicket和SellTicket做类似的事情。
那么你说的是第三个订单......你要找的是这样的东西吗?

买->卖->买->卖->买
但要防止
买入->买入->卖出->买入->买入

换句话说,如果上一个开仓的订单是买入订单,那么下一个就必须是卖出,反之亦然?

或者你的EA应该开的最大订单量是多少?是不是2个,一个卖出,如果满足相反订单的条件,一个买入,但如果再次从买入触发点反弹,就不再是卖出?
如果这是真的,我在你最初的代码中加入的OpenOpposite计数器的问题是什么?

编辑。

我可以想象的第三个选项是,如果第一个相反的订单被止损了,你想再开一个相反的订单?
所以像这样。

买入->卖出->如果卖出已被阻止->卖出->如果卖出已被阻止->卖出

 
kronin:

我知道你稍微改变了最初的主题,也许第一个问题已经讨论完了(这对我来说很好)。
如果你还想跟进最初的问题,你必须解释一下,因为我不太明白你在寻找什么。

我所调整的第一个片段可以防止代码打开多个订单。你似乎对它不满意,因此你删除了(或只是没有添加)它,但通过使用BuyTicket和SellTicket做类似的事情。
那么你说的是第三个订单......你要找的是这样的东西吗?

买->卖->买->卖->买
但要防止
买入->买入->卖出->买入->买入

换句话说,如果上一个开仓的订单是买入订单,那么下一个就必须是卖出,反之亦然?

或者你的EA应该开的最大订单量是多少?是不是2个,一个卖出,如果满足相反订单的条件,一个买入,但如果再次从买入触发点反弹,就不再是卖出?
如果这是真的,我在你最初的代码中加入的OpenOpposite计数器的问题是什么?

编辑。

我可以想象的第三个选项是,如果第一个相反的订单被止损了,你想再开一个相反的订单?
所以像这样。

买入->卖出->如果卖出已被止损->卖出->如果卖出已被止损->卖出


嗨,Kronin。

感谢你在这个问题上抽出时间来支持我。

该策略遵守这一逻辑。

假设第一笔订单是买入,然后通过追踪止损(TrailingStop)平仓,但是如果买入价(Bid)在订单开盘价(ReturnDistance)下反弹了一些点,卖出将打开,并通过追踪止损(TrailingStop)平仓,同样如果买入价(Ask)在订单开盘价之上反弹了一些点,则买入将打开。当最后一个订单通过追踪止损平仓或达到最大订单设置(7个)时,这个乒乓过程将结束。

多次开仓的问题发生在价格上升和下降跨越OrderOpenPrice的时候。因此,如果我们有一个买入,下一个订单可能是一个卖出,等等。

关于您之前的帮助,也许我没有很好地解释我的问题。任何提供的帮助对我来说都是最有价值的。

致以最美好的祝愿

路易斯

 

路易斯,我在你的代码上花了不少时间,但说实话,我并不确定我是否能达到你的要求。

请看附件。最终确定/修改它,测试它,了解它....,并告诉我至少它的工作原理接近、类似或完全是你所寻找的。我对这个策略还不是很确定。
请先不要添加新的功能(不要重新添加martingale)。代码已经够大了,你还有很多工作要做,要让它可靠地运行。
我不得不说,这段代码没有更清晰的安排。我不想改变你的运行部分(甚至你需要一个更好的错误处理)。我评论了一些部分,移动了一些部分,但它们都还在那里......


祝你愉快...

附加的文件:
 
kronin:

路易斯,我在你的代码上花了很多时间,但说实话,我不太确定我是否能做到你想要的。

请看附件。最后确定/修改它,测试它,理解它....,并告诉我至少它的工作原理与你所寻找的接近,类似或完全不同。我对这个策略还不是很确定。
请先不要添加新的功能(不要重新添加martingale)。代码已经够大了,你还有很多工作要做,要让它可靠地运行。
我不得不说,这段代码没有更清晰的安排。我不想改变你的运行部分(甚至你需要一个更好的错误处理)。我评论了一些部分,移动了一些部分,但它们都还在那里......


祝你愉快...


嗨,克罗尼。

在所有这些之前,我最感谢你花时间来支持我的问题。

虽然我相信你已经尽了最大的努力去理解这个策略,但有些事情还没有完全反应过来(当然是由于我对这个问题缺乏了解)。

我已经做了一些修改,购买了你的建议,但不确定是否做得正确。

有两个问题。

1 - 我们的想法是,一旦交易被追踪止损关闭,所有剩余的未平仓订单都应该关闭。这些订单不应该在止盈时关闭(止盈之所以存在是因为我想确定它是在冻结区)。所以我想用最后一个订单的收盘价来运行CloseAll函数(在尝试这样做时出现了一些愚蠢的事情...)。你使用最后关闭的票据来运行未平仓订单的关闭,但我不明白当交易通过追踪止损关闭时是否会发生这种情况......

2 - "乒乓 "不工作,至少在测试器中是这样。

在附件中是我所理解的进行了修改的文件。

谢谢你的耐心和时间。(更多信息在私人信息 中)

致以最崇高的敬意

路易斯

附加的文件:
 

好的,我已经改变了算法,在SL而不是TP上关闭所有订单。(变化是将"<"替换为">"--你应该找到这个地方)。

乒乓对我来说确实有效,我只让它在测试器中以视觉模式运行。但我已经调整了你的输入参数,使其不是所有的订单都在几乎相同的时间打开。也许你必须验证默认参数。

它从最初的订单开始(我已经改变了print()语句),然后做相反的订单。

EURUSD,M1: open #1 buy 0.01 EURUSD at 1.43310 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.43200 OK
EURUSD,M1:下达2号相反的卖出指令
EURUSD,M1: 修改#2卖出0.01 EURUSD at 1.43200 sl: 1.43700 tp: 1.43000 ok
EURUSD,M1: 打开#3买入0.01 EURUSD在1.43300 OK
EURUSD,M1:下达3号相反的买入指令
EURUSD,M1: 修改#3买入0.01 EURUSD at 1.43300 sl: 1.42800 tp: 1.43500 ok

我在OpenOppositeOrder()中加入了返回,当我打开一个订单时。通过设置,我可以开出一个买单,并在同一时间开出一个卖单。这导致了MaxOrder的不可靠。
也许更好的方法是,把它分成两个函数,或者给这个函数一个参数,只对卖单或买单运行。

btw. 你上传的代码没有交易!所有的交易都因为 "无效的LotSize "而失败....。

附加的文件:
 

嗨,克罗尼。

谢谢你花时间来支持我。

关于 "你上传的代码没有交易!所有交易都失败了,因为'无效的手数'....",这是将MM代码移到文件末尾后发生的。我在代码的开头使用了MM();函数 的调用,似乎这种操作不起作用,但你发送的最后一段代码是有效的,MM()函数仍然在同一位置,并且是有效的,所以我在这里失去了....。

关于在同一个点上开仓的问题。

当EA进入图表时,它必须比当时的价格更多(或更少),这意味着当价格上升(或下降)时,OpenDistance买入(或卖出)订单会发生。从这里开始,当价格从OrderOpenPrice减去ReturnDistance后反弹下来时(如果最后一个订单是买入),下一个开盘就可以发生了,如果最后一个订单是卖出,也是同样的逻辑。也许必须有一个限制,以避免任何超出这个逻辑的开仓订单。

致以最崇高的敬意

路易斯

 
//mine
LotSize = (RiskAmount / StopLoss) / TickValue;              //Phil: LotSize is defined in global scope

//yours
double LotSize = (RiskAmount / StopLoss) / TickValue;


你在全局范围内定义了LotSize并将其初始化为0。在void MM()函数 中,你计算了一个只在该函数中有效的LotSize。我只删除了初始化,所以全局范围内的变量被更新了。

你能不能对每一个数值进行评论,以点为单位?

extern double StopLoss       =  50;
extern double TakeProfit     =  20;
extern double TrailingStop   =   2;
extern int    MinimumProfit  =   3;
extern int    Slippage       =   3;
extern double OpenDistance   =   2;
extern double ReturnDist     =   1;
extern double MinStop        =   1;

你想运行EA的符号的点差是多少?

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

试着做同样的事情,让它在测试器中以视觉模式运行。

 
kronin:


你在全局范围内定义了LotSize并将其初始化为0。在void MM()函数中,你计算了一个只在该函数中有效的LotSize。我只删除了初始化,所以全局范围内的变量被更新了。

你能不能对每一个数值进行评论,以点为单位?

你想运行EA的符号的点差是多少?

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

试着做同样的事情,让它在测试器中以视觉模式运行。


嗨,克罗尼。

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

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

int init ()// Adjust for 4 or 5 digits.
   {
   if (Digits == 2 || Digits == 4) <------- not compatible with metals
      {
      pt = Point;
      RealSlippage = Slippage;
      }    
   if (Digits == 3 || Digits == 5) 
      {
      pt = Point * 10;
      RealSlippage = Slippage * 10;
      }

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

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

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

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

你在代码中写道。

OTLastTick=OTCurrentTick;                      //shift OrderTotal
  OTCurrentTick=OrdersTotal();                   //reinit OrderTotal
  if(OTCurrentTick>0)Trail();                    //Trail
  if(OTLastTick>=2                               //if OrderTotal has changed
     &&OTCurrentTick<OTLastTick
     &&OTCurrentTick>0){CloseAllOnSL();return;}  //Check order closed on SL level
  if(OTCurrentTick>=MaxOrders)return;            //Dont open more orders. Trail and return.
                                                 //Actually we have nothing more to do.
                                                 //Only call opposite if the initial order of the serie is open
  if(OTCurrentTick>0)OpenOppositeOrder(); //<--------------------- include this line to call function (not sure if this the right method to do it...)
  MM();                //<--------------------- include this line to call function (not sure if this the right method to do it...)
                        
  if(OTCurrentTick==0){//init serie
     BuyAllowed=true;
     SellAllowed=true; 

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

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

致以最崇高的敬意

路易斯