[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 774

 
drknn:

Je ne comprends pas ce qui se passe. J'ai une ligne dans l'ordre d'ouverture du marché, je la copie et j'en ajoute une nouvelle à l'ordre mais la même erreur 4107 ne s'affiche pas dans le journal mais l'ordre s'ouvre, si vous voulez bien regarder ce que j'ai manqué.

Dossiers :
test_21_1.mq4  15 kb
 
FoxUA:

Je ne comprends pas, j'ai cette ligne dans l'ordre d'ouverture du marché, je la copie dans un ordre en attente et j'en ajoute un nouveau, mais la même erreur 4107 s'écrit toujours dans le journal, mais les ordres en attente sont émis, si vous voulez regarder ce que j'ai manqué.


Votre code est sacrément mal organisé. Et les noms des variables comportent des abréviations qui rendent également la lecture difficile.

Le code doit être organisé en blocs. Attribuez des noms aux variables de manière à ce qu'un coup d'œil suffise pour comprendre le contenu du code. Les noms constants (prenez-en l'habitude), écrivez-les en lettres majuscules. L'initialisation des constantes avec des valeurs doit être placée dans un bloc d'initialisation. Ainsi, par exemple, vous avez une utilisation absolument injustifiée de la chaîne de caractères

string sy = Symbol() ;

au début de l'EA. Dites-moi pourquoi vous devez appeler la fonction Symbol() à chaque tick, si le nom du symbole reste le même pendant toute la transaction ? Il suffit d'initialiser une fois avec la valeur de la variable sy dans le bloc d'initialisation, et c'est tout. En outre, ce bloc de code

pral=StopLossLastPos(sy,OP_BUY,-1) ;   // цена по StopLoss последнего открытого BUY на покупку BUYLIMIT
pras=TakeProfitLastPos(sy,OP_BUY,-1);  // цена по TakeProfit последнего открытого BUY на покупку BUYSTOP
prbl=StopLossLastPos(sy,OP_SELL,-1);   // цена по StopLoss последнего открытого SELL на продажу SELLLIMIT
prbs=TakeProfitLastPos(sy,OP_SELL,-1) ;// цена по TakeProfit последнего открытого SELL на продажу SELLSTOP

C'est fondamentalement faux ! Pour connaître le stop loss du dernier ordre, il (l'ordre) doit d'abord être sélectionné à l'aide de OrderSelect() - voir l'exemple dans le compteur d'ordres ci-dessous. Cela signifie que si vous avez besoin de niveaux d'arrêt pour les derniers ordres, vous devrez le faire via une boucle. Suivant. La conception de

int total = OrdersTotal();
if(total == 0){

}

n'est pas justifiée. La fonction OrdersTotal() renvoie le nombre total d'ordres déjà ouverts dans le terminal. Cette valeur inclut les ordres ouverts par d'autres instruments de trading, ainsi que les ordres qui n'ont pas été ouverts par le Conseiller Expert, mais par vous personnellement et manuellement pour le même instrument, que le Conseiller Expert a placé.

Si vous n'avez pas l'intention de négocier à la main et que vous ne négociez que sur le symbole sur lequel l'EA a été lancé, alors cette conception fonctionnera. Mais dès que vous souhaitez effectuer des transactions avec vos mains et que l'EA n'interfère pas avec vos transactions manuelles, ou que vous souhaitez que les transactions soient exécutées avec d'autres symboles également, la conception vous laissera vraiment tomber. Il est donc préférable d'écrire des compteurs de commande séparés pour chaque type de commande. Voici un exemple d'un tel compteur.

//=========== SchBuy()  ===============================
//  Функция возвращает количество Buy-ордеров
//   SchBuy      - счётчик Buy ордеров
//-----------------------------------------------------------
int SchBuy(int MAGIC){
  string SMB=Symbol();
  int SchBuy=0;
  for (int i=OrdersTotal()-1;i>=0;i--) {
    if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
      Print("Ошибка № ",GetLastError()," при выборе ордера № ",i);
    }
    else {
      if(OrderSymbol()!= SMB || OrderMagicNumber()!= MAGIC){continue;}// если не наш, то смотрим следующий
      if(OrderType()==OP_BUY){ 
        SchBuy++;
      }  
    }
  }
  return(SchBuy);
}                  

Réécrivez le code en tenant compte des recommandations ci-dessus ! !!

 

Désolé, je n'avais pas réalisé que les chaînes de caractères comme

pral=StopLossLastPos(sy,OP_BUY,-1) ;   // цена по StopLoss последнего открытого BUY на покупку BUYLIMIT

appeler un sous-programme.

Mais il est toujours préférable de l'organiser d'une manière différente.

>> double StopLossLastPos(string sy="", int op=-1, int mn=-1) {

Il n'est pas nécessaire de transmettre le nom symbolique d'un symbole boursier dans le sous-programme. Votre sous-routine se trouve dans l'Expert Advisor, et non dans la bibliothèque incluse. Comme la variable sy est déclarée au niveau global du conseiller expert, cette variable est dans la portée de ces sous-programmes. En outre, vous passez le deuxième paramètre au sous-programme, mais lorsque vous appelez le sous-programme lui-même, vous initialisez ce paramètre avec une valeur ( int op=-1) - vous n'avez pas besoin de le faire. Il en va de même pour le paramètre suivant.

La ligne

>> si (op<0 || OrderType()==op) {

est à nouveau illisible. Regardez comment c'est organisé dans mon comptoir !

 

Et puis il y a ça. Le bloc de code

pral=StopLossLastPos(sy,OP_BUY,-1) ;   // цена по StopLoss последнего открытого BUY на покупку BUYLIMIT
pras=TakeProfitLastPos(sy,OP_BUY,-1);  // цена по TakeProfit последнего открытого BUY на покупку BUYSTOP
prbl=StopLossLastPos(sy,OP_SELL,-1);   // цена по StopLoss последнего открытого SELL на продажу SELLLIMIT
prbs=TakeProfitLastPos(sy,OP_SELL,-1) ;// цена по TakeProfit последнего открытого SELL на продажу SELLSTOP

est appelé à chaque tic. Mais elle n'est pas nécessaire pour chaque tique. Dans certains cas, il suffit de connaître l'ordre stop/profit. C'est à ce moment-là que vous devez appeler votre sous-routine.

 
spidey:

Bonjour, pouvez-vous joindre une alerte à l'indicateur (le vert croise le rouge de haut en bas - vente, retour - achat) ?

Eh bien, quelqu'un poste à nouveau des codes volés sur le forum. :))))))))

Je doute que quiconque veuille fouiller gratuitement dans ce fatras de variables numérotées :)

 
spidey:

Bonjour, pourriez-vous ajouter une alerte à la dinde (la verte croise la rouge de haut en bas - vente, retour - achat) ?

Si vous répétez cela, je devrai vous donner un avertissement concernant le bannissement.

C'est une violation des règles du forum.

 
Le code doit-il être affiché ?
 
drknn:

Désolé, je n'avais pas réalisé que les chaînes de caractères comme

appeler un sous-programme.

Mais il est toujours préférable de l'organiser d'une manière différente.

>> double StopLossLastPos(string sy="", int op=-1, int mn=-1) {

Il n'est pas nécessaire de transmettre le nom symbolique d'un symbole boursier dans le sous-programme. Votre sous-routine se trouve dans l'Expert Advisor, et non dans la bibliothèque incluse. Comme la variable sy est déclarée au niveau global du conseiller expert, cette variable est dans la portée de ces sous-programmes. Ensuite, vous passez un deuxième paramètre au sous-programme, mais lorsque vous appelez le sous-programme lui-même, vous initialisez ce paramètre avec une valeur ( int op=-1) - vous n'avez pas besoin de le faire. Il en va de même pour le paramètre suivant.

La ligne

>> si (op<0 || OrderType()==op) {

est à nouveau illisible. Regardez comment il est organisé dans mon comptoir !

Donc je suppose que l'appel de fonction peut être écrit simplement

PrAskLim = StopLossLastPos(OP_SELL) ; dans la fonction elle-même

double StopLossLastPos(int op=-1,) comme ceci ?

J'ai déjà dit que j'ai pris les fonctions de ce site, leur travail a été testé parce que je n'ose pas changer leurs variables pour d'autres plus lisibles, parce que je manque peut-être d'expérience sur ce qu'on peut et ce qu'on ne peut pas changer ; cela comporte le danger que je change quelque chose de faux dans une fonction qui fonctionne et vous aiguillez dans un tas de code à nouveau,

mais j'ai réparé autant que possible ce que j'ai ajouté moi-même,

Je l'ai déjà ajouté moi-même mais cela n'a pas résolu mes problèmes avec le log 4107 et je dois demander comment je peux changer le prix et les stops car je n'ai rien changé radicalement dans ce log.

La deuxième question est de savoir comment ajouter un spread à ce prix PrAskLim = StopLossLastPos(OP_SELL) ; (Spread =MarketInfo(sy, MODE_SPREAD) ; )

Voici la version modifiée de l'EA

Dossiers :
test_21_2.mq4  16 kb
 
spidey:
Le code doit-il être affiché ?
Tu n'as pas besoin de poster les trucs volés.
 
drknn:
Tu n'es pas obligé de poster des trucs volés.

Tu n'as pas besoin de voler.

Et les règles de cette ressource ne l'interdisent pas...

https://www.mql5.com/ru/code/8089

;)

Raison: