[ARCHIVIO]Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Non posso andare da nessuna parte senza di te - 5. - pagina 424

 
gyfto:

Beh, in teoria, se i buffer degli indicatori aggiuntivi sono autodichiarati e si usano ulteriori linee di tendenza, allora funzionerà...

Allora perché la documentazione dice che il
numero di buffer non può superare 8
Non è chiaro qui. Non dice che è il numero di buffer principali, non tutti. Dice il numero di buffer e basta. Quindi sto leggendo questo ed è la mia comprensione che questo dovrebbe applicarsi al numero totale di buffer per un dato indicatore.
 
gyfto:

No, sto parlando di ObjectCreate(), devi impostare il numero di finestra lì. Ti ho mostrato come impostarlo se è una sottofinestra (cioè non zero, che è la finestra principale).

Così avete il parametro di funzione WindowOnDropped lì quando create un oggetto, ed è già una specie di finestra principale relativamente. O la finestra principale è lafinestra più a sinistra nel terminale?
 

Ciao, non riesco a capire perché gli ordini buystop non vengono cancellati.

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:

Allora perché la documentazione dice che il
numero di buffer non può superare 8
È qui che non è chiaro. Non dice il numero di buffer principali... non tutti i buffer. Dice il numero di buffer e basta. Quindi lo sto leggendo e si suppone che si applichi al numero totale di buffer di un dato indicatore.

Non sto parlando dei buffer degli indicatori, sto parlando dei buffer degli indicatori simulati. E lì ArrayResize(CustomBuffer, Bars) nel wrapper di IndicatorCounted(), e le estremità delle linee di tendenza più a destra dovrebbero essere ridisegnate da Bid.

hoz:

Quindi avete un parametro di funzione lì quando create un oggetto - WindowOnDropped, ed è già una specie di finestra principale relativamente. O la finestra principale è la più a sinistratra le finestre del terminale?
No, anche io ero confuso all'inizio. Per esempio, abbiamo due grafici aperti, euron e gold. Quindi, entrambi hanno un indice di zero. Ma se hanno delle sottofinestre, sono numerate a partire da una. Per esempio, ho lanciato tre indici sul grafico eurenne, due sull'oro, e tutti e cinque con #property separate_window e tutte le diverse sottofinestre. Allora eurene avrà i numeri di finestra 0, 1, 2, 3 e oro 0, 1, 2.
 

Ho una domanda. Il mio cervello sta bollendo, onestamente. Se puoi - aiutami.

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);
}

Ora una domanda: come posso ripristinare i valori lento, veloce, periodo per max (che è la posizione di un elemento nell'array)? L'ordine in cui i valori sono messi in temp[] è dato in Print(). Ho messo 3 come limite, ma qualsiasi numero può essere usato lì. Ecco i primi 77 valori (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:

Ho una domanda. Il mio cervello sta bollendo, onestamente. Se puoi - aiutami.

Ora una domanda: come posso ripristinare i valori lento, veloce, periodo per max (che è la posizione di un elemento nell'array)? L'ordine in cui i valori sono messi in temp[] è dato in Print(). Ho messo 3 come limite, ma può essere qualsiasi numero.


Dove "n++" controlla se il risultato è massimo, se è massimo, ricorda i valori di lento, veloce, ecc.
 
Si potrebbero fare altri tre array (o un array tridimensionale) per il lento, il veloce... Questo è meglio, perché nel caso vogliate ordinare i risultati in qualche modo, ci saranno sempre dei parametri di prova disponibili.
 
Se queste azioni sono frequenti, per esempio una volta per barra o 10 barre, è meglio scalare gli array per i risultati e tre array con i valori dei parametri nell'initem, scorrere questi cicli, riempire gli array con i valori del periodo. Poi scorrere il tutto in un ciclo. Poi saremo in grado di usare la funzione ArrayMaximum, e risolvere le cose. Questo renderà il lavoro il più veloce possibile.
 
gyfto:

No, anche io ero confuso all'inizio. Per esempio, abbiamo due grafici aperti, l'euro e l'oro. Quindi, entrambi hanno un indice di zero. Ma se hanno delle sottofinestre, sono numerate a partire da una. Per esempio, ho lanciato tre indici sul grafico eurenne, due sull'oro, e tutti e cinque con #property separate_window e tutte le diverse sottofinestre. Allora l'eurene avrebbe i numeri di finestra 0, 1, 2, 3 e l'oro avrebbe 0, 1, 2.

Esattamente! Non lavoro affatto con i tacchini, quindi non ho prestato attenzione quando studiavo l'aiuto. Tutto ha un senso.

gyfto:

Non sto parlando di buffer indicatori, sto parlando di buffer indicatori simulati. C'è ArrayResize(CustomBuffer, Bars) nel wrapper di IndicatorCounted(), e le estremità delle linee di tendenza più a destra dovrebbero essere ridisegnate da Bid.

E stavo chiedendo specificamente come disegnare più di 6 linee su un grafico. In quale finestra (0 o altra, non importa). Questo è quello che mi interessa di più ed è quello che ti ho chiesto in primo luogo.
 
Integer:

Dove "n++" fa controllare il massimo del risultato, se massimo, ricorda i valori di lento, veloce, ecc.

Non ci ho pensato.


Integer:
Si possono fare altri tre array (o un array tridimensionale) per il lento, il veloce... Questo è meglio, perché nel caso in cui si voglia ordinare i risultati in qualche modo, ci saranno sempre dei parametri di prova disponibili.

Tridimensionale è l'ideale, ma ArrayMaximum() funziona solo su una dimensione, quindi dovrete far convergere l'array in uno lineare, e di nuovo dovrete capire dove si trova tutto. Ma ho fastMax=slow, e questo è il problema. Ma tre matrici diverse... Ho lo stesso risultato, quindi o uno tridimensionale o uno lineare.


Integer:
scale array per i risultati

Non conosco questa terminologia, per favore spiegatemi. Creare una matrice lineare di lunghezza in un cubo?


Beh, almeno c'è già un'opzione. Via MathMax(risultato, risultatoPrev).

Motivazione: