반대 순서 열기 - 페이지 2

 

4/5 디지트 브로커에 대한 슬리피지를 조정하기 위해 이 작업을 수행할 수는 없습니다. 의미가 없습니다.

Slippage는 정수여야 하므로 정수여야 합니다. 4자리 브로커 슬리피지는 핍 단위이므로 Slippage = 3은 3핍을 의미하고 5자리 브로커 슬리피지는 포인트 단위이므로 Slippage = 3은 3포인트 또는 0.3핍을 의미합니다. 따라서 이를 보상하기 위해 5자리 브로커의 경우 슬리피지 수치에 10을 곱하여 30을 제공해야 합니다. . . 30포인트 = 3핍.

따라서 이 코드는 잘못되었습니다. . .

 int init()
   {
   if ( Digits == 3 || Digits == 5 ) pt = 10 * Point ;
   else pt = Point ;
   Slippage = Slippage * pt;    
   }
 

이 수정된 버전의 OpenOppositeOrder() 함수 를 사용해 보십시오. . .

 void OpenOppositeOrder() 
   {
   int Op;  
 
   for ( int Counter = OrdersTotal ()- 1 ; Counter >= 0 ; Counter--)
      {
       if ( OrderSelect (Counter,SELECT_BY_POS,MODE_TRADES))   // only continue if the OrderSelect() worked
         {
         if (OrderSymbol() == Symbol ()&& OrderMagicNumber() == MagicNumber)
            {
            Op = OrderType();

             if (Op == OP_BUY && Bid < OrderOpenPrice())
               {      
               Ticket = OrderSend ( Symbol (), OP_SELL, LotSize, Bid, Slippage, 0 , 0 , "Sell Order" , MagicNumber, 0 , Red);
               if (Ticket > 0 ) 
                  {
                   Print ( "Opposite Sell order placed # " , Ticket);
                  AddLimitsSell();
                  }
               else
                  {
                   Print ( "Order Send failed, error # " , GetLastError () );
                  }
               }
               
             if (Op == OP_SELL && Ask > OrderOpenPrice())
               {      
               Ticket = OrderSend ( Symbol (), OP_BUY, LotSize, Ask, Slippage, 0 , 0 , "Buy Order" , MagicNumber, 0 , Green);
               if (Ticket > 0 )
                  {
                   Print ( "Opposite Buy order placed # " , Ticket);
                  AddLimitsBuy();
                  }
               else
                  {  
                   Print ( "Order Send failed, error # " , GetLastError () );
                  }   
               }
            }
         }
      }
   }
 
RaptorUK :

이 수정된 버전의 OpenOppositeOrder() 함수를 사용해 보십시오. . .


안녕하세요 RaptorUk입니다.

먼저 지금까지 제공한 도움에 감사드립니다. 이제 EA가 작동하기 시작합니다. 나는 주문에 이익이 있는 경우 모두를 닫는 방법에 대해 다른 수정을 했고 괜찮습니다. 그러나 이미 보았고 이 전략에 대해 예측한 것처럼 이익에 도달한 주문은 이전 주문을 보상하기 위해 로트 크기를 늘려야 합니다. 이를 염두에 두고 코드를 도입했습니다. 그래서 저는 여기서 혼란을 겪고 있습니다. 마지막 주문에 이익이 있었는지 확인해야 하고 다음 주문 로트 크기를 조정하는 방식으로 OrderProfit()을 사용하고 싶지만 해당 정보를 얻기 위해 이전 주문을 닫을 필요가 없습니까?

다음은 잘 작동하는 반대 주문을 여는 코드입니다(당신 덕분에). 여기서 저는 열린 이전 주문이 이익이 있는지 알아보기 위해 추가 코드를 소개합니다. 내가 올바른 방법으로 그것을 얻을 수 있습니까?

고맙습니다

루이스

 void OpenOppositeOrder() 
 {
// LastOrder Loss Compensation 
   int Orders;
   Orders= OrdersTotal ();
   if (Orders> 0 )
   {  
     for (i= 0 ;i<Orders;i++)
   {
     OrderSelect (i,SELECT_BY_POS,MODE_TRADES);
     if (OrderSymbol()== Symbol ()&& OrderMagicNumber()== MagicNumber)
   {
    lastprofit = OrderProfit();
    lastlot = OrderLots();
   }
  }
 }
  mlots= 0 ;
   if (lastprofit< 0 )mlots= NormalizeDouble (lastlot*Multiplier, Digits );
   else mlots=LotSize;
 
//+------------------------------------------------------------------+ 
//Open Opposite Order 
   int Op;  
 
   for ( int Counter = OrdersTotal ()- 1 ; Counter >= 0 ; Counter--)
      {
       if ( OrderSelect (Counter,SELECT_BY_POS,MODE_TRADES))  
         {
         if (OrderSymbol() == Symbol ()&& OrderMagicNumber() == MagicNumber)
            {
            Op = OrderType();

             if (Op == OP_BUY && Bid < OrderOpenPrice())
               {  
               if (Martingale)ilots=mlots; else ilots=LotSize; 
               Ticket = OrderSend ( Symbol (), OP_SELL, ilots, Bid, UseSlippage, 0 , 0 , "Sell Order" , MagicNumber, 0 , Red);
               if (Ticket > 0 ) 
                  {
                   Print ( "Opposite Sell order placed # " , Ticket);
                  AddLimitsSell();
                  }
               else
                  {
                   Print ( "Order Send failed, error # " , GetLastError () );
                  }
               }
               
             if (Op == OP_SELL && Ask > OrderOpenPrice())
               { 
               if (Martingale)ilots=mlots; else ilots=LotSize;
               Ticket = OrderSend ( Symbol (), OP_BUY, ilots, Ask, UseSlippage, 0 , 0 , "Buy Order" , MagicNumber, 0 , Green);
               if (Ticket > 0 )
                  {
                   Print ( "Opposite Buy order placed # " , Ticket);
                  AddLimitsBuy();
                  }
               else
                  {  
                   Print ( "Order Send failed, error # " , GetLastError () );
                  }   
               }
            }
         }
      }
   }
 
luisneves :


안녕하세요 RaptorUk입니다.

먼저 지금까지 제공한 도움에 감사드립니다. 이제 EA가 작동하기 시작합니다. 나는 주문에 이익이 있는 경우 모두를 닫는 방법에 대해 다른 수정을 했고 괜찮습니다. 그러나 이미 보았고 이 전략에 대해 예측한 것처럼 이익에 도달한 주문은 이전 주문을 보상하기 위해 로트 크기를 늘려야 합니다. 이를 염두에 두고 코드를 도입했습니다. 그래서 저는 여기서 혼란을 겪고 있습니다. 마지막 주문에 이익이 있었는지 확인해야 하고 다음 주문 로트 크기를 조정하는 방식으로 OrderProfit()을 사용하고 싶지만 해당 정보를 얻기 위해 이전 주문을 닫을 필요가 없습니까?

다음은 잘 작동하는 반대 주문을 여는 코드입니다(감사합니다). 여기에 열려 있는 이전 주문이 이익이 있는지 확인하기 위해 추가 코드를 소개합니다. 내가 그것을 얻는 올바른 방법입니까?

나는 이것이 당신에게 문제를 일으킬 것이라고 생각합니다. . .

mlots = NormalizeDouble (lastlot * Multiplier, Digits );

예를 들어, 결과가 1.12316734 랏 이면 5자리 액면가에서 NormalizeDouble() 이 1.12316으로 변경되고 이는 로트 단계 요구 사항을 준수하지 않습니다. . . . 수정된 로트 크기를 로트 단계 MarketInfo(Symbol(), MODE_LOTSTEP ) 배수로 만들려면 약간의 수학을 사용해야 합니다.

 
RaptorUK :

나는 이것이 당신에게 문제를 일으킬 것이라고 생각합니다. . .

예를 들어, 결과가 1.12316734 랏 이면 5자리 액면가에서 NormalizeDouble() 이 1.12316으로 변경되고 이는 로트 단계 요구 사항을 준수하지 않습니다. . . . 수정된 로트 크기를 로트 단계 MarketInfo(Symbol(), MODE_LOTSTEP ) 배수로 만들려면 약간의 수학을 사용해야 합니다.


안녕하세요 RaptorUK입니다.

내 로트 크기를 로트 단계의 배수로 유지하라는 조언과 관련하여 해당 주제에 대해 문서화하려고 합니다.

이제 다른 문제가 있습니다(하나 더...)

현재 가격 위와 아래에서 주문을 열려면 Ea가 실행되기 시작하면 가격을 아직 있는 라인과 비교하는 라인을 사용하고 싶습니다.

첫 번째 문제가 발생합니다. 가격 차이와 라인을 어떻게 비교할 수 있습니까?

여기 내가 지금까지 가지고있는 코드가 있습니다. priceline 뒤에 iHigh를 넣으면 작동하지 않기 때문에 여기에서 비교할 이름을 어떻게 지정할 수 있습니까?

이러한 문제에 대한 단서에 대해 미리 감사드립니다.

루이스

priceline=iHigh( Symbol (), 0 , 0 );
 ObjectCreate ( "highline" , OBJ_HLINE , 0 , 0 ,Bid); 
 ObjectSet( "highline" , OBJPROP_COLOR ,LimeGreen);
 ObjectSet( "highline" , OBJPROP_WIDTH , 1 );
 WindowRedraw();

이것은 전혀 작동하지 않는 것 같습니다(...)

 if (Bid > priceline+Distance*pt)                      
                {       
// Open buy order

                             while (IsTradeContextBusy()) Sleep ( 10 );
                                 RefreshRates();        
                       
             Ticket= OrderSend ( Symbol (),OP_BUY,LotSize,Ask,UseSlippage, 0 , 0 , "Buy Order" ,MagicNumber, 0 ,Green);
             if (Ticket> 0 )AddLimitsBuy();
            }

모든 주문이 마감될 때 행을 삭제해야 하기 때문에 여기에 개체 삭제를 넣었습니다. 제가 맞습니까 ?

 void CloseAll()
      {
         int i,Op,Error;
         int Total= OrdersTotal ();
     
         if (Total> 0 )
         {
         for ( int pos= OrdersTotal ()- 1 ;pos>= 0 ;pos--)
         if ( OrderSelect (pos,SELECT_BY_POS)
         && OrderMagicNumber()==MagicNumber && OrderSymbol()== Symbol ())
         {
         Op=OrderType();
         if (Op==OP_BUY)
         {
         OrderClose(OrderTicket(),OrderLots(),Bid, UseSlippage, Yellow);
         }
         if (Op==OP_SELL)
         {
         OrderClose(OrderTicket(),OrderLots(),Ask, UseSlippage, Yellow);
         }
         else
         {
         ObjectDelete ( "highline" );
         }
        }
       }
      }
 
luisneves :

이것은 전혀 작동하지 않는 것 같습니다(...)

모든 주문이 마감될 때 행을 삭제해야 하기 때문에 여기에 개체 삭제를 넣었습니다. 제가 맞습니까 ?

좋아, 나는 당신이하고 싶은 것을 이해하고 있다고 생각합니다. 입찰가가 당신의 라인과 비교되는 위치를 확인하기를 원합니다. 이렇게하려면 라인의 위치를 얻을 필요가 있습니다. . . 개체 이름 및 개체 속성 인덱스 OBJPROP_TIME1 과 함께 ObjectGet() 을 사용하면 행이 배치된 가격이 반환됩니다.

당신의 ObjectDelete() 호출은 나에게 괜찮아 보입니다. 저는 특히 ObjectsDeleteAll() 사용을 싫어합니다. 게으르고 위험하다고 생각합니다. . . 또는 최소한 다른 사람들에게는 불편합니다.

 
RaptorUK :

좋아, 나는 당신이하고 싶은 것을 이해하고 있다고 생각합니다. 입찰가가 당신의 라인과 비교되는 위치를 확인하기를 원합니다. 이렇게하려면 라인의 위치를 얻을 필요가 있습니다. . . 개체 이름 및 개체 속성 인덱스 OBJPROP_TIME1 과 함께 ObjectGet() 을 사용하면 행이 배치된 가격이 반환됩니다.

당신의 ObjectDelete() 호출은 나에게 괜찮아 보입니다.


안녕하세요 RaptorUK입니다.

하나의 이익이 마감되면 모든 주문을 마감하려고 합니다. 그러나 그런 일이 발생하면 보류 중인 주문은 여전히 열려 있지만 닫기 명령은 CloseAll() 함수에 포함됩니다. 이 문제에 대한 단서가 있습니까?

당신이 제공하는 모든 도움에 미리 감사드립니다

루이스

 int GoToClose()
 {
   int pos;  
 {
   for ( int Profit= OrdersTotal ()- 1 ;pos>= 0 ;pos--)
   if ( OrderSelect (Profit,SELECT_BY_POS)
  && OrderMagicNumber()==MagicNumber && OrderSymbol()== Symbol ()
  && OrderProfit()+OrderSwap()+OrderCommission()> 0 || OrdersTotal ()> MaxOrders)CloseAll();  
 }
}
//+---------------------------------------------------------------------------+  
       void CloseAll()
      {
         int Op,Error;
                    
         for ( int pos= OrdersTotal ()- 1 ;pos>= 0 ;pos--)
         if ( OrderSelect (pos,SELECT_BY_POS)
         && OrderMagicNumber()==MagicNumber && OrderSymbol()== Symbol ())
         {
         Op=OrderType();
         if (Op==OP_BUY)
         {
         RefreshRates();
         OrderClose(OrderTicket(),OrderLots(),Bid, UseSlippage, Yellow);
         }
         if (Op==OP_SELL)
         {
         RefreshRates();
         OrderClose(OrderTicket(),OrderLots(),Ask, UseSlippage, Yellow);
         }
         if (Op==OP_SELLSTOP||OP_BUYSTOP||OP_SELLLIMIT||OP_BUYLIMIT)
         {
         RefreshRates();
         OrderDelete(OrderTicket());
         }
         else Print ( "Error opening BUY Stop Order : " , GetLastError ());         
         }
        }             
 
luisneves :


안녕하세요 RaptorUK입니다.

하나의 이익이 마감되면 모든 주문을 마감하려고 합니다. 그러나 그런 일이 발생하면 보류 중인 주문은 여전히 열려 있지만 닫기 명령은 CloseAll() 함수에 포함됩니다. 이 문제에 대한 단서가 있습니까?

표현식이 어떻게 작동하는지 이해해야 합니다. . . 당신은 이것을 할 수 없습니다. . .

 if (Op == OP_SELLSTOP || OP_BUYSTOP || OP_SELLLIMIT || OP_BUYLIMIT)

이것과 비슷한 상황이지만 정확히 같지는 않습니다: https://www.mql5.com/en/forum/141790


의 결과는 무엇입니까? . .

WhatValue = ( 5   || 4   ||   3   ||   2 );

|| Boolean 연산자이므로 bool에서만 작동합니다. . .


bool 결과 값이 됩니다. . .

( Op == OP_SELLSTOP )

. . . 값에 비트 연산자 를 사용하려면 이것을 사용할 수 있습니다. . . .

 int WhatValue = ( 5   | 4   |   3   |   2 );

. . . 그러나 그것은 당신이 하려고 하는 것이 아닙니다.

 
RaptorUK :

표현식이 어떻게 작동하는지 이해해야 합니다. . . 당신은 이것을 할 수 없습니다. . .

이것과 비슷한 상황이지만 정확히 같지는 않습니다: https://www.mql5.com/en/forum/141790


의 결과는 무엇입니까? . .

|| Boolean 연산자이므로 bool에서만 작동합니다. . .


bool 결과 값이 됩니다. . .

. . . 값에 비트 연산자 를 사용하려면 이것을 사용할 수 있습니다. . . .

. . . 그러나 그것은 당신이 하려고 하는 것이 아닙니다.


안녕하세요 RaptorUK입니다.

알겠습니다. 하지만 이제 이를 염두에 두고 코드와 보류 중인 주문을 수정했습니다.

 void CloseAll()
      {
         int Op,Error;
                    
         for ( int pos= OrdersTotal ()- 1 ;pos>= 0 ;pos--)
         if ( OrderSelect (pos,SELECT_BY_POS)
         && OrderMagicNumber()==MagicNumber && OrderSymbol()== Symbol ())
         {
         Op=OrderType();
         if (Op==OP_BUY)
         {
         RefreshRates();
         OrderClose(OrderTicket(),OrderLots(),Bid, UseSlippage, Yellow);
         }
         if (Op==OP_SELL)
         {
         RefreshRates();
         OrderClose(OrderTicket(),OrderLots(),Ask, UseSlippage, Yellow);
         }
         if (Op==OP_SELLSTOP)
         {
         RefreshRates();
         OrderDelete(OrderTicket());
         }
         if (Op==OP_BUYSTOP)
         {
         RefreshRates();
         OrderDelete(OrderTicket());
         }
         else Print ( "Error opening BUY Stop Order : " , GetLastError ());         
         }
        }        
 
luisneves :


안녕하세요 RaptorUK입니다.

알겠습니다. 하지만 이제 이를 염두에 두고 코드와 보류 중인 주문을 수정했습니다.

MagicNumber 와 다른 Magic Number를 가지고 있거나 EA가 실행 중인 심볼 이외의 심볼에 대한 것이거나 OP_SELLLIMIT 또는 OP_BUYLIMIT인 경우일 수 있습니다. . . 또한 OrderDelete() 및 OrderClose() 호출에서 반환 값을 확인해야 합니다. . .

왜 RefreshRates()를 호출해야 합니까? 제거하려는 것은 아니지만 현재 위치에서 RefreshRates()를 호출하는 이유를 설명할 수 있습니까?


함수 반환 값이란 무엇입니까? 어떻게 사용합니까?