Questions des débutants MQL5 MT5 MetaTrader 5 - page 271

 
soroko:
Ainsi, seule la première valeur est remplie avec l'indice [0].
//+------------------------------------------------------------------+
//|                                                         test.mq5 |
//|                              Copyright © 2014, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2014, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"

double Pr[5];                 // обявление 5-мерного статического массива
double PriceOld;              // переменная для сравнения цены
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   double temp_prace=SymbolInfoDouble(_Symbol,SYMBOL_BID);
   if(NormalizeDouble(PriceOld-temp_prace,5)!=0)
     {
      Pr[4]=Pr[3];
      Pr[3]=Pr[2];
      Pr[2]=Pr[1];
      Pr[1]=Pr[0];
      Pr[0]=temp_prace;
      PriceOld=Pr[0];
     }
  }
//+------------------------------------------------------------------+
 
soroko:

Merci. Cela m'a épargné un week-end sans sommeil).

vicmos merci.
 
barabashkakvn:
vicmos merci.
elle remplit tout avec une seule valeur, comme la fonction ArrayFill(...)/.
 
soroko:
elle remplit tout avec une seule valeur, comme la fonction ArrayFill(...)/.
désolé, il y a juste un plus petit nombre de chiffres ! merci beaucoup !
 

Bonjour à tous ! Un tel problème - le compilateur donne un avertissement. Je ne veux pas l'ignorer, pouvez-vous m'aider à trouver une issue ?

   double aHigh[ 12 ], aLow[ 12 ];
   double dVolatility = 0.0;
   
   CopyHigh(sSymbol, PERIOD_MN1, 0, 12, aHigh);
   CopyLow(sSymbol, PERIOD_MN1, 0, 12, aLow);
   
   dVolatility = ArrayMaximum(aHigh) - ArrayMinimum(aLow);
   dVolatility = NormalizeDouble(dVolatility, SymbolInfoInteger(sSymbol, SYMBOL_DIGITS));

Il maudit spécifiquement à la dernière ligne, dit :"perte possible de données en raison de la conversion de type". Comment normaliser correctement le type réel dans ce cas ?

 
jommerbot:

Bonjour à tous ! Un tel problème - le compilateur donne un avertissement. Je ne veux pas l'ignorer, pouvez-vous m'aider à trouver une issue ?

Il maudit spécifiquement à la dernière ligne, dit :"perte possible de données en raison de la conversion de type". Comment normaliser correctement le type réel dans ce cas ?

   dVolatility = NormalizeDouble(dVolatility, (int)SymbolInfoInteger(sSymbol, SYMBOL_DIGITS));
 
barabashkakvn:
Merci.
 
jommerbot:

Bonjour à tous ! Un tel problème - le compilateur donne un avertissement. Je ne veux pas l'ignorer, pouvez-vous m'aider à trouver une issue ?

Il maudit spécifiquement à la dernière ligne, dit :"perte possible de données en raison de la conversion de type". Comment normaliser correctement le type réel dans ce cas ?

Et une dernière chose : ArrayMaximum et ArrayMinimum renvoient l'index de l'élément trouvé. Donc la bonne méthode est la suivante :

   dVolatility = aHigh[ArrayMaximum(aHigh)] - aLow[ArrayMinimum(aLow)];
 
MigVRN:

De même, ArrayMaximum et ArrayMinimum renvoient l'indice de l'élément trouvé. Donc la bonne méthode est la suivante :

Merci beaucoup. J'ai découvert la même chose en déboguant le code.
 

Il ne calcule pas correctement le niveau de prise de bénéfices en fonction du montant des pertes des ordres fermés. Il s'avère que le 1er ordre = 1 ; le 2ème ordre = 2 ; le 3ème ordre = 3 ; le 4ème ordre = 4. Nous devons calculer le nombre de pips pour couvrir la perte sur tous les ordres précédents et gagner 10% de la perte totale.

En fait, le conseiller expert considère simplement que le montant de chaque ordre fermé est égal à l'ordre supposé en attente, c'est-à-dire que ses calculs montrent que si le 5ème ordre en attente est égal à 5 lots, tous les ordres perdants précédents étaient égaux à 5 lots et, par conséquent, la perte est calculée avec le niveau de profit erroné correspondant. En d'autres termes, si le volume total de 4 ordres est égal à 10 lots, alors le Conseiller Expert va simplement multiplier 4 ordres par le volume du 5ème ordre en attente et obtenir un volume total de 20 lots......Que devons-nous corriger dans le code ?

// Fonction qui calcule le niveau d'achat en fonction du niveau de perte des transactions fermées.

//=================================================================================================

double TakeProfitCalculate(double lot,int type)

{

int n,i ;

double prf,ttp ;


prf=MathAbs(BuyLevel-SellLevel)/Point*LOT*MarketInfo(Symbol(),MODE_TICKVALUE);//

if(No!=0) for(i=OrdersHistoryTotal()-1;i>=0;i--)

{

if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) continue ;

if(OrderSymbol()!=Symbol() || OrderMagicNumber()<MAGIC || OrderMagicNumber()>MAGIC+200 || OrderType()>OP_SELL) continuer ;

n=OrderMagicNumber()-MAGIC ;

prf+=(OrderProfit()+OrderSwap()+OrderCommission()) ;

si(n==0) pause ;

}

prf=MathAbs(prf*(100+ProfitPercent)/100) ;

ttp=prf*Point/(LOT*MarketInfo(Symbol(),MODE_TICKVALUE))

if(type==OP_BUY) return(NRu(BuyLevel+ttp)) ; else return(NRd(SellLevel-ttp))

}

Raison: