포럼을 어지럽히 지 않도록 모든 초보자 질문. 프로, 놓치지 마세요. 너 없이는 아무데도 - 6. - 페이지 123

 
nick_travel :

안녕하세요!

고문이 일을 하지 않는 이유를 설명하고 도와주세요.

어쩌면 그는 먹고 싶어? 월급을 기다리며...
 
hoz :


네, 그런데 이 정렬이 구현에 더 적합합니다. 수반되는 기능이 시작될 때 전류가 더 많은 공간을 차지하기 시작했습니다. 다음과 같이 밝혀졌습니다.

최적화할 부분이 없는 것 같죠?

처음에는 전혀 없을 때 훨씬 더 편리하다는 뜻입니다. 그리고 모든 것은 순전히 함수에 의해 호출됩니다. 그리고 마지막으로 처음에는 주요 기능에 많은 종류의 성장이 있었고 추가 기능을 검색한다는 것이 밝혀졌습니다 ...

함수에서 전역적으로 선언된 배열의 이름을 사용하는 경우 참조로 배열을 전달하는 이유는 무엇입니까? 다음과 같이 넣을 수 있습니다.

 void FindOrders( int & massive [])
{
   int oType;
   ArrayInitialize ( massive , 0 );
   for ( int i= OrdersTotal () - 1 ; i>= 0 ; i--)
   {
       if (! OrderSelect (i,SELECT_BY_POS,MODE_TRADES)) continue ;
       if (OrderSymbol() != Symbol ()) continue ;
       if (OrderMagicNumber() != i_magic) continue ;
      
      oType = OrderType();
      massive [oType] = massive [oType] + 1 ;
   }
}

예, 모나를 약간 줄이십시오.

 void FindOrders( int & massive [])
{
   ArrayInitialize ( massive , 0 );
   for ( int i= OrdersTotal () - 1 ; i>= 0 ; i--)
   {
       if (! OrderSelect (i,SELECT_BY_POS,MODE_TRADES)) continue ;
       if (OrderSymbol() != Symbol ()) continue ;
       if (OrderMagicNumber() != i_magic) continue ;
      
      massive [OrderType()] = massive [OrderType()] + 1 ;
   }
}

그리고 시작부터의 호출과 메시지의 출력에 대해. 거기에 뭔가 엉망이 된 것 같습니다. pr() 함수는 보이지 않으므로 제안할 것이 없습니다 ...

제 경우에는 테스터에서 주문건수 를 확인하기 위해 별 생각 없이 바로 이렇게 했습니다.

   FindOrders(mn0, OrdersMassive);

   Comment ( "\n" + "Всего ордеров = " + OrdersTotal ()+
             "\n" + "Количество " +GetNameOP( 0 )+ " = " +OrdersMassive[ 0 ]+
             "\n" + "Количество " +GetNameOP( 1 )+ " = " +OrdersMassive[ 1 ]+
             "\n" + "Количество " +GetNameOP( 2 )+ " = " +OrdersMassive[ 2 ]+
             "\n" + "Количество " +GetNameOP( 3 )+ " = " +OrdersMassive[ 3 ]+
             "\n" + "Количество " +GetNameOP( 4 )+ " = " +OrdersMassive[ 4 ]+
             "\n" + "Количество " +GetNameOP( 5 )+ " = " +OrdersMassive[ 5 ]
            );

배열에서 데이터를 읽고 인간과 유사한 객체에 정보를 표시하는 함수로 전체 출력을 래핑할 수 있습니다.

 
nick_travel :

안녕하세요!

고문이 일을 하지 않는 이유를 설명하고 도와주십시오.


모든 텔레파시와 모든 관찰자가 여기에 있는 것은 아니기 때문 입니다!
 

당연하게도!

나는 아마도 어떤 설정이나 다른 것이 필요하다는 사실에 대해 이야기하고 있습니까?

 
artmedia70 :

함수에서 전역적으로 선언된 배열의 이름을 사용하는 경우 참조로 배열을 전달하는 이유는 무엇입니까? 다음과 같이 넣을 수 있습니다.

 void FindOrders( int &massive[])
{
   int oType;
   ArrayInitialize (massive, 0 );
   for ( int i= OrdersTotal () - 1 ; i>= 0 ; i--)
   {
       if (! OrderSelect (i,SELECT_BY_POS,MODE_TRADES)) continue ;
       if (OrderSymbol() != Symbol ()) continue ;
       if (OrderMagicNumber() != i_magic) continue ;
      
      oType = OrderType();
      massive[oType] = massive[oType] + 1 ;
   }
}

사실, 그렇습니다. 현재도 여기에서 참조로 전달됩니다 .. :)) 매개변수가 전역적이지 않은 마지막 시간 이후에 남겨두었습니다.

그리고 pr 기능에 대해. 여기 그녀가 있습니다:

 //+-------------------------------------------------------------------------------------+
//| Распринтовка на экран                                                               |
//+-------------------------------------------------------------------------------------+
void pr ( string txt)
{
   string info [];
   ArrayResize (info, 20 );
   string h, m, s, cm; int i;
   
   h = DoubleToStr(Hour(), 0 );     if ( StringLen (h) < 2 ) h = "0" + h;
   m = DoubleToStr(Minute(), 0 );   if ( StringLen (m) < 2 ) m = "0" + m;
   s = DoubleToStr(Seconds(), 0 ); if ( StringLen (s) < 2 ) s = "0" + s;
   txt = h + ":" + m + ":" + s + " - " + txt;
   
   for (i= 20 - 1 ; i>= 1 ; i--)
   info[i] = info[i- 1 ];
   info[ 0 ] = txt;
   
   for (i= 20 - 1 ; i>= 0 ; i--)
   if (info[i] != "" )
   {
      cm = info[i];
       ObjectCreate ( "txtw" +i, OBJ_LABEL , 0 , 0 , 0 );
      ObjectSet    ( "txtw" +i, OBJPROP_CORNER , 1 );
      ObjectSet    ( "txtw" +i, OBJPROP_XDISTANCE , 10 );
      ObjectSet    ( "txtw" +i, OBJPROP_YDISTANCE , 30 + 15 *i);
      ObjectSetText( "txtw" +i, cm, 10 , "Times New Roman" , Green);
   }
}
 
nick_travel :

당연하게도!

나는 아마도 어떤 설정이나 다른 것이 필요하다는 사실에 대해 이야기하고 있습니까?


그리고 나는 여기에 텔레파시가 거의 없다는 사실에 대해 이야기하고 있으며, 있다면 그러한 재주에 관심을 갖도록 노력하십시오 .. 추측 및 도움 ...

 
hoz :


그리고 나는 여기에 텔레파시가 거의 없다는 사실에 대해 이야기하고 있으며, 있다면 그러한 재주에 관심을 갖도록 노력하십시오 .. 추측 및 도움 ...

아니면 잘못된 시장 진입을 허용하지 않는 아주 좋은 시스템일 수도 있습니다! 나는 이것을 원한다!
 

여기에 필요한 위치를 닫는 스토퍼가 있습니다. 요지는 이렇습니다.

1. 포지션 마감이 추적됩니다.

2. 마지막 테이크 포지션이 청산되는 즉시 모든 오픈 포지션과 미결 포지션을 한번에 청산해야 합니다. 로트별로 정렬된 모든 항목을 닫습니다. 즉시 큰 로트, 그 다음 작은 로트. 상황은 순전히 명령에 대한 경험을 얻기 위한 것입니다.

구현은 다음과 같습니다.

모든 틱마다 start() 에서:

 for (int ord=OrdersTotal()-1; ord>=0; ord--)
   {
      if (!OrderSelect(ord,SELECT_BY_POS)) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if (OrderSymbol() != Symbol()) continue;
      if (OrderType() == 6) continue;
        
      g_ticket = OrderTicket();
      g_type = OrderType();
              
      // Блок модификации ордеров       
      if (i_sl != 0 || i_tp != 0)
      {
         if (OrderStopLoss() == 0 && OrderTakeProfit() == 0)
         {
            OrdersModifyer(g_ticket);
         }
      }
      // Закрытие всех ордеров, если последний ордер закрыт
      if (isCloseByTakeLastOpenPos(2))
      {
         // if (g_type < 2)
          {
              ClosePosBySortLots();
          }
          //else
          if (g_type > 1)
          {
              DeletePendingOrders(g_ticket);
          }
      }
   }

우리는 시장 주문 마감에 관심이 없습니다. deferred는 필요에 따라 제거됩니다. 여기 우리가 가진 것이 있습니다:

 //+-------------------------------------------------------------------------------------+
//| Получаем состояние последней позиции (Открыта или закрыта)                          |
//+-------------------------------------------------------------------------------------+
bool isCloseByTakeLastOpenPos( int delta)
{
   datetime lastOrderCloseTime = - 1 ,               // Время закрытия последнего открытого ордера
            lastOOTHist = - 1 ;                     // Время открытия последнего открытого ордера из истории
   int j = - 1 ;
   pr ( "Запустилась функция isCloseByTakeLastOpenPos" );
   
   for ( int i=OrdersHistoryTotal()- 1 ; i>= 0 ; i--)
   {
       if (! OrderSelect (i, SELECT_BY_POS, MODE_HISTORY)) continue ;
       if (OrderMagicNumber() != i_magic) continue ;
       if (OrderSymbol() != Symbol ()) continue ;
       if (OrderType() > 1 ) continue ;               // Все удалённые отложки нас не интересуют..
  
       if (lastOrderCloseTime < OrderCloseTime())   // Находим время закрытия..
      {
         lastOrderCloseTime = OrderCloseTime();   // ..последней закрытой позиции в истории
         j = i;
         pr ( "j = " + j + "   " + TimeToStr( TimeCurrent ()));
      }
   }
   if ( OrderSelect (j, SELECT_BY_POS, MODE_HISTORY))
   {
       if (OrderProfit() + OrderCommission() + OrderSwap() <= 0 ) return ( false );
//      pr ("OTP() = " + OrderTakeProfit() + "; OCP() " + OrderClosePrice() + "   " + TimeToStr(TimeCurrent()));
   //    pr ("OOP() = " + OrderOpenPrice() + "; OCP() " + OrderClosePrice() + "   " + TimeToStr(TimeCurrent()));
       if ( MathAbs (OrderTakeProfit() - OrderClosePrice()) > delta * pt) return ( false );
       else
      {
         lastOOTHist = OrderOpenTime();
         Comment ( "\n" , "FUNC isCloseByTakeLastOpenPos: " ,
                 "\n" , "j = " , j,
                 "\n" , "lastOOTHist = " , TimeToStr(lastOOTHist, TIME_SECONDS));
      }
   }
   else
   {
       Comment ( "\n" , "FUNC isCloseByTakeLastOpenPos: " ,
               "\n" , "j = " , j,
               "\n" , "не удалось выбрать ордер в истории" );
       return ( false );
   }
  
   for ( int h= OrdersTotal ()- 1 ; h>= 0 ; h--)
   {
       if ( OrderSelect (h, SELECT_BY_POS, MODE_TRADES))
      {
         if (OrderMagicNumber() != i_magic)   continue ;
         if (OrderSymbol() != Symbol ())       continue ;
         if (OrderType() > 1 )                 continue ;
         if (lastOOTHist < OrderOpenTime()) return ( false );   // Выбранная рыночная позиция открыта позже закрытой по тейку
      }
       else { Print ( "FUNC isCloseByTakeLastOpenPos : не удалось выбрать рыночный ордер" ); return ( false );}
   }
   
   return ( true );
}

 //+-------------------------------------------------------------------------------------+
//| Закрытие ордеров, отсортированных по размеру лотов                                  |
//+-------------------------------------------------------------------------------------+
void ClosePosBySortLots()
{
   double a[][ 2 ];
   int p = 0 ;
   
   for ( int i= OrdersTotal ()- 1 ; i>= 0 ; i--)
   {
       if (! OrderSelect (i, SELECT_BY_POS, MODE_TRADES)) continue ;
       if (OrderMagicNumber() != i_magic) continue ;
       if (OrderSymbol() != Symbol ()) continue ;
       if (OrderType() < 2 )
      {
         p++;
         ArrayResize (a, p);
         a[p- 1 ][ 0 ] = OrderLots();
         a[p- 1 ][ 1 ] = OrderTicket();
      }
   }
   pr ( "ClosePosBySortLots(): " + "p = " + p);
   if (p > 0 )
   {
       ArraySort (a, WHOLE_ARRAY , 0 , MODE_DESCEND);
       for (i= 0 ; i<p; i++)
      {
         if ( OrderSelect (a[i][ 1 ], SELECT_BY_TICKET, MODE_TRADES))
         {
             if (OrderCloseTime() == 0 ) ClosePosBySelect();
         }
      }
   }
}
//+-------------------------------------------------------------------------------------+
//| Закрытие одного, предварительно выбранного ордера                                   |
//+-------------------------------------------------------------------------------------+
void ClosePosBySelect()
{
   bool    fc;
   color   clClose, clCloseBuy = Blue, clCloseSell = Red;
   double ll, pa, pb, pp;
   int     err, it, NumberOfTry = 3 ;

   if (OrderType() == OP_BUY || OrderType() == OP_SELL)
   {
       for (it= 1 ; it<=NumberOfTry; it++)
       {
           while (!IsTradeAllowed()) Sleep ( 5000 );
           RefreshRates();
           pa = MarketInfo(OrderSymbol(), MODE_ASK);
           pb = MarketInfo(OrderSymbol(), MODE_BID);
           if (OrderType() == OP_BUY)
           {
               pp = pb; clClose = clCloseBuy;
           }
           else
           {
               pp = pa; clClose = clCloseSell;
           }
           ll = OrderLots();
           fc = OrderClose(OrderTicket(), ll, pp, 30 , clClose);
           if (fc)
           {
               break ;
           }
           else
           {
               err = GetLastError ();
           }
       }
   }
   else Print ( "Некорректная торговая операция. Close " );
}

어떤 이유로 주문이 닫히지 않은 경우가 있습니다. 명확하지 않은 경우 일부 세그먼트를 인쇄합니다. 예를 들어:

주석에서 lastOOTHist = 01:30:00 임을 알 수 있지만 사실 이것은 사실이 아닙니다. 결국, 마지막으로 마감된 주문, 결과 창을 더듬어 보면 다음과 같이 표시됩니다.

닫는 시간이 다르니...

여기서 무슨 문제가 있습니까?

 
hoz :

사실, 그렇습니다. 현재도 여기에서 참조로 전달됩니다 .. :)) 매개변수가 전역적이지 않은 마지막 시간 이후에 남겨두었습니다.

나는 배열이 참조로 전달되어야 한다고 주장했다. 그렇지 않으면 함수는 하나의 하드 코딩된 배열에서만 작동하게 됩니다. 전역적으로 설정하도록 합니다.
 

이번주말까지 걸려서 아쉽지만 여쭤봅니다.

알려진 보낸 사람이 보낸 편지함의 메시지를 읽는 코드를 사용한 경험이 있는 사람이 있습니까?