Questions des débutants MQL5 MT5 MetaTrader 5 - page 412

 
Imminence:

Bonjour, j'ai un problème de débutant...

Je n'arrive pas à faire en sorte que le système compare la valeur de clôture de la dernière barre avec les hauts et les bas d'une certaine période, par ex.

les 20 dernières mesures. Qu'est-ce que je fais de mal ?


Je l'ai vérifié avec Alert et pour une raison inconnue, le testeur affiche la valeur maximale du calcul du dernier tick, mais il donne cette valeur

C'est le même nombre de fois que les ticks, donc l'ordre ne s'ouvre pas.


La deuxième question est de savoir comment faire pour que mon EA attende l'ouverture de la prochaine barre (période de 30m). Dans le test des points de contrôle, tout va bien, mais si j'utilise les ticks,

puis l'EA s'ouvre dans la même barre juste après avoir fermé au stop loss....


Par exemple, pour une période de 30m, je veux fermer l'ordre 5 secondes avant la fin de la barre (29.55, 59.55).

Sur la base de toutes les données disponibles à ce moment-là. A ce stade, le problème est que si un tick ne se produit pas dans les 5 secondes, donc aucun

(En théorie, c'est une connerie, mais en réalité, le prochain tick peut apparaître dans quelques chandeliers pour une raison quelconque.

peut être dans quelques bougies pour une raison quelconque.


Merci d'avance !

1. Je n'ai rien vu concernant les 20 dernières barres dans le code.

2. Comment déterminer le premier tick d'une nouvelle barre ?

3. comment fermer un ordre sans vérifier s'il s'agit d'un tick ou non ?

Nous devons éviter de travailler avec OnTick et travailler avec OnTimer. Réglez le timer avec un intervalle de 1 seconde et vérifiez l'heure dans celui-ci. La minuterie ne dépend pas des ticks.

/// Определяет начало нового бара
bool NewBar()
{
    static datetime lastbar = 0;
    datetime curbar = iTime(Symbol(), PERIOD_M30, 0);
    if(lastbar!=curbar)
    {
        lastbar=curbar;
        return (true);
    }
    return(false);
}
 
Leanid Aladzyeu:

o_oops je ne savais pas que le terminal poke aussi où se trouve l'erreur, première fois que je tombe sur une erreur critique.

Il crache dessus.

Bien sûr, il va cracher, vous accédez au 3ème élément d'un tableau de dimension 2 - mas[2]++.

void Oher(int Mag,string Symb, int &mas[2])
..............
...........

case 1:mas[1]++; mas [2]++;break;// 1 продажа
 

Alexey Volchanskiy:
Так у тебя в комменте стоит управляющий символ "\n " - это символ перевода строки. Если его убрать, многострочия не будет.

C'est une blague. Maintenant, il ajoute un commentaire à la fin de la ligne... et le texte se déplace vers la droite. ;-)

 

Bonsoir. J'essaie d'écrire un EA simple sur le croisement de tenkan et kinjun. Voici le code :

void OnTick()

void OnTick()

{

TradeSignal_20() ;

}


int TradeSignal_20()

{

int sig=0 ;


if(h_ich==INVALID_HANDLE)

{

h_ich=iIchimoku(Symbole(),Période(),IKHtenkansen,IKHkijunsen,IKHsenkouspanb) ;

retour(0) ;

}

sinon

{

si (CopyBuffer(h_ich,0,0,3,ich1_buffer)<2) return(0) ; // TENKANSEN_LINE

si (CopyBuffer(h_ich,1,0,3,ich2_buffer)<2) return(0) ; // KIJUNSEN_LINE

if (!ArraySetAsSeries(ich1_buffer,true)) return(0) ;

if (!ArraySetAsSeries(ich2_buffer,true)) return(0) ;

}

//--- vérifier la condition et fixer la valeur pour sig

if(ich1_buffer[1]>ich2_buffer[1]) sig=1;

else if(ich1_buffer[1]<ich2_buffer[1]) sig=-1 ;

sinon sig=0 ;

if (ich1_buffer[1]>ich2_buffer[1])

if (ich1_buffer[2]<ich2_buffer[2])

Alert(Symbol()+" : achat") ;

if (ich1_buffer[1]<ich2_buffer[1])

if (ich1_buffer[2]>ich2_buffer[2])

Alert(Symbol()+" : sale") ;

//--- retourner le signal de commerce

retour (sig) ;

}

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

Comment faire pour que l'alerte ne soit appelée qu'une seule fois et non constamment ?

 
Alexey Volchanskiy:

1. Je n'ai rien vu concernant les 20 dernières barres dans le code, donnez des détails.

2. Comment déterminer le premier tick d'une nouvelle barre ?

3. comment une transaction peut-elle être fermée, qu'elle ait été cochée ou non ?

Vous devez éviter de travailler avec OnTick et travailler avec OnTimer, régler le minuteur avec un intervalle d'une seconde et vérifier l'heure dans celui-ci. La minuterie ne dépend pas de l'arrivée des tiques.

Ici, comment puis-je comparer le prix de clôture avec le maximum des 20 dernières barres ? Et si le dernier prix est égal ou supérieur au prix maximum des 20 dernières barres, alors il y a un signal d'ouverture.
  

double HIGHEST              = High[iHighest(Symbol(),0,MODE_HIGH,20,0)];


   
  if(Close[0] > SMMA && Close[0] > BB_UP && Close[0] >= HIGHEST)

  {
   TICKET = OrderSend(Symbol(),OP_BUY,LOT,Ask,0,Ask-StopLoss*Point,Ask+TakeProfit*Point,NULL,MAGIC,0,Blue);
   if(TICKET < 0)
      {
         Alert("Order Send failed, error # ", GetLastError() );
      } 
  }
 
first_may:

Bonsoir. J'essaie d'écrire un EA simple sur le croisement de tenkan et kinjun. Voici le code :

void OnTick()

void OnTick()

{

TradeSignal_20() ;

Comment faire pour que l'alerte ne soit appelée qu'une seule fois et pas tout le temps ?
Vous ne pouvez pas appuyer sur le bouton SRC ?
 
Imminence:
Ici, comment puis-je comparer le prix de clôture avec le maximum des 20 dernières barres ? Et si le dernier prix est égal ou supérieur au maximum des 20 dernières barres, il y a un signal d'ouverture.
Regardons le code
double HIGHEST              = High[iHighest(Symbol(),0,MODE_HIGH,20,0)];

  if(Close[0] > SMMA && Close[0] > BB_UP && Close[0] >= HIGHEST)

  {
***********

Je pense que le problème vient de la référence à la barre zéro, c'est-à-dire la barre actuelle. Vous devez définir le début d'une nouvelle barre, je l'ai donné dans la réponse précédente et effectuer toutes les comparaisons uniquement sur le premier tick d'une nouvelle barre. Et changer l'indexation. Nous devons nous assurer que la dernière barre fermée n'est pas dans iHighest. Et maintenant que vous avez une référence à la barre actuelle qui se forme à chaque tick, les résultats seront des plus étranges.

double HIGHEST              = High[iHighest(Symbol(),0,MODE_HIGH,20,2)];

  if(Close[1] > SMMA && Close[1] > BB_UP && Close[1] >= HIGHEST)

  {
***********

 
Alexey Volchanskiy:
Regardons le code de

Je pense que le problème vient de la référence à la barre zéro, c'est-à-dire la barre actuelle. Vous devez définir le début d'une nouvelle barre, je l'ai cité dans la réponse précédente et seulement sur le premier tick de la nouvelle barre faire toutes les comparaisons. Et changer l'indexation. Nous devons nous assurer que la dernière barre fermée n'est pas dans iHighest. Et maintenant que vous avez une référence à la barre actuelle qui se forme à chaque tick, les résultats seront des plus étranges.

Merci, ça semble avoir aidé :) bien que j'aurais juré avoir fait exactement la même chose et que ça n'ait pas marché...

Vous avez conseillé OnTimer() mais pour une raison quelconque, il ne veut pas coopérer avec moi. J'ai étudié toute l'aide et je n'ai pas trouvé d'explications ou d'exemples clairs, j'étais donc dans l'impasse.

C'est-à-dire que ce code trivial n'est pas exécuté, même si tout est spécifié dans la référence... En cherchant ce programme sur Google, je suis tombé sur le fait que OnTimer() ne fonctionne pas dans le test.

mode. Bien que ce moment semble être éliminé avec la sortie de mql5. Aide à la compréhension :) Merci !

int OnInit()
  {
//---
  bool  Timer = EventSetTimer(1);
  if(Timer != TRUE)
  Print(GetLastError()); 
//---
   return(INIT_SUCCEEDED);
  }

void OnDeinit(const int reason)
  {
  EventKillTimer();   
  }
  
void OnTimer()
{
Print("It works");
}  
  
 

Imminence:

En cherchant ce programme sur Google, j'ai trouvé qu'ils disent que OnTimer() ne fonctionne pas en mode test. Il a été résolu avec mql5. Aidez-moi à le comprendre.) Merci !

C'est vrai, dans MT4 dans le testeur le timer ne fonctionne pas et ce n'est pas documenté ! J'ai écrit à Servicedesk et ils ont dit qu'ils ne le feraient jamais. Je m'en suis sorti en appelant OnTimer dans OnTick. J'ai réglé le minuteur sur une seconde.

// Возвращает true, если работает под тестером
bool IsRunOnTester()
{
    if(MQLInfoInteger(MQL_TESTER) || MQLInfoInteger(MQL_VISUAL_MODE) || MQLInfoInteger(MQL_OPTIMIZATION))
        return true;
    return false;    
}

MqlDateTime     TimeCurrStruct;

void OnTick()
{
    if(IsRunOnTester())
    {
        static datetime dt1 = 0, dt2 = 0;
        static bool tfirst = true;
        if(tfirst)
        {
            tfirst = false;
            dt1 = dt2 = TimeCurrent();
            return;
        }
    
        dt2 = TimeCurrent();
        for(datetime TimeTesterCurrent = dt1+1; TimeTesterCurrent <= dt2; TimeTesterCurrent++)
        {
            TimeToStruct(TimeTesterCurrent, TimeCurrStruct);
            OnTimer();
        }    
        dt1 = dt2;
    }
}

Ainsi, si dans le testeur les ticks arrivent plus d'une fois par seconde, les ticks excédentaires sont ignorés ; s'ils sont moins fréquents, le multiple de temps de 1 seconde est généré. Ce temps se trouve dans la structure TimeCurrStruct, et ma classe principale, quel que soit le mode, ne prend du temps que dans cette structure. À mon avis, c'est la seule façon de traiter ce bogue. Voici une fonction, j'ai enlevé les choses inutiles, seulement la viande ;))

void OnTimer()
{
    string msg;
    if(!IsRunOnTester())
    {
        TimeToStruct(TimeCurrent(), TimeCurrStruct);
        SmartDsp.ReceiveTick(TimeCurrStruct);    // основной метод робота, в него передается структура со временем
    }
    else
    {
        SmartDsp.ReceiveTick(TimeCurrStruct);    
    }
}




 
Alexey Volchanskiy:
Vous ne pouvez pas appuyer sur le bouton SRC ?
Ce que vous entendez par là n'est pas clair ?