[Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas votre chemin. Je ne peux aller nulle part sans toi. - page 935

 

Bonjour, je suis intéressé par cette question. Est-ce qu'Alpari fournit un serveur où vous pouvez télécharger votre conseiller pour qu'il puisse travailler 24 heures sur 24? Auriez-vous l'amabilité de me répondre en personne ?

 
gheka:

Ça ne marche pas, peut-être que je dois changer quelque chose ici ou le mettre après le début.

J'ai essayé de traduire votre code sur papier en russe que je comprends, mais ça ne marche pas,

c'est trop compliqué, surtout quand les conditions de chaque condition se suivent, et une condition sur huit.

Bien sûr, je ne dis pas que celui qui a créé ce code est un miracle, mais pour moi, c'est une perversion complète (dans le bon sens du terme).

Je n'ai pas la flemme d'ajouter des commentaires à chaque opération et condition, sauf pour la fonction standard.


Il y a quelques redondances dans le code, mais le code est lisible.

 
question sur le changement de période dans le programme ... par exemple, il y a une certaine séquence d'opérateurs qui doit être appliquée à différentes périodes ... si je comprends bien, il est plus facile de faire cela sous la forme d'un cicle ... en changeant la période... Je trouve une fonction dans la documentation qui renvoie la valeur de la période ... mais je ne trouve pas de fonction pour la modifier ... qu'est-ce que je fais mal ?
 

Quelque chose ne fonctionne pas pour vous, pas ce code... :)

bool isCloseLastPosByStop(string sy="", int op=-1, int mn=-1) {// Объявление функции. Передаваемые параметры: sy = символ, op - тип, mn - магик
  datetime t;                                                  // Переменная содержит время закрытия ордера
  double   ocp, osl;                                           // ocp - цена закрытия позиции, osl - цена СтопЛосс закрытой позиции
  int      dg, i, j=-1, k=OrdersHistoryTotal();                // k содержит общее количество ордеров в истории

  if (sy=="0") sy=Symbol();                                 // Если в ф-цию передан sy равный 0 или NULL, то использовать символ графика
  for (i=0; i<k; i++) {                                     // Цикл по массиву закрытых ордеров
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {      // Если выбран ордер из массива закрытых ордеров, ...
      if (OrderSymbol()==sy || sy=="") {                    // ... если его символ совпадает с нашим, ...
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {  // ... если его тип Бай или Селл, ...
          if (op<0 || OrderType()==op) {                // ... если тип ордера равен или -1 (имеется ввиду любой) или равен переданному в ф-цию, ...
            if (mn<0 || OrderMagicNumber()==mn) {       // ... если его магик или любой (-1) или равен переданному в ф-цию (магику советника), ...
              if (t<OrderCloseTime()) {    // ... если переменная t содержит время закрытия меньше, чем время закрытия выбранного ордера, то ...
                t=OrderCloseTime();        // ... то присвоим переменной t время закрытия выбранного ордера (этот ордер закрыт позже предыдущего)
                j=i;                                        // Запишем в переменную j индекс найденного ордера с максимальным временем закрытия
              }
            }
          }
        }
      }
    }
  }                                                       // По окончании цикла в переменной j находится индекс последнего закрытого ордера
  if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {      // Выберем его по индексу
    dg=MarketInfo(sy, MODE_DIGITS);                       // Количество цифр после десятичного точки в цене инструмента, заданного переменной sy
    if (dg==0) if (StringFind(OrderSymbol(), "JPY")<0) dg=4; else dg=2; // Честно... точно не скажу, но вижу, что корректировка под йену
    ocp=NormalizeDouble(OrderClosePrice(), dg);           // Нормализуем цену закрытия ордера для дальнейшего сравнения с ценой СтопЛосс
    osl=NormalizeDouble(OrderStopLoss(), dg);             // Нормализуем цену СтопЛосс ордера для сравнения с ценой закрытия
    if (ocp==osl) return(True);                           // Если эти цены равны, значит поза закрыта по стопу, возвращаем значение "Истина"
  }
  return(False);                                          // Возвращаем "Ложь"
}

C'est toute la logique... Viktor avait raison - c'est redondant, mais aussi simple que possible... :)

 
Skopcheny:
question sur la modification de la période dans le programme ... par exemple, il y a une certaine séquence d'opérateurs qui devrait être appliquée à différentes périodes ... si je comprends bien, il est plus facile de le faire sous la forme d'une ligne de temps ... en changeant la période... Je trouve une fonction dans la documentation qui renvoie une valeur de période... mais je ne trouve pas de fonction pour la modifier... qu'est-ce que je fais de travers ?

La période du graphique peut être l'une des valeurs suivantes :

Constant Valeur Description
PERIOD_M1 1 1 minute
PERIOD_M5 5 5 minutes
PERIOD_M15 15 15 minutes
PERIODE_M30 30 30 minutes
PERIOD_H1 60 1 heure
PERIOD_H4 240 4 heures
PERIOD_D1 1440 1 jour
PERIODE_W1 10080 1 semaine
PERIOD_MN1 43200 1 mois
0 (zéro) 0 Période du graphique actuel
 
Merci beaucoup, j'ai juste besoin de quelques éclaircissements ... pour qu'un groupe d'opérateurs travaille sur une certaine période, suffit-il de spécifier devant eux une des périodes telles qu'elles sont présentées dans ce tableau ?
 
Skopcheny:
Merci beaucoup, j'ai juste besoin de quelques éclaircissements ... pour qu'un groupe d'opérateurs travaille sur une certaine période, suffit-il de spécifier devant eux une des périodes telles qu'elles sont présentées dans ce tableau ?
Pour répondre correctement à votre question, vous devez voir au moins un exemple de code où vous devez spécifier la période...
 
artmedia70:
Pour donner une réponse correcte à votre question, vous devez voir au moins un exemple de code où vous devez spécifiquement définir la période...


string trend()
{int count,count_change ;
double bar_centr ;
string trend ;
bool clear ;
for (int i=10;i !=0;i--)
{
bar_centr = (High[i]-Low[i])/2+Low[i]) ;
if (bar_centr>((High[i+1]-Low[i+1])/2+Low[i+1])
count++ ;

if (bar_centr<((High[i+1]-Low[i+1])/2+Low[i+1])
count-- ;
}

Print (count, "period ",Period()) ;


if (count>3) trend="buy" ;
if (count<-3) trend="sell" ;
if (count<3||count>-3) trend="uncertain" ;





return(trend);}

cette fonction doit être appliquée successivement à différentes périodes ... Il fonctionne si je le connecte à Windows dans le terminal avec des délais différents ... La question est de savoir s'il est possible pour EA de gérer plusieurs périodes différentes ...

 
Skopcheny:


cette fonction doit être appliquée successivement à différentes périodes ... Cela fonctionne si je connecte l'EA à des fenêtres dans le terminal avec des périodes différentes ... La question est de savoir s'il est possible pour EA de gérer plusieurs périodes différentes ...

Je comprends que vous voulez que votre fonction fonctionne non seulement avec le graphique et la période en cours, mais aussi avec n'importe quelle période qui lui est passée ...

string trend(string sy="", int tf=0)
{
   int count,count_change;
   double bar_centr;
   string trend;
   bool clear;

   if (sy=="" || sy=="0") sy=Symbol();      
   if (tf==0) tf=Period();
   
   for (int i=10; i>0; i--)
      {
         bar_centr = (iHigh(sy,tf,i)-iLow(sy,tf,i))/2+iLow(sy,tf,i);
         if (bar_centr>((iHigh(sy,tf,i+1)-iLow(sy,tf,i+1))/2+iLow(sy,tf,i+1)))
            count++;
         if (bar_centr<((iHigh(sy,tf,i+1)-iLow(sy,tf,i+1))/2+iLow(sy,tfi+1)))
            count--;
      }

   Print (count,"период ",tf);

   if (count>3) trend="покупка";
   if (count<-3) trend="продажа";
   if (count<3||count>-3) trend="неопределенность";

   return(trend);
}

Maintenant, appelez votre fonction comme ceci

trend(Symbol(), Period()) ; // Il retournera les valeurs pour le graphique et la période dans lesquels l'EA plane...

trend(USDJPY, PERIOD_D1) ; // Il retourne les valeurs pour le symbole USDJPY et la période de "1 jour".

Au lieu de PERIOD_D1 vous pouvez entrer 1440 - cela donnera le même résultat...

Si elle est appelée sans paramètres, la fonction renvoie les valeurs pour le symbole et la période en cours (elles sont définies par défaut)

 
artmedia70:

Je comprends que vous voulez que la fonction fonctionne non seulement avec le graphique et la période en cours, mais aussi avec tout graphique qui lui est passé...

Maintenant, appelez votre fonction comme ceci :

trend(Symbol(), Period()) ; // Il retournera les valeurs pour le graphique et la période dans lesquels l'EA plane...

trend(USDJPY, PERIOD_D1) ; // Il retourne les valeurs pour le symbole USDJPY et la période de "1 jour".

Au lieu de PERIOD_D1 vous pouvez entrer 1440 - c'est la même chose...




réponse complète... Merci beaucoup ...