2016-06-13 61 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