[Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 4. - pagina 402

[Eliminato]  

Questa è la mia idea:

Apro un ordine e poi dipende da quale bilancio si è chiuso.

Se il saldo è inferiore a zero, registriamo la perdita, e se è maggiore di zero, cominciamo a lavorare dall'inizio.

Se la nostra perdita è inferiore a zero, l'abbiamo fissata e assegnata a una variabile, per esempio: Meno

Minus = OrderProfit (- 45 centesimi);

ContoAqviti + Meno + il mio valore (la mia coscienza)

più avanti nel prossimo ordine

se il profitto di questo ordine è superiore a AccountAqviti + Minus + il mio valore (la mia coscienza), allora chiudiamo l'ordine; se non è superiore a zero, allora lo sistemiamo:

(AccountAqviti + OrderProfit) - (AccountAqviti + Minus + il mio valore (la mia coscienza)) = Meno

se Minus >= 0, allora Minus = 0;

 
belck:

Questa è la mia idea:


Bisogna andare al Service Work con un'idea, e qui si usa trattare situazioni specifiche con un codice specifico.
[Eliminato]  

Buon pomeriggio! Vorrei creare un indicatore che visualizza un canale su indicatori come MASD, AO e simili. Questo indicatore è sovrapposto alla finestra degli indicatori di base (MASD, AO e simili) ed è disegnato come linee parallele sopra e sotto lo 0. Queste linee sono definite come una media dei picchi massimi (sopra 0) e minimi (sotto 0) per il periodo specificato.
Sto cercando di usare l'indicatore AO come esempio, ma non funziona.
Algoritmo:
scriviamo le letture dell'indicatore in un array,
corriamo attraverso questo array alla ricerca di picchi / depressioni,
li scriviamo in determinati array,
troviamo il valore medio dei picchi, poi dei depressioni,
assegniamo il valore ottenuto al buffer dell'indicatore.
In questa fase, non è il canale (che si attacca a 0) sull'indicatore che è definito nel codice, ma il valore medio dei picchi massimi e il valore medio dei minimi bassi.
La definizione dei picchi e delle depressioni può essere rimossa dal codice ed eseguita come una funzione, ma per ora l'ho lasciata così - non fa alcuna differenza.
Problemi:
1. il terminale si blocca (considerevolmente)
2. le linee non sono visualizzate come una media; appaiono come max/min per un periodo.
C'è voluto molto tempo per capirlo, ma non riesco a capire la causa dei problemi. Potete per favore aiutarmi a correggere il mio codice o darmi un link al codice sorgente di problemi simili e cercherò di correggerlo ulteriormente. Grazie in anticipo.

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);
}
 
grazie! molto utile!
 
LOA:

Buon pomeriggio!
Problemi:

1. il terminale si blocca (significativamente)

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


Aumentare la dimensione di un array in un ciclo è crudele, ecco perché si blocca. Aumentare le dimensioni una volta sola. O usare le serie temporali in una volta sola


P.S. vedi messaggi personali

 

Come faccio a fare un loop su una variabile di tipo stringa?

Esempio

   double A[3];
   A[0]=iClose("EURUSD",0,0);
   A[1]=iClose("GBPUSD",0,0);
   A[2]=iClose("AUDUSD",0,0);
Come posso sostituire questa costruzione con un ciclo?
 
Buon pomeriggio, potreste dirmi come scrivere una condizione per cui se il profitto di un ordine aperto è un pungente, allora chiudete quell'ordine?
[Eliminato]  
first_may:
Buon pomeriggio, potreste dirmi come scrivere una condizione per cui se il profitto di un ordine aperto è un pungente, allora chiudete quell'ordine?

Utilizzando la funzione.

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:

Come faccio a fare un loop su una variabile di tipo stringa?

Esempio

Come posso sostituire questo costrutto con un ciclo?

   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:



Grazie