확인 - 내가 무엇을 잘못 했습니까?

 

나는 코드를 작성

 int GetN()
{
   int n = 0 ;
   for ( int i = OrdersHistoryTotal() - 1 ; i >= 0 ; i--)
   {
       if ( OrderSelect (i, SELECT_BY_POS, MODE_HISTORY) && OrderMagicNumber() == Magic && OrderSymbol() == _Symbol )
      {
         bool profit = OrderType() == OP_BUY ? OrderClosePrice() > OrderOpenPrice() : OrderClosePrice() < OrderOpenPrice();
         
         bool loss = OrderType() == OP_BUY ? OrderClosePrice() < OrderOpenPrice() : OrderClosePrice() > OrderOpenPrice();
         
         bool neutral = OrderClosePrice() == OrderOpenPrice();

            SumPosOrder = OrderLots();
            Tiket2 = OrderTicket();
           }


         if (loss)
           {
            n++;
            ObchMin = ObchMin + SumPosOrder; // Подсчет общего минуса
            Minus++;                         //Подсчет отрицательных сделок
            Sdelok++;                         //Подсчет количества сделок
           }

         if (n >= MartinSteps)
           {
            n = 0 ;
             break ;
           }

         if (profit)
           {
            ObchPlus = ObchPlus + (SumPosOrder * 0.8 ); // Расчет для Бинарных опционов поэтому умножаю на 0,8
           }

         if (profit && ObchPlus < ObchMin)
           {
            n++;
            Pobeda++;
            Sdelok++;
           }



         if (profit && ObchPlus > ObchMin)
           {
            ObchPlus = 0 ;
            ObchMin = 0 ;
            Pobeda++;
            Sdelok++;
            n = 0 ;
             break ;
           }
        }
     
   return n;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double SelectVolume( int n)
  {
   return
      n == 0 ? Volume1
      : n == 1 ? Volume2
      : n == 2 ? Volume3
      : n == 3 ? Volume4
      : n == 4 ? Volume5
      : n == 5 ? Volume6
      : n == 6 ? Volume7
      : n == 7 ? Volume8
      : n == 8 ? Volume9
      : n == 9 ? Volume10
      : Volume1;
  }
//+------------------------------------------------------------------+

작업은 원래 다음과 같습니다.
마지막으로 마감된 주문을 찾습니다.
플러스 또는 마이너스로 닫혀 있는지 확인하십시오.
거래 수 계산
플러스와 마이너스의 수를 세십시오.

베팅 금액을 계산합니다.


거래가 양수이면(그리고 총 빼기 = 0) 베팅 #1
거래가 음수이면 마이너스를 고려하고 2번을 입찰합니다.
플러스이지만 마이너스 > 0이면 다음 베팅입니다.
그런데 어떤 이유로 내기 횟수와 내기 금액을 올바르게 계산하지 않습니다 ...

 

예를 들어 문자열

 bool neutral = OrderClosePrice() == OrderOpenPrice();

아마도 다음과 같이 알고리즘 조건의 작업을 구성하는 것이 필요합니다.

   bool neutral=false;

   if(NormalizeDouble(OrderClosePrice(),_Digits) == NormalizeDouble(OrderOpenPrice(),_Digits)neutral=true;

글쎄, 같은 정신의 다른 두 조건

 

그건 그렇고, 역사상 마지막 거래가 항상 마지막 거래는 아닙니다.

 
Nikita Chernyshov # :

그건 그렇고, 역사상 마지막 거래가 항상 마지막 거래는 아닙니다.

예, 시간별로 선택 항목을 제거했지만 아직까지는 작동하지 않습니다 ...
레나트 아크티아모프 # :

예를 들어 문자열

아마도 다음과 같이 알고리즘 조건의 작업을 구성하는 것이 필요합니다.

   bool neutral=false;

   if(NormalizeDouble(OrderClosePrice(),_Digits) == NormalizeDouble(OrderOpenPrice(),_Digits)neutral=true;

글쎄, 같은 정신의 다른 두 조건

이전에 다른 시스템에서 이 블록을 사용했는데 이 부분에서 완벽하게 작동했습니다.
그러나 물론 여전히 확인하고 다시 작성합니다. 결과를 알려드리겠습니다.
 
Natalya Smirnova # :
예, 시간 샘플링을 제거했지만 아직 작동하지 않습니다. 이전에 다른 시스템에서 이 블록을 사용했는데 이 부분에서 완벽하게 작동했습니다.
그러나 물론 여전히 확인하고 다시 작성합니다. 결과를 알려드리겠습니다.

이 변수가 어딘가에 0으로 설정되어 있습니까?

            ObchMin = ObchMin + SumPosOrder; // Подсчет общего минуса
            Minus++;                         //Подсчет отрицательных сделок
            Sdelok++;                         //Подсчет количества сделок
 
Renat Akhtyamov # :

이 변수가 어딘가에 0으로 설정되어 있습니까?

예, 시작 시 값은 0입니다.
그리고 완료까지.
 
Renat Akhtyamov # :

이 변수가 어딘가에 0으로 설정되어 있습니까?

어쩌면 다른 방향으로 갈 수도 있습니다.
지금은 이 함수에서 통계 모음을 제거하고 다른 함수에서 일반 빼기 및 통계를 제거합니다(별도의 함수를 생성하겠습니다).

나는 블록으로 씁니다.

통계 수집 및 빼기 및 더하기(빼기 및 더하기 전역 변수)를 계산하기 위한 블록

 if ( OrderSelect ((OrdersHistoryTotal() - 1 ), SELECT_BY_POS, MODE_HISTORY) && OrderMagicNumber() == Magic && OrderSymbol() == _Symbol )
              {
               if (OrderTicket() != Tiket2)
                 {
                   bool profit1 = false ;
                   if (OrderClosePrice() > 0 )
                    {
                     profit1 = true ;
                    }
                   bool loss1 = false ;
                   if (OrderClosePrice() < 0 )
                    {
                     loss1 = true ;
                    }


                  SumPosOrder = OrderLots();
                  Tiket2 = OrderTicket();
                   Print (OrderCloseTime());
                 


               if (loss1)
                 {
                  ObchMin = ObchMin + SumPosOrder;
                  Minus++;
                  Sdelok++;
                 }



               if (profit1)
                 {
                  ObchPlus = ObchPlus + (SumPosOrder * 0.8 );
                 }

               if (profit1 && ObchPlus < ObchMin)
                 {

                  Pobeda++;
                  Sdelok++;
                 }




               if (profit1 && ObchPlus > ObchMin)
                 {
                  ObchPlus = 0 ;
                  ObchMin = 0 ;
                  Pobeda++;
                  Sdelok++;

                 }
}


비율 계산(보다 정확하게는 샘플링)을 위한 변수 n의 블록 2 선택

 int GetN()
  {
   int n = 0 ;
   for ( int i = OrdersHistoryTotal() - 1 ; i >= 0 ; i--)
     {
       if ( OrderSelect (i, SELECT_BY_POS, MODE_HISTORY) && OrderMagicNumber() == Magic && OrderSymbol() == _Symbol )
        {
         bool profit = false ;
         if (OrderClosePrice() > 0 )
            profit = true ;

         bool loss = false ;
         if (OrderClosePrice() < 0 )
            loss = true ;


        }


       if (loss)
        {
         n++;
        }

       if (n >= MartinSteps)
        {
         n = 0 ;
         break ;
        }

      

       if (profit && ObchPlus < ObchMin)
        {
         n++;
        }



       if (profit && ObchPlus > ObchMin)
        {
         n = 0 ;
         break ;
        }
     }

   Print (n);

   return n;
  }


double SelectVolume( int n)
  {
   return
      n == 0 ? Volume1
      : n == 1 ? Volume2
      : n == 2 ? Volume3
      : n == 3 ? Volume4
      : n == 4 ? Volume5
      : n == 5 ? Volume6
      : n == 6 ? Volume7
      : n == 7 ? Volume8
      : n == 8 ? Volume9
      : n == 9 ? Volume10
      : Volume1;
  }
//+------------------------------------------------------------------+


아마 맞을거에요...

 

논리를 이해할 때까지

어떻게 그렇게?

 bool profit = false ;
         if (OrderClosePrice() > 0 )
            profit = true ;

         bool loss = false ;
         if (OrderClosePrice() < 0 )
            loss = true ;

주문 의 종가가 어떻게 0보다 작을 수 있습니까?

BUY 주문은 종가가 시가보다 높으면 긍정적인 영역이 됩니다.

다음은 구매에 대한 플러스 조건입니다(커미션 및 스왑 제외):

OrderClosePrice() > OrderOpenPrice()
반대의 경우에는 음수입니다.
 
Renat Akhtyamov 의 종가가 어떻게 0보다 작을 수 있습니까?

BUY 주문은 종가가 시가보다 높으면 양의 영역에 있습니다.

구매에 대한 플러스 조건은 다음과 같습니다(커미션 및 스왑 제외).

반대의 경우에는 음수입니다.

이진 옵션을 작성했기 때문에 조금 다르게 했습니다.

 if (OrderProfit() > 0 )


그럼 아마 맞겠죠?

 
Natalya Smirnova # :

어쩌면 다른 방향으로 갈 수도 있습니다.
지금은 이 함수에서 통계 모음을 제거하고 다른 함수에서 일반 빼기 및 통계를 제거합니다(별도의 함수를 생성하겠습니다).

나는 블록으로 씁니다.

통계 수집 및 빼기 및 더하기(빼기 및 더하기 전역 변수)를 계산하기 위한 블록


비율 계산(보다 정확하게는 샘플링)을 위한 변수 n의 블록 2 선택


아마 맞을거에요...

알고리즘 전반에 걸쳐 당신은 이미 조언을 받았고, 나는 끼어들고 싶지도 않고 당신의 코드와 같은 조언도 보지 않았습니다 ... 그리고 이것은

 double SelectVolume( int n)
  {
   return
      n == 0 ? Volume1
      : n == 1 ? Volume2
      : n == 2 ? Volume3
      : n == 3 ? Volume4
      : n == 4 ? Volume5
      : n == 5 ? Volume6
      : n == 6 ? Volume7
      : n == 7 ? Volume8
      : n == 8 ? Volume9
      : n == 9 ? Volume10
      : Volume1;
  }

내 눈을 사로 잡았다. 이와 관련하여 질문은 다음과 같습니다. switch 문을 적용하는 것이 더 쉽고 읽기 쉽지 않습니까?

 double SelectVolume( int n)
  {
   double Volume = 0.0 ;
     switch (n)
    {
     case 1   :  Volume = Volume2;     break ;
     case 2   :  Volume = Volume3;     break ;
     case 3   :  Volume = Volume4;     break ;
     case 4   :  Volume = Volume5;     break ;
     case 5   :  Volume = Volume6;     break ;
     case 6   :  Volume = Volume7;     break ;
     case 7   :  Volume = Volume8;     break ;
     case 8   :  Volume = Volume9;     break ;
     case 9   :  Volume = Volume10;     break ;
     default :  Volume = Volume1;     break ;
    }
   return (Volume);
  }
더 읽기 쉽고 이해하기 쉬울 것 같아요. 어쩌면 조금 더 빨리 작동합니다.
 
Alexey Viktorov # :

알고리즘 전반에 걸쳐 당신은 이미 조언을 받았고, 나는 끼어들고 싶지도 않고 당신의 코드와 같은 조언도 보지 않았습니다 ... 그리고 이것은

내 눈을 사로 잡았다. 이와 관련하여 질문은 다음과 같습니다. switch 문을 적용하는 것이 더 쉽고 읽기 쉽지 않습니까?

더 읽기 쉽고 이해하기 쉬울 것 같아요. 어쩌면 조금 더 빨리 작동합니다.
나는 경험이 많지 않기 때문에 당신의 제안은 나에게 완전히 새로운 것입니다.
처음에는 찾던 대로 했더니 효과가 있어서 개선할 생각은 하지 않았습니다.
당신은 그들이 말하는 것을 알고 있습니다 - 그것은 작동합니다 - 만지지 마십시오.

그러나 이제 나는 확실히 이 방법을 적용하려고 노력할 것입니다. 배우고 성장해야 하기 때문입니다.

지금은 변수 n을 다룰 것입니다. 그녀는 고려되기를 원하지 않습니다.
항상 n = 0(지금은)