[ARCHIVE] 포럼을 어지럽히 지 않도록 초보자 질문. 프로, 놓치지 마세요. 너 없이는 아무데도 - 5. - 페이지 334

 
hoz :


보리스, int GetGeneralSignal() 함수에서 조건 중 하나를 주석 처리하면 여는 것이 명확해집니다.

나는 추적했다. 현재 미결 주문의 수익성이 빨간색일 때 플래그는 값을 변경하지 않습니다. 다음은 짧은 플래그와 플래그의 값을 false 로 설정해야 하는 다시 작성된 함수입니다. 부정적인 주문이 있는 경우 포지션 개설 금지:

호출 함수는 다음과 같습니다.

만의 조건이 더 적합할까요? 사실, 오늘은 유로의 매우 약한 하락으로 인해 판매를 시작하지만 여전히 아무것도 없는 것보다 낫습니다!
 
borilunad :
만의 조건이 더 적합할까요? 사실, 오늘은 유로의 매우 약한 하락으로 인해 판매를 시작하지만 여전히 아무것도 없는 것보다 낫습니다!


아니요. 같은 자리에 int GetGeneralSignal() 함수에 명확하게 동작하는 시그널이 등록되어 있습니다. 신호는 원시적이며 테스트용으로만 가져왔습니다. RSI가 상한선을 넘으면 매수하고, 하한선을 넘으면 매도합니다. 나 자신은 칠면조를 사용하지 않지만 순전히 실험을 위해 이것을 확인하기로 결정했습니다.

그래서. 플래그가 없으면 모든 것이 완벽하게 작동합니다. 플래그는 그렇지 않습니다. 결국, 함수 int FindOrders ( bool & long , bool & short ) 가 주어진 유형의 주문을 포함하고 그 이익이 0 미만일 때 내 함수로 판단하면 GetGeneralSignal() 함수에 대한 참조는 특정 플래그이지만 실제로 플래그 값은 항상 true입니다 .

//+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров                                                                 |
//+-------------------------------------------------------------------------------------+
int FindOrders(bool& long, bool& short)
{
   int t, total = OrdersTotal() - 1;
   double profitL,               // Профит лонговой позиции
          profitS;               // Профит шортовой позиции
   
   for (int i=total; i>=0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
          if (OrderSymbol() != Symbol()) continue;
              if (OrderMagicNumber() != i_magic) continue;
              {
                 if (OrderType() == OP_BUY)        // Найден ордер типа OP_BUY
                 {
                     if (profitL < OrderProfit())
                     {
                         profitL = OrderProfit();
                         pr("profitL =" + profitL);
                         if (profitL < 0)
                         long = false;
                     }
                 }

                 else if (OrderType() == OP_SELL)       // Найден ордер типа OP_SELL
                 {
                     if (profitS < OrderProfit())
                     {
                         pr("profitS =" + profitS);
                         profitS = OrderProfit();
                         if (profitS < 0)
                         long = false;
                     }
                 }
                 t++;
              }
   }
   
   return (t);
}  

인쇄물에서 보는데 왜 깃발이 바뀌지 않는지는 불명.

그건 그렇고, 나는 주문의 수익성을 인쇄했습니다.

 //+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров                                                                 |
//+-------------------------------------------------------------------------------------+
int FindOrders( bool & long , bool & short )
{
   int t, total = OrdersTotal () - 1 ;
   double profitL,               // Профит лонговой позиции
          profitS;               // Профит шортовой позиции
   
   for ( int i=total; i>= 0 ; i--)
   {
       if (! OrderSelect (i,SELECT_BY_POS,MODE_TRADES)) continue ;
           if (OrderSymbol() != Symbol ()) continue ;
               if (OrderMagicNumber() != i_magic) continue ;
              {
                 if (OrderType() == OP_BUY)         // Найден ордер типа OP_BUY
                 {
                     Print ( "if (OrderType() == OP_BUY)" );
                     profitL = OrderProfit();
                     pr( "profitL =" + profitL);
                     if (profitL < OrderProfit())
                         if (profitL < 0 )
                         long = false ;
                 }

                 else if (OrderType() == OP_SELL)       // Найден ордер типа OP_SELL
                 {
                     Print ( "if (OrderType() == OP_SELL)" );
                     profitS = OrderProfit();
                     pr( "profitS =" + profitS);
                     if (profitS < OrderProfit())
                         if (profitS < 0 )
                         long = false ;
                 }
                 t++;
              }
   }
   
   return (t);
}

그리고 인쇄물에서 깃발의 의미는 다음과 같습니다.

저것들. 수익성이 0보다 작으면 해당 플래그가 false 에서 변환되어야 하지만 이런 일이 발생하지 않는다는 것을 분명히 알 수 있습니다... 모든 것이 기본적으로 보이지만 무언가가 작동하지 않습니다.

 
hoz :


아니요. 같은 자리에 int GetGeneralSignal() 함수에 명확하게 동작하는 시그널이 등록되어 있습니다. 신호는 원시적이며 테스트용으로만 가져왔습니다. RSI가 상한선을 넘으면 매수하고, 하한선을 넘으면 매도합니다. 나 자신은 칠면조를 사용하지 않지만 순전히 실험을 위해 이것을 확인하기로 결정했습니다.

그래서. 플래그가 없으면 모든 것이 완벽하게 작동합니다. 플래그는 그렇지 않습니다. 결국, 함수 int FindOrders ( bool & long , bool & short ) 가 주어진 유형의 주문을 포함하고 그 이익이 0 미만일 때 내 함수로 판단하면 GetGeneralSignal() 함수에 대한 참조는 특정 플래그이지만 실제로 플래그 값은 항상 true입니다 .

인쇄물에서 보는데 왜 깃발이 바뀌지 않는지는 불명.
보세요, 두 경우 모두 long=false를 작성했는데 어떻게 열릴까요?!
 
hoz :



인쇄물에서 보는데 왜 깃발이 바뀌지 않는지는 불명.

 //+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров                                                                 |
//+-------------------------------------------------------------------------------------+
int FindOrders( bool & long , bool & short )
{
   int t, total = OrdersTotal () - 1 ;
   double profitL,               // Профит лонговой позиции
          profitS;               // Профит шортовой позиции
   
   for ( int i=total; i>= 0 ; i--)
   {
       if (! OrderSelect (i,SELECT_BY_POS,MODE_TRADES)) continue ;
           if (OrderSymbol() != Symbol ()) continue ;
               if (OrderMagicNumber() != i_magic) continue ;
              {
                 if ( OrderType() == OP_BUY )         // Найден ордер типа OP_BUY
                 {
                     Print ( "if (OrderType() == OP_BUY)" );
                     profitL = OrderProfit();
                     if (profitL < OrderProfit())
                         if (profitL < 0 )
                         l ong = false ;
                 }

                 else if (OrderType() == OP_SELL )       // Найден ордер типа OP_SELL
                 {
                     Print ( "if (OrderType() == OP_SELL)" );
                     profitS = OrderProfit();
                     if (profitS < OrderProfit())
                         if (profitS < 0 )
                         long = false ; /// ?????????????????????? 
                 }
                 t++;
              }
   }
   
   return (t);
}  
 

오타를 수정했습니다.

 //+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров                                                                 |
//+-------------------------------------------------------------------------------------+
int FindOrders( bool & long , bool & short )
{
   int t, total = OrdersTotal () - 1 ;
   double profitL,               // Профит лонговой позиции
          profitS;               // Профит шортовой позиции
   
   for ( int i=total; i>= 0 ; i--)
   {
       if (! OrderSelect (i,SELECT_BY_POS,MODE_TRADES)) continue ;
           if (OrderSymbol() != Symbol ()) continue ;
               if (OrderMagicNumber() != i_magic) continue ;
              {
                 if (OrderType() == OP_BUY)         // Найден ордер типа OP_BUY
                 {
                     if (profitL < OrderProfit())
                     {
                         profitL = OrderProfit();
                         pr( "profitL =" + profitL);
                         if (profitL < 0 )
                         long = false ;
                     }
                 }

                 else if (OrderType() == OP_SELL)       // Найден ордер типа OP_SELL
                 {
                     if (profitS < OrderProfit())
                     {
                         pr( "profitS =" + profitS);
                         profitS = OrderProfit();
                         if (profitS < 0 )
                         short = false ;
                     }
                 }
                 t++;
              }
   }
   
   return (t);
}

