오류 코드 "0"?

 

나는 왜 롱 포지션이 작동하고 숏 거래가 전혀 작동하지 않는지 이해하기 위해 고군분투하고 있습니까?

주어진 브로커와 함께 소수점 이하 자릿수를 결정하는 초기화 기능 과 관련이 있다는 느낌이 듭니다. (이것이 테스터를 처음 시작할 때 팬텀 오더가 바로 버려지는 이유에 대한 원인 인 것 같습니다 ...)

왜 짧은 쪽이 나에게이 오류를 말하는지 아는 사람이 있습니까?


미리 감사드립니다(코드가 현재 약간 지저분합니다. 물론 정리할 예정입니다!)

 //+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {

   double ticksize = MarketInfo( Symbol (), MODE_TICKSIZE);
   if (ticksize == 0.00001 || ticksize == 0.001 ) // if you set this to 0 it WONT throw an order out straight away.
   pips = ticksize* 10 ;
   else pips = ticksize;  
   

   return ( 0 );
  }
//+----

//+------------------------------------------------------------------+
//| Order Enter Function                                             |
//+------------------------------------------------------------------+

void OrderEntry ( int direction)
{    
   
   int PositionIndex;     //  <-- this variable is the index used for the loop
   int TotalNumberOfOrders;   //  <-- this variable will hold the number of orders currently in the Trade pool
  TotalNumberOfOrders = OrdersTotal ();     // <-- we store the number of Orders in the variable
   
   
   double s12 = iMA ( NULL , 60 , 60 , 0 , 1 , 0 , 1 ); 
   double i121 = iMA ( NULL , 60 , 60 , 0 , 1 , 0 , 1 );
   
   double LotSize= 0 ;
   double Equity=AccountEquity();
   double RiskedAmount=Equity*RiskPercent* 0.01 ;

   int iTBT= iBarShift( NULL , 60 , triggerBarTime, true ),
        iHH= iHighest( NULL , 60 , MODE_HIGH, iTBT + 1 , 0 ); 
             double buyPrice = High[iHH]+PadAmount*pips;
   
   
     int iTBT_1= iBarShift( NULL , 60 , triggerBarTime1, true ),
        iLL= iLowest( NULL , 60 , MODE_LOW, iTBT_1 + 1 , 0 ); 
             double sellPrice = Low[iLL]-PadAmount*pips;
            
   
   double buy_stop_price = iMA ( NULL , 60 , 60 , 0 , 1 , 0 , 1 )-PadAmount*pips; 
   double pips_to_bsl = buyPrice-buy_stop_price;         
   double buy_takeprofit_price = (pips_to_bsl*RewardRatio)+buyPrice;   
   double sell_stop_price = iMA ( NULL , 60 , 60 , 0 , 1 , 0 , 1 )+PadAmount*pips; 
   double pips_to_ssl = sell_stop_price-sellPrice;     
   double sell_takeprofit_price = sellPrice-(pips_to_ssl*RewardRatio);
   
//+----------------------------------------------------------------------------------------------------------------------------------------+  
//+----------------------------------------------------------------------------------------------------------------------------------------+   
   
  
if (direction== 0 ) //--Buy--//
   {
      
      {
       double bsl=buy_stop_price;
       double btp=buy_takeprofit_price;
      LotSize = (RiskedAmount/(pips_to_bsl/pips))/ 10 ;
       if (OpenOrdersThisPair( Symbol ())== 0 ) 
       int BuyTicketOrder = OrderSend ( Symbol (),OP_BUYSTOP,LotSize,buyPrice, 3 ,bsl,btp, NULL ,MagicNumber, 0 ,Green); 
      
       if (BuyTicketOrder > 0 )
         {
         Print ( "Order Placed #" , BuyTicketOrder);
         }
       else
         {
         Print ( "Order Send Failed, error # " , GetLastError ());   
         }
  
      }
   }

            
if (direction== 1 ) //--Sell--//
   {
      {
       double ssl=sell_stop_price;
       double stp=sell_takeprofit_price;
      LotSize = (RiskedAmount/(pips_to_ssl/pips))/ 10 ;    
       if (OpenOrdersThisPair( Symbol ())== 0 )  
       int SellTicketOrder = OrderSend ( Symbol (),OP_SELLSTOP,LotSize,sellPrice, 3 ,ssl,stp, NULL ,MagicNumber, 0 ,Red); 
  
       if (SellTicketOrder > 0 )
         {
         Print ( "Order Placed #" , SellTicketOrder);
         }
       else
         {
         Print ( "Order Send Failed, error # " , GetLastError ());   
         }
 
      }
   }
} 
 

당신이 댓글을 달 때 그것은 거래를 입력합니까

 //if (OpenOrdersThisPair( Symbol ())== 0
언제 입력합니까
LotSize = 0.1 ;
등. 거래에 들어가기 시작할 때까지 다시 작업하십시오. 일단 거기에 있으면 문제가 무엇인지 알게 될 것입니다. hth
 
네, 로트 사이즈가 "0"인 경우에도 긴 쪽에 들어갑니다...

OpenOrderThisPair를 변경해도 작동하지 않습니다.... 흠. 아주 이상해...
 
DomGilberto :
네, 로트 사이즈가 "0"인 경우에도 긴 쪽에 들어갑니다...

OpenOrderThisPair를 변경해도 작동하지 않습니다.... 흠. 아주 이상해...

이 테스트가 0이 아닌 값을 반환하는 경우. . .

 if (OpenOrdersThisPair( Symbol ()) == 0 )  

. . . OrderSend()는 호출되지 않지만 SellTicketOrder가 0보다 큰지 확인 합니다. . .

이 작업을 수행 . . .

 if (direction== 1 ) //--Sell--//
   {
      {
       double ssl=sell_stop_price;
       double stp=sell_takeprofit_price;
      LotSize = (RiskedAmount/(pips_to_ssl/pips))/ 10 ;    
       if (OpenOrdersThisPair( Symbol ())== 0 )
         {
         int SellTicketOrder = OrderSend ( Symbol (),OP_SELLSTOP,LotSize,sellPrice, 3 ,ssl,stp, NULL ,MagicNumber, 0 ,Red); 
  
         if (SellTicketOrder > 0 )
            {
             Print ( "Order Placed #" , SellTicketOrder);
            }
         else
            {
             Print ( "Order Send Failed, error # " , GetLastError ());   
            }
         }
      }
 
아니요 - 판매 주문 을 보내고 싶지 않은 것 같습니다 ...

주문을 트리거하기 위해 OrderEntry 함수를 보내는 for 루프 내의 "IF" 문에 관한 코드를 작성한 방식의 오류임에 틀림없습니다...
 
DomGilberto :
아니요 - 판매 주문을 보내고 싶지 않은 것 같습니다...

주문을 트리거하기 위해 OrderEntry 함수를 보내는 for 루프 내의 "IF" 문에 관한 코드를 작성한 방식의 오류임에 틀림없습니다...

이제 어떤 오류가 발생합니까? 하나를 얻지 못하고 "주문 배치 # 12345"가 표시되지 않으면 OrderSend()가 호출되지 않고 OpenOrdersThisPair() 함수 에 문제가 있는 것입니다. . . 코드를 게시하십시오.
 
이것이 실행되면 긴 쪽에서 잘 작동합니다(저는 지난 2시간 동안 이것으로 놀고 있었습니다). 문제는 이동 평균 매개변수와 관련된 IF 문과 관련하여 내가 어디에서 잘못되고 있는지(여기서 "CheckForMaTrade" 함수 를 호출함) 및 그들이 "true"는 OrderEntry를 OrderSend로 보낼 것입니다... 문제는, 그 부분을 올바르게 작성하는 방법을 여전히 배우고 있다는 것입니다...
 //+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+

int start()
  {
//----
   
   if (OpenOrdersThisPair( Symbol ())>= 1 )
      {
       if (UseMoveToBreakEven)MoveToBreakEven();
       if (UseTrailingStop)AdjustTrail();
       if (Use_MA_Trail)MA_Trail();
      }
       if (IsNewCandle())CheckForMaTradeLong();
       if (IsNewCandle())CheckForMaTradeShort();
//----
   return ( 0 );
  }
 
DomGilberto :
이것이 실행되면 긴 쪽에서 잘 작동합니다(저는 지난 2시간 동안 이것으로 놀고 있었습니다). 문제는 이동 평균 매개변수와 관련된 IF 문과 관련하여 내가 어디에서 잘못되고 있는지(여기서 "CheckForMaTrade" 함수라고 함)가 알고 있기 때문에 당신과 특정 누군가를 감쌀 것입니다. "true"는 OrderEntry를 OrderSend로 보낼 것입니다... 문제는, 그 부분을 올바르게 작성하는 방법을 여전히 배우고 있다는 것입니다...

랩터영국 :
이제 어떤 오류가 발생합니까? 하나를 얻지 못하고 "주문 배치 # 12345"가 표시되지 않으면 OrderSend()가 호출되지 않고 OpenOrdersThisPair() 함수에 문제가 있는 것입니다. . . 코드를 게시하십시오.


그래서 .. . . 어떤 오류가 발생합니까 등. . .
 
오 죄송합니다 - 더 이상 오류가 발생하지 않습니다. 매수주문만 받고 매도주문 은 안들어오네요...

그것은 MA 크로스 오버에 관한 나의 이전 스레드와 관련이 있습니다 - 나는 여전히 그것을 이해하지 못합니다! 그러나 나는 사람들이 나에게 답을 주는 동안 누군가를 감아 죽인 말을 치고 싶지 않습니다(비록 답을 이해하지는 못하지만)! 도움을 주신 RaptorUK를 응원합니다!
 
      if (IsNewCandle())CheckForMaTradeLong();
     if (IsNewCandle())CheckForMaTradeShort();
인수분해 작업을 함수 로 지원하는 동안 New Candle/New Bar의 대부분의 변형에 대해서는 해당 함수를 한 번만 호출할 수 있기 때문에 지원하지 않습니다[per start()]
 int start(){
   static datetime time0; bool isNewCandle = time0 != Time[ 0 ]; time0 = Time[ 0 ]; // Once per start only.
   :
       if (isNewCandle)CheckForMaTradeLong();
       if (isNewCandle)CheckForMaTradeShort();
 
감사합니다 WHRoeder - 좋은 팁!