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

 
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 ?

Voulez-vous attribuer un numéro magique à chaque commande ?
 
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 ! Il serait très intéressant de comprendre comment il s'y prend exactement.

OrderOpenPrice - le prix d'ouverture de l'ordre, il (le prix) est le rapport d'une devise à une autre

AccountMargin - donne la marge totale du compte pour tous les ordres ouverts.

 
Vladimir Karputov:

Reporté :

Vasiliy Danilov, 2016.12.02 07:18

Pouvez-vous me dire ce qu'il faut faire ? J'ai presqueécrit un Conseiller Expert simple utilisant un indicateur externe, il y a un hic.

La fermeture de la moitié du lot ne fonctionne pas correctement et l'ordre est modifié pour chaque tick.

Voici le bloc de modification à acheter

if (CountBuy()>0) //Dans cette fonction, le nombre d'ordres d'achat est calculé.
{ 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) ; /ici je change Stop en Breakeven
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 Breakeven
Print("Erreur de modification du seuil de rentabilité à l'achat") ;

} } }


Si SL != OrderStopLoss()) modifier .... Alors l'ordre sera modifié uniquement si SL diffère de l'OrderStopLoss actuel.

Et pour comprendre ce qui ne va pas lors de la fermeture, utilisez GetLastError() ; en général, il serait bon de vérifier OrderClose ... bool testOrCls

testOrCls=OrderClose ......

if( !testOrCls) Print (GetLastError() ) ;

c'est-à-dire que s'il y a une erreur, on demande le code d'erreur ; s'il n'y a pas d'erreur, on ne demande pas le code d'erreur.


 
bablusut:

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// à partir de quelle position commencer la recherche

) ;

... Si je me trompe, veuillez me corriger ...

Cela ne fonctionne pas du tout de cette façon. Les arguments de cette fonction sont 1) la chaîne de caractères à rechercher ; 2) la combinaison de caractères à trouver ; 3) le début de la recherche (par défaut, à partir du caractère nul de la chaîne selon l'étape 1).

Elle renvoie le numéro de la position dans la chaîne, à laquelle la sous-chaîne recherchée commence, ou -1 si aucune sous-chaîne n'est trouvée.

En d'autres termes, écrivez-le comme ceci :

if(StringFind(OrderComment(),"[tp]",0)>-1) {действие при нахождении признака закрытия по TP}
 
Renat Akhtyamov:

Vous avez une erreur en fermant la moitié du lot, donc ce n'est pas modifiable. Veuillez le corriger conformément à mon message ci-dessus.

Si vous voulez le faire une seule fois, vous devez spécifier le seuil de rentabilité par un nombre fixe de points et ajouter la condition de vérification de la prise de profit de l'ordre pour voir s'il correspond à ce nombre.

Et en passant par une telle condition dans le bloc de modification de l'ordre, la moitié est fermée.

Vasiliy Danilov:
Pouvez-vous me dire ce qu'il faut faire ? J'ai presqueécrit un Conseiller Expert simple utilisant un indicateur externe mais il y a un problème.

S'il y a OrederClose dans le bloc, la moitié du lot sera fermée immédiatement et OrderModify ne fonctionnera plus.

Si nous supprimons OrederClose, alors 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 fermer la moitié de l'ordre lorsque le prix atteint le MinMove, et l'autre moitié atteint le Breakeven une fois ?

A propos, je viens de prêter attention à OrderSelect by position SELECT_BY_POS, mais où se trouve la sélection des tickets ?

OrderClose(OrderTicket()

 
Babu Bonappan:

Comment utiliser MQL4 pour obtenir une valeur de marge pour chaque position ouverte dans le terminal ?

J'avais l'habitude de faire comme ça :

margin = MarketInfo(Symbol(),MODE_LOTSIZE) * OrderOpenPrice() / AccountLeverage() * OrderLots();

En négociant l'EUR/USD, cette construction a bien fonctionné et j'étais sûr que sa logique était correcte.

Mais maintenant je veux obtenir le même résultat pour EUR/JPY (ou EUR/CHF). Évidemment, au lieu d'utiliserOrderOpenPrice(), je dois multiplier la valeur d'un lot standard par le taux de la devise de base par rapport à la devise de dépôt (dans mon cas, par EUR/USD). Mais quel est ce taux ? Le taux de change qui était au moment de l'ouverture de la position, ou celui que nous avons maintenant (au moment où nous voulons connaître le montant du dépôt pour cette position) ?

Non MODE_MARGINMAINTENANCE ?

 
A1exPit:

Au fait, je viens de remarquer que OrderSelect sur la position SELECT_BY_POS, mais où se trouve le ticket de sélection ?

OrderClose(OrderTicket()

Vous ne savez rien du tout de ce fil de discussion ?

Si la commande est sélectionnée, alors la fonction OrderTicket() renvoie le ticket de la commande sélectionnée. Et le mode de sélection de la commande - par index ou par ticket - n'a aucune importance.

Il y a une subtilité dans le cas de la sélection par ticket - le pool n'est pas pris en compte, et nous devons vérifier à partir de quelle liste la commande est sélectionnée, en vérifiant l'heure de sa clôture.

 
Vasiliy Danilov:
Pouvez-vous me dire ce qu'il faut faire ? J'ai presqueécrit un Conseiller Expert simple utilisant un indicateur externe mais j'ai rencontré un problème.

S'il y a un OrederClose dans le bloc, 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 pour l'achat

   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 lorsque le prix atteint le niveau MinMove et l'autre moitié atteint le seuil de rentabilité une fois ?

Lors de la fermeture partielle, le ticket change. D'abord pour atteindre le seuil de rentabilité, puis pour fermer.

Soit on change la logique.

 
Artyom Trishkin:

A1exPit:

Au fait, je viens de remarquer que OrderSelect by SELECT_BY_POS , mais où se trouve le ticket de sélection ?

OrderClose(OrderTicket()

Vous ne savez rien du tout de ce fil de discussion ?

Si une commande est sélectionnée, alors la fonction OrderTicket() renvoie le ticket de la commande sélectionnée. Et le mode de sélection de la commande - par index ou par ticket - n'a pas d'importance.

Il y a une nuance lors de la sélection par ticket - le pool n'est pas pris en compte, et vous devez vérifier à partir de quelle liste la commande est sélectionnée en vérifiant l'heure de clôture.

Et si nous regardons le code dans lequel ce commentaire a été écrit ? Ce n'est pas si simple là-bas...

{ 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)) //Пытаюсь закрыть половину лота Какой тикет?
 
Vitalie Postolache:

Et si vous regardez le code dans lequel ce commentaire a été écrit ? Ce n'est pas aussi clair là-bas...

{ 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)) //Пытаюсь закрыть половину лота Какой тикет?
Eh bien... ouais... Je n'ai pas regardé de près. Juste un aperçu. Je ne suis pas intéressé par ce fil pour une raison quelconque.
Raison: