Veuillez me guider en ce qui concerne la répartition - page 2

 
GumRai:

Je pense que vous pouvez obtenir ce codage pour 20 ou 30 $.

Bien... merci... Je vais voir si je peux trouver quelque chose de gratuit, si je ne trouve rien, je vais poster un travail.
 
GumRai:

Je pense que vous pouvez obtenir ce code pour 20 ou 30 $.

En fait, comme vous avez CONFIRMÉ que la clôture de l'ordre prend déjà en compte le spread, je pense que le script ci-dessus devrait fonctionner pour moi... merci... Tout ce que j'ai à régler dans ce programme est de 10 pips... et il le fermera automatiquement comme vous le dites en utilisant la valeur ASK s'il s'agit d'un short et en utilisant une valeur BID s'il s'agit d'un long... et la somme totale de cela en tant que profit total du compte et ferme tous les ordres ouverts....Il ne touche pas à l'ordre en attente, donc tout va bien... merci beaucoup... aussi, pourriez-vous m'expliquer... dans le programme ci-dessus, il est dit que le slippage = 5... qu'est-ce que cela signifie pour ce script ? comment cela va-t-il se passer lorsque le script ferme un ordre ? oh et aussi, est-ce un script ou un EA ? ou comment faire la différence entre les deux ? [COMMENT FAITES-VOUS POUR APPRENDRE AUTANT DE CHOSES >.<]
 
tatyawinchu:

Merci beaucoup... très clair et très utile... Je me demande combien cela coûterait de publier un tel travail ? Quel est le degré de difficulté d'un tel code ? Le code que j'ai obtenu sur le web et que j'ai posté ci-dessus semble énorme... Je veux dire que je ne peux vraiment pas dépenser des milliers de dollars...


Rebonjour,

Pas besoin de s'inquiéter, le code pour ce que vous voulez ne devrait pas être si compliqué et, juste pour que vous sachiez si jamais vous avez besoin de poster un emploi, vous êtes celui qui contrôle, vous offrez combien vous pouvez vous permettre et vous pensez que cela vaut la peine !

D'un autre côté, si vous êtes comme moi, j'essaierais d'abord l'option gratuite. Rien à perdre, peut-être gagner quelques amis et apprendre quelque chose par la même occasion.

Au revoir

 
tatyawinchu:

En fait, comme vous avez CONFIRMÉ que la fermeture de l'ordre prend déjà en compte le spread, je pense que le script ci-dessus devrait fonctionner pour moi... merci... Tout ce que j'ai à régler dans ce script est de 10 pips... et il le fermera automatiquement comme vous le dites en utilisant la valeur ASK si c'est un short et en utilisant une valeur BID si c'est un long... et la somme totale de cela comme profit total du compte et ferme tous les ordres ouverts....Il ne touche pas les ordres en attente, donc tout va bien... Merci beaucoup... Aussi, pourriez-vous m'expliquer... dans le programme ci-dessus, il est dit que le slippage = 5... Qu'est-ce que cela signifie pour ce script ? Comment cela va-t-il se passer lorsque le script ferme un ordre ? oh et aussi, est-ce un script ou un EA ? ou comment faire la différence entre les deux ? [ COMMENT FAITES-VOUS POUR APPRENDRE AUTANT DE CHOSES >.< ]


Bonjour encore,

Comme toujours, il y a une bonne et une mauvaise nouvelle. Vous voulez la mauvaise ou la bonne nouvelle en premier ?

La voici et si je ne l'explique pas assez bien, merci de me le faire savoir : Pour qu'un EA puisse sortir d'une transaction en se basant sur le profit du compte, il doit savoir quelle était l'équité du compte avant que la transaction ne soit placée, pour avoir un point de départ. Cela a-t-il un sens ?

Si vous n'avez pas de point de départ avec lequel comparer ou s'il n'y a pas de comparaison, l'EA ne fermera jamais votre transaction tant que le bénéfice du compte est négatif ou fermera immédiatement toutes les transactions si le bénéfice du compte est positif et supérieur à 100 ou à la limite fixée.

Est-ce que cela a un sens ?

Comme l'offre et la demande changent continuellement, au moment où votre ordre atteint le serveur, si la valeur du prix (offre ou demande) est dans les limites du slippage, l'ordre sera traité, sinon il sera recoté.

Oui, votre code est un EA. Un script ne s'exécute généralement qu'une fois, vous obtenez un nouveau tick, exécutez le code et quittez. Un EA fonctionne en continu aussi longtemps que vous le laissez fonctionner.

Comment les différencier ? C'est parfois difficile car ils fonctionnent de manière similaire. Lorsqu'un nouveau script est créé, il ressemble à ceci :

//+------------------------------------------------------------------+
//|                                                   TestScript.mq4 |
//|                             Copyright 2014, 3D@tm Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, 3D@tm Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   
  }
//+------------------------------------------------------------------+

Vous pouvez voir qu'il n'a que la fonction OnStart et qu'il est écrit : Fonction de démarrage du programme de script.

Pour en revenir à votre problème, si vous exécutez un EA qui vérifie l'équité du compte lorsqu'aucun ordre n'est placé et prend cela comme point de référence, il peut alors fermer tous les ordres lorsque le profit souhaité par compte est atteint.

La valeur d'un pip (argent par pip) n'est pas la même pour toutes les devises : un pip dans la paire AUDUSD n'a pas la même valeur que dans la paire GBPJPY.

Recherchez-vous des symboles spécifiques pour cet EA ou, quel que soit le symbole, fermez simplement tous les ordres lorsque le profit par compte est atteint ?

De plus, le stop loss doit-il être lié à l'équité du compte ou à l'ordre/la paire ?

Je sais que cela semble compliqué mais ce n'est pas si compliqué. Nos ordinateurs sont tellement bêtes que si vous ne spécifiez pas exactement ce que vous voulez, ils sont perdus.

Est-ce que cela vous a aidé ? J'espère que oui.

Au revoir

 

Thrdel

Je suis presque sûr que AccountProfit() renvoie le profit total pour les transactions ouvertes en cours. Ce n'est pas évident dans la documentation.

 
GumRai:

Thrdel

Je suis presque sûr que AccountProfit() renvoie le profit total pour les transactions ouvertes en cours. Ce n'est pas évident dans la documentation.


Hmm ...

 AccountProfit() 

J'utilise plutôt ...

double AccProfits=AccProfits+OrderProfit();

Cela dépend de ce que vous voulez obtenir.

 
GumRai:

Thrdel

Je suis presque sûr que AccountProfit() renvoie le profit total pour les transactions ouvertes en cours. Ce n'est pas évident d'après la documentation.


Salut GumRai,

Vous avez raison, ce n'est pas très évident dans la documentation mais je l'ai testé et encore une fois, vous avez raison, c'est la somme des profits/pertes sur tous les ordres ouverts.

Bien vu. Merci.

Je ne peux toujours pas utiliser Account Profit si je veux seulement gérer les ordres ouverts manuellement et si je dois sélectionner d'autres ordres qui peuvent être placés par d'autres EA.

Je suppose que la sélection par le nombre magique = 0 devrait faire l'affaire. Et ensuite faire la somme des profits comme deysmacro l'a suggéré.

Je pense que c'est ainsi que je vois les choses. Qu'en pensez-vous, les gars ?

//+------------------------------------------------------------------+
//|                                       CloseOrdersOnProfit_v1.mq4 |
//|                             Copyright 2014, 3D@tm Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, 3D@tm Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//---
#include <stdlib.mqh>
//---
#define  RETRYCOUNT    10
#define  RETRYDELAY    500
#define  LONG          1
#define  SHORT         -1
#define  ALL           0
//---
extern int     Slippage=3;
input  double  ProfitTarget=100.0;
input  double  StopLossLimit=50.0;
input  bool    WriteScreenshots=true;
//---
double StartEquity=0;
int    myOrders;
//===================================================================
/*
This EA will manage manually placed orders and skip the orders that
have a magic number different from zero.
If the Profit target - the sum of profit/loss on all orders (except
orders placed by other EA's ) is reached, all those orders are
closed.
If the maximum amount of money allowed for a loss is reached, EA
will close all those orders and an alert will pop up.
*/
//===================================================================
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   if(Digits==3 || Digits==5) Slippage*=10;
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- count orders manually placed (no magic number)
   CountMyOrders();
//--- reset account equity / take a reference point
   if(myOrders<1)
     {
      StartEquity=AccountEquity();
      //--- no orders detected, wait for orders to be placed
      return;
     }
//--- calculate profit
   double myProfit=CalculateProfit();
//--- if profit target reached, exit all
   if(myProfit>=ProfitTarget)
     {
      ExitAll(ALL);
      Alert("Orders closed due to profit target reached");
     }
//--- exit if stop limit reached
   if(StartEquity-AccountEquity()>=StopLossLimit)
     {
      ExitAll(ALL);
      Alert("Orders closed due to stop loss limit reached");
     }

   return;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double CountMyOrders()
  {
   myOrders=0;
   for(int cnt=OrdersTotal()-1;cnt>=0;cnt--)
     {
      if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES)==false)
         Print("Failed to select order, error : "+ErrorDescription(GetLastError()));
      //skip orders placed by other EA's
      if(OrderMagicNumber()>0)continue;
      if(OrderType()==OP_BUY || OrderType()==OP_SELL)
        {
         myOrders++;
        }
     }
   return(myOrders);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double CalculateProfit()
  {
   double Profit=0;
   for(int cnt=OrdersTotal()-1;cnt>=0;cnt--)
     {
      if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES)==false)
         Print("Failed to select order, error : "+ErrorDescription(GetLastError()));
      //skip orders placed by other EA's
      if(OrderMagicNumber()>0)continue;
      if(OrderType()==OP_BUY || OrderType()==OP_SELL)
        {
         Profit=Profit+OrderProfit();
        }
     }
   return(Profit);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void ExitAll(int direction)
  {

   string total=IntegerToString(OrdersTotal(),0,0);

   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      Comment(StringConcatenate("Closing trade #",(i+1)));
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)
         Print("Failed to select order, error : "+ErrorDescription(GetLastError()));
      //skip orders placed by other EA's
      if(OrderMagicNumber()>0)continue;
      //---
      if(OrderType()==OP_BUY &&(direction==LONG ||  direction==ALL)) { Exit(OrderSymbol(),OrderTicket(),LONG,OrderLots(),Blue); }
      if(OrderType()==OP_SELL &&(direction==SHORT|| direction==ALL)) { Exit(OrderSymbol(),OrderTicket(),SHORT,OrderLots(),Red); }
     }
   Comment(StringConcatenate(total," trades closed."));
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool Exit(string symb ,int ticket,int dir,double volume,color clr,int t=0)
  {
   int i=0,j=0,cmd=0;
   double prc=0,sl=0,tp=0,lots=0;
   string cmt;
   double bid=MarketInfo(symb,MODE_BID);
   double ask=MarketInfo(symb,MODE_ASK);
   bool closed;

   Print("Exit("+IntegerToString(dir,0,0)+","+DoubleToStr(volume,3)+","+IntegerToString(t,0,0)+")");

   for(i=0; i<RETRYCOUNT; i++) 
     {
      for(j=0;(j<50) && IsTradeContextBusy(); j++)
         Sleep(100);
      RefreshRates();

      if(dir==LONG) 
        {
         prc=bid;
        }
      if(dir==SHORT) 
        {
         prc=ask;
        }
      Print("Exit: prc="+DoubleToStr(prc,Digits));

      closed=OrderClose(ticket,volume,prc,Slippage,clr);
      if(closed)
        {
         Print("Trade closed");
         Screenshot("Exit");

         return (true);
        }

      Print("Exit: error \'"+ErrorDescription(GetLastError())+"\' when exiting with "+DoubleToStr(volume,3)+" @"+DoubleToStr(prc,Digits));
      Sleep(RETRYDELAY);
     }

   Print("Exit: can\'t enter after "+IntegerToString(RETRYCOUNT,0,0)+" retries");
   return (false);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Screenshot(string moment_name)
  {
   if(WriteScreenshots)
      WindowScreenShot(WindowExpertName()+"_"+Symbol()+"_M"+IntegerToString(Period(),0,0)+"_"+
                       IntegerToString(Year(),0,0)+"-"+two_digits(Month())+"-"+two_digits(Day())+"_"+
                       two_digits(Hour())+"-"+two_digits(Minute())+"-"+two_digits(Seconds())+"_"+
                       moment_name+".gif",1024,768);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
string two_digits(int i)
  {
   if(i<10)
      return ("0"+IntegerToString(i,0,0));
   else
      return (""+IntegerToString(i,0,0));
  }
//+------------------------------------------------------------------+
 
thrdel:


Salut GumRai,

Vous avez raison, ce n'est pas très évident dans la documentation mais je l'ai testé et encore une fois, vous avez raison, c'est la somme des profits/pertes sur tous les ordres ouverts.

Bien vu. Merci.

Je ne peux toujours pas utiliser Account Profit si je veux seulement gérer les ordres ouverts manuellement et si je dois sélectionner d'autres ordres qui peuvent être placés par d'autres EA.

Je suppose que la sélection par le nombre magique = 0 devrait faire l'affaire. Et ensuite faire la somme des profits comme deysmacro l'a suggéré.

Je pense que c'est ainsi que je vois les choses. Qu'en pensez-vous ?


cela échoue .....

pour beaucoup de transactions, prc n'est pas le bon prix

ne le faites pas non plus

  if(Digits==3 || Digits==5) Slippage*=10;

si vous changez plusieurs fois votre timeframe ......

 
deVries:


ceci échoue .....

pour beaucoup de métiers le prc n'est pas le bon prix

ne faites pas non plus

si vous changez plusieurs fois d'horizon temporel ......


Oui deVries,

tout échoue et je ne devrais pas faire cela si vous le dites, mais puisque je ne vois pas vraiment d'aide dans votre réponse .....

Vous comprenez bien que le code n'est pas un EA commercial destiné à être vendu à un client difficile, n'est-ce pas ? Nous essayons de trouver une solution et si vous ne voulez pas nous aider, vous devriez au moins laisser tomber.

Vous pensez vraiment que si je change le délai plusieurs fois..... quoi ? Le slippage sera de 3000000 ? Pas dans mon MT4 apparemment. Et si vous ne me croyez pas, faites un test vous-même.

Mon test dit que lorsque vous changez les cadres temporels, l'EA passe par le cycle deinit/init et puisque le code mentionné est dans le OnInit, le Slippage sera juste à 30 points à chaque fois.

Comme tout le monde peut le voir, changer de time frame n'amènera pas le Slippage à un million, si c'est ce que vous suggérez.

Et non, ce n'est pas une fausse image, elle est réelle, vous pouvez vérifier le temps de changement de chaque cadre temporel.

J'espère que cela vous aidera.

 
thrdel:


Bonjour encore,

Comme toujours, il y a une bonne et une mauvaise nouvelle. Vous voulez la mauvaise ou la bonne nouvelle en premier ?

La voici et si je ne l'explique pas assez bien, merci de me le faire savoir : Pour qu'un EA puisse sortir d'une transaction en se basant sur le profit du compte, il doit savoir quelle était l'équité du compte avant que la transaction ne soit placée, pour avoir un point de départ. Cela a-t-il un sens ?

Si vous n'avez pas de point de départ avec lequel comparer ou s'il n'y a pas de comparaison, l'EA ne fermera jamais votre transaction tant que le bénéfice du compte est négatif ou fermera immédiatement toutes les transactions si le bénéfice du compte est positif et supérieur à 100 ou à la limite fixée.

Est-ce que cela a un sens ?

Comme l'offre et la demande changent continuellement, au moment où votre ordre atteint le serveur, si la valeur du prix (offre ou demande) est dans les limites du slippage, l'ordre sera traité, sinon il sera recoté.

Oui, votre code est un EA. Un script ne s'exécute généralement qu'une fois, vous obtenez un nouveau tick, exécutez le code et quittez. Un EA fonctionne en continu aussi longtemps que vous le laissez fonctionner.

Comment les différencier ? C'est parfois difficile car ils fonctionnent de manière similaire. Lorsqu'un nouveau script est créé, il ressemble à ceci :

Vous pouvez voir qu'il n'a que la fonction OnStart et qu'il est écrit : Fonction de démarrage du programme de script.

Pour en revenir à votre problème, si vous exécutez un EA qui vérifie l'équité du compte lorsqu'aucun ordre n'est placé et prend cela comme point de référence, il peut alors fermer tous les ordres lorsque le profit souhaité par compte est atteint.

La valeur d'un pip (argent par pip) n'est pas la même pour toutes les devises : un pip dans la paire AUDUSD n'a pas la même valeur que dans la paire GBPJPY.

Recherchez-vous des symboles spécifiques pour cet EA ou, quel que soit le symbole, fermez simplement tous les ordres lorsque le profit par compte est atteint ?

De plus, le stop loss doit-il être lié à l'équité du compte ou à l'ordre/la paire ?

Je sais que cela semble compliqué mais ce n'est pas si compliqué. Nos ordinateurs sont tellement bêtes que si vous ne spécifiez pas exactement ce que vous voulez, ils sont perdus.

Est-ce que cela vous a aidé ? J'espère que oui.

Au revoir


thrdel:


Bonjour à nouveau,

Comme toujours, il y a une bonne et une mauvaise nouvelle. Vous voulez la mauvaise nouvelle en premier ou la bonne nouvelle ?

La voici et si je ne l'explique pas assez bien, merci de me le faire savoir : Pour qu'un EA puisse sortir des trades en se basant sur le profit du compte, il a besoin de savoir quelle était l'équité du compte avant que le trade soit placé, pour avoir un point de départ. Cela a-t-il un sens ?

Si vous n'avez pas de point de départ avec lequel comparer ou s'il n'y a pas de comparaison, l'EA ne fermera jamais votre transaction tant que le bénéfice du compte est négatif ou fermera immédiatement toutes les transactions si le bénéfice du compte est positif et supérieur à 100 ou à la limite fixée.

Est-ce que cela a un sens ?

Comme l'offre et la demande changent continuellement, au moment où votre ordre atteint le serveur, si la valeur du prix (offre ou demande) est dans les limites du slippage, l'ordre sera traité, sinon il sera recoté.

Oui, votre code est un EA. Un script ne s'exécute généralement qu'une fois, vous obtenez un nouveau tick, exécutez le code et quittez. Un EA fonctionne en continu aussi longtemps que vous le laissez fonctionner.

Comment les différencier ? C'est parfois difficile car ils fonctionnent de manière similaire. Lorsqu'un nouveau script est créé, il ressemble à ceci :

Vous pouvez voir qu'il n'a que la fonction OnStart et qu'il est écrit : Fonction de démarrage du programme de script.

Pour en revenir à votre problème, si vous exécutez un EA qui vérifie l'équité du compte lorsqu'aucun ordre n'est placé et prend cela comme point de référence, il peut alors fermer tous les ordres lorsque le profit souhaité par compte est atteint.

La valeur d'un pip (argent par pip) n'est pas la même pour toutes les devises : un pip dans la paire AUDUSD n'a pas la même valeur que dans la paire GBPJPY.

Recherchez-vous des symboles spécifiques pour cet EA ou, quel que soit le symbole, fermez simplement tous les ordres lorsque le profit par compte est atteint ?

De plus, le stop loss doit-il être lié à l'équité du compte ou à l'ordre/la paire ?

Je sais que cela semble compliqué mais ce n'est pas si compliqué. Nos ordinateurs sont tellement bêtes que si vous ne spécifiez pas exactement ce que vous voulez, ils sont perdus.

Est-ce que cela vous a aidé ? J'espère que oui.

Au revoir

Bonjour à nouveau

Merci pour cette réponse très claire... et merci d'avoir été très utile... Maintenant je comprends beaucoup ce que vous avez appris...

"Cherchez-vous des symboles spécifiques pour cet EA ou peu importe le symbole, juste pour fermer tous les ordres quand le profit par compte est atteint ?" = la deuxième moitié avec quelques conditions est l'exigence.

"juste pour fermer tous les ordres quand le profit par compte est atteint".

Ok, je ne négocie que 2 paires à la fois ... D'abord j'ouvre un ordre sur une paire ... s'il va contre moi, je le couvre avec un ordre sur l'autre paire ....

Je cherche un EA qui fasse les choses suivantes :

1) Ne rien faire s'il n'y a pas d'ordre ou seulement un ordre.

2) Il doit fermer sur X profit UNIQUEMENT s'il y a DEUX ordres en cours, sinon aller à 1).

3) En fermant X, il devrait considérer le spread à payer et considérer X comme un profit NET [ ceci a déjà été expliqué ci-dessus que AccountProfit() annule directement le spread que vous devez payer et vous montre le profit net et non brut ... corrigez si vous avez tort ].

4) Comme vous pouvez le voir, SL et TP ne sont pas concernés, je ne les utilise pas et ne sont donc pas nécessaires dans l'EA.

Maintenant, je suis totalement d'accord avec vous en ce qui concerne les trucs gratuits, de plus, bien que je ne sache pas coder, je pense que plus de la moitié de ce dont j'ai besoin est déjà là dans l'EA ci-dessus ... Je dois juste trouver quelque chose à changer pour qu'il ne fasse ce qu'il fait que lorsque deux ordres sont ouverts ... Je pense que cela a quelque chose à voir avec cette boucle FOR là-dedans ... ou quelque chose comme ça ... =D [ Ok, maintenant je suis jaloux que vous puissiez lire le code et que je ne le puisse pas !!! ... maintenant je me sens comme un mec débile du 20ème siècle ! ahahha au 21ème siècle tout le monde doit savoir coder >.< ]

J'ai fait un rapide organigramme mental de mes besoins

EA démarre ---> Ne fait rien jusqu'à ce qu'il y ait 0 ou 1 ordre ----> Fait un 'son de call open' quand le 2ème ordre est déclenché ----> Ferme les deux ordres à un montant X de profit pur [après avoir considéré le spread] et fait un 'son de call close' ]

Bien sûr, les fichiers sonores d'ouverture et de fermeture de l'appel peuvent être de petits fichiers d'ondes... facilement disponibles sur mt4 lui-même. ... Je pense que ces choses peuvent être réalisées dans l'EA ci-dessus que j'avais posté en changeant quelques choses ! hehehe aidez-moi plz =D

Raison: