2016-06-13 68 views
0

我在交换机中有一堆情况。我需要将代码一次留在一个案例中,直到满足特定条件,然后我想告诉它要去哪个案例。我目前有这种情况发生,这不会导致错误,但它确实会导致我正在使用的程序不断加载并永远不会执行。C#在交换机中重复一个特定的情况

我需要的标准是布尔语句“激活”,直到它,我希望代码留在案例中。

有很多代码丢失,所以它可能没有意义,但我想知道是否有更好的方法来做到这一点。

另外,在你问之前,我还是一个初学者,我知道每个人都讨厌goto语句。如果你可以提出替代方案,我会倾听。

谢谢你明智的。

if(CurrentPosition.Value != 0){ 
      switch(location) 
      { 

       case 0: 
        if(criteria1 && criteria2) 
        { 
         LimitLongsPT.Send(S1 + ((R1 - S1) * BuffZone)); 
         LongStopSA.Send(S1 - StopAmount); 
         ShortStopDeep.Send(R1 + StopAmount); 
         TradeManager.ProcessEvents(); 
         if(activated == true) 
         { 
          if(PublicFunctions.DoubleEquals(CurrentPosition.Value, 0)) 
          { 
           break; 
          } 
          if(PublicFunctions.DoubleLess(CurrentPosition.Value, 0)) 
          { 
           if(PublicFunctions.DoubleGreater(MP[0], S1) && PublicFunctions.DoubleLess(MP[0], R1)) 
           { 
            goto case 15; 
           } 
           if(PublicFunctions.DoubleGreater(MP[0], R1) && PublicFunctions.DoubleLess(MP[0], R2)) 
           { 
            goto case 16; 
           } 
           if(PublicFunctions.DoubleGreater(MP[0], S2) && PublicFunctions.DoubleLess(MP[0], S1)) 
           { 
            goto case 23; 
           } 
          } 
          if(PublicFunctions.DoubleGreater(CurrentPosition.Value, 0)) 
          { 
           if(PublicFunctions.DoubleGreater(MP[0], R1) && PublicFunctions.DoubleLess(MP[0], R2)) 
           { 
            goto case 1; 
           } 
          } 
         } 
        } 
        **goto case 0;** 
       case 1: 
        if(PublicFunctions.DoubleGreater(CurrentPosition.Value, 0) && PublicFunctions.DoubleGreater(MP[0], R1) && PublicFunctions.DoubleLess(MP[0], R2)) 
        { 
+3

或多或少,你似乎已经在那里的角落编码了;因为你切换了一件事,然后如果......另一件事;考虑到“情况23”,它似乎也是这个功能是巨大的。您需要分解代码并仔细考虑代码中的每个行为,以便可以封装它。这将有助于在相关条件下使用逻辑的原子位。 – zaitsman

+5

在这种情况下'goto'的替代方法是一个_state machine_,其中'switch'块随时间执行多次。 'goto'通常是设计不佳的标志,你喜欢折磨小猫;) – MickyD

+1

这听起来像标准变量随着时间的推移在这里变化。你有什么情况0:goto case 0是一个循环。你有没有考虑重构成一个while循环? – Assaf

回答

1

您需要将交换机放在while循环中,并将“location”设置为接下来的任何内容。

if(CurrentPosition.Value != 0){ 
     while (location > -1) { 
      switch(location) 
      { 

       case 0: 
        if(criteria1 && criteria2) 
        { 
         LimitLongsPT.Send(S1 + ((R1 - S1) * BuffZone)); 
         LongStopSA.Send(S1 - StopAmount); 
         ShortStopDeep.Send(R1 + StopAmount); 
         TradeManager.ProcessEvents(); 
         if(activated == true) 
         { 
          if(PublicFunctions.DoubleEquals(CurrentPosition.Value, 0)) 
          { 
           location = -1; 
           break; 
          } 
          if(PublicFunctions.DoubleLess(CurrentPosition.Value, 0)) 
          { 
           if(PublicFunctions.DoubleGreater(MP[0], S1) && PublicFunctions.DoubleLess(MP[0], R1)) 
           { 
            location = 15; 
            break; 
           } 
           if(PublicFunctions.DoubleGreater(MP[0], R1) && PublicFunctions.DoubleLess(MP[0], R2)) 
           { 
            location = 16; 
            break; 
           } 
           if(PublicFunctions.DoubleGreater(MP[0], S2) && PublicFunctions.DoubleLess(MP[0], S1)) 
           { 
            location = 23; 
            break; 
           } 
          } 
          if(PublicFunctions.DoubleGreater(CurrentPosition.Value, 0)) 
          { 
           if(PublicFunctions.DoubleGreater(MP[0], R1) && PublicFunctions.DoubleLess(MP[0], R2)) 
           { 
            location = 1; 
            break;; 
           } 
          } 
         } 
        } 
        location = 0; 
        break; 
       case 1: 
        if(PublicFunctions.DoubleGreater(CurrentPosition.Value, 0) && PublicFunctions.DoubleGreater(MP[0], R1) && PublicFunctions.DoubleLess(MP[0], R2)) 
        { 

虽然我个人会避免做出如此大的混乱,并使它更平坦一点。如果那是你需要的,也许看看State Machine