Ea는 여러 개의 동일한 보류/지정가 주문을 생성하고 있습니다. [Help pls] - 페이지 3

 
GumRai :

우리는 당신이 무엇을하려고하는지 모릅니다

한 번에 하나의 미결 거래만 원하는 경우 새 주문을 보내기 전에 미결 주문이 없는지 확인하십시오.

막대당 하나의 거래만 원하면 막대당 한 번만 테스트하십시오.

조건 조합을 원하면 조합을 테스트하십시오.

나는 여기에서 설명한다:

시간당 최대 6개의 지지와 6개의 저항이 있습니다. 2 지원 및 2 저항 또는 시간당 최대 6 지원 및 6 저항을 제외한 모든 것일 수 있습니다.

매 시간이 시작될 때 해당 S/R 수준을 지정가 주문으로 열고 싶습니다.

하나의 구매 기능과 하나의 판매 기능을 만들었습니다... 총 12개의 S/R 레벨에 대해 동일한 구매/판매 코드를 작성할 필요가 없습니다.

지금. 이 다음 코드를 사용할 때 :

 int SellCall( double SC)
{
   SellStopLoss = SC + (StopLoss * CalcPoint1);
   SellTakeProfit = SC - (TakeProfit * CalcPoint1);
   SellTicket = OrderSend ( Symbol (),OP_SELLLIMIT,LotSize,SC,UseSlippage,SellStopLoss,SellTakeProfit, "Sell Limit Order" ,MagicNumber, TimeCurrent ()+ 3540 ,Red);

   return ( 0 );
}

여러 개의 동일한 주문을 생성합니다.

WHRoeder 코드도 사용 했습니다. 별도의 기능에서. 함수 내에서 함수를 선언할 수 없기 때문입니다.

 

문제는 게시한 함수가 아니라 함수 를 호출하는 코드에 있습니다.

분명히 주문이 이미 접수되었는지 확인하는 검사가 없습니다.

 
GumRai :

문제는 게시한 함수가 아니라 함수를 호출하는 코드에 있습니다.

분명히 주문이 이미 접수되었는지 확인하는 검사가 없습니다.

함수 호출을 위한 코드(스냅샷)

 if (FS == 1 || FS == 5 || FS == 7 )
   {
     if ( P1 == 1 || P1 == 5 || P1 == 7 )
      {
      
      BuyCall(S0);
      }    
     if ( P2 == 1 || P2 == 5 || P2 == 7 )
      {
      
      BuyCall(S1);
      }  
     if ( P3 == 1 || P3 == 5 || P3 == 7 )
      {
  
      BuyCall(S2);
      }  
     if ( P4 == 1 || P4 == 5 || P4 == 7 )
      {
      
      BuyCall(S3);
      }      
          
     if ( P5 == 1 || P5 == 5 || P5 == 7 )
      {
     
      BuyCall(S4);
      }      
     if ( P6 == 1 || P6 == 5 || P6 == 7 )
      {
     
      BuyCall(S5);
      }  
     if ( P7 == 1 || P7 == 5 || P7 == 7 )
      {
      
      SellCall(R0);
      } 
     
       if ( P8 == 1 || P8== 5 || P8 == 7 )
      {
    
      SellCall(R1);
      }  
      
     if ( P9 == 1 || P9== 5 || P9 == 7 )
      {
      
      SellCall(R2);
      }          
          
     if ( P10 == 1 || P10== 5 || P10 == 7 )
      {
     
      SellCall(R3);
      }   
     if ( P11 == 1 || P11== 5 || P11 == 7 )
      {
     
      SellCall(R4);
      }                       
     if ( P12 == 1 || P12== 5 || P12 == 7 )
      {
       
      SellCall(R5);
      }            
          
    }
   

주문이 이미 접수되었는지 여부를 확인하는 방법은 무엇입니까? Buyticket > 0 조건으로?

 
cashcube :

함수 호출을 위한 코드(스냅샷)

주문이 이미 접수되었는지 여부를 확인하는 방법은 무엇입니까? Buyticket > 0 조건으로?

트리거되지 않은 주문으로 마감 시간에 무엇을 하고 있는지, 트리거된 주문을 어떻게 관리하고 있는지 제가 알지 못하기 때문에 조언을 드리기 어렵습니다.

전역적으로 선언된 배열(또는 2)을 만들고 미결 주문에 대한 티켓 번호를 저장할 수 있습니다. 새 주문을 열기 전에 값이 >0인 수준에 해당하는 배열 요소 를 확인하십시오.

물론 티켓 번호도 확인해야 하며 트리거되지 않은 주문을 삭제하는 경우 배열 요소를 0으로 설정해야 합니다. 또한 주문이 마감되었는지 확인하고 논리에 따라 다음으로 재설정해야 할 수도 있습니다. 0

 
GumRai :

트리거되지 않은 주문으로 마감 시간에 무엇을 하고 있는지, 트리거된 주문을 어떻게 관리하고 있는지 제가 알지 못하기 때문에 조언을 드리기 어렵습니다.

전역적으로 선언된 배열(또는 2)을 만들고 미결 주문에 대한 티켓 번호를 저장할 수 있습니다. 새 주문을 열기 전에 값이 >0인 수준에 해당하는 배열 요소를 확인하십시오.

물론 티켓 번호도 확인해야 하며 트리거되지 않은 주문을 삭제하는 경우 배열 요소를 0으로 설정해야 합니다. 또한 주문이 마감되었는지 확인하고 논리에 따라 다음으로 재설정해야 할 수도 있습니다. 0

트리거되지 않은 주문의 만료 수준을 설정하면 0:59 또는 59분에 만료됩니다. 트리거된 주문의 경우 SL 및 TP가 설정됩니다.

이전에 매 시간마다 매수 또는 매도 주문 을 받는 Ea를 설계했습니다. 문제 코드는 간단하지 않았습니다. 그러나 여기에서는 매우 어려울 것 같습니다.

알겠습니다. 말씀하신 대로 코딩해 보겠습니다. 문제가 발생하면 여기에 게시하겠습니다. 또한 티켓 번호를 계산하는 간단한 코드 예제를 공유할 수 있다면 좋을 것입니다.

제안해 주셔서 감사합니다.

 

이 다음 코드를 사용하여 일시적으로 문제를 해결하고 시간별 차트에서 실행했습니다. 단순한

 //--- go trading only for first tiks of new bar
   if (Volume[ 0 ]> 1 ) return ( 0 );
 
막대가 신뢰할 수 없음(새로 고침/재연결이 차트의 막대 수를 변경할 수 있음) 볼륨이 신뢰할 수 없음(눈금 누락) 항상 시간을 사용하십시오. 새 양초 - MQL4 forum
 
WHRoeder :
막대가 신뢰할 수 없음(새로 고침/재연결이 차트의 막대 수를 변경할 수 있음) 볼륨이 신뢰할 수 없음(눈금 누락) 항상 시간을 사용하십시오. 새 양초 - MQL4 forum

코드 주셔서 감사합니다. Tick 기능에 추가했습니다. 하지만 이제 내 EA는 거래를 받지 않습니다. 보류중인 주문을 할 때 buycall/sell call 기능을 사용합니다. 함수 안에 이 함수를 추가할 수 없습니다.

//---------------------- Buy/Sell function (limit orders)
int BuyCall( double BC)
{     
              BuyStopLoss = BC - (StopLoss * CalcPoint1);
              BuyTakeProfit = BC + (TakeProfit *  CalcPoint1);
              BuyTicket = OrderSend ( Symbol (),OP_BUYLIMIT,LotSize,BC,UseSlippage,BuyStopLoss,BuyTakeProfit, "Buy limit Order" ,MagicNumber, TimeCurrent ()+ 3540 ,Green);
         
return ( 0 );
}


int SellCall( double SC)
{ 
   SellStopLoss = SC + (StopLoss * CalcPoint1);
   SellTakeProfit = SC - (TakeProfit * CalcPoint1);
   SellTicket = OrderSend ( Symbol (),OP_SELLLIMIT,LotSize,SC,UseSlippage,SellStopLoss,SellTakeProfit, "Sell Limit Order" ,MagicNumber, TimeCurrent ()+ 3540 ,Red);

   return ( 0 );
}
       
//+------------------------------------------------------------------+
//| OnTick function                                                  |
//+------------------------------------------------------------------+
void OnTick (){
   static datetime timeCur; datetime timePre = timeCur; timeCur=Time[ 0 ];
   bool isNewBar = timeCur != timePre;
   if (isNewBar){ 
     return ; // Once per bar
   }
   return ; // every tick
}  

어떤 아이디어?

 

또한 중지 된 주문 에 대한 역 거래도 작동하지 않습니다.

 //-------------Reverse trade for buy
     for(xx =OrdersHistoryTotal()-1;xx >=0;xx --)
     {
         if ( OrderSelect (xx, SELECT_BY_POS,MODE_HISTORY))
         {
         if (OrderSymbol()== Symbol () && OrderMagicNumber()== MagicNumber)
           {
           //for buy order reverse
           if (OrderType()==OP_BUY && OrderProfit()< 0 ) // if last buy closed with loss
          { 
             //--- go trading only for first tiks of new bar
             if (Volume[ 0 ]> 1 ) return ( 0 );
            SellStopLoss = Bid + (StopLoss * CalcPoint1);
            SellTakeProfit = Bid - (TakeProfit * CalcPoint1);
            SellTicket = OrderSend ( Symbol (),OP_SELL,LotSize,Bid,UseSlippage,SellStopLoss,SellTakeProfit, "Sell Reverse Order" ,MagicNumber, 0 ,Red);
          }
         break ; 
          }
          }
     } 
 

역 코드에 하이라이트가 있습니까? 왜 작동하지 않습니까?

고맙습니다.

사유: