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

 
Leanid Aladzyeu:

J'ai commencé à étudier les tableaux.

J'ai écrit une fonction pro-order avec des tableaux, 3 tableaux = 0 achat, 1= vente, 2= total des transactions d'achat et de vente.

Puis j'ai écrit une condition d'achat si ( la première condition && array [0] == 0 )alors nous ouvrons un achat.

et en vente si ( la première condition && array [1]== 0) alors nous ouvrons une position de vente.

Mais le testeur lance une erreur et le test s'arrête, quel est le problème ? ( error " array exit " )

Cela signifie que l'index que vous adressez est en dehors de la disposition du tableau. Par exemple, si array[ 3 ] ; vous ne pouvez adresser que les éléments de 0 à 2. Vérifiez votre code.

Une autre possibilité est que vous n'avez pas partitionné le tableau (avec ArrayResize()), mais que vous essayez d'accéder à certains de ses éléments.

 
le code...
void Oher(int Mag,string Symb, int &mas[2])
{
ArrayInitialize( mas,0);

int tip;
int ticket3 =-1;
  for (int pos=OrdersTotal()-1; pos>=0; pos--)
     {
     if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderMagicNumber()==Mag && OrderSymbol()==Symb && OrderTicket()!=ticket3)
          {
          ticket3=OrderTicket();
          tip=OrderType();
          
          switch(tip)
              {
              case 0:mas[0]++; mas [2]++;break;// 0 покупка
              case 1:mas[1]++; mas [2]++;break;// 1 продажа
              }
          }
          continue;
     }

}
Чудо код вставил ) 2 раз получилось за все время что я на сайте)
 
Leanid Aladzyeu:
le code...
Essayez de le découvrir vous-même, le testeur doit indiquer dans quelle ligne et à quel endroit de la ligne l'erreur s'est produite.
 
Tapochun:
Essayez de le découvrir vous-même, le testeur doit indiquer dans quelle ligne et à quel endroit de la ligne l'erreur s'est produite.

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.

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

Il crache dessus.

 
Je l'ai corrigé. C'était un total de 2 tableaux et j'en avais besoin de 3. Dans l'initialisation du tableau et dans la fonction, le nombre faisait +1. et ça a marché)
 

Veuillez m'indiquer comment vérifier le fonctionnement de l'indicateur.

L'idée est la suivante : quand l'EA forme une nouvelle barre, il appelle l'indicateur, mais l'indicateur n'a pas de données à ce moment et je reçois les données de la barre précédente (il n'a pas eu le temps de calculer).

Comment éviter ce problème. De plus, tout est OK dans le testeur de stratégie. Je reçois soit très bien, soit pas du tout sur la démo !

C'est tout, ce n'est pas pertinent. Résolu.

 

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 ?

extern int     MAGIC             = 90324752;
extern int     START_HOUR        = 7;
extern int     FINISH_HOUR       = 18;
extern int     TRADE_LIMIT       = 3;
extern int     SMMA_PERIOD       = 100;
extern int     BB_PERIOD         = 50;
extern double  BB_DEV            = 1;
extern double  LOT               = 1;
extern double  StopLoss          = 400;
extern double  TakeProfit        = 2000;

void OnTick()
{
static int    TICKET;

double SMMA                 = iMA (Symbol(),0,SMMA_PERIOD,0,MODE_SMMA,PRICE_CLOSE,0);
double BB_UP                = iBands(Symbol(),0,BB_PERIOD,BB_DEV,0,PRICE_CLOSE,MODE_UPPER,0);       

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

if(Hour() >= START_HOUR && Hour() <= FINISH_HOUR && TRADE_COUNT < TRADE_LIMIT && POS_OPENED == FALSE && Seconds() >= 55)
if(Minute() == 29 || Minute() == 59)
{     
  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() );
      } 
  }
}
}


J'ai vérifié avec Alert et pour une raison inconnue, le testeur donne la valeur maximale du calcul à partir du tout 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 en sorte que mon EA attende l'ouverture de la prochaine barre (période de 30m). Lorsque je teste en utilisant des points de contrôle, tout va bien, mais si j'utilise des ticks,

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


Par exemple, sur 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 s'avérer être dans quelques bougies pour une raison quelconque.


Merci d'avance !
 

Aidez-nous avec les commentaires. Sur chaque barre, des commentaires sont générés. À chaque cochage, je veux ajouter du texte au commentaire existant.

J'appelle le code :

void UserMarketComment( )

{

   string com=ChartGetString(0,CHART_COMMENT);  // Получаем текст существующего комментария

   string st="Целевой убыток="+DoubleToStr(-inpTargetLoss,2)+" "+AccountCurrency()+"  Текущ";

   if(AccountProfit()<0) st=st+"ий убыток=";

   else st=st+"ая прибыль=";

   st=st+DoubleToStr(AccountProfit(),2)+" "+AccountCurrency()+"  Целевая прибыль="+DoubleToStr(inpTargetProfit,2)+" "+AccountCurrency();

   Comment(com+"",TimeToStr(TimeCurrent(),TIME_SECONDS),"    Spread = ",MarketInfo(Symbol(),MODE_SPREAD),

           "\n ",st);

  }

Ajoute un nouveau commentaire et à chaque fois qu'il est coché, une nouvelle ligne et du texte glissent vers le bas.

Comment faire pour qu'il supprime les dernières lignes avant la sortie ?

 
ForTorg ZEVs:

Aidez-nous avec les commentaires. Sur chaque barre, des commentaires sont générés. À chaque cochage, je veux ajouter du texte au commentaire existant.

J'appelle le code :

void UserMarketComment( )

{

   string com=ChartGetString(0,CHART_COMMENT);  // Получаем текст существующего комментария

   string st="Целевой убыток="+DoubleToStr(-inpTargetLoss,2)+" "+AccountCurrency()+"  Текущ";

   if(AccountProfit()<0) st=st+"ий убыток=";

   else st=st+"ая прибыль=";

   st=st+DoubleToStr(AccountProfit(),2)+" "+AccountCurrency()+"  Целевая прибыль="+DoubleToStr(inpTargetProfit,2)+" "+AccountCurrency();

   Comment(com+"",TimeToStr(TimeCurrent(),TIME_SECONDS),"    Spread = ",MarketInfo(Symbol(),MODE_SPREAD),

           "\n ",st);

  }

Ajoute un nouveau commentaire et à chaque fois qu'il est coché, une nouvelle ligne et du texte glissent vers le bas.

Comment faire pour qu'il supprime les dernières lignes avant la sortie ?

Il me semble que vous ne pouvez que remplacer complètement Comment()

Et par conséquent, pour changer une partie du commentaire à chaque tick, il faut changer complètement le commentaire à chaque tick.

 
ForTorg ZEVs:

Aidez-nous avec les commentaires. Sur chaque barre, des commentaires sont générés. À chaque cochage, je veux ajouter du texte au commentaire existant.

J'appelle le code :

void UserMarketComment( )

{

   string com=ChartGetString(0,CHART_COMMENT);  // Получаем текст существующего комментария

   string st="Целевой убыток="+DoubleToStr(-inpTargetLoss,2)+" "+AccountCurrency()+"  Текущ";

   if(AccountProfit()<0) st=st+"ий убыток=";

   else st=st+"ая прибыль=";

   st=st+DoubleToStr(AccountProfit(),2)+" "+AccountCurrency()+"  Целевая прибыль="+DoubleToStr(inpTargetProfit,2)+" "+AccountCurrency();

   Comment(com+"",TimeToStr(TimeCurrent(),TIME_SECONDS),"    Spread = ",MarketInfo(Symbol(),MODE_SPREAD),

           "\n ",st);

  }

Ajoute un nouveau commentaire et à chaque fois qu'il est coché, une nouvelle ligne et du texte glissent vers le bas.

Comment faire pour qu'il supprime les dernières lignes avant la sortie ?

Vous avez donc un caractère de contrôle "\n" dans votre commentaire - c'est un caractère de saut de ligne. Si vous l'enlevez, il n'y aura pas de lignes multiples.
Raison: