Questions des débutants MQL5 MT5 MetaTrader 5 - page 722
Vous manquez des opportunités de trading :
- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Inscription
Se connecter
Vous acceptez la politique du site Web et les conditions d'utilisation
Si vous n'avez pas de compte, veuillez vous inscrire
Ouais, eh bien... Où puis-je trouver un courtier comme celui-là... Pouvez-vous me donner un lien ?
Bon après-midi,
Question :
Pouvez-vous me dire pourquoi je ne peux pas mettre un achat en attente :
request.price =SymbolInfoDouble(Symbol(),SYMBOL_ASK)+(offset)*point ;
Si le décalage est de 1 , l'erreur apparaîtra:
échec de l'achat stop 0.10 AUDNZD.m à 1.03748 [prix invalide], c'est-à-direun petitniveau prix (dans mon cas)
Lorsque le même "ordre d'exécution" est placé juste après.
request.price = SymbolInfoDouble(Symbol(), SYMBOL_ASK)
tout fonctionne bien (c'est-à-dire que la commande est passée) :
ordre d'achat 0.10 à 1.03747 [#2 achat 0.10 AUDNZD.m à 1.03747]
Pourquoi la demande d' un ordre en attente(1,03748) n'est-elle pas acceptée, c'est-à-dire qu'à 1,03747, il est placé, mais à 1,03748, il ne l'est pas ? (parce queSYMBOL_ASK prend en compte l'écart et le décalage - le décalage par rapport au prix actuel pour passer l'ordre, en points, est augmenté de 1)
Mais à offset=100 : prix BUY_STOP en attente = 1.03847 - cela fonctionne déjà
Merci.Bon après-midi,
Question :
Pouvez-vous me dire pourquoi je ne peux pas mettre un achat en attente :
request.price =SymbolInfoDouble(Symbol(),SYMBOL_ASK)+(offset)*point ;
Si le décalage est de 1 , l'erreur apparaîtra:
échec de l'achat stop 0.10 AUDNZD.m à 1.03748 [prix invalide], c'est-à-dire unpetit niveau de prix (dans mon cas).
Quand je place un "ordre d'exécution" immédiatement après
request.price = SymbolInfoDouble(Symbol(), SYMBOL_ASK)
tout fonctionne bien (c'est-à-dire que la commande est passée) :
ordre d'achat 0.10 à 1.03747 [#2 achat 0.10 AUDNZD.m à 1.03747]
Pourquoi la demande d' un ordre en attente(1.03748) n'est-elle pas acceptée, c'est-à-dire qu'à 1.03747 l'ordre est placé, mais qu'à 1.03748 l'ordre est petit ?
Mais si offset=100 : prix BUY_STOP en attente = 1.03847, cela fonctionne déjà.
Merci.Vous avez déjà répondu à votre propre question.
Il existe un paramètre "stoplevel" - distance minimale nécessaire entre le prix actuel et le prix de placement d'un ordre en attente - pour chaque symbole, il a sa propre valeur et est défini dans les conditions de négociation.
Вы же сами и ответили на свой вопрос.
Есть такой параметр stoplevel -- минимально необходимое расстояние от текущей цены до цены установки отложенного ордера -- для каждого инструмента своё значение и задаётся в торговых условиях
Alors il serait probablement juste d'écrire
prix =SymbolInfoDouble(Symbol(),SYMBOL_ASK)+SymbolInfoInteger(Symbol(),SYMBOL_TRADE_STOPS_LEVEL)*point
Toutefois, si vous avez écrit "...à partir du prix actuel ", quel est le rapport avec l'écart ? Qui est inclus dans SYMBOL_ASK (parce que SYMBOL_ASK = prix ouvert + spread).
J'ai joint un exemple pour vous aider...
Je vois, l'exemple a aidé. Merci.
Maintenant, voici une question.
Lorsque j'augmente le lot, à un moment donné, il n'y a plus assez de fonds libres, et je dois ouvrir avec un lot plus important.
C'est-à-dire, entrer le lot maximum, autant que FreeMargin le permet.
Comment écrire cette condition: s'il n'y a pas assez de fonds pour ouvrir une position avec le lot calculé, la fonction doit retourner le lot maximum possible pour ouvrir la position.
{
double Lot=FirstLot;
if(DoublingCount<=0) return Lot;
double MaxLot=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MAX);
double MainLot=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);
if(Lot<MainLot)Lot=MainLot;
if(Lot>MaxLot)Lot=MaxLot;
double lt1=Lot;
HistorySelect(0,TimeCurrent());
if(HistoryOrdersTotal()==0)return(Lot);
double cl=HistoryOrderGetDouble(HistoryOrderGetTicket(HistoryOrdersTotal()-1),ORDER_PRICE_OPEN);
double op=HistoryOrderGetDouble(HistoryOrderGetTicket(HistoryOrdersTotal()-2),ORDER_PRICE_OPEN);
long typeor=HistoryOrderGetInteger(HistoryOrderGetTicket(HistoryOrdersTotal()-2),ORDER_TYPE);
if(typeor==ORDER_TYPE_BUY)
{
if(op>cl)
{
if(ud<DoublingCount)
{
lt1=HistoryOrderGetDouble(HistoryOrderGetTicket(HistoryOrdersTotal()-2),ORDER_VOLUME_INITIAL)*_C_;
ud++;
}
else ud=0;
}
else ud=0;
}
if(typeor==ORDER_TYPE_SELL)
{
if(cl>op)
{
if(ud<DoublingCount)
{
lt1=HistoryOrderGetDouble(HistoryOrderGetTicket(HistoryOrdersTotal()-2),ORDER_VOLUME_INITIAL)*_C_;
ud++;
}
else ud=0;
}
else ud=0;
}
if(lt1>MaxLot)lt1=MaxLot;
lt1=LotCheck(lt1);
return(lt1);
}
//+------------------------------------------------------------------+}
Je vois, l'exemple a aidé. Merci.
Maintenant, cette question.
Lorsque j'augmente le lot, à un moment donné, il n'y a plus assez de fonds libres, et je dois ouvrir avec un lot plus important.
C'est-à-dire, entrer le lot maximum, autant que FreeMargin le permet.
Comment écrire cette condition: s'il n'y a pas assez de fonds pour ouvrir une position avec le lot calculé, la fonction doit retourner le lot maximum possible pour ouvrir la position.
double Mgn,Lot=0,BID,ASK;
BID=SymbolInfoDouble(_Symbol,SYMBOL_BID);
ASK=SymbolInfoDouble(_Symbol,SYMBOL_ASK);
if(OrderCalcMargin(ORDER_TYPE_BUY,_Symbol,1,ASK,Mgn)==true)Lot=AccountInfoDouble(ACCOUNT_MARGIN_FREE)/Mgn;
if(OrderCalcMargin(ORDER_TYPE_SELL,_Symbol,1,BID,Mgn)==true)Lot=AccountInfoDouble(ACCOUNT_MARGIN_FREE)/Mgn;
Marina, que dis-tu de ça ?
Vous appliquez deux options de calcul - l'une pour ouvrir la VENTE, et l'autre pour ouvrir l'ACHAT.
if(OrderCalcMargin(ORDER_TYPE_BUY,_Symbol,1,ASK,Mgn)==true)Lot=AccountInfoDouble(ACCOUNT_MARGIN_FREE)/Mgn;
if(OrderCalcMargin(ORDER_TYPE_SELL,_Symbol,1,BID,Mgn)==true)Lot=AccountInfoDouble(ACCOUNT_MARGIN_FREE)/Mgn;
Non, ça ne l'est pas.
Il ne faut pas seulement calculer le lot maximum possible, mais aussi vérifier le tout pour le minimum autorisé, car il se peut que le lot minimum soit de 0.01, et que la marge vous permette d'ouvrir seulement 0.009, alors tourmentez le serveur avec des demandes qui ne seront jamais acceptées, mais ils peuvent prendre des mesures à votre égard)
Non, ça ne l'est pas.
Vous devez non seulement calculer le lot maximum possible, mais aussi vérifier l'ensemble de la chose pour le minimum autorisé, car il peut arriver que le lot minimum 0,01, et la marge vous permet d'ouvrir seulement 0,009, puis la torture des demandes du serveur, qui ne sera jamais accepter, mais l'action sur vous et peut prendre)
Écrire le code complet, comme il se doit, et je verrai en même temps.... ?
J'apprendrai toujours de vous et je garderai un œil sur vous pour m'assurer que les réponses sont complètes.
J'ai travaillé comme superviseur technique, ne vous inquiétez pas, tout ira bien !
Ensemble, nous formons une équipe !
Je vois, l'exemple a aidé. Merci.
Maintenant, cette question.
Lorsque j'augmente le lot, à un moment donné, il n'y a plus assez de fonds libres, et je dois ouvrir avec un lot plus important.
C'est-à-dire, entrer le lot maximum, autant que FreeMargin le permet.
Comment écrire cette condition: s'il n'y a pas assez de fonds pour ouvrir une position avec le lot calculé, la fonction doit retourner le lot maximum possible pour ouvrir la position.