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

 
Vinin:

Victor, regardez votre message personnel, s'il vous plaît.
 
glasha:
Victor, regardez votre message personnel, s'il vous plaît.

Je l'ai vu.
 
dimon74:

OrderSend() est déclenché à chaque tick (si je comprends bien). Pour éliminer le problème, placez une variable avant la fonction de démarrage, par exemple int H=0.

Plus loin le code :

..........

si ( H==0)

{

OrderSend(bla bla bla) ;

}

H=1 ;

Et il n'y a pas besoin d'algèbre. Et il est préférable de ne pas utiliser OrdersTotal() pour limiter.


Je comprends, cela fonctionne pour moi, je veux dire que je dois ouvrir un ordre et qu'il ne s'ouvre pas au prochain tick.

La deuxième commande, la deuxième commande n'est nécessaire que lorsque la première est fermée.

 

Si je ne me trompe pas, ça doit être comme ça ?

int H=0 ;

int F=OrdersTotal();

..........

si(F<1)

{

si ( H==0)

{

OrderSend(bla bla bla) ;

}

H=1;}

 
gheka:

Si je ne me trompe pas, ça doit être comme ça ?

int H=0 ;

int F=OrdersTotal();

..........

si(F<1)

{

si ( H==0)

{

OrderSend(bla bla bla) ;

}

H=1;}

total = CountTrades();
if (total < 1) {
ticket = OrderSend
}

int CountTrades() {
   int count = 0;
   for (int trade = OrdersTotal() - 1; trade >= 0; trade--) {
      OrderSelect(trade, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue;
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
         if (OrderType() == OP_SELL || OrderType() == OP_BUY) count++;
   }
   return (count);
}
 
gheka:


c'est compréhensible, tout fonctionne pour moi, je veux dire 1 ordre à ouvrir et à ne pas ouvrir au prochain tick

le deuxième ordre, le deuxième ordre n'est nécessaire que lorsque le premier est fermé.

Vous devriez vérifier ici.
 

Bonjour à tous. Je ne suis pas très doué pour écrire des EA, j'ai essayé d'apprendre ce genre de choses, mais je viens de commencer et c'est assez difficile pour moi. Je veux écrire un EA qui ouvrirait des trades lorsque les prix traversent une moyenne mobile et les fermerait au croisement opposé, en utilisant un stop loss ou un trailing stop. J'ai trouvé un exemple d'un tel EA, mais il n'y a pas de trailing stop ou de stop loss et les trades sont ouverts et fermés simplement au croisement. Je n'ai pas assez de connaissances pour cela. Je veux demander à quelqu'un de m'aider à savoir où placer le trailing stop et le stoploss et comment le faire fonctionner :

#property copyright "Jake Sunders"

#lien de propriété "feloq@mail.ru"



#define STATE_SQUARE 0

#define STATE_LONG 1

#define STATE_SHORT 2



//---- paramètres d'entrée

extern int MAPeriod=26 ;
extern double LotsNumber=1.0 ;
extern double TrailingStop=50 ;
extern double StopLoss= 50 ;


//---- variables globales

int CurrentState ;

int MyOrderTicket ;

//+------------------------------------------------------------------+

//| fonction d'initialisation de l'expert |

//+------------------------------------------------------------------+

int init()

{

//----

si (iMA(NULL, 0, MAPeriod, 0, MODE_SMA, PRICE_CLOSE, 0) > Close[0])

État actuel = STATE_SHORT ;

autre Etat actuel = STATE_LONG ;

MaCommandeTicket = 0 ;
//----
retour(0) ;
}
//+------------------------------------------------------------------+
//| fonction de désinitialisation des experts |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
retour(0) ;
}
//+------------------------------------------------------------------+
//| fonction de démarrage de l'expert |
//+------------------------------------------------------------------+
int start()
{
//----
int err ;
double MA ;
MA = iMA(NULL, 0, MAPeriod, 0, MODE_EMA, PRICE_CLOSE, 0) ;
si ( CurrentState == STATE_LONG)
{
if (MA > Close[1]) //la moyenne mobile est plus élevée que le prix de clôture
{
État actuel = STATE_SHORT ;
//tourner pour vendre
//-- fermer la position si elle est ouverte
si ( MyOrderTicket != 0)
{
si (!OrderClose(MyOrderTicket, LotsNumber, Bid, 3, CLR_NONE))
{
err = GetLastError() ;
Print("Erreur lors de la fermeture de la position : ", err) ;
retour(0) ;
}
MaCommandeTicket = 0 ;
}
RefreshRates() ;
//--- la position longue a été fermée avec succès
//--- maintenant ouvrons une position de vente
//--- vérifier les fonds libres
MyOrderTicket = OrderSend(Symbol(), OP_SELL, LotsNumber, Bid, 3, 0, 0,
NULL, 0, 0, CLR_NONE) ;
si (MyOrderTicket<0)
{
err = GetLastError() ;
Print("Erreur à l'ouverture de la position : ", err) ;
MaCommandeTicket = 0 ;
}
}
}
sinon
{
if (MA < Close[1]) // moyenne glissante en dessous du prix de clôture
{
État actuel = STATE_LONG ;

//inverse pour acheter
//-- fermer la position si elle est ouverte
si ( MyOrderTicket != 0)
{
if (!OrderClose(MyOrderTicket, LotsNumber, Ask, 3, CLR_NONE))
{
err = GetLastError() ;
Print("Erreur lors de la fermeture de la position : ", err) ;
retour(0) ;
}
MaCommandeTicket = 0 ;
}
RefreshRates() ;
//--- la position courte a été fermée avec succès
//--- maintenant ouvrons une position d'achat.
//--- vérifier les fonds libres
MyOrderTicket = OrderSend(Symbol(), OP_BUY, LotsNumber, Ask, 3, 0, 0,
NULL, 0, 0, CLR_NONE) ;
si (MyOrderTicket<0)
{
err = GetLastError() ;
Print("Erreur à l'ouverture de la position : ", err) ;
MaCommandeTicket = 0 ;
}
}
}
//----
retour(0) ;
}

 

S'il vous plaît, conseillez-nous ! Comment faire pour ouvrir et fermer une position à l'expiration d'une bougie ou de chandeliers ? C'est-à-dire qu'il s'ouvre à l'ouverture d'un nouveau chandelier, et se ferme

Comment prendre les valeurs de l'indicateur à la clôture d'un chandelier ?

 
gheka:

J'ai des ordres d'achat et de vente qui s'ouvrent au même prix pour près de 50-100 positions,

comment faire pour qu'un seul ordre soit ouvert, si je ne me trompe pas - OrdersTotal()

Si oui, comment dois-je l'utiliser et où dois-je la placer ? J'ai l'impression que sans cette fonction, je dois saisir l'algèbre entière.


Mauvaises conditions pour effectuer des transactions, voir l'exemple pour deux MAs.
 
Superjake:

Bonjour à tous. Je ne suis pas très doué pour écrire des EA, j'ai essayé d'apprendre ce genre de choses, mais je viens de commencer et c'est assez difficile pour moi. Je veux écrire un EA qui ouvrirait des trades lorsque les prix traversent une moyenne mobile et les fermerait au croisement opposé, en utilisant un stop loss ou un trailing stop. J'ai trouvé un exemple d'un tel EA, mais il n'y a pas de trailing stop ou de stop loss et les trades sont ouverts et fermés simplement au croisement. Je n'ai pas assez de connaissances pour cela. Je veux demander à quelqu'un de m'aider à savoir où placer le trailing stop et le stoploss et comment le faire fonctionner :

#property copyright "Jake Sunders"

#lien de propriété "feloq@mail.ru"



#define STATE_SQUARE 0

#define STATE_LONG 1

#define STATE_SHORT 2



//---- paramètres d'entrée

extern int MAPeriod=26 ;
extern double LotsNumber=1.0 ;
extern double TrailingStop=50 ;
extern double StopLoss= 50 ;


//---- variables globales

int CurrentState ;

int MyOrderTicket ;

//+------------------------------------------------------------------+

//| fonction d'initialisation de l'expert |

//+------------------------------------------------------------------+

int init()

{

//----

si (iMA(NULL, 0, MAPeriod, 0, MODE_SMA, PRICE_CLOSE, 0) > Close[0])

État actuel = STATE_SHORT ;

autre Etat actuel = STATE_LONG ;

MaCommandeTicket = 0 ;
//----
retour(0) ;
}
//+------------------------------------------------------------------+
//| fonction de désinitialisation des experts |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
retour(0) ;
}
//+------------------------------------------------------------------+
//| fonction de démarrage de l'expert |
//+------------------------------------------------------------------+
int start()
{
//----
int err ;
double MA ;
MA = iMA(NULL, 0, MAPeriod, 0, MODE_EMA, PRICE_CLOSE, 0) ;
si ( CurrentState == STATE_LONG)
{
if (MA > Close[1]) //la moyenne mobile est plus élevée que le prix de clôture
{
État actuel = STATE_SHORT ;
//tourner pour vendre
//-- fermer la position si elle est ouverte
si ( MyOrderTicket != 0)
{
si (!OrderClose(MyOrderTicket, LotsNumber, Bid, 3, CLR_NONE))
{
err = GetLastError() ;
Print("Erreur lors de la fermeture de la position : ", err) ;
retour(0) ;
}
MaCommandeTicket = 0 ;
}
RefreshRates() ;
//--- la position longue a été fermée avec succès
//--- maintenant ouvrons une position de vente
//--- vérifier les fonds libres
MyOrderTicket = OrderSend(Symbol(), OP_SELL, LotsNumber, Bid, 3, 0, 0,
NULL, 0, 0, CLR_NONE) ;
si (MyOrderTicket<0)
{
err = GetLastError() ;
Print("Erreur à l'ouverture de la position : ", err) ;
MaCommandeTicket = 0 ;
}
}
}
sinon
{
if (MA < Close[1]) // moyenne glissante en dessous du prix de clôture
{
État actuel = STATE_LONG ;

//inverse pour acheter
//-- fermer la position si elle est ouverte
si ( MyOrderTicket != 0)
{
if (!OrderClose(MyOrderTicket, LotsNumber, Ask, 3, CLR_NONE))
{
err = GetLastError() ;
Print("Erreur lors de la fermeture de la position : ", err) ;
retour(0) ;
}
MaCommandeTicket = 0 ;
}
RefreshRates() ;
//--- la position courte a été fermée avec succès
//--- maintenant ouvrons une position d'achat.
//--- vérifier les fonds libres
MyOrderTicket = OrderSend(Symbol(), OP_BUY, LotsNumber, Ask, 3, 0, 0,
NULL, 0, 0, CLR_NONE) ;
si (MyOrderTicket<0)
{
err = GetLastError() ;
Print("Erreur à l'ouverture de la position : ", err) ;
MaCommandeTicket = 0 ;
}
}
}
//----
retour(0) ;
}


Regardez cet exemple