Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Nulle part sans toi - 6. - page 758

 
Ozero:

Passez le " ;" derrière le support.

Le programme fonctionne, MAIS il échoue occasionnellement avec l'erreur 4108.


Ozero.

Ouvrez l'aide, voyez les erreurs d'exécution, et nous voyons :

4108

ERR_INVALID_TICKET

Numéro de billet incorrect.

Réfléchissez et cherchez...

 

Aidez les gens ont besoin de négocier sur chaque devise avec ses propres ordres pour distinguer et différencier + après l'ordre ouvert si le prix recule encore plus loin pourrait ouvrir un autre ordre le même que le premier.

//+------------------------------------------------------------------+
//|                                                  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);
  }
// конец.
 

Bonjour à tous !

Je viens de remarquer que NormalizeDouble fonctionne bizarrement.

En d'autres termes, le conseiller expert fonctionne bien et ne présente aucune erreur, mais les journaux dans le testeur de stratégie sont très étranges.

Je vais vous expliquer.

Je calcule le bénéfice en utilisant cette fonction. Je fais ce que je pense que NormalizeDouble(Profit,Digits) devrait faire ;

Puis j'imprime(" profit=",DoubleToStrMorePrecision(Profit,8)) ;

Le résultat est le suivant : "profit=0.88881912". Il semble que ce soit 0,88881000, non ?

Ou peut-être que je suis stupide et que je fais quelque chose de mal ?

 
goodearth:

Bonjour à tous !

Je viens de remarquer que NormalizeDouble fonctionne bizarrement.

En d'autres termes, le conseiller expert fonctionne bien et ne présente aucune erreur, mais les journaux dans le testeur de stratégie sont très étranges.

Je vais vous expliquer.

Je calcule le bénéfice en utilisant cette fonction. Je fais ce que je pense que NormalizeDouble(Profit,Digits) devrait faire ;

Puis j'imprime(" profit=",DoubleToStrMorePrecision(Profit,8)) ;

Le résultat est le suivant : "profit=0.88881912". Il semble que ce soit 0.88881000, non ?

Ou peut-être que je suis stupide et que je fais quelque chose de mal ?

Avez-vous une valeur de profit dans les ordres d'échange?
 
artmedia70:
Votre valeur de profit participe-t-elle aux ordres de commerce ?

Oui, bien sûr. Et pas d'erreurs :-). C'est pourquoi j'ai été surpris.

J'ai le Build 735.

Le trading se fait sur la démo.

Aaaaaaaaah je l'ai eu ! J'ai oublié l'opération d'affectation:-). "Profit=NormaliserDouble(Profit,Chiffres)".

Mais je ne comprends toujours pas pourquoi l'EA ne montre pas d'erreurs ;))

Peut-être que le serveur arrondit automatiquement.....

Je pensais que NormalizeDouble était une procédure, pas une fonction :-).

 
Ozero:

Mettez " ;" derrière une parenthèse.

Le programme fonctionne, MAIS il échoue occasionnellement avec l'erreur 4108.


Ozero.

En fait, il doit être supprimé !

 
borilunad:

En fait, il devrait être supprimé !

Boris, tu ferais mieux de lui montrer le code directement, parce que j'étais trop endormi pour m'en souvenir... ;)

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

Boris, tu ferais mieux de lui montrer le code directement, parce que j'étais trop endormi pour m'en souvenir... ;)

Je ne voulais pas abuser de votre droit d'auteur ! ;)

Et sérieusement, quelque chose n'a pas collé ! Mais je vais essayer maintenant !

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

Et maintenant ça a marché ! C'est bizarre !

 
Bonjour

Veuillez me donner une solution.

Il y a une EA qui compile sans erreur avec la 500ème build de l'éditeur.

Mais dans la nouvelle version, il génère des erreurs. Je vois ces erreurs :

bool TP?=true;   // ошибка  '?' - semicolon expected    
Et celle-ci, deux fois.

if(TP?)    // ')' - unexpected token    
           // ')' - ':' colon sign expected     
J'ai parcouru le manuel de la nouvelle et de l'ancienne version, mais je n'ai rien trouvé concernant le point d'interrogation.

Question : que signifient ces opérations et comment les corriger pour que le code compile normalement ?

Merci d'avance.


 

Bonjour ! Pourriez-vous me dire pourquoi j'ai parfois un opérateur ifle qui ne fonctionne pas.
Voici un exemple :

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

Où :
H3 est la valeur du prix du niveau
price est le prix actuel

Le résultat est que le prix atteint ce niveau (parfois même s'y arrête), mais l'alerte ne se déclenche pas.
Pouvez-vous me dire quelle est l'erreur ?

Raison: