포럼을 어지럽히 지 않도록 모든 초보자 질문. 프로, 놓치지 마세요. 너 없이는 아무데도 - 6. - 페이지 758

 
Ozero :

페레즈 ";" 브래킷용.

프로그램은 작동하지만 주기적으로 오류 4108에서 맹세합니다.


호수.

도움말을 열고 런타임 오류 를 보면 다음이 표시됩니다.

4108

ERR_INVALID_TICKET

잘못된 티켓 번호

우리는 우리가 찾고 있다고 생각합니다 ...

 

사람들이 도움이됩니다. 구별하고 구별하기 위해 각 통화를 자체 주문으로 거래해야합니다. + 오픈 주문 후 가격이 더 롤백되면 첫 번째 주문과 동일한 다른 주문을 열 수 있습니다.

 //+------------------------------------------------------------------+
//|                                                  MACD Sample.mq4 |
//|                      Copyright © 2005, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
 
extern double TakeProfit = 50 ;
extern double Lots = 0.1 ;
extern double TrailingStop = 30 ;
extern double MACDOpenLevel= 3 ;
extern double MACDCloseLevel= 2 ;
extern double MATrendPeriod= 26 ;

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   double MacdCurrent, MacdPrevious, SignalCurrent;
   double SignalPrevious, MaCurrent, MaPrevious;
   int cnt= 0 , ticket, total;
// первичные проверки данных
// важно удостовериться что эксперт работает на нормальном графике и
// пользователь правильно выставил внешние переменные (Lots, StopLoss,
// TakeProfit, TrailingStop)
// в нашем случае проверяем только TakeProfit
   if ( Bars < 100 )
     {
       Print ( "bars less than 100" );
       return ( 0 );  
     }
   if (TakeProfit< 10 )
     {
       Print ( "TakeProfit less than 10" );
       return ( 0 );   // проверяем TakeProfit
     }
// ради упрощения и ускорения кода, сохраним необходимые
// данные индикаторов во временных переменных
   MacdCurrent= iMACD ( NULL , 0 , 12 , 26 , 9 , PRICE_CLOSE ,MODE_MAIN, 0 );
   MacdPrevious= iMACD ( NULL , 0 , 12 , 26 , 9 , PRICE_CLOSE ,MODE_MAIN, 1 );
   SignalCurrent= iMACD ( NULL , 0 , 12 , 26 , 9 , PRICE_CLOSE ,MODE_SIGNAL, 0 );
   SignalPrevious= iMACD ( NULL , 0 , 12 , 26 , 9 , PRICE_CLOSE ,MODE_SIGNAL, 1 );
   MaCurrent= iMA ( NULL , 0 ,MATrendPeriod, 0 , MODE_EMA , PRICE_CLOSE , 0 );
   MaPrevious= iMA ( NULL , 0 ,MATrendPeriod, 0 , MODE_EMA , PRICE_CLOSE , 1 );
 
   total= OrdersTotal ();
   if (total< 1 ) 
     {
       // нет ни одного открытого ордера
       if (AccountFreeMargin()<( 1000 *Lots))
        {
         Print ( "We have no money. Free Margin = " , AccountFreeMargin());
         return ( 0 );  
        }
       // проверяем на возможность встать в длинную позицию (BUY)
       if (MacdCurrent< 0 && MacdCurrent>SignalCurrent && MacdPrevious<SignalPrevious &&
         MathAbs (MacdCurrent)>(MACDOpenLevel* Point ) && MaCurrent>MaPrevious)
        {
         ticket= OrderSend ( Symbol (),OP_BUY,Lots,Ask, 3 , 0 ,Ask+TakeProfit* Point ,
                           "macd sample" , 16384 , 0 ,Green);
         if (ticket> 0 )
           {
             if ( OrderSelect (ticket,SELECT_BY_TICKET,MODE_TRADES))
               Print ( "BUY order opened : " ,OrderOpenPrice());
           }
         else Print ( "Error opening BUY order : " , GetLastError ()); 
         return ( 0 ); 
        }
       // проверяем на возможность встать в короткую позицию (SELL)
       if (MacdCurrent> 0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious && 
         MacdCurrent>(MACDOpenLevel* Point ) && MaCurrent<MaPrevious)
        {
         ticket= OrderSend ( Symbol (),OP_SELL,Lots,Bid, 3 , 0 ,Bid-TakeProfit* Point ,
                           "macd sample" , 16384 , 0 ,Red);
         if (ticket> 0 )
           {
             if ( OrderSelect (ticket,SELECT_BY_TICKET,MODE_TRADES))
               Print ( "SELL order opened : " ,OrderOpenPrice());
           }
         else Print ( "Error opening SELL order : " , GetLastError ()); 
         return ( 0 ); 
        }
       return ( 0 );
     }
   // переходим к важной части эксперта - контролю открытых позиций
   // 'важно правильно войти в рынок, но выйти - еще важнее...'
   for (cnt= 0 ;cnt<total;cnt++)
     {
       OrderSelect (cnt, SELECT_BY_POS, MODE_TRADES);
       if (OrderType()<=OP_SELL &&   // это открытая позиция? OP_BUY или OP_SELL 
         OrderSymbol()== Symbol ())   // инструмент совпадает?
        {
         if (OrderType()==OP_BUY)   // открыта длинная позиция
           {
             // проверим, может уже пора закрываться?
             if (MacdCurrent> 0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious &&
               MacdCurrent>(MACDCloseLevel* Point ))
                {
                 OrderClose(OrderTicket(),OrderLots(),Bid, 3 ,Violet); // закрываем позицию
                 return ( 0 ); // выходим
                }
             // проверим - может можно/нужно уже трейлинг стоп ставить?
             if (TrailingStop> 0 )  
              {                 
               if (Bid-OrderOpenPrice()> Point *TrailingStop)
                 {
                   if (OrderStopLoss()<Bid- Point *TrailingStop)
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Bid- Point *TrailingStop,
                                 OrderTakeProfit(), 0 ,Green);
                     return ( 0 );
                    }
                 }
              }
           }
         else // иначе это короткая позиция
           {
             // проверим, может уже пора закрываться?
             if (MacdCurrent< 0 && MacdCurrent>SignalCurrent &&
               MacdPrevious<SignalPrevious && MathAbs (MacdCurrent)>(MACDCloseLevel* Point ))
              {
               OrderClose(OrderTicket(),OrderLots(),Ask, 3 ,Violet); // закрываем позицию
               return ( 0 ); // выходим
              }
             // проверим - может можно/нужно уже трейлинг стоп ставить?
             if (TrailingStop> 0 )  
              {                 
               if ((OrderOpenPrice()-Ask)>( Point *TrailingStop))
                 {
                   if ((OrderStopLoss()>(Ask+ Point *TrailingStop)) || (OrderStopLoss()== 0 ))
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Ask+ Point *TrailingStop,
                                 OrderTakeProfit(), 0 ,Red);
                     return ( 0 );
                    }
                 }
              }
           }
        }
     }
   return ( 0 );
  }
// конец.
 

안녕하세요 !

방금 NormalizeDouble 의 이상한 작업을 알아차렸습니다.

즉, 어드바이저는 잘 작동하고 오류가 발생하지 않지만 테스터의 로그는 매우 이상합니다.

설명하겠습니다.

나는 이익 함수를 계산합니다. 나는 예상대로 NormalizeDouble(Profit,Digits);

다음 인쇄(" 이익=",DoubleToStrMorePrecision(Profit,8));

결과적으로 로그에 "profit=0.88881912"가 표시됩니다. 이론상으로는 0.88881000 이어야 겠죠?

아니면 내가 바보이고 뭔가 잘못하고 있습니까?

 
goodearth :

안녕하세요 !

방금 NormalizeDouble의 이상한 작업을 발견했습니다.

즉, 어드바이저는 잘 작동하고 오류가 발생하지 않지만 테스터의 로그는 매우 이상합니다.

설명하겠습니다.

나는 이익 함수를 계산합니다. 나는 예상대로 NormalizeDouble(Profit,Digits);

다음 인쇄(" 이익=",DoubleToStrMorePrecision(Profit,8));

결과적으로 로그에 "profit=0.88881912"가 표시됩니다. 이론상으로는 0.88881000 이어야 겠죠?

아니면 내가 바보이고 뭔가 잘못하고 있습니까?

거래 주문 과 관련된 이익 가치가 있습니까?
 
artmedia70 :
거래 주문과 관련된 이익 가치가 있습니까?

그렇지. 그리고 오류 없이 :-). 그래서 놀랐습니다.

빌드 735가 있습니다.

거래가 데모에 있습니다.

아아아아아 알았어요! 할당 작업 을 잊어 버렸습니다 :-). "Profit=NormalizeDouble(Profit,Digits)".

고문이 오류를 제공하지 않는 이유는 여전히 진실이 분명하지 않습니다.))

아마도 서버에서 자동으로 반올림됩니다 .....

어떤 이유에서인지 NormalizeDouble은 함수가 아닌 절차인 것 같습니다 :-).

 
Ozero :

페레즈 ";" 브래킷용.

프로그램은 작동하지만 주기적으로 오류 4108에서 맹세합니다.


호수.

사실, 당신은 그것을 제거해야합니다!

 
borilunad :

사실, 당신은 그것을 제거해야합니다!

보리스, 그에게 코드를 직접 보여 주면 더 좋을 것입니다. 그렇지 않으면 수면 부족으로 잊어 버렸습니다 ...;)

 ResetLastError ();
if (!OrderClose(OrderTicket(),OrderLots(),_Bid, 15 )) Print ( "Чё-та не закрылася позиция. Фигня вот такая происходит: " + GetLastError ());
 
artmedia70 :

보리스, 그에게 코드를 직접 보여 주면 더 좋을 것입니다. 그렇지 않으면 수면 부족으로 잊어 버렸습니다 ...;)

귀하의 저작권을 남용하려는 것은 아닙니다! ;)

하지만 진지하게, 뭔가가 삽입되지 않았습니다! 하지만 이제 시도하겠습니다!

 ResetLastError ();
if (!OrderClose(OrderTicket(),OrderLots(),_Bid, 15 )) Print ("");

이제 작동했습니다! 기이한!

 
여보세요

해결책을 알려주세요.

에디터의 500번째 빌드로 에러 없이 컴파일해주는 어드바이저가 있습니다.

그러나 새 버전에서는 오류가 발생합니다. 다음과 같이:

 bool TP?= true ;   // ошибка  '?' - semicolon expected    
그러나 이것에 대해 이미 두 번

 if (TP?)     // ')' - unexpected token    
           // ')' - ':' colon sign expected     
새 버전과 이전 버전의 설명서를 찾아보았지만 물음표에 대해 비슷한 것을 찾지 못했습니다.

질문: 이러한 작업은 무엇을 의미하며 코드가 정상적으로 컴파일되도록 수정하는 방법은 무엇입니까?

미리 감사드립니다


 

안녕하세요! if esle 문이 때때로 저에게 효과가 없는 이유를 알려주세요.
다음은 예입니다.

 double H3=ObjectGet ( "H3 line" , OBJPROP_PRICE1);
int start()
{
double price = Bid;
if (price==H3)
{
 Alert ( "Урааааа  " , Symbol ());
}
return ( 0 );
}

어디에:
H3는 레벨의 가격 값입니다.
가격 - 현재 가격

결과적으로 가격이 이 수준에 도달했지만(때로는 그 수준에서 멈추기도 함) 경고가 작동하지 않습니다.
무슨 일이야?