Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 135

 
Vitaly Muzichenko:
Mettete i prezzi tutti insieme o li prendete e poi li mettete nel calcolo?
Vitaly Muzichenko:
Imposta i prezzi in una volta sola, o li ottiene e poi li incolla nel calcolo?
int k=periodo;
for(int i=1; i<=periodo; i++)
{
H1_Close[i]=Close[k];
k--;
}
Prendo un pezzo di timesession uguale al periodo che parte dall'ultima barra chiusa e lo capovolgo nell'array, perché 1 è la penultima barra in timesession e il calcolo deve partire dall'i-esimo
cioè la mia funzione dovrebbe restituire il valore SMMA dell'ultima barra chiusa.
 
Buon pomeriggio a tutti.
Il codice qui sotto codifica una semplice idea.
Se l'ultimo ordine chiuso era su SEL
Se l'ultimo ordine chiuso era sulla NEL
Aprire un ordine NEL
if (OrderSelect (Ht-1,SELECT_BY_POS, MODE_HISTORY))                                            
if ( OrderType ()==OP_SELL)                                            
X = OrderProfit( );                                            

if (OrderSelect (Ht-1,SELECT_BY_POS, MODE_HISTORY))                                            
if ( OrderType ()==OP_BUY)                                              
if(X < 0)                                              

OrderSend(Symbol(),OP_SELL,0.1,Bid ,3,Ask+400*Point,Ask-200*Point,"17-10",123 );



DOMANDA
Quale costrutto di linguaggio può essere usato per aggiungere altre due condizioni a questo codice (cerchiato in rosso)

Se l'ultimo ordine chiuso è NEL
Se l'ultimo ordine CEL ha chiuso
Se l'ultimo ordine chiuso ha chiuso sulla NEL
Se l'ultimo ordine chiuso è stato chiuso su unSL

Grazie per il vostro aiuto.


Vi sarei molto grato se poteste scrivere il codice e non solo spiegare cosa deve essere fatto.
 
Salve. Sto scrivendo uno script per cancellare tutti gli ordini in sospeso. Tuttavia, cancella solo un ordine. Ho sempre due ordini in sospeso o uno solo. In entrambi i casi cancella solo un Buy Stop. Per eliminare il Sell Stop è necessario eseguire nuovamente lo script, a condizione che non ci siano altri ordini Buy Stop. Si prega di avvisare dove si trova l'errore.

void CancellaOrdini()
{
int Total=OrdersTotal();
for(int i=0;i<Totale;i++)
if(OrderSelect(i,SELECT_BY_POS))
{
int type=OrderType(), ticket=OrderTicket();
bool c;
interruttore(tipo)
{
caso 4:
c=OrderDelete(ticket);
se(!c)
Print(GetLastError());
pausa;
caso 5:
c=OrderDelete(ticket);
se(!c)
Print(GetLastError());
pausa;
}
}
}
 
0B53RV3R:
Salve. Sto scrivendo uno script per cancellare tutti gli ordini pendenti. Tuttavia, cancella solo un ordine. Ho sempre due ordini in sospeso o uno solo. In entrambi i casi cancella solo un Buy Stop. Per eliminare il Sell Stop è necessario eseguire nuovamente lo script, a condizione che non ci siano altri ordini Buy Stop. Si prega di avvisare dove si trova l'errore.

nullo CancellareOrdini()
{
int Total=OrdersTotal();
for(int i=0;i<Totale;i++)
if(OrderSelect(i,SELECT_BY_POS))
{
int type=OrderType(), ticket=OrderTicket();
bool c;
interruttore(tipo)
{
caso 4:
c=OrderDelete(ticket);
se(!c)
Print(GetLastError());
pausa;
caso 5:
c=OrderDelete(ticket);
se(!c)
Print(GetLastError());
pausa;
}
}
}
Cambia la direzione della ricerca for(i=totale-1;i>=0;i--)
 
Maxim Kuznetsov:
cambiare la direzione della ricerca for(i=totale-1;i>=0;i--)
Grazie, ora funziona. Ho capito bene che quando un ordine con indice 0 viene cancellato, all'ordine con indice 1 viene assegnato l'indice 0, e alla prossima iterazione i == 1, e non c'è un ordine simile. Può dirmi se questo è il caso?
 
0B53RV3R:
Grazie, ora funziona. Ho capito bene che quando un ordine con indice 0 viene cancellato, un ordine con indice 1 viene assegnato all'indice 0, e alla prossima iterazione i == 1, e non appare nessun ordine del genere. Puoi dire se questo è il caso?
Giusto.
 

C'è una funzione frattale personalizzabile, beh, cavolo, è terribilmente pesante. Ho lasciato il disegno degli oggetti solo per mostrare visivamente se i frattali si stanno formando correttamente - non ci sarà.

Domanda: come possiamo renderlo più facile, perché il test visivo è stupido:

extern int FrLeft=15; // Баров слева
extern int FrRight=5; // Баров справа

//-----------------------------------------------------------------------------------------------
void OnTick()
{
int nFrUp= GetBarFractal(Symbol(),PERIOD_CURRENT,FrLeft,FrRight,0,MODE_UPPER); // Возвращает номер бара
int nFrDn= GetBarFractal(Symbol(),PERIOD_CURRENT,FrLeft,FrRight,0,MODE_LOWER); // Возвращает номер бара
double FrHigh = High[nFrUp]; // Цена верхнего фрактала
double FrLow  = Low [nFrDn]; // Цена нижнего фрактала

SetArrow("FrUp"+"_"+(string)Time[nFrUp], Time[nFrUp], High[nFrUp], clrDeepSkyBlue, 217, 2, ANCHOR_BOTTOM);
SetArrow("FrDn"+"_"+(string)Time[nFrDn], Time[nFrDn], Low[nFrDn], clrDeepPink, 218, 2, ANCHOR_TOP);

// Comment("Price: ",FrHigh,", Num: ",nFrUp,"\nPrice: ",FrLow,", Num: ",nFrDn);
}

//----------------------------------------------------------------------------------------------+
//---------------------- Возвращает номер бара фрактала (настраиваемый) ------------------------+
//----------------------------------------------------------------------------------------------+
int GetBarFractal(string symb,ENUM_TIMEFRAMES tf=0,int nLeft=2,int nRight=2,int numFr=0,int mode=MODE_UPPER) {
int i=0,cn=0,pos=0,r=0,l=0,e=0,equals,bars;
double _high[], _low[];
nLeft=nLeft<=2?2:nLeft;
nRight=nRight<=2?2:nRight;
equals=nLeft+nRight;
bars=Bars(symb,tf)-equals;
ArraySetAsSeries(_high,true);
ArraySetAsSeries(_low,true);

  for(pos=nRight+1; pos<bars; pos++) {
   r=nRight;
   if(mode==MODE_UPPER) {
    CopyHigh(symb,tf,0,pos+equals+1,_high);
    for(i=1; i<=r; i++) {
     if(_high[pos]<=_high[pos-i]) break;
   }}
   if(mode==MODE_LOWER) {
    CopyLow(symb,tf,0,pos+equals+1,_low);
    for(i=1; i<=r; i++) {
     if(_low[pos]>=_low[pos-i]) break;
   }}
   //--
   if(i==r+1) {
    l=nLeft;
    e=equals;
     for(int j=1; j<=l+equals; j++) {
      if(mode==MODE_UPPER) {
       if(_high[pos]<_high[pos+j])  break;
       if(_high[pos]>_high[pos+j])  l--;
       if(_high[pos]==_high[pos+j]) e--;
      }
      if(mode==MODE_LOWER) {
       if(_low[pos]>_low[pos+j])  break;
       if(_low[pos]<_low[pos+j])  l--;
       if(_low[pos]==_low[pos+j]) e--;
      }
      if(l==0) {
       cn++;
       if(cn>numFr) return(pos);
      }
      //--
      if(e<0) break;
   }}
  }
   Print(__FUNCTION__": Фрактал не найден");
  return(0);
}

//----------------------------------------------------------------------------------------------+
//------------------- Функция рисования значка на графике, объект OBJ_ARROW --------------------+
//----------------------------------------------------------------------------------------------+
void SetArrow(string nm="", datetime t1=0, double p1=0, color col=clrRed,
                                           int code=252, int width=1, int anchor=0) {
if(ObjectFind(0,nm)==-1) {
    ObjectCreate(0,nm,OBJ_ARROW,0,0,0);
    ObjectSetInteger(0,nm,OBJPROP_COLOR,col);
    ObjectSetInteger(0,nm,OBJPROP_ARROWCODE,code);
    ObjectSetInteger(0,nm,OBJPROP_ANCHOR,anchor);
    ObjectSetInteger(0,nm,OBJPROP_WIDTH,width);
    ObjectSetInteger(0,nm,OBJPROP_SELECTED,false);
    ObjectSetInteger(0,nm,OBJPROP_SELECTABLE,true);
    ObjectSetInteger(0,nm,OBJPROP_HIDDEN,false);
    ObjectSetDouble(0,nm,OBJPROP_PRICE,p1);
    ObjectSetInteger(0,nm,OBJPROP_TIME,t1);
   }
}

Grazie!

 
Vitaly Muzichenko:

C'è una funzione frattale personalizzabile, beh, cavolo, è terribilmente pesante. Ho lasciato il disegno degli oggetti solo per mostrare visivamente se i frattali si stanno formando correttamente - non succederà.

Domanda: come posso renderlo più facile, perché è stupido testarlo visivamente:

Grazie!

Si può solo rendere tutto più facile trasformandolo in un indicatore. Anche il commento nell'angolo superiore sinistro del grafico e soprattutto i segni di apertura e chiusura delle posizioni, che il tester stesso mette, stanno rallentando il test.
 

Salve. Potrebbe consigliare un nuovo arrivato?

Ecco un esempio:

se(Condizione1)

se(Condizione2)

{

}

else

{

}

Secondo il codice, Else dovrebbe riferirsi a if(condition1) e sarà eseguito se la condizione1 non è soddisfatta

Ma in realtà sarà eseguito anche se la condizione2 non è soddisfatta.

 
Andy-D:

Salve. Potrebbe consigliare un nuovo arrivato?

Ecco un esempio:

se(Condizione1)

se(Condizione2)

{

}

else

{

}

Secondo il codice, Else dovrebbe riferirsi a if(condition1) e sarà eseguito se la condizione1 non è soddisfatta

Ma in realtà sarà eseguito se la condizione2 non è soddisfatta.


Prendi l'abitudine di mettere subito le bretelle ricce con la condizione

se(Condizione)

{

}

A secondo la sua domanda

if(Условие1)
   {
       if(Условие2)

        {

        }
    }
   else

    {

    }