[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 424

 
gyfto:

Non, je parle de ObjectCreate(), vous devez définir le numéro de la fenêtre à cet endroit. Je vous ai montré comment le définir s'il s'agit d'une sous-fenêtre (c'est-à-dire pas zéro, qui est la fenêtre principale).

Vous avez donc le paramètre de fonction WindowOnDropped lors de la création d'un objet, et c'est déjà en quelque sorte la fenêtre principale de manière relative. Ou la fenêtre principale est-elle lafenêtre la plus à gauche dans le terminal ?
 

Bonjour, je n'arrive pas à comprendre pourquoi les ordres d'achat stop ne sont pas supprimés.

extern double Lots       =0.01;
extern int    Magic      =333;

extern int    StopLoss      = 100;      // Размер фиксированного стопа
extern int    TakeProfit    = 100;       // Размер фиксированного тэйка
extern int    DistanceSet   = 160;      // Расстояние от рынка
extern int    Slippage      = 3;       // Проскальзывание цены
color  clOpenBuy     = LightBlue;    // Цвет ордера BuyStop
color  clOpenSell    = LightCoral;   // Цвет ордера SellStop
string Name_Expert   = "Scalp";

string Symb;
bool Work=true;

extern bool   UseSound       = True;  // Использовать звуковой сигнал
extern string NameFileSound  = "expert.wav";  // Наименование звукового файла
//============================================================================================
int start()
  {
   int
   Total,
   Tip=-1,
   Ticket,
   TicketB,
   TicketS,
   TicketMB,
   TicketMS,
   buys,
   sells,
   mbuys,
   msells;
   double
   OP_PriceSell,
   OP_PriceBuy, 
   Lot,
   Lts,
   Min_Lot,
   Max_Lot,
   Step,
   Free,
   One_Lot,
   Price,
   SL,
   TP,
   TP1,
   PriceB,
   PriceS,
   SLB,
   SLS;
   bool
   Ans  =false,
   Opn_B=false,
   Opn_S=false,
   Cls_B=false,
   Cls_S=false;
//============================================================================================
   // Учёт ордеров
   Symb=Symbol();
   Total=0;
   buys=0;
   sells=0;
   mbuys=0;
   msells=0;                                    
   for(int i=1; i<=OrdersTotal(); i++)
     {
      if (OrderSelect(i-1,SELECT_BY_POS)==true)
        {
         Total++;
         if(OrderType()==OP_BUYSTOP)  buys++;
         if(OrderType()==OP_SELLSTOP) sells++;
         if(OrderType()==OP_BUY)  mbuys++;
         if(OrderType()==OP_SELL) msells++;
         if(OrderType()==OP_BUYSTOP) TicketB=OrderTicket();
         if(OrderType()==OP_SELLSTOP) TicketS=OrderTicket(); 
         Ticket=OrderTicket();
         Tip   =OrderType();
         TP    =OrderTakeProfit();
         Lot   =OrderLots();
        }
     }
//============================================================================================
   // Открытие ордеров
   while(true)                                  
     {
      if (Total==0)            
        {                                      
         star();
        }
      break;                                   
     }
//============================================================================================
  while(true)
     {
      if(Total==2)
        {
         if(msells==1)
           {
            if(buys==1)
              {
               if(OrderType()==OP_BUYSTOP && OrderLots()==Lots)
                 {
                  OrderDelete(Ticket);
                 }
              }
           }
        }
      if(Total==2)
        {
         if(mbuys==1)
           {
            if(sells==1)
              {
               if(OrderType()==OP_SELLSTOP && OrderLots()==Lots)
                 {
                  OrderDelete(Ticket);
                 }
              }
           }
        }
      break;
     }  
//============================================================================================
   return;
  }
//============================================================================================
//+------------------------------------------------------------------+
void star() {
  double ldStop=0, ldTake=0;
  double pAsk=Ask+DistanceSet*Point;
  double pBid=Bid-DistanceSet*Point;

  if (StopLoss!=0) ldStop=pAsk-StopLoss*Point;
  if (TakeProfit!=0) ldTake=pAsk+TakeProfit*Point;
  SetOrder(OP_BUYSTOP, pAsk, ldStop, ldTake);

  if (StopLoss!=0) ldStop=pBid+StopLoss*Point;
  if (TakeProfit!=0) ldTake=pBid-TakeProfit*Point;
  SetOrder(OP_SELLSTOP, pBid, ldStop, ldTake);
}

//+------------------------------------------------------------------+
//| Установка ордера                                                 |
//| Параметры:                                                       |
//|   op     - операция                                              |
//|   pp     - цена                                                  |
//|   ldStop - уровень стоп                                          |
//|   ldTake - уровень тейк                                          |
//+------------------------------------------------------------------+
void SetOrder(int op, double pp, double ldStop, double ldTake) {
  color  clOpen;
  string lsComm=GetCommentForOrder();

  if (op==OP_BUYSTOP) clOpen=clOpenBuy;
  else clOpen=clOpenSell;
  OrderSend(Symbol(),op,Lots,pp,Slippage,ldStop,ldTake,lsComm,0,0,clOpen);
  if (UseSound) PlaySound(NameFileSound);
}

//+------------------------------------------------------------------+
//| Генерирует и возвращает строку коментария для ордера или позиции |
//+------------------------------------------------------------------+
string GetCommentForOrder() {
  return(Name_Expert+" "+GetNameTF(Period()));
}

//+------------------------------------------------------------------+
//| Возвращает наименование таймфрейма                               |
//+------------------------------------------------------------------+
string GetNameTF(int TimeFrame) {
        switch (TimeFrame) {
                case PERIOD_MN1: return("Monthly");
                case PERIOD_W1:  return("Weekly");
                case PERIOD_D1:  return("Daily");
                case PERIOD_H4:  return("H4");
                case PERIOD_H1:  return("H1");
                case PERIOD_M30: return("M30");
                case PERIOD_M15: return("M15");
                case PERIOD_M5:  return("M5");
                case PERIOD_M1:  return("M1");
                default:                     return("UnknownPeriod");
        }
}
//+------------------------------------------------------------------+
 
hoz:

Dans ce cas, pourquoi la documentation indique-t-elle que
le nombre de tampons ne peut pas dépasser 8
? C'est là que les choses ne sont pas claires. Il ne dit pas le nombre de tampons principaux... pas tous les tampons. Ça dit le nombre de tampons et c'est tout. Je le lis donc et il est censé s'appliquer au nombre total de tampons d'un indicateur donné.

Je ne parle pas des tampons indicateurs, je parle des tampons indicateurs simulés. Et là ArrayResize(CustomBuffer, Bars) dans le wrapper de IndicatorCounted(), et les extrémités des lignes de tendance les plus à droite devraient être redessinées par Bid.

hoz:

Vous avez donc un paramètre de fonction lors de la création d'un objet - WindowOnDropped, et c'est déjà en quelque sorte la fenêtre principale de manière relative. Ou bien la fenêtre principale est-elle la plus à gaucheparmi les fenêtres du terminal ?
Non, j'étais confus au début, aussi. Par exemple, nous avons deux graphiques ouverts, euron et gold. Donc, ils ont tous deux un indice de zéro. Mais si elles ont des sous-fenêtres, elles sont numérotées à partir d'une seule. Par exemple, j'ai lancé trois indices sur le graphique eurenne, deux sur l'or, et les cinq avec #property separate_window et toutes les sous-fenêtres différentes. Alors eurene aura les numéros de fenêtre 0, 1, 2, 3 et gold 0, 1, 2.
 

J'ai une question. Mon cerveau est en ébullition, honnêtement. Si vous pouvez - aidez-moi.

int n=1, limit=3;
double result;//или int result, что не столь сейчас важно
double temp[];
int start(){
        for(int slow=10; slow<=10*limit; slow++){
                for(int fast=10; fast<=slow; fast++){
                        for(int period=1; period<=slow/10; period++){
                                n++; Print(n-1, ": ", slow-9, ", ", fast-9, ", ", period);
                                //здесь идёт тестирование машки с параметрами slow, fast, period, а результаты тестирования заносим в массив:
                                ArrayResize(temp,n); temp[n-1]=result;
                        }
                }
        }
        //и находим максимальный результат:
        int max=ArrayMaximum(temp);
   return(0);
}

