[ARCHIVE !] Toute question de débutant, pour ne pas encombrer le forum. Professionnels, ne passez pas à côté. Nulle part sans toi - 4. - page 205

 
alsu:
Ce n'est pas "devrait être de type double" mais "sera stocké dans une variable globale en tant que double". Sentir

Bon après-midi. J'ai essayé de "sentir la différence" et voici ce qui en est ressorti... C'est-à-dire que nous pouvons (avec un peu d'extension) VRAIMENT définir une variable GV comme suit. Une variable GV est une "boîte" dans laquelle vous pouvez stocker une variable de n'importe quel type (à l'exception de la chaîne de caractères, car une variable GV est de type double uniquement, alors que la règle du typecasting ne permet pas la réduction de type, c'est-à-dire que vous ne pouvez pas faire d'une chaîne de caractères un double). Et cette variable, que nous allons insérer dans une variable GV, "prendra la forme de cette boîte" (c'est-à-dire qu'elle sera castée du type source au type double)... Bref, c'est comme ça, n'est-ce pas ?

Merci d'avance pour votre réponse.
 

Bonjour. La question est la suivante. Dans lelivre MQL4 deS.K ., dans lasection "Trading Operations", il y a un exemple de script simple qui modifie un ordre en attente dont le prix déclaré est plus élevé que celui des autres ordres en attente (modifyorderprice.mq4) comme suit :

//--------------------------------------------------------------------
// modifyorderprice.mq4 
// Предназначен для использования в качестве примера в учебнике MQL4.
//--------------------------------------------------------------- 1 --
int start()                                     // Спец.функция start
  {
   int Tral=10;                                 // Дист. приближения
   string Symb=Symbol();                        // Финанс. инструмент
   double Dist=1000000.0;                       // Предустановка
   double Win_Price=WindowPriceOnDropped();     // Здесь брошен скрипт
//--------------------------------------------------------------- 2 --
   for(int i=1; i<=OrdersTotal(); i++)          // Цикл перебора ордер
     {
      if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий
        {                                       // Анализ ордеров:
         //------------------------------------------------------ 3 --
         if (OrderSymbol()!= Symb) continue;    // Не наш фин.инструм.
         if (OrderType()<2) continue;           // Рыночный ордер  
         //------------------------------------------------------ 4 --
         if(NormalizeDouble(MathAbs(OrderOpenPrice()-Win_Price),Digits)
            < NormalizeDouble(Dist,Digits))     // Выбираем ближайший
           {
            Dist=MathAbs(OrderOpenPrice()-Win_Price);// Новое значение
            int    Tip   =OrderType();          // Тип выбранного орд.
            int    Ticket=OrderTicket();        // Номер выбранн. орд.
            double Price =OrderOpenPrice();     // Цена выбранн. орд.
            double SL    =OrderStopLoss();      // SL выбранного орд.
            double TP    =OrderTakeProfit();    // TP выбранного орд.
           }                                    // Конец if
        }                                       // Конец анализа ордера
     }                                          // Конец перебора орд.
//--------------------------------------------------------------- 5 --
   if (Tip==0)                                  // Если отложенных нет
     {
      Alert("По ",Symb," отложенных ордеров нет");
      return;                                   // Выход из программы
     }
//--------------------------------------------------------------- 6 --
   while(true)                                  // Цикл закрытия орд.
     {
Ou bien il y a une erreur dans ce script dans le bloc 5-6, parce que (comme je le vois) la ligne
if (Tip==0)                                  // Если отложенных нет
Doit être de la forme
if (Tip<2)                                  // Если отложенных нет
puisque tous les types d'ordres non en attente (marché) ont le type 0 ou 1, c'est-à-dire moins de 2.

Ou ai-je mal compris quelque chose ?

Question : Pourriez-vous préciser : si j'ai mal compris quelque chose, de quoi s'agit-il ?

Merci d'avance pour votre réponse.

 
7777877:

Bon après-midi. J'ai la question suivante. Dans lelivre MQL4de S.K ., dans lasection "Trading Operations", il y a un exemple de script simple qui modifie un ordre en attente dont le prix déclaré est plus proche du point où le script est attaché que les prix des autres ordres en attente(

Ou il y a une erreur dans ce script dans le bloc 5-6, parce que (comme je le vois) la ligne

devrait ressem

bler à

ceci parce que tous les types d'ordres non en attente (marché) ont le type 0 ou 1, c'est-à-dire moins de 2.

Ou j'ai mal compris quelque chose.

Question : pourriez-vous me préciser : si j'ai mal compris quelque chose, quoi

exactement ?

Merci d'avance pour la réponse

cher... il n'est pas nécessaire d'écrire en si grosses lettres ici... vous pourriez vous casser les yeux :-)

et que... avant de poser des questions... avez-vous essayé de lire le BACKGROUND dans MetaEditor ? Tout ? ... pour commencer... pour que vous ne posiez pas de questions stupides sur les types et des trucs comme ça.....

===

Type d'opération pour la fonction OrderSend(). Peut être l'une des valeurs suivantes :

Constant Valeur Description
OP_BUY 0 Acheter
OP_SELL 1 Vendez
OP_BUYLIMIT 2 Ordre en attente BUY LIMIT
OP_SELLLIMIT 3 Ordre SELL LIMIT en attente
OP_BUYSTOP 4 Ordre BUY STOP en attente
OP_SELLSTOP 5 Ordre SELL STOP en attente
 

mais pour ce qui est du type - il n'y a rien de mal... exactement ==0 devrait être...

car dans le 3ème bloc

      if (OrderType()<2) continue;           // Рыночный ордер  

les ordres de marché sont ignorés...

===

et si les ordres en attente sont trouvés dans la liste des ordres, la variable TYPE ne sera pas égale à 0

---

 

Bon après-midi. Pouvez-vous me donner un indice ?

Par exemple, nous avons un critère pour le passage du MA au niveau_R et au niveau_S :

int Criterion;
double MA_1=iMA(......,0);
double MA_2=iMA(......,1);
double MA_3=iMA(......,2);
if(MA_1 > Level_S_1 && Ma_2 <= Level_S_2 MA_3 <= Level_S_3) Criterion=1;
if(MA_1 > Level_R_1 && Ma_2 <= Level_R_2 MA_3 <= Level_R_3) Criterion=2;

Question : comment mémoriser le critère de façon à ce qu'il conserve une valeur de 1 ou 2 (selon la passe) jusqu'à ce qu'une nouvelle passe se produise et qu'il ne soit pas réinitialisé lors des ticks suivants.

 
Placez la définition de la variable en dehors de la fonction Start ou autre... Dans les variables globales...
 
Aleksander:
Placez la définition de la variable en dehors de la fonction Start ou autre... Dans les variables globales...
J'ai essayé, et il a juré... faisant allusion à mon incompétence.
 
ensuite, si le texte est petit, publiez le texte entier... 20-30 lignes au maximum
 
int Criterion, Crit;
int start()
 {
  Crit= Fun_Criterion( Criterion); 

  switch(Crit)
   {
   /************/
   }
return(0);
 }

Fun_Criterion(int Criterion)
 {
  if(MA_1 > Level_S_1 && Ma_2 <= Level_S_2 MA_3 <= Level_S_3) Criterion=1;
  if(MA_1 < Level_R_1 && Ma_2 >= Level_R_2 MA_3 >= Level_R_3) Criterion=2;

  return(Criterion);
 }
 

pourquoi y a-t-il des intermédiaires ? et quelle est la fonction du FUN ?

int Criterion;
int start() {
  Fun_Criterion(); 

  switch( Criterion)
   {
   /************/
   }
  return(0);
}
//-----------------------------
void Fun_Criterion() {
  if(MA_1 > Level_S_1 && Ma_2 <= Level_S_2 &&  MA_3 <= Level_S_3) Criterion=1;
  if(MA_1 < Level_R_1 && Ma_2 >= Level_R_2 &&  MA_3 >= Level_R_3) Criterion=2;
 }

Et && ne sont pas au bon endroit...

Raison: