Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Nulle part sans toi - 6. - page 1098

 
wishmast:

Les gars, je me suis déjà creusé les méninges. Comment faire pour que l'EA place des ordres en attente sur les hauts et les bas, par exemple 8 bougies, avec un take profit de 1/4.

Je fais quelque chose comme ça :

double Vhod1=iHighest(Symbol(),0,MODE_HIGH,8,0) ;

double Vhod2=iLowest(Symbol(),0,MODE_LOW,8,0) ;

double TP=((Vhod1-Vhod2)/4)+Vhod1 ;


J'ai essayé de modifier les paramètres, mais je continue à obtenir des arrêts erronés ou à fixer le prix à 7.00000 ; on ne sait pas très bien d'où cela vient.

iHighest, iLowest vous donneront l'adresse du chandelier, mais pas le prix.
 
evillive:
iHighest, iLowest donnera l'adresse de la bougie, pas le prix.

C'est vrai. Nous avons besoin

double Vhod1=iHigh(Symbole(), 0, iHighest(Symbole(),0,MODE_HIGH,8,0)) ;

double Vhod2=iLow(Symbol(), 0, iLowest(Symbol(),0,MODE_LOW,8,0)) ;

 
alvlaf:


Je l'ai mal mis, mais ça n'aurait toujours pas fonctionné correctement parce que... Parce que.) Bref, ça devrait se passer comme ça :

1) créer une variable AllowNewOrders dans l'inite (si elle n'existe pas)

2) Créez un nouvel ordre, jusqu'à ce qu'il soit clôturé, le OnTick de ce symbole est inactif, mais il sera exécuté sur le OnTick d'un autre symbole.

3) Effectuez l'étape 2 pour les autres symboles jusqu'à ce que la limite MaxOpenOrders soit atteinte.

4) à la fin de l'ordre, s'il est perdant ou a une valeur nulle, interdire l'ouverture de nouveaux ordres pour toutes les copies via AllowNewOrders.

[Voici le problème immédiat : lorsque la série perdante se termine, AllowNewOrders=1, mais que se passe-t-il si MaxOpenOrders>1 et qu'il y a plusieurs de ces sessions ?]

5) Si le point 4 n'est pas rempli, vous pouvez alors ouvrir de nouveaux ordres.

Le programme DOIT fonctionner lorsque MaxOpenOrders=1. Peut-être y aura-t-il un problème si nous interdisons les nouveaux ordres à la suite d'un ordre non rentable AllowNewOrders=0 et que le prochain OrderSend, pour une raison quelconque, n'ouvre pas l'ordre. Je vais écrire ci-dessous comment je me suis couvert pour ce cas...

int OnInit()                     
{
   if (!GlobalVariableCheck("AllowNewOrders")) GlobalVariableSet("AllowNewOrders", 1);
   return(INIT_SUCCEEDED);
}
//----------------------------------------------------------------------
void OnTick()
{
   if (CountTrades() == 0)  // Количество ордеров должно равняться нулю
   {
      if ((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) < PriceOpenLastHistOrder(OP_BUY))
      || (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) > PriceOpenLastHistOrder(OP_SELL)))
      // Если последняя сделка убыточная, то открывается такая же, но с увеличенным лотом
      {
         GlobalVariableSet("AllowNewOrders", 0);
         Type = TypeLastHistOrder();
         if (Type == OP_BUY)  Price = Ask;
         if (Type == OP_SELL) Price = Bid;
         Lot = NormalizeDouble(LotsLastHistOrder()*Multiplier, 2);
         ticket = OrderSend(Symbol(), Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);
      }
      else GlobalVariableSet("AllowNewOrders", 1);
      if (PriceCloseLastHistOrder() == PriceOpenLastHistOrder() && CountHistTrades() > 0) 
      // Если прибыль последней сделки равняется нулю, то открывается такая же
      {
         GlobalVariableSet("AllowNewOrders", 0);
         Type = TypeLastHistOrder();
         if (Type == OP_BUY)  Price = Ask;
         if (Type == OP_SELL) Price = Bid;
         Lot = NormalizeDouble(LotsLastHistOrder(), 2);
         ticket = OrderSend(Symbol(), Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);
      }
      else GlobalVariableSet("AllowNewOrders", 1);
      if (((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) > PriceOpenLastHistOrder(OP_BUY))
      || (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) < PriceOpenLastHistOrder(OP_SELL)))
      || CountHistTrades() == 0)
      // Если последняя сделка прибыльная или это первая сделка, то открывается ордер
      {
         if (OrdersTotal() >= MaxOpenOrders || GlobalVariableGet("AllowNewOrders") == 0) return;
         if (SignalBuy())
         {
            ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, IntegerToString(Exp), Magic);
         }
         if (SignalSell())
         {
            ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, IntegerToString(Exp), Magic);
         }
      }
   }
}
 
A13ksandr:

Je vais écrire ci-dessous comment je me couvre pour cette éventualité...

int Tries = 5;
ResetLastError();
do
{
   // решение ошибок с предыдущей попытки открытия ордера, например:
   if (_Error == 134)
   {
      _Lot = NormalizeDouble(_Lot / 2, 2);
      if (_Lot < SymbolInfoDouble(Symbol(), SYMBOL_VOLUME_MIN)) _Lot = SymbolInfoDouble(Symbol(), SYMBOL_VOLUME_MIN);
   }
   if (_Error == 138) RefreshRates();
   Ticket = OrderSend(Symbol(), OP_BUY, _Lot, Ask, 3, 0, 0, NULL, 0, 0, clrNONE);
   if (Ticket < 0)
   {
      _Error = GetLastError();
      Sleep(100);
   }
   Tries--;
}
while (Ticket < 0 && Tries > 0);

Si la solution à l'erreur est correctement prévue, le taux de réussite de l'ouverture d'une commande augmente.

 
Bonjour ! Veuillez me conseiller si j'utilise la fonction du post (chaque commande a son propre magicien) - http://forum.forexpeoples.ru/showthr...=1#post1715092 , à quoi cela ressemblerait-il de trouver les dernières commandes de ventes ou d'achats, ou de mettre à niveau une série de commandes si ce n'est pas chaque commande a son propre magicien, mais chaque série de commandes a son propre magicien. C'est-à-dire qu'on suppose que lorsqu'une nouvelle série d'ordres avec sa propre magie est ouverte, les anciennes séries d'ordres continuent à ouvrir leurs propres ordres avec leurs propres magies. Chaque série est censée avoir son propre bénéfice et il y a beaucoup de séries de commandes de ce type.

Comment le code ci-dessous peut-il changer dans ces conditions ?
for(cnt=OrdersTotal()-1;cnt>=0;cnt--){
if ( !OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES)) continue ;
if(OrderSymbol()!=Symbol()) continue ; if(OrderMagicNumber() < startMagicNumber || OrderMagicNumber() >= startMagicNumber + MaxTrades) continue ;

J'ai mis le code pour générer une magik lors de l'ouverture des premiers ordres d'une série, mais voici le problème lors de l'ouverture de nouveaux ordres dans la même série.

Le code lui-même pour générer la magie à partir du post :
//+------------------------------------------------------------------+
// obtenir la magie suivante dans la série
int getNextMagicNumber(){
int magic = EMPTY ;

if (OrdersTotal() == 0) {
return(startMagicNumber) ;
}

for (int i = startMagicNumber ; i < startMagicNumber + MaxTrades ; i++){
magic = checkMarketByMagic(i) ;
if (magic != EMPTY) break ;
}

if (magic == EMPTY){
magic = startMagicNumber ; // premier de la série
} else {
magic++ ; // suivant de la série
}

return(magic) ;
}
//+------------------------------------------------------------------+
// keekkenen : vérifier la présence d'un ordre sur le marché avec une magie donnée
int checkMarketByMagic(int magic){
for(int i = 0 ; i < OrdersTotal() ; i++){
if( !OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue ;
if(OrderSymbol() != Symbol()) continue ;
if(OrderMagicNumber() == magic) return(magic) ;
}
return(EMPTY) ;
}
//+------------------------------------------------------------------+
 
Bonjour messieurs du forum,
Je m'excuse si j'ai confondu les fils, mais je n'ai pas trouvé le bon endroit pour poster le THEME, donc ne me donnez pas de coup de pied.

Parfois, en surfant sur Internet à la recherche de nouveaux conseillers-experts, je suis tombé sur un conseiller-expert auquel je n'ai pas prêté attention, car sa description était standard, et il y en a beaucoup, mais je n'ai pas prêté attention à son nom.

Si je ne l'ai pas vu ou lu, veuillez me donner le nom, et google fera son travail ou si j'en ai un, je le prendrai comme un cadeau. Il existe peut-être un conseiller similaire qui effectue des actions similaires.

Je vais décrire la signification de l'Expert Advisor (il n'y a rien de très sophistiqué, ce dont j'ai besoin maintenant).

En gros, le travail ressemblerait à ceci :

1. Ouvrir une position manuellement, par exemple acheter.
2. Le conseiller expert définit le Stop Loss et le Take Profit en fonction des paramètres.
3. L'ordre est fermé au moment du takeprofit - l'EA ouvre immédiatement un autre achat et définit les mêmes stoploss et takeprofit jusqu'à ce qu'il rattrape le premier stoploss ou s'il existe un takeprofit ultime.
4. Si la position est fermée par un Stop Loss, le robot ne fait plus rien. Le conseiller expert attend que l'ordre suivant soit ouvert manuellement.

C'est tout.

Je vous en serais très reconnaissant.
 
A13ksandr:


Je l'ai mal inséré, mais ça n'a toujours pas fonctionné correctement, parce que... Parce que.) Bref, ça se passe comme ça :

1) créer une variable AllowNewOrders dans l'initem (si elle n'existe pas)

2) Créez un nouvel ordre jusqu'à ce qu'il se ferme Le OnTick de ce symbole est inactif, mais le OnTick de l'autre symbole fonctionne.

3) Effectuez l'étape 2 pour les autres symboles jusqu'à ce que la limite MaxOpenOrders soit atteinte.

4) à la fin de l'ordre, s'il est perdant ou a une valeur nulle, interdire l'ouverture de nouveaux ordres pour toutes les copies via AllowNewOrders.

[Voici le problème immédiat : lorsque la série perdante se termine, AllowNewOrders=1, mais que se passe-t-il si MaxOpenOrders>1 et qu'il y a plusieurs de ces sessions ?]

5) Si le point 4 n'est pas rempli, vous pouvez alors ouvrir de nouveaux ordres.

Le programme DOIT fonctionner lorsque MaxOpenOrders=1. Peut-être y aura-t-il un problème si nous interdisons les nouveaux ordres à la suite d'un ordre non rentable AllowNewOrders=0 et que le prochain OrderSend, pour une raison quelconque, n'ouvre pas l'ordre. Je vais écrire ci-dessous comment je me couvre pour ce cas.

Merci Alexander, je vérifierai demain. (d'où le problème immédiat - lorsque les séries perdantes se terminent, AllowNewOrders=1, et si MaxOpenOrders>1 et qu'il y a plusieurs sessions...). Si MaxOpenOrders>1 par une certaine valeur, alors dans l'idée AllowNewOrders=1 devrait aussi être plus grand par la même valeur. Mais nous n'avons pas besoin de nous préoccuper de cela et MaxOpenOrders devrait être supprimé, car dans cette version du programme, nous ne planifions pas plus d'une série de toute façon.
 
alvlaf:
Merci Alexander, je le vérifierai demain. [d'où le problème immédiat - lorsque la série perdante se termine, AllowNewOrders=1, mais si MaxOpenOrders>1 et qu'il y a plus d'une session...]. Si MaxOpenOrders>1 par une certaine valeur, alors dans l'idée AllowNewOrders=1 devrait également être plus grand par la même valeur. Mais je n'ai pas besoin de m'en préoccuper pour l'instant et MaxOpenOrders devrait être complètement supprimé, car dans cette version du programme, on ne prévoit pas plus d'une série de toute façon.
J'ai essayé, cela a bien fonctionné pendant les cinq premières minutes, puis j'ai commencé à ouvrir plusieurs transactions (4) à la fois et pour la même paire avec un lot plus important. Alexander, je ne comprends pas bien comment la variable globale obtient et modifie sa valeur dans votre version ?
 

Bonjour à tous !

Voici un objet graphique sur un graphique.

Ses paramètres sont le temps, la valeur et le code. La valeur correspond au prix auquel l'objet est situé.

Existe-t-il un moyen d'obtenir son heure et sa valeur (via une fonction ou autre) ?

\\\\\

Ou, dans un sens plus large, existe-t-il des objets (en dehors des lignes de tendance, des lignes de Fibonacci, des Gannets) qui nous permettent d'obtenir leur temps et leur prix instantanément ?

Je dois placer des marqueurs sur le tableau et obtenir des informations de leur part. Tracer des lignes de tendance, fibo, etc... - terriblement encombrant et lent...

Merci pour les réponses !

PS Je viens de commencer à étudier...

 
ilmel:

Bonjour à tous !

Voici un objet graphique sur un graphique.

Ses paramètres sont le temps, la valeur et le code. La valeur correspond au prix auquel l'objet est situé.

Existe-t-il un moyen d'obtenir son heure et sa valeur (via une fonction ou autre) ?

\\\\\

Ou, dans un contexte plus large, existe-t-il des objets (en dehors des lignes de tendance, des lignes de Fibonacci, des Gannets) dont on peut déduire immédiatement le temps et le prix ?

Je dois placer des marqueurs sur le tableau et obtenir des informations de leur part. Tracer des lignes de tendance, fibo, etc... - terriblement encombrant et lent...

Merci pour les réponses !

PS Je viens de commencer à étudier...

https://docs.mql4.com/ru/objects/objectgetdouble
https://docs.mql4.com/ru/objects/objectgetinteger