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

 
Sepulca :

나는 이것을 할 것입니다 :


PS 동시에 응답)))

이해하지 못함:

 if (shift> 0 ) shift=shift- 1 ;

첫 번째 막대에서 열려 있으면 0에서 0까지를 찾고 있습니까?

 
artmedia70 :

이해하지 못함:

첫 번째 막대에서 열려 있으면 0에서 0까지를 찾고 있습니까?


이것은 주문의 개시 가격이 개시 시점의 최저가보다 훨씬 높은 경우에 대비한 작은 재보험입니다. 저것들. 검색을 위해 시작 표시줄을 사용하지 않습니다. 이를 위해 PERIOD_M1.
 
Sepulca :
이것은 주문의 개시 가격이 개시 시점의 최저가보다 훨씬 높은 경우에 대비한 작은 재보험입니다. 저것들. 검색을 위해 시작 표시줄을 사용하지 않습니다. 이를 위해 PERIOD_M1.

그렇지 않으면 했을 것입니다. 나는 일반적으로 위치가 한 마디 이상 지속되는 경우에만 검색을 시작합니다. 결국 최고의 가격은 오프닝 바에서 할 수 있고 우리는 그것을 소비합니다 ...
 
artmedia70 :
그렇지 않으면 했을 것입니다. 나는 일반적으로 위치가 한 마디 이상 지속되는 경우에만 검색을 시작합니다. 결국 최고의 가격은 오프닝 바에서 할 수 있고 우리는 그것을 소비합니다 ...

동의한다. 주문 시점부터 최저가를 다시 검색하는 것보다 각 틱 에서 배열의 각 미결 주문 가격의 최저가(또는 최고가)를 기억하고 조건에 도달할 때 주문을 마감하는 것이 더 효율적일 것입니다. 다음과 같은 것:

 ShortOrderTicket[i]= OrderSend ( Symbol (),OP_SELL,......
 if (ShortOrderTicket[i]>= 0 ) min[i]=Bid;
 //.....................................................
 //На каждом тике обновляем минимумы для каждого открытого ордера
 for (i= 0 ;i<N;i++){
   if (ShortOrderTicket[i]>= 0 ){
   min[i] =MathMin (min[i],Ask);
  }
// Если достигнуто условие, закрываем ордер
   if (Ask>min[i]+Delta) if (OrderClose(ShortOrderTicket[i],.....))ShortOrderTicket[i]=- 1 ;
 }
음, 연결 끊김, 어드바이저 다시 시작 등과 같은 문제가 있는 경우 때때로 주문의 손절매를 수정합니다.
 
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 ;
   }
}

다음과 같이 호출합니다.

FindOrders(OrdersMassive)

OrdersMassive 배열 작업이 진행 중입니다.

그래서:

FindOrders(massiveOfOrders)

MassiveOfOrders 배열 사용

 
거래를 열 때 스프레드 크기 를 찾는 방법을 알려주십시오. 그러나 로그에 표시하는 것이 더 낫습니까?
 
Forexman77 :
거래를 열 때 스프레드 크기를 찾는 방법을 알려주실 수 있지만 로그에 표시하는 것이 더 낫습니까?

if (spread) == some value, then.. do something... (예를 들어, 주문을 열거나 로그에 해당 값을 인쇄). 또는 반대로 일부 값보다 같지 않거나 더 크거나 같으면 로그에 출력하고 무언가를 수행합니다. 원하는대로..
 

어제 했던 질문을 다시 할게요. 별도의 지점을 만들고 싶지 않습니다. 명확하지 않은 것이 있으면 모든 질문에 답하겠습니다.

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

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 :


흠. 결국 호출 함수에 전달되는 배열에 따라 다릅니다. 특정 배열이 있으면 호출된 함수가 그 배열과 함께 작동합니다... 결국, 그래서 ..

예를 들어,

다음과 같이 호출합니다.

OrdersMassive 배열 작업이 진행 중입니다.

그래서:

MassiveOfOrders 배열 사용


변수(배열)를 값으로 함수에 전달할 때 헤더에 선언한 로컬 변수 가 함수 내부에 생성됩니다. MyFunct(int my_var). 따라서 이 변수에 대한 변경 사항은 함수 외부에서 볼 수 없습니다. 그리고 배열의 경우 컴파일러는 이를 상기시켜줍니다.

변수 값의 변경 사항을 외부(함수 외부)에서 볼 수 있도록 하려면 변수를 참조로 전달하십시오. MyFunct(int & my_var)

 
hoz :


흠. 결국 호출 함수에 전달되는 배열에 따라 다릅니다. 특정 배열이 있으면 호출된 함수가 그 배열과 함께 작동합니다... 결국, 그래서 ..

예를 들어,

다음과 같이 호출합니다.

OrdersMassive 배열 작업이 진행 중입니다.

그래서:

MassiveOfOrders 배열 사용

정확히. 크기와 유형이 일치하는 배열을 전송할 수 있다면 함수 자체에서 특정 배열을 처방하기 어려운 이유는 무엇입니까?