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

 
gyfto:

J'ai une question enfantine. Les variables sont déclarées dans l'en-tête du code. Ils sont censés être mondiaux. Mais je ne comprends pas la différence

de

si cette variable est déclarée dans l'en-tête. Idéalement, par la portée de la variable. Mais dans les deux cas, il est visible à l'intérieur de la fonction. J'ai fait un test (script) :

- Je n'ai pas remarqué de différences. Pouvez-vous expliquer leur différence, car je ne la comprends pas.

Il y a un statik supplémentaire là-dedans. Il fonctionnera également sans lui. Il est logique de déclarer les statiques à l'intérieur des fonctions. La portée du bloc fonctionnel uniquement.
 
Zhunko:
Il est logique de déclarer les statiques à l'intérieur des fonctions. L'étendue n'est qu'un bloc fonctionnel.


Cela fonctionne de la même manière :

int a = 10;
int start(){
   Alert(StringConcatenate("st: a = ", a));//st: a = 10
   f1(); Alert(StringConcatenate("f1: a = ", a));//f1: a = 10
   f2(); Alert(StringConcatenate("f2: a = ", a));//f2: a = 10
}
void f1(){
   int a = 11;
   return;
}
void f2(){
   static int a = 12;
   return;
}

Dans quel cas la différence se fera-t-elle sentir ? ALXIMIKS, merci aussi pour la réponse.

 

Bonjour !

Pouvez-vous me dire comment installer un indicateur/robot supplémentaire sur un mt4 installé sur un iphone/ipad ? Est-ce en principe possible ? Avec Windows, c'est simple et élémentaire, mais avec les produits mobiles d'Apple, ce n'est pas si évident.

La logique dit que c'est possible. Après tout, un certain nombre d'indicateurs sont déjà préinstallés. Mais ce qui et où copier n'est pas clair, la structure du fichier est différente. Quelqu'un n'a-t-il pas rencontré un tel problème ?

Merci d'avance.

 

Je suis en train de créer un indicateur basé sur les moyennes mobiles . L'idée est de couper les mouvements insignifiants dans des points précis. Disons que nous avons défini un filtre de 50 pips. L'indicateur est en baisse mais la baisse est inférieure à 50 pips, donc nous prenons la valeur de la moyenne d'hier et l'écrivons et fixons son niveau pour la date actuelle. Sur la barre suivante, nous vérifions la différence, la valeur actuelle moins la valeur que nous avons enregistrée, si le total ne dépasse pas 50 pips, nous fixons le niveau qui est stocké dans la variable statique à la valeur actuelle. Si la valeur la dépasse, elle devient la valeur actuelle, c'est-à-dire qu'elle est similaire à une moyenne mobile avec un décalage de zéro.J'ai essayé différentes variantes, mais je n'ai pas encore trouvé la bonne solution.

Pour des raisons de simplicité, je joins le code pour dessiner uniquement les déclins. Le problème est que l'indicateur tire à la hausse. Et la principale est que lorsque je l'exécute dans le testeur, je peux voir visuellement l'indicateur changer, alors qu'il n'y a pas de sortie en dehors du filtre. Je suppose que quelque part la valeur de l'enregistrement "MA_otshet" est perdue.

#property indicator_chart_window
#property indicator_buffers 1
#property  indicator_color1 Red 
//--- input parameters
//--- buffers
double ExtMapBuffer1[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE,0,1);
   SetIndexBuffer(0,ExtMapBuffer1);
   IndicatorDigits(Digits+1);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
    int counted_bars=IndicatorCounted(),                      
    limit;
    double
    raznica,raznica_static,MA_0_t,MA_1_t;
   static double MA_otshet;  //здесь хранится запись значения MA_otshet
   
   for(int i=0;i<Bars;i++)
   {  
      MA_0_t=iMA(NULL,0,7,0,MODE_EMA,PRICE_CLOSE,i+0);  
      MA_1_t=iMA(NULL,0,7,0,MODE_EMA,PRICE_CLOSE,i+1); 
      raznica=MA_0_t-MA_1_t; //разница между сегодня и вчера по скользящей средней
      raznica_static=MA_0_t-MA_otshet; //разница между сегодня и MA_otshet

      if(raznica > -0.005 && raznica <= 0) // если raznica не превышает заданное число 
          {
          MA_otshet=MA_1_t; // записываем значение MA_otshet
          }
      if(raznica_static > - 0.005 && raznica_static <= 0) //если raznica_static не превышает заданное число
          {
          ExtMapBuffer1[i]=MA_otshet;  // то рисуем значение индикатора, как записанный MA_otshet
          }
      if(raznica_static < - 0.005) // если raznica превышает заданное число
          {
          ExtMapBuffer1[i]=MA_0_t; // то рисуем значение по текущей цене
          }
   } 
   return(0);
  }
//+------------------------------------------------------------------+
 

Bonjour. Aidez-moi, s'il vous plaît.

J'ai besoin que tous les ordres soient fermés à 23 h 55 et le vendredi, la négociation se termine à 22 h. Il y a donc un problème avec la transaction.

j'ai trouvé dans le script du tutoriel dans la section temps l'aide s'il vous plaît ajouter le paramètre numéro du jour, c'est-à-dire vendredi les ordres ont été fermés à 21 55 et les jours normaux à 23 55 ou peut partager le lien s'il ya des solutions prêtes à l'emploi

//--------------------------------------------------------------------
// timeevents.mq4
// Предназначен для использования в качестве примера в учебнике MQL4.
//--------------------------------------------------------------- 1 --
extern double Time_Cls=16.10;          // Время закрытия ордеров
bool Flag_Time=false;                  // Флаг, сообщения ещё не было 
//--------------------------------------------------------------- 2 --
int start()                            // Спец. функция start
  {
   int    Cur_Hour=Hour();             // Серверное время в часах
   double Cur_Min =Minute();           // Серверное время в минутах
   double Cur_time=Cur_Hour + Cur_Min100; // Текущее время
   Alert(Cur_time);
   if (Cur_time>=Time_Cls)             // Если наступило время события
      Executor();                      //.. то выполняем задуманное
   return;                             // Выход из start()
  }
//--------------------------------------------------------------- 3 --
int Executor()                         // Пользовательская функция
  {
   if (Flag_Time==false)               // Если ещё не было сообщения..
     {                                 // .. то сообщаем (1 раз)
      Alert("Время важных новостей. Закройте ордера.");
      Flag_Time=true;                  // Теперь сообщение уже было
     }
   return;                             // Выход из польз. функции
  }

//--------------------------------------------------------------- 4 --

 
r772ra:
Facile !!!


Merci. Mais avez-vous la moindre idée. Je n'ai besoin que d'une journée d'informations. Il s'agit d'afficher les informations sur les bénéfices du dernier jour ouvrable.

Les variables sont déclarées. Ça ne marche pas. Il n'y a que des zéros.

for (p=0; p<OrdersHistoryTotal(); p++) {

if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {

if (StrToTime(TimeToStr(TimeCurrent(), TIME_DATE))<OrderCloseTime() && (OrderType()==OP_BUY || OrderType()==OP_SELL) )

p0+=OrderProfit()+OrderCommission()+OrderSwap();

}

}

double r0=p0*100/AccountBalance();

 
Zolotai:


Merci. Mais, euh, tu peux me donner un indice ? Je n'ai besoin que d'une journée d'informations. C'est-à-dire pour afficher les informations sur les bénéfices du dernier jour ouvrable.

Les variables sont déclarées. Ça ne marche pas. C'est nul.

for (p=0; p<OrdersHistoryTotal(); p++) {

if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {

if (StrToTime(TimeToStr(TimeCurrent(), TIME_DATE))<OrderCloseTime() && (OrderType()==OP_BUY || OrderType()==OP_SELL) )

p0+=OrderProfit()+OrderCommission()+OrderSwap();

}

}

double r0=p0*100/AccountBalance();


Ce conseiller expert dispose de la bibliothèque MM_Light et de la fonction correspondante :

//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Автор : TarasBY, taras_bulba@tut.by                                              |
//+-----------------------------------------------------------------------------------+
//|        Считаем итоги работы по своим ордерам                                      |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
double fCalculate_Pribul (int fi_OP = -2,              // тип (BUY\SELL) учитываемых ордеров
                          datetime fdt_TimeBegin = 0,  // момент времени, с которого производим расчёт
                          string fs_Comment = "")      // комментарий ордеров
{
    double   ld_Pribul = 0.0;
    int      history_total = OrdersHistoryTotal();
//----
    for (int li_ORD = 0; li_ORD < history_total; li_ORD++)
    {
        if (!fCheck_MyOrders (li_ORD, fi_OP, MODE_HISTORY)) continue;
        if (fdt_TimeBegin > OrderCloseTime()) continue;
        if (fs_Comment != "") {if (StringFind (OrderComment(), fs_Comment) < 0) continue;}
        ld_Pribul += (OrderProfit() + OrderSwap() + OrderCommission());
    }
//----
    return (ld_Pribul);
}
Le principe est facile à comprendre. Pour calculer le profit/la perte pour le jour en cours, vous devez lui transmettre la valeur : fCalculate_Pribul (-2, iTime (Symbol(), PERIOD_D1, 0), "").
 
sannin:

Bonjour. Aidez-moi, s'il vous plaît.

J'ai besoin que tous les ordres soient fermés à 23 h 55 et le vendredi, la négociation se termine à 22 h. Il y a donc un problème avec la transaction.

j'ai trouvé dans le script du tutoriel dans la section temps l'aide s'il vous plaît ajouter le paramètre numéro du jour, c'est-à-dire vendredi les ordres ont été fermés à 21 55 et les jours normaux à 23 55 ou peut partager le lien s'il ya des solutions prêtes à l'emploi

//--------------------------------------------------------------- 4 --

Bien sûr, le code a été écrit à partir de rien, mais il devrait fonctionner, ou du moins vous devriez le comprendre.

int start() {
switch(DayOfWeek()){// если пятница,суббота, и т.д.
 case 4://пятница
 case 5://суббота на всякий случай
 case 6://воскресенье на всякий случай
             if((Hour()==22 && Minute()>=00) || Hour()>22){
                 //   Выполняем какое то действие  в пятницу после 22:00
             }
             break;
 case 0://понедельник
 case 1://вторник
 case 2://среда
 case 3://четверг
             if(Hour()>23 || (Hour()==23 && Minute()>55)){
                // все остальные действия в нормальные рабочии дни ПОСЛЕ 23:55
             }
              break;
  default:   {//все остальные действия в нормальные рабочии дни до 23:55
  
             }
 }                   
}
 
SetIndexStyle(1,DRAW_LINE,STYLE_DASH,0);
Où cette partie spécifie-t-elle l'épaisseur de la ligne? J'étais même gêné. :(
 
Link_x:
Où cette partie spécifie-t-elle l'épaisseur de la ligne ? J'étais même gêné. :(
Le dernier paramètre.
Raison: