Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 565

 
PolarSeaman:

Vous avez substitué dans le code

à

mais ça n'a pas aidé).

Je suis désolé que ce soit tout ce que vous ayez remarqué).

 
Alekseu Fedotov:

FileSeek() avec le drapeau SEEK_END, vous aidera.

<

Merci ! Je vais essayer !

 
YanSay:

Bonsoir !

Je me demande comment ajouter un code universel (pour différents instruments) pour calculer le lot pour une transaction basée sur le % du dépôt.

Je l'ai fait comme ça :

Le prix ( prix d 'ouverture) et le SL (Stop Loss) sont calculés séparément.

Pour les paires où la devise de cotation est en dollars (par exemple EURUSD), pour l'indice SPX500 et pour l'or - tout est correctement calculé, mais pour les paires où le dollar est la première devise de cotation (par exemple USDJPY), cela ne fonctionne pas.

Veuillez me dire ce que j'ai manqué ?

Attention à la normalisation

La variable _Digits stocke le nombre de décimales après le point décimal qui détermine la précision du prix du symbole graphique actuel.

 
Alekseu Fedotov:

Notez la normalisation

La variable _Digits stocke le nombre de décimales après la virgule qui détermine la précision du prix du symbole graphique actuel.

Merci ! Voici comment il a été refait :

input double MaximumRisk=0.02;                  //Риск в сделке от депозита

//1ый вариант
{Lots = NormalizeDouble(((AccountBalance()*MaximumRisk)/((MathAbs(Price-SL))/Point)/((MarketInfo(Symbol(),MODE_LOTSIZE)*(MarketInfo(Symbol(),MODE_ASK)+Point))
-(MarketInfo(Symbol(),MODE_LOTSIZE)*MarketInfo(Symbol(),MODE_ASK)))),
int(MathAbs(log(MarketInfo(Symbol(), MODE_LOTSTEP)))));}

//2ой вариант
{Lots = NormalizeDouble((AccountBalance()*MaximumRisk)/((MathAbs(Price-SL))/Point)/((MarketInfo(Symbol(),MODE_TICKVALUE))),
int(MathAbs(log(MarketInfo(Symbol(), MODE_LOTSTEP)))));}

Dans la 1ère variante : EURUSD et XAUUSD - tout est correct ; USDJPY - au lieu de 2% du dépôt, il risque 0,2% du dépôt ; dans le cas de SPX500 et BRN, il génère l'erreur 131 d'OrderSend (erreur dans le calcul du lot).

Dans la 2ème variante : EURUSD, XAUUSD et USDJPY - tout est correct ; SPX500 risque 20% du dépôt au lieu de 2% ; pour BRN, il génère l'erreur 131 d'OrderSend (une erreur de calcul de lot).

Il y a une erreur quelque part ailleurs, je n'arrive pas à comprendre à quel endroit, veuillez me conseiller.

 
YanSay:

Merci ! Voici comment on le refait :

La première version : EURUSD et XAUUSD - tout est correct ; USDJPY - il risque 0,2% du dépôt au lieu de 2% du dépôt ; également dans le cas de SPX500 et BRN il génère l'erreur 131 d'OrderSend (erreur de calcul de lot).

Dans le second cas : EURUSD, XAUUSD et USDJPY - tout est correct ; SPX500 risque 20% du dépôt au lieu de 2% ; pour BRN, il génère l'erreur 131 d'OrderSend (une erreur de calcul de lot).

Il y a une erreur à un autre endroit, mais je n'arrive pas à comprendre où elle se trouve.

RemplacerPoint, parMarketInfo(Symbol(),MODE_POINT)

 
Vitaly Muzichenko:

RemplacerPoint, parMarketInfo(Symbol(),MODE_POINT)

Quel est l'intérêt ? Si tout est calculé par le symbole du graphique. Cela a du sens s'il y a une multivariable et que Symbol différent du graphique actuel est calculé.

 
Vitaly Muzichenko:

RemplacerPoint, parMarketInfo(Symbol(),MODE_POINT)

Malheureusement, cela n'a pas aidé.

L'information MODE_POINT indique "Taille du point dans la devise de la cotation". Il est stocké dans la variable prédéfinie Point pour le symbole actuel".

À en juger par la description, la variante à utiliser n'a pas d'importance. Mais j'ai essayé et ça n'a pas aidé.


 

Pouvez-vous me dire s'il est possible de mettre une "sélection" d'un outil graphique sur le bouton dans l'Expert Advisor, de sorte qu'en cliquant sur le bouton, l'icône de l'outil apparaisse sous le curseur et qu'il soit possible de l'étirer ?

Et le canal devrait déjà avoir des propriétés spécifiées

 
Roman Sharanov:

Pouvez-vous me dire s'il est possible de mettre une "sélection" d'un outil graphique sur le bouton dans l'Expert Advisor, de sorte qu'en cliquant sur le bouton, l'icône de l'outil apparaisse sous le curseur et qu'il soit possible de l'étirer ?

En outre, le canal peut déjà avoir des propriétés spécifiées.

Peut-être

 
YanSay:

Malheureusement, cela n'a pas aidé.

Et dans l'information MODE_POINT, il est indiqué "Taille du point en devise de cotation. Pour le symbole actuel est stocké dans la variable prédéfinie Point".

À en juger par la description, la variante à utiliser n'a pas d'importance. Mais j'ai essayé et ça n'a pas aidé.

Essayez la fonction :

//===============================================================================================
//------------------------------ Расчет лота по риску на StopLoss -------------------------------+
//===============================================================================================
double sLot(double Percent=1, double Stloss=100, string symb="0") {
 if(symb=="0") symb=Symbol();
 double TickValue   =SymbolInfoDouble(symb,SYMBOL_TRADE_TICK_VALUE),
        TickSize    =SymbolInfoDouble(symb,SYMBOL_TRADE_TICK_SIZE),
        ContractSize=SymbolInfoDouble(symb,SYMBOL_TRADE_CONTRACT_SIZE),
        Min_Lot     =SymbolInfoDouble(symb,SYMBOL_VOLUME_MIN),
        Max_Lot     =SymbolInfoDouble(symb,SYMBOL_VOLUME_MAX),
        Step        =SymbolInfoDouble(symb,SYMBOL_VOLUME_STEP),
        Free        =AccountInfoDouble(ACCOUNT_FREEMARGIN),
        Lots_New    =0.0;
 int CalcMode=(int)SymbolInfoInteger(symb,SYMBOL_TRADE_CALC_MODE);

  if(Percent > 100) Percent = 100;
  if(Stloss <=0) return(0);
  if(Percent == 0) Lots_New = Min_Lot;
   else {
    if(CalcMode==0 || CalcMode==4)
      Lots_New = MathFloor((((Free*Percent/100)/Stloss)/TickValue)/Step)*Step;
    if(CalcMode==1||CalcMode==2||CalcMode==3)
      Lots_New = MathFloor(((((Free*Percent)/100)/Stloss)/((TickSize*TickValue)*ContractSize/TickValue))/Step)*Step;
   }
   if(Lots_New > Max_Lot) Lots_New = Max_Lot;
   if(Lots_New < Min_Lot) return(0);
  return(NormalizeDouble(Lots_New,/*LotDigit()*/ 2));
 }