[ARCHIVE]Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Je ne peux aller nulle part sans toi - 5. - page 409

 
Zhunko:
Lorsque vous ouvrez et mettez à jour le graphique, une demande de nouvelles données est envoyée au serveur. Certaines sociétés de courtage cupides préfèrent dépenser leur argent dans leur propre poche plutôt que dans des serveurs plus puissants et un canal plus large. Ils doivent limiter le nombre de requêtes provenant du terminal afin qu'un serveur faible ne soit pas "bloqué". MRC n'a que 2000 demandes par jour. C'est 10 fois moins que le nombre de leurs instruments multiplié par le nombre de TF, sans compter les demandes de transaction.
Eh bien, nous devons éviter de telles cuisines. C'est la première fois que j'entends des choses négatives sur MRC. Il reste à savoir si le terminal est le seul ou si les fonctions (à l'exception du trading) se réfèrent également au serveur. J'ai posé cette question au support (j'ai écrit à ce sujet plus haut, pas encore de réponse). Si ce n'est pas le seul, alors tout se met en place, et si ce n'est que le terminal, alors tout devient absurde ce type de terminal est en marche et il contactera le serveur pour mettre à jour les cotations, dépasser la limite sans négocier. Je pense que c'est inadéquat, et pourtant les fonctions, comme Viktor l'a dit, à l'exception du trading, n'accèdent pas au serveur.

Zhunko:

Les inclusions dans MQL4 aident à rationaliser le code. Par exemple, voici à quoi ressemble un indicateur pour 3000 lignes dans mon code.

Le fait est que j'ai vu des bibliothèques, et il est mentionné dans la documentation, que les inludes sont généralement placés tout en haut du code, là où les variables globales sont déclarées. S'il y a des fonctions dans les inludes, il semble étrange de penser qu'à un endroit où sont déclarées des variables globales, il y aura en fait une fonction à cet endroit, et alternativement, une sorte de variables. Ce n'est pas comme ça que le code est écrit. Si les variables utilisées dans le conseiller expert et les variables personnalisées externes sont déclarées en haut, personne ne met de fonctions à côté d'elles ! Mais ils placent des inludes avec des fonctions, et c'est considéré comme normal, d'après ce que je comprends. C'est ce qui me perturbe le plus ici.

Cela ne semble pas logique...

D'autre part, si un inline est placé, quelque part. à la place de plusieurs fonctions, qui sont responsables de l'obtention, disons, d'un signal de commerce pour un certain attribut, ce serait une chose logique et lisible.

Zhunko:

Malheureusement, le compilateur ne permet pas à une inclusion d'être utilisée plus d'une fois dans un module. Il s'agit généralement d'un moyen d'économiser sur le code répétitif.

C'est une petite chose. Après tout, l'essentiel est de placer les fonctions et les fragments de code les plus encombrants en dehors du code principal, et de les appeler via la fonction inline. Et ensuite vous pouvez appeler la fonction, que vous avez inlined, par le nom de la fonction... Et vous n'aurez pas à vous soucier de cette restriction.
 

Bon après-midi à tous.

Étude des fonctions MarketInfo ( ) et Print( )

Voici un code simple utilisant ces fonctions

Testeur, TF 60 min.

double T ;
int start()
{
 T = MarketInfo("EURUSD",MODE_HIGH); // в глобальную переменную Т запоминаем максимум дневной свечи,который должна возвращать  MarketInfo ( )
Print (" corresponds to ", T );           //
if ( T > iHigh( Symbol (), 0,10))  // если максимум текущей дневной свечи > High свечи N10(ТФ60 мин)
OrderSend(Symbol(),OP_SELL,0.1,Bid,1,0,0,"jfh",123 ); открыть ордер
}                                                                                                                       
return;

ПРОБЛЕМА 1.Ордер не открывается 2.Print() постоянно возвращает 0 ПРИМЕЧАНИЕ. Для открытия ордера - мне нужной сравнивать параметры свечей разных ТФ(60 мин и 1440 мин.) Подскажите пожалуйста как это можно сделать. Спасибо.

 
Integer:
La requête du graphique ressemble à la requête CopyRates ArrayCopySeries et non à la requête RefreshRates. CopyRates est la seule fonction non commerciale qui fait bouger le serveur.

Vérifié RefreshRates(). Si cet Expert Advisor est exécuté, par exemple, sur l'EURUSD, et qu'un autre outil dont la fenêtre n'a pas été ouverte depuis longtemps est inséré dans les paramètres (de sorte que l'historique ne soit pas là), l'historique apparaît.

extern string Tool           = "AUDNZD"; // Имя инструмента.
extern bool   IsRefreshRates = true;     // Флаг включения обновления таймсерий.
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
void start()
 {
  string sTool = Tool; // Имя инструмента.
  if (Tool == "") sTool = Symbol();
  while (!IsStopped())
   {
    if (IsRefreshRates) RefreshRates();
    string sComment = StringConcatenate("MarketInfo()\n",
                                        TimeToStr(MarketInfo(sTool, MODE_TIME), TIME_DATE|TIME_MINUTES|TIME_SECONDS), "\n",
                                        DoubleToStr(MarketInfo(sTool, MODE_BID), Digits), "  ", DoubleToStr(MarketInfo(sTool, MODE_ASK), Digits),
                                        "\n\nПредопределенные переменные\n",
                                        TimeToStr(Time[0], TIME_DATE|TIME_MINUTES|TIME_SECONDS), "\n",
                                        DoubleToStr(Bid, Digits), "  ", DoubleToStr(Ask, Digits),
                                        "\n\nМассивы-таймсерии\n");
    for (int i = 0; i < 10; i++)
     {
      sComment = sComment + StringConcatenate(TimeToStr(iTime(sTool, 0, i), TIME_DATE|TIME_MINUTES|TIME_SECONDS), "  ",
                                              DoubleToStr(iOpen(sTool, 0, i), Digits), "  ",
                                              DoubleToStr(iLow(sTool, 0, i), Digits), "  ",
                                              DoubleToStr(iHigh(sTool, 0, i), Digits), "  ",
                                              DoubleToStr(iClose(sTool, 0, i), Digits), "  ",
                                              DoubleToStr(iVolume(sTool, 0, i), 0), "\n");
     }
    Comment(sComment);
    Sleep(300);
   }
 }

Ainsi, RefreshRates() fait référence au serveur et télécharge l'historique. Par conséquent, il est nécessaire de contrôler l'arrivée de l'histoire.

Le support indique qu'aucune des fonctions ne fait directement référence au serveur. Tout se fait par le biais du terminal :-).

 
TarasBY:
Si vous utilisez GetProfitFromDateInCurrency() (original - ceci est IMPORTANT : je ne sais pas ce que vous avez pu obtenir dans votre version), alors la fonction doit être appelée comme ceci :

et la fonction renverra les bénéfices sur les ordres fermés depuis le début de la journée en cours.

Et vous pouvez attraper toutes les choses stupides dans le code en utilisant Print().


ça ne marche pas. Il montre tous les bénéfices disponibles sur les transactions pour l'ensemble de l'historique.

Voici la fonction originale, dans laquelle je n'ai rien changé, bien sûr.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает суммарный профит в валюте депозита                  |
//|             закрытых с определённой даты позиций                           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента             (""   - любой символ,         |
//|                                               NULL - текущий символ)       |
//|    op - операция                             (-1   - любая позиция)        |
//|    mn - MagicNumber                          (-1   - любой магик)          |
//|    dt - Дата и время в секундах с 1970 года  ( 0   - с начала истории)     |
//+----------------------------------------------------------------------------+
double GetProfitFromDateInCurrency(string sy="", int op=-1, int mn=-1, datetime dt=0)
{
  double p=0;
  int    i, k=OrdersHistoryTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (mn<0 || OrderMagicNumber()==mn) {
            if (dt<OrderCloseTime()) {
              p+=OrderProfit()+OrderCommission()+OrderSwap();
            }
          }
        }
      }
    }
  }
  return(p);
}

voici son appel et son impression

GetProfitFromDateInCurrency (Symbol(), -1, -1, iTime (NULL, PERIOD_D1, 0));  
Print(   GetProfitFromDateInCurrency () );
 
Zhunko:

Vérifié RefreshRates(). Si cet Expert Advisor est exécuté, par exemple, sur l'EURUSD, et qu'un autre outil dont la fenêtre n'a pas été ouverte depuis longtemps est inséré dans les paramètres (de sorte que l'historique ne soit pas là), l'historique apparaît.

Ainsi, toujours RefreshRates() fait référence au serveur et remplit l'historique. Par conséquent, il est nécessaire de contrôler l'arrivée de l'histoire.

Le support indique qu'aucune des fonctions ne fait directement référence au serveur. Donc, tout se fait par le terminal :-)


Vadim, j'ai exécuté votre script sur un terminal sur lequel je n'ai jamais ouvert d'instruments à part les majors et les crosses avec le yen. Bref, voici une capture d'écran :

Rien n'est pompé car le tableau des données du marché est vide, à en juger par les commentaires...

 
hoz:


Vadim, j'ai exécuté votre script sur un terminal sur lequel je n'ai jamais ouvert d'instruments à part les majors et les crosses avec le yen. Bref, voici une capture d'écran :

Rien n'est pompé, car le tableau des données du marché est vide, à en juger par les commentaires...


Oui. Il n'a pas non plus remarqué qu'il a MarketInfo() dans son Expert Advisor et pas seulement RefreshRates().
 
Zhunko:

Vérifié RefreshRates(). Si cet Expert Advisor est exécuté, par exemple, sur l'EURUSD, et qu'un autre outil dont la fenêtre n'a pas été ouverte depuis longtemps est inséré dans les paramètres (de sorte que l'historique ne soit pas là), l'historique apparaît.

Ainsi, toujours RefreshRates() fait référence au serveur et remplit l'historique. Par conséquent, il est nécessaire de contrôler l'arrivée de l'histoire.

Le support indique qu'aucune des fonctions ne fait directement référence au serveur. Donc, tout se fait par le terminal :-)


Le niveau d'imagination est impressionnant. Pourquoi les données n'apparaissent-elles que pour certains symboles (qui n'ont pas été ouverts), et pas pour tous dans la revue de marché ? Comment la fonction RefreshRates() a-t-elle su que certains symboles devaient être mis à jour et d'autres non ?

Junko, arrête de divaguer.

 
lottamer:


ne fonctionne pas. Produit tous les profits disponibles sur les transactions dans l'ensemble de l'historique.

Voici la fonction originale et je n'y ai rien changé, bien sûr.

Voici son appel et son impression

GetProfitFromDateInCurrency (Symbol(), -1, -1, iTime (NULL, PERIOD_D1, 0));  
Print(   GetProfitFromDateInCurrency () );

Donc tout est correct. Vous "lisez" la fonction ligne par ligne et comprenez comment elle fonctionne, si vous êtes trop ennuyé pour l'écrire vous-même, et tout se met en place...

Vous avez un paramètre de fonction :

iTime (NULL, PERIOD_D1, 0)

est l'heure d'ouverture de la dernière barre du jour, c'est-à-dire que toutes les positions qui sont fermées avant l'ouverture de la barre du jour actuel seront calculées et additionnées ! Est-ce que ça a un sens ? Donc, fixez une autre barre, qui est requise ou autre. Mais vous devez voir par vous-même.

 
Integer:

Oui. Il n'a pas non plus remarqué qu'il a MarketInfo() dans son Expert Advisor, et pas seulement RefreshRates().


Ainsi que toutes les fonctions :


DoubleToStr(iOpen(sTool, 0, i), Digits), ",
DoubleToStr(iLow(sTool, 0, i), Digits), ",
DoubleToStr(iHigh(sTool, 0, i), Chiffres), " ",
DoubleToStr(iClose(sTool, 0, i), Chiffres), ",
DoubleToStr(iVolume(sTool, 0, i), 0), "\n") ;

Naturellement, les données seront mises à jour.

 
Integer:


Je suis impressionné par le niveau de fantaisie. Pourquoi les données ne sont disponibles que pour certains personnages (qui n'ont pas été ouverts), et pas pour tous dans la revue de marché ? Comment la fonction RefreshRates() a-t-elle su que certains symboles devaient être mis à jour et d'autres non ?

Junko, arrête de délirer.


Dmitry, ne nous disputons pas entre nous. Il vaut mieux s'entraider, car vous et Vadim avez eu tellement de désaccords ces derniers temps. Je me suis ennuyé dans mes pensées pendant quelques jours, je n'ai pas visité le fil de discussion, et puis, comme d'habitude, je suis allé tout regarder. Pour être honnête, c'était drôle à lire, vraiment drôle ! Il y a une telle escarmouche, et de telles discussions et congrès que je me demande juste :) Des phrases et des mots parfois abscons, mais en fait complètement absurdes. Je ne jugerai personne, bien que je sois loin d'être un penseur avancé, moi-même devant encore apprendre à apprendre (dans certains endroits à nager), puis comprendre et voir clairement que le débat a atteint l'absurdité totale.

Il semble que ce soit un rassemblement de pros, sinon je ne le dirai pas. Je ne peux pas en dire autrement de vous, car je vois que chacun comprend ce qu'il fait. Mais ce qui est intéressant, c'est que les pros ont parfois de telles réactions excessives lorsqu'ils ne veulent pas admettre leurs erreurs. Mais nous apprenons de nos erreurs ! Il n'y a pas de quoi avoir honte. Ainsi, si quelqu'un a commis une erreur, il n'est pas nécessaire de s'écarter du sujet, mais plutôt d'avouer. Pour des dizaines de pages de déchets de programmeurs se transformant en personnalités, ce n'est en quelque sorte pas une option. Le but d'au moins cette branche ou ce forum n'est pas de se chier dessus de la tête aux pieds, mais de s'améliorer en programmation et de partager nos réflexions sur le sujet. Alors, vivons ensemble. Assez de chamailleries.