Maintenant une question : comment puis-je restaurer les valeurs slow, fast, period par max (qui est la position d'un élément dans le tableau) ? L'ordre dans lequel les valeurs sont placées dans temp[] est donné dans Print(). J'ai mis 3 dans la limite, mais n'importe quel nombre peut être utilisé ici. Voici les 77 premières valeurs (limite=2) :

            10: 4, 4, 1  20: 6, 5, 1  30: 8, 2, 1  40: 9, 4, 1   50: 10, 5, 1   60: 11, 3, 1  70: 11, 8, 1
1: 1, 1, 1  11: 5, 1, 1  21: 6, 6, 1  31: 8, 3, 1  41: 9, 5, 1   51: 10, 6, 1   61: 11, 3, 2  71: 11, 8, 2
2: 2, 1, 1  12: 5, 2, 1  22: 7, 1, 1  32: 8, 4, 1  42: 9, 6, 1   52: 10, 7, 1   62: 11, 4, 1  72: 11, 9, 1
3: 2, 2, 1  13: 5, 3, 1  23: 7, 2, 1  33: 8, 5, 1  43: 9, 7, 1   53: 10, 8, 1   63: 11, 4, 2  73: 11, 9, 2
4: 3, 1, 1  14: 5, 4, 1  24: 7, 3, 1  34: 8, 6, 1  44: 9, 8, 1   54: 10, 9, 1   64: 11, 5, 1  74: 11, 10, 1
5: 3, 2, 1  15: 5, 5, 1  25: 7, 4, 1  35: 8, 7, 1  45: 9, 9, 1   55: 10, 10, 1  65: 11, 5, 2  75: 11, 10, 2
6: 3, 3, 1  16: 6, 1, 1  26: 7, 5, 1  36: 8, 8, 1  46: 10, 1, 1  56: 11, 1, 1   66: 11, 6, 1  76: 11, 11, 1
7: 4, 1, 1  17: 6, 2, 1  27: 7, 6, 1  37: 9, 1, 1  47: 10, 2, 1  57: 11, 1, 2   67: 11, 6, 2  77: 11, 11, 2
8: 4, 2, 1  18: 6, 3, 1  28: 7, 7, 1  38: 9, 2, 1  48: 10, 3, 1  58: 11, 2, 1   68: 11, 7, 1
9: 4, 3, 1  19: 6, 4, 1  29: 8, 1, 1  39: 9, 3, 1  49: 10, 4, 1  59: 11, 2, 2   69: 11, 7, 2
 
gyfto:

J'ai une question. Mon cerveau est en ébullition, honnêtement. Si vous pouvez - aidez-moi.

Maintenant une question : comment puis-je restaurer les valeurs slow, fast, period par max (qui est la position d'un élément dans le tableau) ? L'ordre dans lequel les valeurs sont placées dans temp[] est donné par Print(). J'ai mis 3 dans la limite, mais cela peut être n'importe quel nombre.


Où "n++" vérifie si le résultat est maximal, s'il est maximal, mémorise les valeurs de lent, rapide, etc.
 
Vous pourriez faire trois tableaux supplémentaires (ou un tableau tridimensionnel) pour la lenteur, la rapidité... C'est mieux ainsi, car au cas où vous voudriez trier les résultats d'une manière ou d'une autre, il y aura toujours des paramètres de test disponibles.
 
Si ces actions sont fréquentes, par exemple une fois par barre ou 10 barres, il est préférable de mettre à l'échelle des tableaux pour les résultats et trois tableaux avec les valeurs des paramètres dans l'initem, de faire défiler ces boucles, de remplir les tableaux avec les valeurs des périodes. Puis faites défiler le tout en une seule boucle. Nous pourrons alors utiliser la fonction ArrayMaximum, et faire le tri. Cela rendra le travail aussi rapide que possible.
 
gyfto:

Non, j'étais confus au début aussi. Par exemple, nous avons deux graphiques ouverts, l'euro et l'or. Donc, ils ont tous deux un indice de zéro. Mais si elles ont des sous-fenêtres, elles sont numérotées à partir d'une seule. Par exemple, j'ai lancé trois indices sur le graphique eurenne, deux sur l'or, et les cinq avec #property separate_window et toutes les sous-fenêtres différentes. Alors l'eurene aurait les numéros de fenêtre 0, 1, 2, 3 et l'or aurait 0, 1, 2.

Exactement ! Je ne travaille pas du tout avec les dindes, donc je n'ai pas fait attention quand j'ai étudié l'aide. Tout a un sens.

gyfto:

Je ne parle pas de tampons indicateurs, je parle de tampons indicateurs simulés. Il y a ArrayResize(CustomBuffer, Bars) dans le wrapper de IndicatorCounted(), et les extrémités des lignes de tendance les plus à droite devraient être redessinées par Bid.

Et je demandais spécifiquement comment dessiner plus de 6 lignes sur un graphique. Dans quelle fenêtre (0 ou autre, cela n'a pas d'importance). C'est ce qui m'intéresse le plus et c'est ce que je vous ai demandé en premier lieu.
 
Integer:

Où "n++" permet de vérifier le maximum du résultat, s'il est maximum, mémoriser les valeurs de lent, rapide, etc.

Je n'y ai pas pensé.


Integer:
Vous pouvez créer trois autres tableaux (ou un tableau tridimensionnel) pour la lenteur, la rapidité... C'est mieux, car au cas où vous voudriez trier les résultats d'une manière ou d'une autre, il y aura toujours des paramètres de test disponibles.

L'idéal est d'avoir un tableau tridimensionnel, mais ArrayMaximum() ne fonctionne qu'en une seule dimension. Vous devrez donc faire converger le tableau vers un tableau linéaire, et vous devrez à nouveau déterminer où se trouve chaque élément. Mais j'ai fastMax=slow, et c'est là le problème. Mais trois tableaux différents... J'ai le même résultat, donc c'est soit un tridimensionnel, soit un linéaire.


Entier:
tableaux d'échelle pour les résultats

Je ne connais pas cette terminologie, veuillez m'expliquer. Créer un tableau linéaire de longueur dans un cube ?


Au moins, il y a déjà une option. Via MathMax(résultat, résultatPrév).

 
hoz:

Et je demandais spécifiquement comment dessiner plus de 6 lignes sur un graphique. Dans quelle fenêtre (0 ou autre, cela n'a pas d'importance). C'est ce qui m'intéresse le plus et c'est ce que je vous ai demandé en premier lieu.

Vous ne pouvez pas le faire avec un seul indicateur. A moins que j'utilise des objets graphiques(lignes de tendance), mais c'est une méthode lente. Il ne reste donc que quelques indicateurs. Division d'un indicateur en plusieurs.