Questions des débutants MQL5 MT5 MetaTrader 5 - page 722

 
Alexey Viktorov:
Ouais, eh bien... Où puis-je trouver un courtier comme celui-là... Pouvez-vous me donner un lien ?
C'est vrai. L'achat se termine à l'offre
 
Je m'excuse pour mon inattention. J'ai lu "ouvre"...
 

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.
 
Konstantin_78:

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.

 
Andrey F. Zelinsky:

Вы же сами и ответили на свой вопрос.

Есть такой параметр 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).

 
Vladimir Karputov:

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 LotA()
{
   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);
  }
//+------------------------------------------------------------------+}
 
Marina Korotkih:

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.

 
Renat Akhtyamov:

                  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, est-ce que ça peut être comme ça?

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)

 
Vitaly Muzichenko:

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 !

 
Marina Korotkih:

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.


Vous êtes sur une pente glissante).
Raison: