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

 

C'est mon idée :

J'ouvre un ordre, et ensuite ça dépend de la balance dans laquelle il a été clôturé.

Si le solde est inférieur à zéro, nous enregistrons la perte, et s'il est supérieur à zéro, nous reprenons le travail depuis le début.

Si notre perte est inférieure à zéro, nous l'avons fixée et affectée à une variable, par exemple : Moins

Moins = OrderProfit (- 45 cents) ;

CompteAqviti + Moins + ma valeur (ma conscience)

plus loin sur la prochaine commande

si le profit de cet ordre est supérieur à AccountAqviti + Minus + ma valeur (ma conscience), alors nous fermons l'ordre ; sinon, il est supérieur à zéro, alors nous le fixons :

(AccountAqviti + OrderProfit) - (AccountAqviti + Minus + ma valeur (ma conscience)) = Moins

si Minus >= 0, alors Minus = 0 ;

 
belck:

C'est là tout le sens de mon idée :


Vous devez vous rendre à Service Work avec une idée, et ici il est d'usage de traiter des situations spécifiques avec un code spécifique.
 

Bonjour ! Je voudrais créer un indicateur qui affiche un canal sur des indicateurs comme MASD, AO et similaires. Cet indicateur est superposé à la fenêtre des indicateurs de base (MASD, AO et similaires) et est dessiné comme des lignes parallèles au-dessus et au-dessous de 0. Ces lignes sont définies comme une moyenne des pics maximums (supérieurs à 0) et des creux minimums (inférieurs à 0) pour la période spécifiée.
J'essaie d'utiliser l'indicateur AO comme exemple mais il ne fonctionne pas.
Algorithme :
nous écrivons les lectures de l'indicateur dans un tableau,
nous parcourons ce tableau à la recherche de pics / creux,
nous les écrivons dans certains tableaux,
nous trouvons la valeur moyenne des pics, puis des creux,
nous assignons la valeur obtenue au tampon de l'indicateur.
A cette étape, ce n'est pas le canal (collant à 0) de l'indicateur qui est défini dans le code, mais la valeur moyenne des pics maximums et la valeur moyenne des creux minimums.
La définition des pics et des creux peut être retirée du code et exécutée comme une fonction, mais pour l'instant je l'ai laissée ainsi - cela ne change rien à l'affaire.
Problèmes :
1. Le terminal se bloque (considérablement)
2. Les lignes ne sont pas affichées comme une moyenne ; elles apparaissent comme max/min pour une période.
J'ai mis du temps à comprendre, mais je n'arrive pas à trouver la cause des problèmes. Pouvez-vous m'aider à corriger mon code ou me donner un lien vers le code source de problèmes similaires et j'essaierai de le corriger davantage. Merci d'avance.

int start(){
    int limit=Bars-IndicatorCounted();
    for(int i=limit;i>=0;i--){
//     if (IsNewBar()){
       int j=0;
       for (int d=2;d<=period-1;d++){         
             ArrayResize(AO,j+1); 
             AO[j]=AO(d);                            // Запишем данные инд. в цикле в массив
             Print("АО-",AO[j],"-",d,"-",i);
             j++;
       }             
       int k_up=0,k_dw=0; double SDw=0,SUp=0,P1=0,P2=0;      
       //собираем экстремумы выше 0
       for (int p=4;p<=period-1; p++){          
         if (AO[p]>AO[p+1] && AO[p]>AO[p-1] 
            && AO[p+1]>AO[p+2]
            && AO[p+2]>AO[p+3]
            && AO[p+3]>0
            && AO[p-1]>AO[p-2]
            && AO[p-2]>AO[p-3]
            && AO[p-3]>0){                           // Нашли макс
            ArrayResize(Up, k_up+1);                 // Размер массива донышек под кол-во найденных донышек
            Up[k_up]=AO(p);                          // Заносим значение пика в массив                 
            Print("значение пика-",Up[k_up],"-",p);           
            SUp=SUp+Up[k_up];
            P1=SUp/(k_up+1);            
            k_up++;                                  // Увеличиваем индекс массива донышек                                 
         }
         //собираем впадины ниже 0
         if (AO[p]<AO[p+1] && AO[p]<AO[p-1] 
            && AO[p+1]<AO[p+2]
            && AO[p+2]<AO[p+3]
            && AO[p+3]<0
            && AO[p-1]<AO[p-2]
            && AO[p-2]<AO[p-3]
            && AO[p-3]<0){                           // Нашли мин
            ArrayResize(Dw, k_dw+1);                 // Размер массива донышек под кол-во найденных донышек
            Dw[k_dw]=AO[p];                          // Заносим значение пика в массив                                            
            Print("значение донышка-",Dw[k_dw],"-",p);                                           
            SDw=SDw+Dw[k_dw];
            P2=SDw/(k_dw+1);           
            k_dw++;// Увеличиваем индекс массива донышек   
         }         
       }
       level1[i]=P1;
       level2[i]=P2;
    }
    return(0);
}
//+------------------------------------------------------------------+
double AO(int a){double AO=iAO( NULL, 0, a);
     return(AO);
}
 
merci ! très utile !
 
LOA:

Bonjour !
Problèmes :

1. le terminal se bloque (de manière significative)

for (int d=2;d<=period-1;d++){         
             ArrayResize(AO,j+1); 


Augmenter la taille d'un tableau dans une boucle est cruel, c'est pour cela qu'il se bloque. Augmentez la taille en une seule fois. Ou utiliser les séries temporelles en une seule fois


P.S. voir les messages personnels

 

Comment boucler une variable de type chaîne de caractères?

Exemple

   double A[3];
   A[0]=iClose("EURUSD",0,0);
   A[1]=iClose("GBPUSD",0,0);
   A[2]=iClose("AUDUSD",0,0);
Comment remplacer cette construction par une boucle ?
 
Bonjour, pourriez-vous me dire comment écrire une condition selon laquelle, si le profit d'un ordre ouvert est d'un pungent, alors cet ordre est fermé ?
 
first_may:
Bonjour, pourriez-vous me dire comment écrire une condition selon laquelle, si le profit d'un ordre ouvert est d'un pungent, alors cet ordre est fermé ?

Utilisation de la fonction.

https://www.mql5.com/ru/forum/131859/page3#434225

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

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (mn<0 || OrderMagicNumber()==mn) {
          p=MarketInfo(OrderSymbol(), MODE_POINT);
          if (p==0) if (StringFind(OrderSymbol(), "JPY")<0) p=0.0001; else p=0.01;
          if (OrderType()==OP_BUY) {
            pr+=(MarketInfo(OrderSymbol(), MODE_BID)-OrderOpenPrice())/p;
          }
          if (OrderType()==OP_SELL) {
            pr+=(OrderOpenPrice()-MarketInfo(OrderSymbol(), MODE_ASK))/p;
          }
        }
      }
    }
  }
  return(pr);
}
 
Rorschach:

Comment boucler une variable de type chaîne de caractères ?

Exemple

Comment remplacer cette construction par une boucle ?

   string asSymbols[3] = {"EURUSD", "GBPUSD", "AUDUSD"};
   double A[3] = {0};
   for (int i = 0; i < ArraySize( sSymbols) && i < ArraySize( A); i++) A[i]= iClose(asSymbols[i], 0, 0);
 
Zhunko:



Merci.