[ARCHIVE] Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Nulle part sans toi - 3. - page 10

 
tol64:
Pouvez-vous nous dire s'il est possible de déterminer par programme la possibilité de fixer un stop loss/stake profit immédiatement à l'ouverture d'une position/ordre en attente ou après ?


Vérifiez au préalable les niveaux d'arrêt et de profit.

Les identificateurs de requête utilisés dans la fonction MarketInfo(). Peut être l'une des valeurs suivantes :

Constant . Valeur Description
MODE_LOW 1 Prix minimum quotidien
MODE_HIGH 2 Prix maximum quotidien
MODE_TIME 5 Heure de la dernière citation
MODE_BID 9 Dernier prix de l'offre reçu. Pour l'instrument actuel, il est stocké dans la variable prédéfinie Bid.
MODE_ASK 10 Dernier prix demandé reçu. Est stocké dans la variable prédéfinie Demander pour le symbole actuel
MODE_POINT 11 Taille du point dans la devise du devis. Stocké dans la variable prédéfinie Point pour le symbole actuel
MODE_DIGITS 12 Nombre de chiffres après la virgule dans le prix de l'instrument. Stocké dans la variable prédéfinie Chiffres pour le symbole actuel
MODE_SPREAD 13 Spread en pips
MODE_STOPLEVEL 14 Niveau minimum autorisé de Stop Loss/Stake Profit en pips
MODE_LOTSIZE 15 Taille du contrat dans la devise de base de l'instrument
MODE_TICKVALUE 16 Taille minimale de changement du prix de l'instrument dans la monnaie de dépôt.
MODE_TICKSIZE 17 Pas minimum de la variation du prix de l'instrument dans la devise de cotation
MODE_SWAPLONG 18 Taille du swap pour les positions longues
MODE_SWAPSHORT 19 Taille du swap pour les positions courtes
MODE_DÉMARRAGE 20 Date de début du calendrier (généralement utilisée pour les contrats à terme)
MODE_EXPIRATION 21 Date d'expiration (normalement utilisée pour les contrats à terme)
MODE_TRADE AUTORISÉ 22 Autorisation de négocier l'instrument spécifié
MODE_MINLOT 23 Taille minimale du lot
MODE_LOTSTEP 24 Étape de la modification de la taille du lot
MODE_MAXLOT 25 Taille maximale du lot
MODE_SWAPTYPE 26 Méthode de calcul des swaps. 0 - en points ; 1 - en monnaie de base de l'instrument ; 2 - en pourcentages ; 3 - en monnaie de marge.
MODE_PROFITCALCMODE 27 Mode de calcul des bénéfices. 0 - Forex ; 1 - CFD ; 2 - Futures
MODE_MARGINALCMODE 28 Mode de calcul de la marge. 0 - Forex ; 1 - CFD ; 2 - Futures ; 3 - Indices CFD
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, requis pour ouvrir un lot à l'achat.
MODE_FREEZELEVEL 33 Niveau de gel des commandes en points. Si le prix d'exécution se situe dans les limites définies par le niveau de gel, l'ordre ne peut être modifié, annulé ou clôturé.

 
SeALALex:

Je suis en train d'apprendre à écrire un EA, comme beaucoup de mes premiers EAs sur des indicateurs standards, je viens d'en écrire un nouveau, mais maintenant je me suis compliqué la tâche. En général, comment faire, que dans l'émergence des conditions a ouvert une position et à sa fermeture, disons, pour prendre les mêmes conditions, une nouvelle n'a pas ouvert, et ouvert que lorsque les conditions opposées, etc. Merci ! !!


il existe un exemple prêt à l'emploi dans l'aide

int i,accTotal=OrdersHistoryTotal() ; for(i=0;i<accTotal;i++) { //---- vérifier le résultat de la sélection if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Error accessing historical database (",GetLastError(),")) ; break ;
       } Nous devons nous souvenir de l'heure de clôture de l'ordre, comparer l'heure de clôture de l'ordre avec l'heure de clôture de l'itération précédente, si (l'heure de clôture est supérieure et le type d'opération commerciale est Achat ou Vente), alors nous devons nous souvenir de l'heure de l'ordre actuel et du type d'opération commerciale // en conséquence, à la fin du cycle, nous connaissons le type d'ordre qui a clôturé en dernier } Quelque chose comme ceci .

 
ivandurak:


Vérifier au préalable les niveaux de réglage du stop et du profit .


Il n'y a pas de contrôle dans cette liste pour certains types de comptes. Voici un paragraphe du Règlement des opérations de trading pour les comptes NDD :

3.3 Si une position est ouverte via le terminal du client en utilisant un Expert Advisor, le client ne peut pas désigner d'ordre de Stop Loss et/ou de Take Profit. Si le client souhaite passer ces ordres, il peut le faire en modifiant une position existante conformément aux clauses 5.16 - 5.22 et 9.13 - 9.16.

Je me demande s'il est possible de vérifier cela de manière programmatique. Si je comprends bien, non. Vous devez d'abord écrire dans le programme une fonction d'ouverture des positions/de définition des ordres en attente, en tenant compte des conditions fixées par le courtier.
 
tol64:


Il n'y a pas de contrôle dans cette liste pour certains types de comptes. Voici un paragraphe du Règlement des opérations de trading pour les comptes NDD :

J'aimerais savoir si cela peut être vérifié de manière programmatique. Si je comprends bien, non. Vous devez à l'origine écrire dans un programme une fonction d'ouverture de positions / de définition d'ordres en attente, en tenant compte des conditions fixées par le courtier.

Je ne comprends pas vraiment les règles de fixation des ordres, essayez de jouer avec la démo et voyez ce que vous pouvez et ne pouvez pas faire. D'après ce que j'ai compris, rien ne vous empêche de définir un ordre par programme et de le modifier ensuite. C'est vrai que c'est étrange, à moins que vous ne coupiez la connexion après avoir ouvert une position sans laisser de stop.
 
tol64:


Il n'y a pas de contrôle dans cette liste pour certains types de comptes. Voici un paragraphe du Règlement des opérations de trading pour les comptes NDD :

J'aimerais savoir si cela peut être vérifié de manière programmatique. Si je comprends bien, non. Vous devez initialement écrire dans le programme une fonction permettant d'ouvrir des positions/de définir des ordres en attente, en tenant compte des conditions fixées par le courtier.

Il n'y a pas de problème du tout. Même (si ce n'est pas pour un usage personnel, parce que vous savez sur quels comptes (conditions de négociation et avec qui) l'utiliser), mais si vous envoyez l'EA à l'ordre et le client n'a pas encore décidé sur quels comptes et où il sera utilisé, même sur les types de comptes avec la possibilité de définir un take et stop immédiatement, puis par défaut produire l'EA avec des valeurs nulles de ces niveaux lors de l'établissement de tous les types d'ordres, puis avec leur modification (fonctionnera là et là), alors que, bien sûr, personne n'a annulé les exigences de contrôle et les restrictions à p.
 
ivandurak:

Je ne comprends pas bien les règles d'établissement des ordres, essayez de jouer avec la démo, ce que vous pouvez et ce que vous ne pouvez pas. D'après ce que j'ai compris, rien ne vous empêche de définir un ordre par programme et de le modifier ensuite. C'est vrai que c'est étrange, à moins que vous ne coupiez la connexion après avoir ouvert une position sans laisser de stop.

))) Non. Vous vous méprenez complètement. Je n'ai pas parlé de "définir par programme", j'ai parlé de "définir par programme". Sur certains types de comptes, il n'est pas possible d'ouvrir immédiatement une position et de définir des arrêts/stops, ce qui serait préférable/sûr pour moi. Sur mql5, si je ne me trompe pas, il semble être possible de le déterminer. J'aimerais pouvoir le déterminer et, en fonction de la définition, choisir la fonction à utiliser.
 
Roman.:

Il n'y a pas de problème du tout. Même (si ce n'est pas pour un usage personnel, parce que vous savez sur quels comptes (conditions de trading et avec qui) l'utiliser), mais si vous faites une EA pour commander et que le client n'a pas encore décidé sur quels comptes et où il va l'utiliser, même sur des types de comptes avec la possibilité de définir une prise et un arrêt immédiat, alors vous faites quand même une EA avec des valeurs nulles de ces niveaux par défaut lors de la définition de tous les types d'ordres, puis avec leur modification (fonctionnera là et là), alors que, bien sûr, personne n'a annulé les exigences de contrôle et les restrictions à la p.

Oui, il n'y a pas de problème quand il y a une solution. Vous devez juste utiliser ce que vous avez et l'utiliser correctement).
 

Roman. et ivandurak merci beaucoup pour vos réponses, mais j'ai encore du mal à comprendre. J'ai trouvé une suggestion sur un autre forum sur la façon de faire cela, mais jusqu'à présent je ne peux pas l'appliquer à mon code habituel.

int BuyTrue, SellTrue;// Définir les variables qui serviront de drapeaux.
....
//--- Condition d'achat
if (BuyTrue==0 && ... plus vos autres conditions) //condition d'ouverture de position
{
....
OrderSend(....) ; //fonction d'ouverture d'un ordre
BuyTrue=1 ; // Si BuyTrue=1, la condition d'ouverture de la position ne sera pas entièrement satisfaite.
// par conséquent, lors d'un signal d'achat répété, une transaction ne sera pas ouverte.
SellTrue=0 ; // A SellTrue=0, la condition d'ouverture de la position sera entièrement satisfaite.
// donc la prochaine transaction sera Vendre seulement
....
}

//--- Condition de vente
if (SellTrue==0 && ... plus vos autres conditions) //condition d'ouverture de position
{
....
OrderSend(....) ; //fonction d'ouverture d'un ordre
SellTrue=1 ; // Si SellTrue=1, la condition d'ouverture de l'ordre ne sera pas entièrement satisfaite.
// donc, à un deuxième signal de vente, une position ne sera pas ouverte.
BuyTrue=0 ; // A BuyTrue=0, la condition d'ouverture de la position sera entièrement satisfaite.
// par conséquent, la prochaine transaction sera uniquement un achat.
....
}

Mon code pour ouvrir une position

total=OrdersTotal() ;
si(total<1)
{
// aucun ordre ouvert identifié
si(AccountFreeMargin()<(1000*Lots))
{
Print("Nous n'avons pas d'argent. Marge libre = ", AccountFreeMargin() ;
retour(0) ;
}
// vérification de la position longue (BUY)
if(MACD1<0 && MACD2<MACD1 && MACD2>MACD3 && MathAbs(MACD1)>(MACDOpenLevel*Point))
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point, "macd sample",16384,0,Green) ;
si(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("Ordre BUY ouvert : ",OrderOpenPrice()) ;
}
else Print("Erreur lors de l'ouverture de l'ordre BUY : ",GetLastError()) ;
retour(0) ;
}
// vérification de la position courte (SELL)
if(MACD1>0 && MACD2>MACD1 && MACD1>(MACDOpenLevel*Point))
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point, "macd sample",16384,0,Red) ;
si(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("Ordre de vente ouvert : ",OrderOpenPrice())
}
else Print("Erreur lors de l'ouverture d'un ordre de VENTE : ",GetLastError()) ;
retour(0) ;
}
retour(0) ;
}

 
SeALALex:

Roman. et ivandurak: merci beaucoup pour vos réponses, mais j'ai encore du mal à comprendre. J'ai trouvé une suggestion sur un autre forum sur la façon de faire cela, mais jusqu'à présent je ne peux pas l'appliquer à mon code habituel.

int BuyTrue, SellTrue;// Définir les variables qui serviront de drapeaux décrits ci-dessus.
....
//--- Condition d'achat
if (BuyTrue==0 && ... plus vos autres conditions) //condition d'ouverture de position
{
....
OrderSend(....) ; //fonction d'ouverture d'un ordre
BuyTrue=1 ; // Si BuyTrue=1, la condition d'ouverture de la position ne sera pas entièrement satisfaite.
// par conséquent, lors d'un signal d'achat répété, une position ne sera pas ouverte.
SellTrue=0 ; // A SellTrue=0, la condition d'ouverture de la position sera entièrement satisfaite.
// donc la prochaine transaction sera Vendre seulement
....
}

//--- Condition de vente
if (SellTrue==0 && ... plus vos autres conditions) //condition d'ouverture de position
{
....
OrderSend(....) ; //fonction d'ouverture d'un ordre
SellTrue=1 ; // Si SellTrue=1, la condition d'ouverture de l'ordre ne sera pas entièrement satisfaite.
// donc, lors d'un signal de vente répété, une position ne sera pas ouverte.
BuyTrue=0 ; // A BuyTrue=0 la condition d'ouverture de position sera entièrement satisfaite
// par conséquent, la prochaine transaction sera uniquement un achat.
....
}

Mon code pour ouvrir un marché.

total=OrdersTotal() ;
si(total<1)
{
// aucun ordre ouvert identifié
si(AccountFreeMargin()<(1000*Lots))
{
Print("Nous n'avons pas d'argent. Marge libre = ", AccountFreeMargin() ;
retour(0) ;
}
// vérification de la position longue (BUY)
if(MACD1<0 && MACD2<MACD1 && MACD2>MACD3 && MathAbs(MACD1)>(MACDOpenLevel*Point))
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point, "macd sample",16384,0,Green) ;
si(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("Ordre BUY ouvert : ",OrderOpenPrice()) ;
}
else Print("Erreur lors de l'ouverture de l'ordre BUY : ",GetLastError()) ;
retour(0) ;
}
// vérification de la position courte (SELL)
if(MACD1>0 && MACD2>MACD1 && MACD1>(MACDOpenLevel*Point))
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point, "macd sample",16384,0,Red) ;
si(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("Ordre de vente ouvert : ",OrderOpenPrice())
}
else Print("Erreur lors de l'ouverture d'un ordre de VENTE : ",GetLastError()) ;
retour(0) ;
}
retour(0) ;
}


Tout d'abord, collez votre code dans l'éditeur via Ctrl+Alt+M (ou appuyez sur SRC en haut du menu), sinon c'est mauvais, ce qui est clair - tout se mélange en un seul...:-))

Deuxièmement, lisez le tutoriel, en particulier les informations sur le lien que je vous ai recommandé, sous le code se trouve sa description et à la toute fin de la description est précisément décrite - comment signaler une fois un prix au-dessus/au-dessous de la MA (vous aurez une analogie avec une entrée unique à une condition de trading donnée - l'utilisation de drapeaux et tout), avant de travailler votre assistant ... :-)))))

P.S. ou recherche google : Comment insérer correctement un code site:mql4.com

 






if (SellTrue==0 && A1<A2 && S1<30 && ADX1<ADX2) // Условие открытия позы
        {
         ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,"AO sample",16384,0,Red);
           if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES ||SellTrue==1)) Print("SELL order opened : ",OrderOpenPrice());
           }
         else Print("Error opening SELL order : ",GetLastError()); 
        
        if (ticket > 0 && SellTrue==1)   
     {
      SellTrue=1;
      BuyTrue=0;                 
      Alert("По данным условиям сделка уже открывалась"); // Сообщение 
     }
        }
      return(0);
Romain. Ça ne marche pas, qu'est-ce qui ne va pas ?
Raison: