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

 
evillive:
Je parle du terrain, pas du lot minimum, mais bon, oubliez ça.
Oh, oui, bien sûr, si vous n'écrivez pas pour vous-même, vous devez en tenir compte.
 
evillive:

Merci, on me l'a déjà expliqué :D

Il est clair que pour moi-même j'écris avec tous les contrôles, comme il se doit, il y avait juste une ébauche de comment amener le lot à l'équilibre/rapport 10, mais l'idée n'a pas abouti....

Mais vous avez beaucoup de texte, ça pourrait être plus simple :

  lotstep= MarketInfo(Symbol(),MODE_LOTSTEP);
  lotmax=MarketInfo(Symbol(), MODE_MAXLOT);
  lotmin=MarketInfo(Symbol(), MODE_MINLOT);

lot=lotstep*MathRound(AccountBalance()*0.001/lotstep);
if(lot < lotmin) lot = lotmin;
if(lot > lotmax) lot = lotmax;

Cela pourrait être plus simple. Seulement, que se passera-t-il si MarketInfo() pour lottep retourne 0 ? Quelles seront les conséquences ? Le conseiller expert sera arrêté et les positions seront abandonnées ?

Et si MINLOT est fixé par le courtier à 0,03 et LOTSTEP à 0,02, c'est-à-dire que les deux premières valeurs de lot autorisées sont 0,03 et 0,05, et que le solde actuel est de 41 - quelle sera la valeur du lot calculé dans votre code ?

Pourquoi, si le lot est inférieur à la valeur minimale - par exemple, avec un solde égal à 1, il sera égal à 0 après le calcul complet de l'expression - pourquoi dans ce cas votre code prend le lot égal à MINLOT, qui peut être 0.03, c'est-à-dire 30 fois plus que la valeur "brute" de "AccountBalance()*0.001", qui dans ce cas est égale à 0.001 ?

Vous ne pouvez pas toujours obtenir une valeur de lot valide, car les conditions peuvent être telles qu'AUCUNE des valeurs de lot valides ne leur correspond. Les situations erronées doivent toutes être programmées, et il faut se rappeler que c'est au moins 90% du travail.

Le modèle appliqué défini par MetaQuotes est le suivant : lot = MINLOT + N * LOTSTEP, où N = 0, 1, 2... M. Et M est tel que MINLOT + M * LOTSTEP <= MAXLOT et MINLOT + (M + 1) * LOTSTEP > MAXLOT. Par conséquent, vous devez également calculer dans le cadre du modèle défini, c'est-à-dire lot = MINLOT + N * LOTSTEP. Ensuite, toutes sortes de combinaisons maladroites de MINLOT et de LOTSTEP deviennent sans importance, car la formule fonctionne de manière générale. Une fois que vous l'avez écrit correctement, que vous l'avez débogué correctement et que vous vous êtes concentré sur autre chose d'intéressant et d'amusant. Et avec plaisir - parce que vous n'avez pas à revenir constamment à un code mal écrit parce qu'une fois de plus ce code ne fonctionne pas, mais seulement des pépins...

 
simpleton:

Cela pourrait être plus simple. Mais que se passera-t-il si MarketInfo() renvoie 0 pour le lottep ? Quelles seront les conséquences ? Le conseiller expert sera arrêté et les positions seront abandonnées ?

Si la valeur de MINLOT est fixée par un courtier à 0,03, et LOTSTEP à 0,02, c'est-à-dire que les deux premières valeurs de lot sont 0,03 et 0,05, et que le solde actuel est de 41, quelle est la valeur du lot calculé dans votre code ?

Pourquoi, si le lot est inférieur à la valeur minimale - par exemple, avec un solde égal à 1, après le calcul complet il sera égal à 0 ? Pourquoi dans ce cas votre code prend le lot égal à MINLOT, qui peut être, par exemple, 0,03, ce qui est 30 fois plus que la valeur "brute" "AccountBalance()*0,001", qui dans ce cas est égale à 0,001 ?

Vous ne pouvez pas toujours obtenir une valeur de lot valide, car les conditions peuvent être telles qu'AUCUNE des valeurs de lot valides ne leur correspond. Les situations erronées doivent toutes être programmées, et il faut se rappeler que c'est au moins 90% du travail.

Le modèle appliqué défini par MetaQuotes est le suivant : lot = MINLOT + N * LOTSTEP, où N = 0, 1, 2... M. Et M est tel que MINLOT + M * LOTSTEP <= MAXLOT et MINLOT + (M + 1) * LOTSTEP > MAXLOT. Par conséquent, vous devez également calculer dans le cadre du modèle défini, c'est-à-dire lot = MINLOT + N * LOTSTEP. Ensuite, toutes sortes de combinaisons maladroites de MINLOT et de LOTSTEP deviennent sans importance, car la formule fonctionne de manière générale. Une fois que vous l'avez écrit correctement, que vous l'avez débogué correctement et que vous vous êtes concentré sur autre chose d'intéressant et d'amusant. Et avec plaisir - parce que vous n'avez pas à revenir constamment à un code mal écrit parce qu'une fois de plus ce code ne fonctionne pas, mais seulement des pépins...

Pour de telles horreurs, il faut également vérifier si les fonds sont suffisants pour ouvrir un tel lot. Aucune personne saine d'esprit n'autoriserait un robot à déposer 10 livres sachant que le min/lot est de 0,1 et que le pas est de 0,1, par exemple.

Et si on en trouvait un aussi intelligent, le robot lui dirait "donne-moi l'argent et au revoir en attendant" :D.

Et je n'ai jamais vu ou lu nulle part que le pas de lot est de zéro, c'est une fantaisie....

 
evillive:

Pour de telles horreurs, il y a également une vérification de la suffisance des fonds pour ouvrir avec un tel lot. Aucune personne saine d'esprit n'autoriserait un robot à déposer 10 livres, sachant que le lot minimum est de 0,1 et que le pas est de 0,1, par exemple.

Et si l'on trouve une personne aussi intelligente, le robot lui dira "donne-moi l'argent, mais en attendant, dis-lui au revoir" :D

Pour éviter les zéros de MarketInfo dans le testeur, je fais ceci :

  double AFM = AccountFreeMargin(); 
  double StopLevel,FreezeLevel,spr,prot;
  if(IsOptimization() || IsTesting() || IsVisualMode())
  {
    MinLot = 0.1;
    LotStep = 0.01;
    spr = Point*10;
    StopLevel = spr*2;
    FreezeLevel = spr*2;
  }
  else
  {
    MinLot = MarketInfo(Symbol(),MODE_MINLOT);
    LotStep = MarketInfo(Symbol(),MODE_LOTSTEP);
    spr = MarketInfo(Symbol(),MODE_SPREAD)*Point;
    StopLevel = MarketInfo(Symbol(),MODE_STOPLEVEL)*Point;
    FreezeLevel = MarketInfo(Symbol(),MODE_FREEZELEVEL)*Point;
  }
  if(MM == 1) 
  lot = MinLot+MathMax(LotStep*MathFloor((AFM-initdepo)*risk/100),0); 
  else if(MM == 0) lot = MinLot;
 
evillive:

Pour de telles horreurs, il y a également une vérification de la suffisance des fonds pour ouvrir avec un tel lot. Aucune personne saine d'esprit n'autoriserait un robot à déposer 10 livres sachant que le lot minimum est de 0,1 et que l'incrément est de 0,1, par exemple.

Et si on en trouvait un aussi intelligent, le robot lui dirait "Donne-moi l'argent et au revoir" :D

Et je n'ai jamais vu ou lu nulle part que le pas de lot est de zéro, c'est une imagination....

Pourquoi est-ce terrible ? Parce que cela ne correspond pas au modèle simplifié ?

Je voulais dire qu'avec MINLOT = 0,03 et LOTSTEP = 0,02, les deux premières valeurs de lot autorisées sont 0,03 et 0,05. Cela dit, si le solde est, disons, de 41, alors votre code :

lot=lotstep*MathRound(AccountBalance()*0.001/lotstep);

Cela donnera une valeur de lot de 0,04, ce qui n'est pas autorisé. Le robot dira quelque chose comme "le serveur a dit que la taille de mon lot est fausse".

Et une taille de lot nulle peut être obtenue lorsqu'une erreur se produit lors de la demande de sa valeur par MarketInfo(). Comment provoquer une erreur artificiellement - j'ai cité le code :

Print("MarketInfo(\"Фигня\", MODE_LOTSTEP) = ", MarketInfo("Фигня", MODE_LOTSTEP));

Il renvoie 0. Quel genre de fantaisie est-ce ?

 
simpleton:

Pourquoi cette horreur ? Parce que cela ne correspond pas au modèle simplifié ?

Je voulais dire qu'avec MINLOT = 0,03 et LOTSTEP = 0,02, les deux premières valeurs de lot autorisées sont 0,03 et 0,05. Cela dit, si le solde est, disons, de 41, alors votre code :

Cela donnera une valeur de lot de 0,04, ce qui n'est pas autorisé. Le robot dira quelque chose comme "le serveur a dit que la taille de mon lot est fausse".

Et une taille de lot nulle peut être obtenue lorsqu'une erreur se produit lors de la demande de sa valeur par MarketInfo(). Je vous ai donné le code ci-dessus sur la façon d'induire artificiellement cette erreur :

Il retournera 0. Alors quel est le fantasme ?

lot=lotstep*MathRound(AccountBalance()*0.001/lotstep);

Cette formule est facilement corrigée pour répondre aux exigences. Vous devez juste prendre en compte le lot minimum

Il sera un peu différent

lot=Min_Lot+lotstep*MathRound((AccountBalance()-X)*0.001/lotstep);

Où X - Solde pour l'ouverture du lot minimal,

Mais le chèque pour le lot minimum sera toujours nécessaire.

 

Bonjour !

Aidez un ignorant ) Dans le testeur aucune commande ouverte erreur 10013 Wrong request, regardez le code où se trouve l'erreur.

Tous les numéros du journal s'affichent sur l'ordre et l'ordre ne s'ouvre pas.

2014.10.19 12:14:34.984 2014.02.03 00:06:00 requête échouée buy 0.10 at 102.31100 sl : 102.27200 tp : 102.33600 [Invalid request] (requête invalide)

2014.10.19 12:22:17.928 2014.02.03 00:06:00 ticket =0 retcode =10013

MqlTradeRequest Req;
MqlTradeResult  Res;
   string TradeSmb;
   if(TradeSmb=="") TradeSmb=_Symbol;
   Req.action=TRADE_ACTION_DEAL;
   Req.symbol=TradeSmb;
   Req.volume=0.1;
   Req.type=ORDER_TYPE_BUY;
   Req.type_filling=ORDER_FILLING_IOC;
   Req.price = SymbolInfoDouble(_Symbol,SYMBOL_ASK);
   Req.sl= NormalizeDouble(sym_bid - (StopLoss*sym_point),sym_digits);
   Req.tp= NormalizeDouble(sym_ask + (TakeProfit*sym_point),sym_digits);
   Req.deviation=3;
   Req.comment="777";
if(OrderSend(Req,Res))
{
      Print("Sent...");
}
      Print("ticket =",Res.order,"   retcode =",Res.retcode);
      if(Res.order!=0)
     {
      datetime tm=TimeCurrent();
      //--- request all history
      HistorySelect(0,tm);
      string comment;
      bool result=HistoryOrderGetString(Res.order,ORDER_COMMENT,comment);
      if(result)
        {
         Print("ticket:",Res.order,"    Comment:",comment);
        }
Drummer a corrigé votre message
 

Où est-ce que tu vois ça ? !

if(OrderSend(Req,Res))

Consultez la documentation ! Et utilisez le bouton SRC pour insérer le code!

Si vous êtes trop paresseux, voyez la 1ère et dernière fois :

int  OrderSend(
   string   symbol,              // символ
   int      cmd,                 // торговая операция
   double   volume,              // количество лотов
   double   price,               // цена
   int      slippage,            // проскальзывание
   double   stoploss,            // stop loss
   double   takeprofit,          // take profit
   string   comment=NULL,        // комментарий
   int      magic=0,             // идентификатор
   datetime expiration=0,        // срок истечения ордера
   color    arrow_color=clrNONE  // цвет
   );

Ce n'est jamais une mauvaise chose d'apprendre !

 

Messieurs !

Veuillez me conseiller.....

Voici une fonction

OrderProfit( )

Cette fonction renvoie la valeur du bénéfice net pour l'ordre sélectionné.

QUESTION

Cette fonction, similaire à la fonction mentionnée ci-dessus, renvoie la valeur de la perte pour l'ordre sélectionné au lieu de la valeur du bénéfice.

Par exemple, si un ordre se ferme sur SL avec une perte de 150 $, j'ai besoin que la fonction renvoieune perte de 150 $.

Merci.

 
solnce600:

Messieurs !

Veuillez me conseiller.....

Voici une fonction

OrderProfit( )

Cette fonction renvoie la valeur du bénéfice net pour l'ordre sélectionné.

QUESTION

Cette fonction, similaire à la fonction mentionnée ci-dessus, renvoie la valeur de la perte pour l'ordre sélectionné au lieu du profit.

Par exemple, si un ordre est clôturé sur SL avec une perte de 150 $, j'ai besoin que la fonction renvoieune perte de 150 $.

Merci.

C'est la même chose ! Seul le montant sortira avec un moins.