[ARCHIVE] 포럼을 어지럽히 지 않도록 초보자 질문. 프로, 놓치지 마세요. 너 없이는 아무데도 - 3. - 페이지 237

 

안녕하세요.

다음 상황에 대한 이유는 무엇입니까? 더 신경을 써야 할까요?

미리 감사드립니다.

 
nemo811 :

더 신경을 써야 할까요?


틀림없이. 오류가 없어야 합니다.
 

도움을 부탁드립니다.

여기에 오류가 있습니까? (코드는 마지막 시장 SELL 주문의 티켓을 반환합니다)

 int OrdTicketSell_b( int MAGIC)
 {
   string SMB= Symbol ();
   int OrdTicketSell= 0 ;
   int i;
   for (i= 0 ;i< OrdersTotal ();i++)
   {
     if ( OrderSelect (i,SELECT_BY_POS,MODE_TRADES) == true)
     {
       if ( OrderSymbol ()==SMB)
       {
         if ( OrderMagicNumber ()==MAGIC || OrderMagicNumber ()== 777 )
         {
           if ( OrderType ()==OP_SELL)
           {
            OrdTicketSell= OrderTicket ();
           }  
         }  
       }          
     }
   }
   if ( OrderTicket ()!= OrdTicketSell) OrderSelect (OrdTicketSell, SELECT_BY_TICKET);
   return (OrdTicketSell);
 }

미리 감사드립니다.

 
int OrdTicketSell_b(int MAGIC)
 {
  string SMB=Symbol();
  int OrdTicketSell=-1;
  int i;
  for(i=0;i<OrdersTotal();i++)
   {
    if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES) == true)
     {
      if(OrderSymbol()==SMB)
       {
        if(OrderMagicNumber()==MAGIC || OrderMagicNumber()==777)
         {
          if(OrderType()==OP_SELL)
           {
            OrdTicketSell=OrderTicket();
           }  
         }  
       }          
     }
   }
   if(OrderTicket()!= OrdTicketSell && OrdTicketSell>=0) OrderSelect(OrdTicketSell, SELECT_BY_TICKET);
   return(OrdTicketSell);
 }
 

안녕하세요.

흥미로운 순간: mql4에서 블록 끝에 있는 변수 { int var; } 는 소멸되지 않으므로 문제는 주기에서 변수를 선언하는 것이 올바른지 여부입니다???

예시:

for(int i = 0, i < 500, i ++)

{

정수 변수; // 반복하는 동안 변수는 어떻게 됩니까?

}

고맙습니다.

 
sergeev :

아닙니다 - 아직 과소 평가되지 않은 것 같습니다. 같은 오류가 나타납니다.

코드의 마지막 부분은 고양이와 함께 남아 있습니다. 관련될 수 있습니다:

     int SchSell=SchSell_b(MAGIC);
     int OrdTicketSell=OrdTicketSell_b(MAGIC);
     double MinLot= MarketInfo (SMB,MODE_MINLOT);

     if (ChastZakr)
      {
       if (SchSell> 1 )
        {  
         OrderClose (OrdTicketSell, OrderLots (), MarketInfo ( OrderSymbol (), MODE_ASK),Proskalz, CLR_NONE );
         Alert (SMB, ": произведено частичное закрытие Sell-позиции, тикет: " ,OrdTicketSell, "." );
        }   
       else
        {  
         if (SchSellLots>MinLot)
          { 
           OrderClose (OrdTicketSell, NormalizeDouble ( OrderLots ()/ 2 , 2 ), MarketInfo ( OrderSymbol (), MODE_ASK),Proskalz, CLR_NONE );
           Alert (SMB, ": произведено частичное закрытие Sell-ордера, тикет: " ,OrdTicketSell, "." );
          }  
        }  
      }

가장 흥미로운 점은 주문을 마감하려고 할 때 오류가 발생한다는 것입니다. 그 전에는 리밋 트레이더였으나 나중에는 작동하여 시장 트레이더가 되었습니다. 주문이 마감되면 고양이. 원래 시장 - 오류가 발생하지 않습니다.

 

버그를 찾았습니다. 해결 방법은 다음과 같습니다.

     int SchSell=SchSell_b(MAGIC);
     double MinLot= MarketInfo (SMB,MODE_MINLOT);

     if (ChastZakr)
      {
       int OrdTicketSell=OrdTicketSell_b(MAGIC);
       if (SchSell> 1 )
        {  
         OrderClose (OrdTicketSell, OrderLots (), MarketInfo ( OrderSymbol (), MODE_ASK),Proskalz, CLR_NONE );
         Alert (SMB, ": произведено частичное закрытие Sell-позиции, тикет: " ,OrdTicketSell, "." );
        }   
       else
        {  
         if (SchSellLots>MinLot)
          { 
           OrderClose (OrdTicketSell, NormalizeDouble ( OrderLots ()/ 2 , 2 ), MarketInfo ( OrderSymbol (), MODE_ASK),Proskalz, CLR_NONE );
           Alert (SMB, ": произведено частичное закрытие Sell-ордера, тикет: " ,OrdTicketSell, "." );
          }  
        }  
      }
 
nemo811 :

버그를 찾았습니다. 해결 방법은 다음과 같습니다.


어리석은 질문을 해도 될까요? 이상한 정규화

 OrderClose (OrdTicketSell, NormalizeDouble ( OrderLots ()/ 2 , 2 ), MarketInfo ( OrderSymbol (), MODE_ASK),Proskalz, CLR_NONE );

왜 이런 짓을 하는지 이해할 수 없습니다.

 
Vinin :


어리석은 질문을 해도 될까요? 이상한 정규화

왜 이런 짓을 하는지 이해할 수 없습니다.

로트 0.03이 최소 허용 0.01과 관련된 경우입니다. 0.03을 2로 나누면 0.015가 되는데, 이것은 내가 이해하는 한 받아들일 수 없는 것입니다. 그래서 그런 정규화를 했습니다.

엄격하게 판단하지 마십시오 - 나는 단지 배우고 있습니다)). 그러나 이것이 실수라면 저를 수정하십시오.

 
artmedia70 :
시작하세요. 도와드리겠습니다. 그리고 그것은 "나를 위해 그것을 해"처럼 보입니다. 필요한 거의 모든 것이 있습니다. 주기의 주문에 대해 테이크 및 스톱만 수행하면 됩니다.

이것이 주문이 열리는 방식입니다:

                ticketSell = OpenPendingOrderSell( 1 , Lots, SellLimit, slip, SellLimit, 0 , 0 , EAName + "-" + NumOfTradesSell, MagicNumber, 0 , HotPink );
                 if (ticketSell < 0 )
                {
                         Print ( "Error: " , GetLastError ());
                         return ( 0 );
                }

다음과 같이 손실 없이 스크립트를 계산하고 싶습니다.

만약

 if (totalBuy > 1 )
{ то ордерам ticketBuy присвоить цену без убытка + TakeProfitBuy, при достижении этой цены или ниже, закрыть ордера}

я думаю, что можно что то в роде такого сделать:

if (totalBuy > 1 && (без убыток + TakeProfitBuy) >= Bid)
{
CloseAllBuy();
}

만약

 if (totalSell > 1 && (без убыток + TakeProfitSell) <= Ask)
{
CloseAllSell();
}

만약

 if (totalSell > 1 && totalBuy > 1 && (без убыток + TakeProfitSell) >= Ask)
{
CloseAllBuy();
CloseAllSell();
}

손실 없이 이 라인 정의 코드를 EA에 올바르게 삽입하는 방법:

 int start()
{
   int b,s;
   double price,price_b,price_s,lot,lot_s,lot_b,SLb,SLs;
   for ( int i= 0 ; i< OrdersTotal (); i++)
   {   if ( OrderSelect (i,SELECT_BY_POS,MODE_TRADES)==true)
      {   if ( OrderSymbol ()== Symbol ())
         {
            price = OrderOpenPrice ();
            lot   = OrderLots ();
             if ( OrderType ()==OP_BUY ) 
               {price_b = price_b+price*lot; b++;  lot_b=lot_b+lot;}
             if ( OrderType ()==OP_SELL) 
               {price_s = price_s+price*lot; s++;  lot_s=lot_s+lot;}
   }  }  }
   ObjectDelete ( "SLb" );
   if (b!= 0 ) 
   {  SLb = price_b/lot_b;
       ObjectCreate ( "SLb" , OBJ_ARROW , 0 ,Time[ 0 ],SLb, 0 , 0 , 0 , 0 );                     
       ObjectSet    ( "SLb" , OBJPROP_ARROWCODE , 6 );
       ObjectSet    ( "SLb" , OBJPROP_COLOR , Navy );
   }
   ObjectDelete ( "SLs" );
   if (s!= 0 ) 
   {  SLs = price_s/lot_s;
       ObjectCreate ( "SLs" , OBJ_ARROW , 0 ,Time[ 0 ],SLs, 0 , 0 , 0 , 0 );                     
       ObjectSet    ( "SLs" , OBJPROP_ARROWCODE , 6 );
       ObjectSet    ( "SLs" , OBJPROP_COLOR , Maroon );
   }
}