[Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas votre chemin. Je ne peux aller nulle part sans toi. - page 825

 
eugggy:
Je comprends en termes généraux, mais qu'est-ce que cela signifie if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES))break ; si aucun ordre n'est sélectionné, alors abandonner ou quoi ?


OrderSelect (voir https://docs.mql4.com/ru/trading/OrderSelect) renvoie FALSE lorsque la fonction échoue. Voir https://docs.mql4.com/ru/basis/operators/break pour l'opérateur de pause.

Ceci peut être simplifié en

OrderSelect(i,SELECT_BY_POS,MODE_TRADES) ;

l'essentiel est de choisir l'ordre.

 
eugggy:


Et pour moi, ça ressemble à des choses absolument différentes. Pourriez-vous insérer ceci dans votre code if(Tip==OP_BUYSTOP||Tip==OP_SELLSTOP&&Minute()<59&&Minute()>57) OrderDelete(Ticket) ;

et si oui, quelle partie ?


Sans voir votre code, je peux plutôt supposer cela (tout dépend de votre algorithme) :

if(OrderType()==OP_BUYSTOP) OrderDelete(OrderTicket()) ;
if(OrderType()==OP_SELLSTOP) OrderDelete(OrderTicket()) ;
if(OrderType()==OP_BUYLIMIT) OrderDelete(OrderTicket()) ;
if(OrderType()==OP_SELLLIMIT) OrderDelete(OrderTicket()) ;

Vous devez seulement mettre de l'ordre dans les variables et corriger les parenthèses dans les conditions avec || et &&.

La condition Minute()<59&&Minute()>57 peut être réduite à Minute()==58 ou utiliser >= ou <=.

Pour forcer la clôture d'un ordre en suspens à la fin d'une période ou à une certaine heure lors de sa mise en place, vous pouvez spécifier le paramètre de date d'expiration - voir https://docs.mql4.com/ru/trading/OrderSend. Dans ce cas, vous n'avez pas à vous soucier de la programmation de sa fermeture. Et la commande sera fermée sans condition et sans correction pour le manque de connexion.

 
eugggy:

Oui, beaucoup de choses utiles. J'aurais pu me passer des gratuités, mais c'est un manuel très bien écrit.
Vous voyez... Je suis sur le sujet de comment "ils parlent maintenant" :)

Freebie, les gars ! Yo ! Comon evry body !!!

Je suppose que si le manuel de SC était écrit comme ça, ce serait un 6+.

Désolé pour le hors-sujet...

 
eugggy:

Non, nous n'en avons pas besoin à la place, nous en avons besoin en plus. J'ai regardé le graphique : parfois le prix ne sort pas du canal High-Low et les ordres en attente restent. Si vous avez une date d'expiration, vous pouvez la résoudre, je suis tout à fait pour. Quant au livre de 1986, vous êtes sérieux ? Je suis moi-même ancien, mais je pense que c'est trop.


En outre, vous devez écrire un code similaire supplémentaire. Il me semble que votre code est un peu fouillis.

Je ne plaisantais pas à propos du livre de 1986. Encore une fois, si vous voulez apprendre les bases de la programmation, vous devez les apprendre sans vous encombrer des constructions du langage moderne. Vous avez besoin des éléments de base. Les manuels d'informatique pour les écoles secondaires, en particulier le premier, sont méthodiquement bien composés pour les personnes "muettes". Comment, par qui, pour qui et pourquoi les manuels scolaires modernes sont rédigés est un sujet distinct.

 

date heure lots prix

26 2010.01.05 12:24 vendre 12 0.10 1.44026 1.44907 1.43526 0.00 3200.09
28 2010.01.05 13:21 acheter 13 0.26 1.44326 1.43445 1.44826 0.00 3200.09
30 2010.01.05 15:34 vendre 14 0.43 1.44026 1.44907 1.43526 0.00 3200.09
32 2010.01.05 16:27 acheter 15 0.72 1.44326 1.43445 1.44826 0.00 3200.09
34 2010.01.05 17:18 vendre 16 1.19 1.44026 1.44907 1.43526 0.00 3200.09

Ici, nous avons 5 ordres ouverts dans les directions correspondantes.

Comment calculer la marge totale pour tous les ordres ouverts ?

Paire : EURUSD, contrat 100,000, effet de levier 100.

 
ikatsko:

date heure lots prix

26 2010.01.05 12:24 vendre 12 0.10 1.44026 1.44907 1.43526 0.00 3200.09
28 2010.01.05 13:21 acheter 13 0.26 1.44326 1.43445 1.44826 0.00 3200.09
30 2010.01.05 15:34 vendre 14 0.43 1.44026 1.44907 1.43526 0.00 3200.09
32 2010.01.05 16:27 acheter 15 0.72 1.44326 1.43445 1.44826 0.00 3200.09
34 2010.01.05 17:18 vendre 16 1.19 1.44026 1.44907 1.43526 0.00 3200.09

Voici 5 ordres ouverts dans les directions respectives.

Comment calculer la marge totale pour tous les ordres ouverts ?

Paire : EUROLLAR, contrat 100000, effet de levier 100.

MarketInfo(Symbol(),MODE_MARGINREQUIRED);

Retourne le montant des fonds libres nécessaires pour ouvrir 1 lot dans un ordre d'achat, bien regardez les autres, en fonction de vos besoins.

Vous pouvez également trouver ceci utile :

double AccountFreeMarginCheck ( string symbol, int cmd, double volume)

Renvoie le montant des fonds libres restant après l'ouverture de la position spécifiée au prix actuel sur le compte actuel. Si les fonds disponibles sont insuffisants, l'erreur 134 (ERR_NOT_ENOUGH_MONEY) sera générée.
 
Merci pour la réponse rapide, mais je veux calculer la marge AVANT l'ouverture de ces positions ! La stratégie est une avalanche, j'ai besoin de savoir s'il y aura un Stop Out après l'ouverture des positions correspondantes ? La taille de tous les lots à venir est connue à l'avance. Je voudrais savoir : combien d'ordres (avec des lots incrémentaux connus à l'avance) peuvent être ouverts ?
 
ikatsko:
Merci pour la réponse rapide, mais je veux calculer la marge AVANT l'ouverture de ces positions ! La stratégie est une avalanche, j'ai besoin de savoir s'il y aura un Stop Out après l'ouverture des positions correspondantes ? La taille de tous les lots à venir est connue à l'avance. Je voudrais savoir : combien d'ordres (avec des lots incrémentaux connus à l'avance) peuvent être ouverts ?
.
// ==========================================================================
// ------------ Функция рассчёта величины лота для открытия позиции ---------
// Если лот превышает возможный для открытия позы, то он корректируется 
// ==========================================================================

double CorrectLots(double lt)
{
   double ltcorr;
   double pnt =      MarketInfo(Symbol(),MODE_POINT);
   double mspr =     MarketInfo(Symbol(),MODE_SPREAD);
   double dig =      MarketInfo(Symbol(),MODE_DIGITS);
   double MaxLot =   MarketInfo(Symbol(),MODE_MAXLOT);
   double MinLot =   MarketInfo(Symbol(),MODE_MINLOT);
   double StpLot =   MarketInfo(Symbol(),MODE_LOTSTEP);
   double OneLot =   MarketInfo(Symbol(),MODE_MARGINREQUIRED);
   double TradeMrg = NormalizeDouble(AccountFreeMargin()/4.0,dig);    // Свободные средства, разрешенные к торговле
   
   lt=MathAbs(lt);
   ltcorr=lt;                       // Зададим начальное значением ltcorr равным значению lt
   
   if (lt>MaxLot) ltcorr=MaxLot;   // Проверим превышение допустимых ...
   if (lt<MinLot) ltcorr=MinLot;   // ... значений лота
   
   double Money=ltcorr*OneLot+mspr*pnt;    // Вычисляем стоимость открываемой позы

   if (Money<TradeMrg)              // Если свободных средств больше, чем цена позиции - 
      {
         return(ltcorr);                                                            // ... возвращаем неизменённый лот
      }
   else if (Money>=TradeMrg)        // Если цена позиции равна или больше, чем есть свободных средств, то ...
      {
         ltcorr=MathAbs(MathFloor(TradeMrg/OneLot/StpLot)*StpLot);               // ... рассчитаем допустимый лот
         double MoneyCorr=ltcorr*OneLot+mspr*pnt;                      
         Print("Func CorrectLots: лот ",lt," скорректирован до ",ltcorr,
               " Стоимость позы до корректировки = ",Money,
               " Стоимость позы после корректировки = ",MoneyCorr
               ); 
         return(ltcorr);                                                         // ... и вернём его значение
      }
   Print("Func CorrectLots: лот вернули без изменений");
   if (lt>MaxLot) ltcorr=MaxLot;   // Проверим превышение допустимых ...
   if (lt<MinLot) ltcorr=MinLot;   // ... значений лота
   return(ltcorr);                            // Возврат изначального лота в непредусмотренных случаях с сообщением
}

Essayez et voyez ce que vous pouvez trouver par vous-même... :)

Et, encore une fois.

double AccountFreeMarginCheck ( string symbol, int cmd, double volume)

J'ai utilisé cette fonction dans un EA personnalisé qui utilise également une martingale nue.
J'ai dû écrire une ligne avant d'ouvrir toute position pour la rendre plus stable :

double lt;                           // Лот
// --------------------------------- +

lt=CorrectLots(lt*2);                // Умножаем лот на 2 с проверкой и коррекцией под допустимый размер лота

// ------- Открытие позы ----------- +
 
Artem, j'ai besoin de calculer la marge moi-même, c'est-à-dire de connaître la formule de calcul. Je n'ai pas besoin de la réponse du terminal sur les possibilités actuelles. Je connais la formule, mais il y a quelque chose à propos du calcul de la marge sur les positions qui se chevauchent ! Et je ne sais même pas ce que sont des positions qui se chevauchent ! J'ai spécifiquement donné un exemple où vous pouvez voir que chaque position successive est ouverte dans la direction opposée à la précédente. Si vous calculez la marge sur les positions ouvertes en additionnant tous les lots (et en collant ce montant dans la formule), cela ne correspond pas à la réaction réelle du DC lorsqu'il applique un Stop Out. Je voudrais le calculer de la manière dont le DC le calcule
 
ikatsko:
Artem, j'ai besoin de calculer la marge moi-même, c'est-à-dire que j'ai besoin de connaître la formule de calcul. Je n'ai pas besoin de la réponse du terminal sur les possibilités actuelles. Je connais la formule de calcul, mais il y a une sorte de particularité du calcul de la marge pour les positions qui se chevauchent !!! Et je ne sais même pas ce que sont des positions qui se chevauchent ! J'ai spécifiquement donné un exemple où vous pouvez voir que chaque position successive est ouverte dans la direction opposée à la précédente. Si vous calculez la marge sur les positions ouvertes en additionnant tous les lots (et en collant ce montant dans la formule), cela ne correspond pas à la réaction réelle du DC lorsqu'il applique un Stop Out. Je voudrais le calculer de la même manière que le DC
.

Les positions superposées ne sont-elles pas égales aux positions verrouillées ? Il s'agit de la marge requise pour maintenir deux positions ouvertes de volume égal mais de direction opposée. Elle correspond généralement à la moitié de la marge requise pour maintenir une position ouverte du même volume que l'une des deux positions verrouillées.

Je l'ai remarqué tout de suite, mais je ne pensais pas que ça te perturberait...

Pour le même EA, j'ai calculé la marge de cette façon, je ne sais pas maintenant, peut-être que c'est faux ??? :

// ======================================================================
// -------------------------- Рассчёт свободной маржи -------------------
// ======================================================================
bool LastFreeMargin(string sy, int op, double lot)
{
   if (sy=="0" || sy=="") sy=Symbol();
   double FreeEqu  = AccountFreeMargin();                         // Вся маржа
   double FreeEqu4 = NormalizeDouble(Equ_Start/4.0, 2);           // Делим маржу на 4 (Средства для торговли)
   double CheckEqu = AccountFreeMarginCheck(sy, op, lot);         // Остаток всех средств после открытия позы 
   double EquTrade = FreeEqu-CheckEqu;                            // Средства, требуемые для открытия следующей
   
   if (FreeEqu4-EquTrade>0) return(true);
   else return(false);
}   

C'est tout ce que le DC vous rend :

MODE_MARGININIT 29 Marge initiale requise pour 1 lot
MODE_MARGINMAINTENANCE 30 Montant de la marge requise pour soutenir les positions ouvertes par 1 lot
MODE_MARGINHED 31 Marge facturée sur les positions chevauchées par 1 lot
MODE_MARGINREQUIRED 32 Montant des fonds libres nécessaires pour ouvrir 1 lot à l'achat