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

 
shtr:

Bonjour à tous !

Pouvez-vous me dire pourquoi les commandes ne s'ouvrent pas ?

Init est init, le commerce est init. Il y a OnTick pour les EAs, il n'y a pas besoin de tout fourrer dans l'init...

Et pour inite, il existe des codes de sortie spéciaux inventés par les développeurs, pourquoi ne les utilisez-vous pas ?

 
evillive:

Initu est pour initu, trade est pour togo. Il y a OnTick pour les EAs, il n'y a pas besoin de tout fourrer dans l'init...

Et pour inite, il existe des codes de sortie spéciaux inventés par les développeurs, pourquoi ne pas les utiliser ?

Probablement parce que nous ne connaissons pas les codes de terminaison inite. Les exemples du tutoriel sont différents du formulaire de l'éditeur. La fonction int start(), par exemple, y est absente. Lorsque j'ai collé l'exemple de conseiller expert simple du tutoriel dans l'inite, cela a en quelque sorte fonctionné. Mais peu importe ce que j'ai écrit, ça n'a pas marché. J'ai donc décidé, après deux semaines d'expériences, de consulter un expert. Merci pour le conseil !

J'ai tout mis dans OnTick, mais rien n'a changé.

 
shtr:

Nous ne l'utilisons pas, ce doit être parce que nous ne connaissons pas les codes d'achèvement init. Les exemples du manuel diffèrent du formulaire de l'éditeur. La fonction int start(), par exemple, y est absente. Lorsque j'ai collé l'exemple de conseiller expert simple du tutoriel dans l'inite, cela a en quelque sorte fonctionné. Mais peu importe ce que j'ai écrit, ça n'a pas marché. J'ai donc décidé, après deux semaines d'expériences, de consulter un expert. Merci pour le conseil !

J'ai tout mis dans OnTick, mais rien n'a changé.

Oubliez le tutoriel, il est écrit en utilisant l'ancienne syntaxe, beaucoup de choses ont changé depuis. L'aide de la livraison du terminal est la plus pertinente, et kodobase, si vous regardez, est également une source d'exemples dans la nouvelle version de MQL.

Et pour ce qui est de ne pas écrire tout le code dans l'inite, c'était avant, cherchez dans le forum, il y a des centaines de messages dans toutes les langues de ce forum, juste à chaque fois il y a un nouveau rédacteur, qui n'est pas un lecteur ;)

 
evillive:

Oubliez le tutoriel, il est écrit selon l'ancienne syntaxe, beaucoup de choses ont changé depuis. L'aide de la livraison du terminal est la plus pertinente, et kodobase, si vous regardez, est également une source d'exemples dans la nouvelle version de MQL.

Et pour ce qui est de ne pas écrire tout le code dans l'inite, c'était avant, cherchez dans le forum, il y a des centaines de messages dans toutes les langues de ce forum, juste à chaque fois il y a un nouveau rédacteur, qui n'est pas un lecteur ;)

Merci !

Les vieux manuels, lorsqu'ils perdent leur pertinence, devraient être immédiatement mis au rancart ;))

 
shtr:

Merci !

Les anciens tutoriels, lorsqu'ils perdent leur pertinence, doivent être immédiatement fumés)).

Et ne jetez pas tout dans OnTick, seulement ce qui est pertinent pour le commerce, la partie du code qui ne s'exécute qu'au démarrage devrait être laissée dans OnInit (bien sûr, que les noms des fonctions devraient être écrits en latin, juste paresseux de changer la mise en page sur le forum à chaque fois).

A propos du code lui-même, il y a des questions sur la boucle, c'est étrange, à mon avis il n'y a pas assez de crochets...

Oui, et aussi pour le calcul des niveaux de profit et de perte, ils ne sont pas correctement prescrits. Le serveur doit envoyer le prix, de préférence normalisé, et non la valeur en pips.

 
evillive:

Et ne mettez pas tout dans OnTick, seulement ce qui est pertinent pour le commerce, la partie du code qui se déclenche seulement au démarrage devrait être laissée dans OnInit (bien sûr, les noms de fonctions devraient être écrits en latin, juste trop paresseux pour changer la mise en page sur le forum à chaque fois).

A propos du code lui-même, il y a des questions sur la boucle, c'est étrange, je pense qu'il n'y a pas assez de crochets...

Oui, et aussi pour le calcul des niveaux de profit et de perte, ils sont incorrectement prescrits. Le serveur doit envoyer le prix, de préférence normalisé, et non la valeur en pips.

Je l'ai, merci. Je vais vérifier les parenthèses - l'éditeur n'a pas produit d'erreurs.

Pourquoi l'exemple du livre a-t-il fonctionné ? J'ai enlevé toutes les fonctions et inséré uniquement le code d'exemple, en commençant par int start. Il n'y a pas eu d'erreur et les transactions se sont ouvertes.

 
shtr:

Je l'ai, merci. Je vais vérifier les parenthèses - l'éditeur n'a pas donné d'erreurs.

Pourquoi l'exemple du livre a-t-il fonctionné... ? J'ai supprimé toutes les fonctions et inséré uniquement le code d'exemple, en commençant par le début. Il n'y a pas eu d'erreur et les transactions se sont ouvertes.

Eh bien, je n'avais pas besoin d'échanger ce qui fonctionnait )))).

Si votre question porte sur la différence entre start et ontik en mode nouveau, vous auriez dû tout transférer de start à ontik. Ou plutôt dans votre cas, de OnInit à OnTick.

Le compilateur garde la trace des erreurs de syntaxe, personne ne vérifiera la logique à part un humain. Dans certains cas, même l'auteur du code peut s'y perdre :)

 
evillive:

Ce qui a marché n'avait pas besoin d'être échangé ))))

Et Int start l'ancienne façon et OnTick la nouvelle façon pour les EAs, donc vous auriez dû déplacer tout de start à OnTick. Ou plutôt dans votre cas, de OnInit à OnTick.

Le compilateur garde la trace des erreurs de syntaxe, personne d'autre qu'un humain ne vérifie la logique. Dans certains cas, même l'auteur du code peut s'y perdre :)

//+------------------------------------------------------------------+
//| 3333.mq4 |
//| Copyright 2016, MetaQuotes Software Corp.
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#lien de propriété "https://www.mql5.com"
#propriété version "1.00"
#propriété stricte
extern int MA_1=5 ;
extern int MA_2=20 ;
extern MA_3=80 ;
extern inttern TP=100 ;
extern int SL=50 ;
extern double Lot=0.1 ;
string Symb ;
//+------------------------------------------------------------------+
//| Fonction d'initialisation de l'expert |
//+------------------------------------------------------------------+
int OnInit()
{
//---
//---
return(INIT_SUCCEEDED) ;
}

//+------------------------------------------------------------------+
//| Fonction de désinitialisation experte |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| Fonction tick expert |
//+------------------------------------------------------------------+
void OnTick()
{
double MA_1_t ;
double MA_2_t ;
double MA_3_t ;
int total ;
int pos ;
Symb=Symbole() ;
Total=0 ;
for( pos=1 ; pos<=OrdersTotal() ; pos++)
pos=OrderSelect(pos-1,MODE_TRADES) ;
si(pos==0)
MA_1_t=iMA(NULL,0,MA_1,0,MODE_EMA,PRICE_CLOSE,0) ;
MA_2_t=iMA(NULL,0,MA_2,0,MODE_EMA,PRICE_CLOSE,0) ;
MA_3_t=iMA(NULL,0,MA_3,0,MODE_EMA,PRICE_CLOSE,0) ;
if(MA_2_t>MA_3_t&&MA_1_t<MA_2_t&&Open[1]<MA_1_t&&Close[1]>MA_1_t)
{
double stoploss=NormalizeDouble(Ask-SL*Point,Digits) ;
double takeprofit=NormalizeDouble(Ask+TP*Point,Digits) ;
pos=OrderSend(Symbol(),OP_BUY,Lot,Ask,3,stoploss,takeprofit, "My order",16384,0,clrGreen) ;
retour ;
}
if(MA_2_t<MA_3_t&&MA_1_t>MA_2_t&&Open[1]>MA_1_t&&Close[1]<MA_1_t)
{
double stoploss=NormalizeDouble(SL*Point-Bid,Digits) ;
double takeprofit=NormalizeDouble(Bid-TP*Point,Digits) ;
pos=OrderSend(Symbol(),OP_SELL,Lot,Bid,3,stoploss,takeprofit, "My order",16384,0,clrRed) ;
retour ;
}
retour ;
}
//---

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

"Eh bien, ce qui a marché n'avait pas besoin d'être colporté)))" Eh bien, vous voulez griffonner quelque chose vous-même).

Le patient n'a pas repris ses esprits après la manipulation.

 
shtr:

"Eh bien, tu n'aurais pas dû échanger ce qui marchait.")) Eh bien, vous voulez griffonner quelque chose vous-même).

Le patient n'a pas repris ses esprits après la manipulation.

Eh bien, la logique et les mathématiques sont boiteuses, il est clair que cela ne fonctionnera pas de cette façon.

Par exemple, pourquoi avons-nous besoin d'un cycle dans cette EE ? Je veux dire, il est clair que nous devons calculer combien de commandes pour le symbole et le magicien donnés ont déjà été passées, non ? Mais ce que nous voyons ici, c'est que la boucle ne compte rien et ne peut pas compter car elle n'a pas de "compteur" vissé dans )))).

Total=0;                                   

   for( pos=1; pos<=OrdersTotal(); pos++)         
   pos=OrderSelect(pos-1,MODE_TRADES); И что дальше? Переменная pos всегда или 0, или 1, цикл сбивается постоянно на начало, а то и заглючить может и превратиться в бесконечный цикл.

OrderSelect() renvoie une valeur booléenne, true ou false, ce qui n'est pas approprié pour la variable pos. Et il est préférable que la boucle commence par l'ordre le plus ancien, c'est-à-dire dans l'ordre inverse, pour éviter de sauter des ordres.

La variable Total peut être utile comme compteur :

for(pos=OrdersTotal()-1;pos>=0;pos--)
{
  if(OrderSelect(pos,MODE_TRADES)) //Обязательно проверить, выбран ли ордер
  { 
    if(OrderSymbol()==Symbol()) //желательно проверить, тот ли это ордер по символу, ещё можно по магику проверить дополнительно в этой же строке
    {
     Total++; //если это наш ордер, добавляем счётчику единицу
    }
  }
}
if(Total<1)
{
  торгуем
}

J'ai supprimé les choses inutiles, ajouté la sortie d'erreur après OrderSend, pour le testeur sur les comptes non-ECN les ordres sont déjà ouverts :

#property version   "1.00"
#property strict
extern int MA_1=5;
extern int MA_2=20;
extern int MA_3=80;
extern int TP=100;
extern int SL=50;
extern double Lot=0.1;

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
  
   double MA_1_t=0;
   double MA_2_t=0; 
   double MA_3_t=0;
   int Total=0;
   
   for(int pos=OrdersTotal()-1;pos>=0;pos--)
   {
     if(OrderSelect(pos,MODE_TRADES)) //Обязательно проверить, выбран ли ордер
     { 
       if(OrderSymbol()==Symbol()) //желательно проверить, тот ли это ордер по символу, ещё можно по магику проверить дополнительно в этой же строке
       {
        Total++; //если это наш ордер, добавляем счётчику единицу
       }
     }
   }
   if(Total<1)
   {
      MA_1_t=iMA(NULL,0,MA_1,0,MODE_EMA,PRICE_CLOSE,0);
      MA_2_t=iMA(NULL,0,MA_2,0,MODE_EMA,PRICE_CLOSE,0); 
      MA_3_t=iMA(NULL,0,MA_3,0,MODE_EMA,PRICE_CLOSE,0);
  
      if(MA_2_t>MA_3_t&&MA_1_t<MA_2_t&&Open[1]<MA_1_t&&Close[1]>MA_1_t)
      {
         double stoploss=NormalizeDouble(Ask-SL*Point,Digits);
         double takeprofit=NormalizeDouble(Ask+TP*Point,Digits);
         if(OrderSend(Symbol(),OP_BUY,Lot,Ask,6,stoploss,takeprofit,"My order buy",16384,0,clrGreen)<1) 
         Print("OrderSend error #",_LastError," BuySL=",stoploss," BuyTP=",takeprofit);
      }
    
      if(MA_2_t<MA_3_t&&MA_1_t>MA_2_t&&Open[1]>MA_1_t&&Close[1]<MA_1_t)
      {
         double stoploss=NormalizeDouble(Bid+SL*Point,Digits);
         double takeprofit=NormalizeDouble(Bid-TP*Point,Digits);
         if(OrderSend(Symbol(),OP_SELL,Lot,Bid,6,stoploss,takeprofit,"My order sell",16384,0,clrRed)<1)
         Print("OrderSend error #",_LastError," Sell SL=",stoploss," Sell TP=",takeprofit);
      }
   }
}

Oh, oui, aussi le calcul du niveau SL pour les ventes était faux, nous devrions être plus attentifs.

 
evillive:

Eh bien, la logique et les mathématiques sont boiteuses, donc il est clair que ça ne fonctionnera pas comme ça.

Par exemple, pourquoi y aurait-il un cycle dans cette EA ? Je veux dire, il est clair que nous devons calculer le nombre de commandes pour le symbole donné et le numéro magique que nous avons, n'est-ce pas ? Mais ce que nous voyons ici, c'est que la boucle ne compte rien et ne peut pas compter car elle n'a pas de "compteur" vissé dans )))).

OrderSelect() renvoie une valeur booléenne, true ou false, ce qui n'est pas approprié pour la variable pos. Et il est préférable que la boucle commence par l'ordre le plus ancien, c'est-à-dire dans l'ordre inverse, pour éviter de sauter des ordres.

La variable Total peut être utile comme compteur :

J'ai supprimé les choses inutiles, ajouté la sortie d'erreur après OrderSend, pour le testeur sur les comptes non-ECN les ordres sont déjà ouverts :

Ah oui, aussi le calcul du niveau SL pour les ventes était erroné, vous devez faire plus attention.

Wow ! !! Merci ! !! Cela demande une certaine réflexion.

Il y a peut-être une "autoformation" sur les nouvelles règles quelque part ? Le numéro de page à 4 chiffres est un peu stressant...