Questions des débutants MQL4 MT4 MetaTrader 4 - page 17

 
Babu Bonappan:

OrderOpenPrice, tel que je le comprends, me donne exactement ce dont j'ai besoin. Mais seulement si la devise du dépôt est l'USD et que la paire négociée est l'EUR/USD. Dans ce cas, c'est comme si l'OrderOpenPrice stockait le taux de change de la devise de base par rapport à la devise du dépôt au moment de l'ouverture de l'ordre sachant que vous pouvez facilement calculer le dépôt.

Mais si au moins une de ces conditions n'est pas remplie, comment obtenir la valeur de l'acompte pour une commande individuelle ? Où peut-on trouver le taux de la devise de base d'une cotation par rapport à la devise du dépôt au moment de son ouverture ?

Oui, nous avons l'heure d'ouverture de la commande à la seconde près. Mais que pouvons-nous obtenir ? Au maximum - les paramètres de la bougie minute du symbole requis. Mais jamais la valeur exacte du taux utilisé pour le calcul du dépôt. Mais la fonction AccountMargin l'obtient en quelque sorte ! J'aimerais beaucoup comprendre comment il s'y prend exactement.

Vous avez besoin de trois formules pour calculer la marge.

En fonction de la devise de votre dépôt, vous calculerez la marge pour n'importe quelle paire de devises.

Il est possible qu'il y ait une erreur dans le calcul. Mais il sera beaucoup plus petit que celui qui apparaîtra lorsqu'on arrondira le résultat du calcul au centième d'unité de la devise de base du dépôt, c'est-à-dire que si c'est un dollar, alors je veux dire des cents.

PS

AccountMargin est la valeur actuelle, c'est-à-dire la dernière valeur.

 

Et si j'obtiens la valeur exacte de la marge au moment de l'ouverture de l'ordre en utilisantMarketInfo(OrderSymbol(),MODE_MARGINREQUIRED)*Lot- elle aura toujours deux décimales, n'est-ce pas ? Puis je le multiplierai par 100 et le sauvegarderai comme MagicNumber de cette commande. Et si nécessaire, je le sortirai de là et le diviserai par 100.0.

Est-ce que ce sera correct ?

 
Babu Bonappan:

Et si j'obtiens la valeur exacte de la marge au moment de l'ouverture de l'ordre en utilisantMarketInfo(OrderSymbol(),MODE_MARGINREQUIRED)*Lot- elle aura toujours deux décimales, n'est-ce pas ? Puis je le multiplierai par 100 et le sauvegarderai comme MagicNumber de cette commande. Et si nécessaire, je le sortirai de là et le diviserai par 100.0.

Est-ce que ce sera correct ?

Encore une fois, ce n'est pas à ça que sert le MagicNumber. Il serait préférable de l'écrire dans un fichier journal et de le lire ensuite.

Tout dépend de l'objectif de ce calcul et du nombre de commandes pour lequel le programme est conçu.

Il me semble que des calculs aussi précis ne sont nécessaires que pour un courtier ou une société de courtage.

De ce point de vue, la solution optimale serait l'enregistrement.

 
Vitaly Muzichenko:

Pourquoi mentez-vous sur le nombre de signes ? N'induisez pas les gens en erreur.

Ha.

N'avez-vous jamais entendu parler d'un compte de haute précision ?

 

Reporté :

écrit un Conseiller Expert simple utilisant un indicateur externe, il y a un hic.

La fermeture d'un demi-lot ne fonctionne pas correctement et l'ordre est modifié à chaque tick.

Voici le bloc de modification à acheter

if (CountBuy()>0) //Cette fonction compte le nombre d'ordres d'achat
{ for (int i = OrdersTotal() -1 ; i>=0 ; i--)
{ si (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{ if (OrderMagicNumber()==Magic && OrderType()==OP_BUY && (Ask-OrderOpenPrice())*10000>MinMove) //si le prix a dépassé le mouvement requis de l'indicateur
SL=NormalizeDouble(Ask-(MinMove*10)*Point,Digits) ; //Changer le Stop en Breakeven ici
if(!OrderClose(Ticket,Lots/2,Ask,Slippage,Black)) //J'essaie de fermer la moitié du lot
Print("Erreur de fermeture de la moitié du lot à acheter") ;
if(!OrderModify(Ticket,OrderOpenPrice(),SL,TP,0)) /ici je déplace la partie restante vers le Breakeven
Print("Erreur de modification du seuil de rentabilité à l'achat") ;

} } }


 
Vladimir Karputov:

Reposé :

Vasiliy Danilov, 2016.12.02 07:18

Pour commencer, essayez d'utiliser NormalizeDouble(OrderLot()/2,2) au lieu de Lots/2

Et collez le code dans le message via le bouton "SRC" pour le rendre lisible.

 
Pouvez-vous me donner des conseils sur la façon de résoudre ce problème ? J'ai presqueécrit un Conseiller Expert simple utilisant un indicateur externe mais j'ai rencontré un problème.

Si le bloc possède OrederClose - la moitié du lot est fermée immédiatement et OrderModify ne fonctionne plus.

Si nous supprimons OrederClose, OrderModify modifie l'ordre pour chaque tick.

Voici le bloc de modification à acheter

   if (CountBuy()>0) //В этой функции считается кол-во ордеров на покупку
   { for (int i = OrdersTotal() -1; i>=0; i--)
     { if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {  if (OrderMagicNumber()==Magic && OrderType()==OP_BUY && (Ask-OrderOpenPrice())*10000>MinMove) //Если цена прошла необходимое движение из индикатора
      SL=NormalizeDouble(Ask-(MinMove*10)*Point,Digits); //Тут меняю стоп на безубыток
       if(!OrderClose(Ticket,Lots/2,Ask,Slippage,Black)) //Пытаюсь закрыть половину лота
       Print("Ошибка закрытия половины лота на покупку");
      if(!OrderModify(Ticket,OrderOpenPrice(),SL,TP,0)) //Тут переставляю оставшуюся часть в безубыток
       Print("Ошибка модификации в безубыток на покупку");

   }    }   }
Comment dois-je fermer une moitié de l'ordre et faire en sorte que l'autre moitié aille au seuil de rentabilité une fois que le prix atteint MinMove ?
 
Vasiliy Danilov:
Pouvez-vous me donner des conseils sur la façon de traiter ce problème ? J'ai presqueécrit un Conseiller Expert simple utilisant un indicateur externe mais il y a un problème.

Si vous avez OrederClose dans le bloc, il ferme immédiatement la moitié du lot et OrderModify ne fonctionne plus.

Si vous supprimez OrederClose, OrderModify modifiera l'ordre à chaque tick.

Voici le bloc de modification à acheter

   if (CountBuy()>0) //В этой функции считается кол-во ордеров на покупку
   { for (int i = OrdersTotal() -1; i>=0; i--)
     { if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {  if (OrderMagicNumber()==Magic && OrderType()==OP_BUY && (Ask-OrderOpenPrice())*10000>MinMove) //Если цена прошла необходимое движение из индикатора
      SL=NormalizeDouble(Ask-(MinMove*10)*Point,Digits); //Тут меняю стоп на безубыток
       if(!OrderClose(Ticket,Lots/2,Ask,Slippage,Black)) //Пытаюсь закрыть половину лота
       Print("Ошибка закрытия половины лота на покупку");
      if(!OrderModify(Ticket,OrderOpenPrice(),SL,TP,0)) //Тут переставляю оставшуюся часть в безубыток
       Print("Ошибка модификации в безубыток на покупку");

   }    }   }
Comment dois-je fermer une moitié de l'ordre et faire en sorte que l'autre moitié atteigne le seuil de rentabilité si le prix atteint MinMove ?

Vous avez une erreur en fermant la moitié du lot, donc il ne se modifie pas. Veuillez le corriger conformément à mon message ci-dessus.

Et pour le faire une seule fois, il faut fixer le seuil de rentabilité à un nombre fixe de points et ajouter la condition de vérification de la prise de profit de l'ordre au fait de respecter ce nombre.

Et lorsque le prix passe par une telle condition dans le bloc de modification de l'ordre, la moitié de l'ordre doit être fermée.

 
Alexey Kozitsyn:
Non. Essaie de comprendre ce que tu fais. Ce que vous avez écrit est juste un prototype de la fonction (c'est-à-dire juste une description de ce qu'elle fait). Donc vous l'avez juste arraché de la documentation. Vous devez l'utiliser. Vous devez donc substituer vos propres valeurs aux arguments. Et la fonction renverra le résultat. Ensuite, ce résultat doit être traité.

Merci pour la réponse ... J'ai cherché sur la moitié de l'Internet, il y a très peu d'exemples d'utilisation de la fonctionStringFind, et de ce que j'ai trouvé, j'ai conclu que les paramètres doivent être

intStringFind(

stringcomment =OrderComment()// La chaîne de caractères que nous recherchons.
stringOrderStopLoss, OrderTakeProfit//ce que nous recherchons
intstart_pos=0// à quelle position commencer la recherche

) ;

... Si je me trompe, corrigez-moi ...

 
Vitaly Muzichenko:

Pourquoi mentez-vous sur le nombre de signes ? N'induisez pas les gens en erreur.

Le point de vue de chaque courtier est différent
Raison: