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

 

안녕하세요, 저는 Ea를 만들었지만 다시 테스트할 때 각 틱에서 동일한 보류 주문을 많이 생성합니다. 그것을 막는 방법. 한 번에 하나의 주문만 필요하고 사본은 필요하지 않습니다.

이 EA를 " open price only "로 시간별 차트에서 실행하면 복사본이 생성되지 않습니다.

또한 내 ea는 구매 한도가 실패하면 역전 거래 옵션이 있습니다. 그러면 판매 거래가 열립니다. 제가 제대로 설정했는지 아닌지도 알려주세요. 도움을 주시면 감사하겠습니다.

시간 내 주셔서 감사합니다.

 // Main function//
if (condition)
   {
     if ( condition )
      {
       if ( BuyTicket == 0 )
      BuyCall(S0);
      }    
     if ( condition)
      {
       if ( BuyTicket == 0 )
      BuyCall(S1);
      }  

   etc etc... // many conditions
}

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

   // reverse trade//
     if ( Bid < BuyStopLoss && SellTicket == 0 )
     {  
        SellStopLoss = Bid + (StopLoss * CalcPoint1);
        SellTakeProfit = Bid - (TakeProfit * CalcPoint1);
        SellTicket = OrderSend ( Symbol (),OP_SELL,LotSize,Bid,UseSlippage,SellStopLoss,SellTakeProfit, "Sell Order" ,MagicNumber, 0 ,Red);
        BuyTicket = 0 ;
     }    
   }
      
return (BuyTicket);
}
 
cashcube : 그것을 막는 방법.
당신은 어떻게 생각하십니까? 새로운 것을 열기 전에 이미 존재하는 것을 확인 합니다.
 
WHRoeder :
캐쉬큐브 : 그것을 막는 방법.
당신은 어떻게 생각하십니까? 새로운 것을 열기 전에 이미 존재하는 것을 확인합니다.

그럼 어떻게 해야 할까요? Buyticket == 0 & Sellticket == 0 코드를 제거하시겠습니까?
 
복구하려면 EA를 코딩해야 합니다. 정전, OS 충돌, 터미널 또는 차트가 실수로 닫히면 다음 틱에서 모든 정적/전역 티켓 변수가 손실됩니다. 당신은 미결 주문을 가지고 있을 것이지만 그것을 알지 못하기 때문에 EA는 결코 그것을 청산하거나 SL 등을 추적하지 않을 것입니다. 당신은 어떻게 회복할 것입니까? OrderSelect 루프 를 사용하여 필요한 티켓 번호를 복구하거나 영구 저장(GV/파일)하십시오.
 
WHRoeder :
복구하려면 EA를 코딩해야 합니다. 정전, OS 충돌, 터미널 또는 차트가 실수로 닫히면 다음 틱에서 모든 정적/전역 티켓 변수가 손실됩니다. 당신은 미결 주문을 가지고 있을 것이지만 그것을 알지 못하기 때문에 EA는 결코 그것을 청산하거나 SL 등을 추적하지 않을 것입니다. 당신은 어떻게 회복할 것입니까? OrderSelect 루프 를 사용하여 필요한 티켓 번호를 복구하거나 영구 저장(GV/파일)하십시오.

안녕하세요, 다음과 같은 방식으로 코드를 변경하도록 추가했습니다.

//---------------------- Buy/Sell function (limit orders)
int BuyCall( double BC)
{  
  if(!OrderSelect(BuyTicket, SELECT_BY_TICKET)==true)
    {      
  if ( BuyTicket == 0)
  {
   BuyStopLoss = BC - (StopLoss * CalcPoint1);
   BuyTakeProfit = BC + (TakeProfit *  CalcPoint1);
   BuyTicket = OrderSend(Symbol(),OP_BUYLIMIT,LotSize,BC,UseSlippage,BuyStopLoss,BuyTakeProfit,"Buy limit Order",MagicNumber,expiration,Green);
   SellTicket = 0;
   // counter trade//
     if( Bid < BuyStopLoss && SellTicket == 0 )
     {  
        if(!OrderSelect(SellTicket, SELECT_BY_TICKET) == true)
        {
        SellStopLoss = Bid + (StopLoss * CalcPoint1);
        SellTakeProfit = Bid - (TakeProfit * CalcPoint1);
        SellTicket = OrderSend(Symbol(),OP_SELL,LotSize,Bid,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Order",MagicNumber,0,Red);
        BuyTicket = 0;
        }
     }    
  }
 }

여전히 각 틱에서 동일한 주문을 여러 번 받습니다.

또한 "!"를 제거하면 서명하면 거래를하지 않습니다.

마지막으로 내 주요 기능에서 buyticket 및 Sellticket 확인을 제거해야 합니까?

고맙습니다

 
if(!OrderSelect(BuyTicket, SELECT_BY_TICKET)==true)
  1. 코드를 붙여넣지 마세요.
    동영상 재생
    게시물을 수정 하세요.
    많은 양의 코드는 첨부하십시오.

  2. 당신은 if( (2+2 == 4) == true) 를 쓰지 않을 것입니까? if(2+2 == 4) 이면 충분합니다. 따라서 if(bool == true) 를 작성하지 말고 if(bool) 또는 if( ! bool) 만 사용하십시오. bool isLongEnabled와 같은 의미 있는 변수 이름을 사용하면 코드가 자체 문서화됩니다. Long_Entry는 트리거 가격이나 티켓 번호처럼 들리고 "if long entry"는 불완전한 문장입니다.
  3. BuyTicket 이 마감되었는지 어디에서 확인합니까? 티켓으로 선택하는 것은 항상 true입니다(유효한 티켓 번호가 제공됨).
  4. OrderSelect 루프에 대한 내 제안을 완전히 무시했습니다.
 

안녕하세요 WHReder님 답변 감사합니다.

예, SRC 코드에 추가했습니다. 하지만 편집할 때 표시되지 않았습니다.

나는 당신이 제안한대로 == true 용어를 제거했습니다.

오해하지 마십시오. 이 orderselect 루프를 이해하는 데 약점이 있습니다. 나는 무시하지 않았다. 추가하려고 했지만 너무 복잡해서 16개의 오류와 2개의 경고가 표시됩니다. 그 코드에서 MN.Count는 무엇입니까?

 // extern int     Magic.Number.Base          = ...
// int      magic.number.max;                   // Export to OpenOrder/MySelect
// string   market.pair;                        // Export to OpenOrder/MySelect
// int init(){
//    market.pair       = Symbol();
//    magic.number.max  = Magic.Number.Base + MN.COUNT - 1;

구매 티켓 확인에 대해 마감되었습니다. 나는 그것을 확인하지 않았으므로 현재 가격이 buystoploss 아래인지 확인한 다음 구매 거래가 마감되었습니다. 그래서 열린 판매 주문 .

 Bid < BuyStopLoss 

문안 인사

 

코드를 이런 식으로 정렬합니다. 하지만 지금 2개의 오류가 표시됩니다. "Myselect" & "MyOrdersTotal"은 전역 범위에서만 지울 수 있습니다.

 int BuyCall( double BC)
{  
//-----------code
bool MySelect( int iWhat, int eSelect, int ePool=MODE_TRADES){
   if (! OrderSelect (iWhat, eSelect, ePool) )   return ( false );
   int       mn = OrderMagicNumber();
   if (mn < MNB1              )   return ( false );
   if (mn > MNB2               )   return ( false );
   if (OrderSymbol()      != Pair   )   return ( false );
   if (ePool != MODE_HISTORY               )   return ( true );
   return (OrderType() <= OP_SELL); 
                                   
                                   
}
int MyOrdersTotal( int op=- 1 , int ePool=MODE_TRADES){   #define OP_ALL - 1
   if (ePool == MODE_TRADES)            iPos = OrdersTotal ()        - 1 ;
   else                                 iPos = OrdersHistoryTotal() - 1 ;
   for (nOrders= 0 ; iPos >= 0 ; iPos--) if (
      MySelect(iPos, SELECT_BY_POS, ePool)) if (
      op == OP_ALL || op == OrderType()
   )  nOrders++;
   return (nOrders);
}

   if (! OrderSelect (BuyTicket, SELECT_BY_TICKET))
    {      
   if ( BuyTicket == 0 )
  {
   BuyStopLoss = BC - (StopLoss * CalcPoint1);
   BuyTakeProfit = BC + (TakeProfit *  CalcPoint1);
   BuyTicket = OrderSend ( Symbol (),OP_BUYLIMIT,LotSize,BC,UseSlippage,BuyStopLoss,BuyTakeProfit, "Buy limit Order" ,MagicNumber,expiration,Green);
   SellTicket = 0 ;
   // counter trade//
     if ( Bid < BuyStopLoss && SellTicket == 0 )
     {  
         if (! OrderSelect (SellTicket, SELECT_BY_TICKET))
        {
        SellStopLoss = Bid + (StopLoss * CalcPoint1);
        SellTakeProfit = Bid - (TakeProfit * CalcPoint1);
        SellTicket = OrderSend ( Symbol (),OP_SELL,LotSize,Bid,UseSlippage,SellStopLoss,SellTakeProfit, "Sell Order" ,MagicNumber, 0 ,Red);
        BuyTicket = 0 ;
        }
     }    
  }
 }
      
return (BuyTicket);
}
 
다른 함수 내에서 함수를 선언할 수 없습니다.
 
GumRai :
다른 함수 내에서 함수를 선언할 수 없습니다.

그러면 어떻게 해야 할까요? 매수/매도 주문 을 열려면 개별적으로 확인해야 할 조건이 많습니다.

그래서 코드를 쉽게 만들기 위해 buycall/sellcall 함수를 만들었습니다.

그 EA는 너무 많은 동일한 거래를 취하고 있습니다. 그것을 막을 방법을 모릅니다.

 
GumRai :
다른 함수 내에서 함수를 선언할 수 없습니다.

캐쉬큐브 :

그러면 어떻게 해야 할까요? 매수/매도 주문을 열려면 개별적으로 확인해야 할 조건이 많습니다.

그래서 코드를 쉽게 만들기 위해 buycall/sellcall 함수를 만들었습니다.

그 EA는 너무 많은 동일한 거래를 취하고 있습니다. 그것을 막을 방법을 모릅니다.

우선 다른 함수 안에서 함수를 선언하려고 하지 마십시오.

게시 한 코드를 보면 무엇을하려는지 알 수 없습니다. 그래서 나는 당신을 도울 수 없습니다.