다음은 스크린샷입니다.

차트에서 매수가 마이너스이고 플래그 = TRU임을 알 수 있습니다.

 
좋은 저녁입니다. 조건이 충족될 때마다가 아니라 조건이 발생할 때 경고 양식이 한 번만 표시되도록 하는 방법을 알려주십시오.
 

너에게 미안했다! 이제 기능에 의해 억제되는 사이클 없이 어떻게 작동하는지 알려드리겠습니다! 다음은 귀하의 코드입니다. 하지만 무엇으로 변경할까요?

 //+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров                                                                 |
//+-------------------------------------------------------------------------------------+
bool& long , bool & short )
double profitL,               // Профит лонговой позиции
       profitS;               // Профит шортовой позиции
 
// int start()
 
//.........................................


  
   if(ExistPositions() == false)
   {
      if(long == true)
      {
         OrderSend(.......OPEN_BUY........................)  
      }
      if(short == true)
      {
         OrderSend(.......OPEN_SELL.........................)
   }  }
   if(ExistPositions() == true)
   {
      if(profitL > 0 && long == true && short == false)
      {
         OrderSend(.......OPEN_BUY........................)  
      }
      if(profitS > 0 && short == true && long == false)
      {
         OrderSend(.......OPEN_SELL.........................)
   }  }
      


                     
이 계획은 문제가 없으며 즉시 작동합니다! 불필요한 기능을 피하십시오! Dear Kim의 유용한 함수에서 ExistPositions() 함수를 찾을 수 있습니다!
 
borilunad :

너에게 미안했다! 이제 기능에 의해 억제되는 사이클 없이 어떻게 작동하는지 알려드리겠습니다! 다음은 귀하의 코드입니다. 하지만 무엇으로 변경할까요?

이 계획은 문제가 없으며 즉시 작동합니다! 불필요한 기능을 피하십시오! Dear Kim의 유용한 함수에서 ExistPositions() 함수를 찾을 수 있습니다!


Boris, ExistPositions 함수는 동일한 주기를 가지며 더 많은 추가 검사만 있으므로 이 과정에서 속도가 느려지지 않습니다. 당신의 논리는 나에게 분명하지만 이전 버전이 작동하지 않는 이유는 공개되지 않아 이상합니다. :)

다음 플래그도 사용합니다.

 if (profitL > 0 && long == true && short == false )

그리고 나는 그들이 올바르게 반환되지 않았다는 것을 보여주었습니다.

다시, 이 함수에 이익 L 및 이익 S 변수가 있으면 플래그가 필요하지 않습니다.

이것이 일어난 방법입니다.

 //+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров                                                                 |
//+-------------------------------------------------------------------------------------+
int FindOrders( double & profitL, double & profitS)
{
   int t, total = OrdersTotal () - 1 ;
   
   for ( int i=total; i>= 0 ; i--)
   {
       if (! OrderSelect (i,SELECT_BY_POS,MODE_TRADES)) continue ;
           if (OrderSymbol() != Symbol ()) continue ;
               if (OrderMagicNumber() != i_magic) continue ;
              {
                 if (OrderType() == OP_BUY)               // Найден ордер типа OP_BUY
                 {
                     if (profitL < OrderProfit())
                     {
                         profitL = OrderProfit();
                         pr( "profitL =" + profitL);       // Выводим профим через коммент на график
                     }
                 }
                 if (OrderType() == OP_SELL)       // Найден ордер типа OP_SELL
                 {
                     if (profitS < OrderProfit())
                     {
                         pr( "profitS =" + profitS);     // Выводим профим через коммент на график
                         profitS = OrderProfit();
                     }
                 }
                 t++;
              }
   }
   
   return (t);
}
//+-------------------------------------------------------------------------------------+
//| Получаем общий торговый сигнал                                                      |
//+-------------------------------------------------------------------------------------+
int GetGeneralSignal()
{
   double profitL,               // Профит лонговой позиции
          profitS;               // Профит шортовой позиции
        
   if (FindOrders(profitL, profitS) > 30 )
       return (SIGNAL_NO);

   if (ExistPositions() == false )
   {
       if (GetRSI( 1 ) < i_RSIToUpLimit)
      {
         if (GetRSI( 0 ) > i_RSIToUpLimit)
         {
             return (SIGNAL_BUY);
         }
      }
       if (GetRSI( 1 ) > i_RSIToDnLimit)
       {
         if (GetRSI( 0 ) < i_RSIToDnLimit)
         {
             return (SIGNAL_SELL);
         }
      }
   }
   if(ExistPositions() == true)
   {
      if (GetRSI(1) < i_RSIToUpLimit)
         if (GetRSI(0) > i_RSIToUpLimit)
         {
            if(profitL > 0)
               return (SIGNAL_BUY);
         }
      if (GetRSI(1) > i_RSIToDnLimit)
      {
         if (GetRSI(0) < i_RSIToDnLimit)
            if(profitS > 0)
               return (SIGNAL_SELL);
      }
   }
            
   return (SIGNAL_NO);
}

다시 말하지만 신호에서 열리지는 않지만 어떻게 든 열립니다.

 
안녕하세요!
조언을 도와주세요. 가상 흔적을 만들고 있는데 그런 문제에 부딪쳤습니다. 어떤 이유로 closelevel=profitpips-TrailingStop 라인이 작동하지 않습니다. trawl 및 GlobalVariableSet ("tral",0) 이 예상대로 포함되지만 변수
closelevel에는profitpips의 값이 할당 되고(현재 이익은 포인트로 표시됨) profitpips 가 아닙니다. - 모든 후속 결과가 있는 TrailingStop o_o



 void Trailing()
   {
     if (! GlobalVariableCheck ( "tral" )&&profitpips>=TrailingStart)
     {
      closelevel=profitpips-TrailingStop;
       GlobalVariableSet ( "tral" , 0 );
      }
     if ( GlobalVariableCheck ( "tral" )&&profitpips>=closelevel+TrailingStop)closelevel=profitpips;
     if ( GlobalVariableCheck ( "tral" )&&profitpips<=closelevel)
     {
       Print ( "ВСЁ ОТЛИЧНО ЗАКРЫЛИСЬ ПО ТРАЛЛУ" );
       for ( int i= 0 ; i<NumberOfTry; i++) 
        {
         CloseAll();
         Lot=LOT;
        }
      }  
     return ;}

알아냈어, 라인
 if ( GlobalVariableCheck ( "tral" )&&profitpips>=closelevel+TrailingStop)closelevel=profitpips;  


로 변경
 if ( GlobalVariableCheck ( "tral" )&&profitpips-TrailingStop>=closelevel+TrailingStop)closelevel=profitpips; 



현재 이익 마감 수준 의 증가와 함께   수정되지 않은...

모든 것이 이미 파악되었습니다.



 
hoz :


Boris, ExistPositions 함수는 동일한 주기를 가지며 더 많은 추가 검사만 있으므로 이 과정에서 속도가 느려지지 않습니다. 당신의 논리는 나에게 분명하지만 이전 버전이 작동하지 않는 이유는 공개되지 않아 이상합니다. :)

다음 플래그도 사용합니다.

그리고 제대로 반환되지 않았다는 것을 증명했습니다.

다시, 이 함수에 이익 L 및 이익 S 변수가 있으면 플래그가 필요하지 않습니다.

이것이 일어난 방법입니다.

다시 말하지만 신호가 아니라 어떻게 든 열립니다.

그러니 스스로 파헤쳐 보세요! 코드의 각 단어에는 기능이 있으며 변수를 관리하는 데 필요합니다. 이것은 하드 코드가 들어오는 곳입니다. 함수 없이는 할 수 없을 때 사용해야 합니다! Kim에서 나는 필요하지 않은 모든 것을 주석 처리했으며 모든 것이 매우 빠르게 작동합니다! 기억하십시오. 저는 모든 사람에게 많은 조건에서 프로그램을 더 빠르게 실행하는 방법을 물었습니다. 이제 5분 안에 모든 진드기에 대해 1년 동안 테스트가 진행됩니다! 나는 모든 조건과 기능을 샅샅이 뒤져 불필요한 모든 것을 버렸다.