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

 
trader781:
Avrai l'ultimo perdente, cosa fare con esso e quali parametri regolare per te stesso, penso che lo capirai

Grazie, penso di aver capito.

Come faccio a far tornare il lotto al suo valore originale dopo il take profit?

if (OrderProfit()>0 && OrderType()<2)
            {
            lot=0.1
            }
non funziona così)
 
wishmast:

Grazie, penso di aver capito.

Come faccio a far tornare il lotto al suo valore originale dopo il take profit?

if (OrderProfit()>0 && OrderType()<2)
            {
            lot=0.1
            }
non funziona così)

Ho il seguente schema

se (OrdiniTotali()==0)

{

aprire con lotto iniziale

}

else

...

cioè se non ci sono ordini, non si aprirà con il vecchio lotto

Naturalmente è possibile memorizzare ogni ordine, ma non ci dicono come farlo.
 
Vitalie Postolache:
Un contatore dovrebbe essere avviato e riportato al suo valore iniziale quando viene raggiunta una certa soglia:

Grazie.

Aiutami a risolvere un problema.
Ci sono 3 posizioni di acquisto, è apparsa una posizione di vendita, dobbiamo chiudere la posizione di vendita e la posizione di acquisto più vecchia. Due posizioni di acquisto dovrebbero rimanere.
Li ho tutti chiusi.

void OnTick()
  {
//---
int b_STOP,s_STOP,b=0,s=0;

  for (int i=0; i<OrdersTotal(); i++)
    {
     if (OrderSelect(i, SELECT_BY_POS)==true)
      {  
        if (OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic) continue;
        if (OrderType()==OP_BUY) b++;
        if (OrderType()==OP_SELL) s++;
        if (OrderType()==OP_BUYSTOP) b_STOP++;
        if (OrderType()==OP_SELLSTOP) s_STOP++;      
      }  
     if (OrderType()==OP_BUY)
     {
     if(b>=1&&s==1)//бай позиций больше или 1 и появилась SELL позиция
     {
      OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),3,CLR_NONE);
      CLOSEORDER(OP_SELL);
     }
     }
    }
  }

 

Spiegare perché la funzione OrderProfit()<0 non funziona?

   for(int q=OrdersHistoryTotal()-1; q>=0; q--)
      {
      if(OrderSelect(q,SELECT_BY_POS,MODE_HISTORY))
         {
         if(OrderType()<2 && OrderMagicNumber()==magic)
            {
            if (OrderProfit()<0)
               {
               if (DayOfWeek()==1)
                  {
                  day1++;
                  Print ("Понедельник SL=",day1);
                  }
               if (DayOfWeek()==2)
                  {
                  day2++;
                  Print ("Вторник SL=",day2);
                  }
               }
            }
         }
      
      }

Voglio vedere quanti stoploss per giorno della settimana

for(int l=OrdersHistoryTotal()-1; l>=0; l--)
        {
        if(OrderSelect(l,SELECT_BY_POS,MODE_HISTORY))
           {
           if(OrderProfit()<0 && OrderType()<2)
              {
              oldticket=OrderTicket();
              }
           if (oldticket>=ticket)
              {
              ticket=oldticket;
              lot=OrderLots()*4;
              }
           if (OrderProfit()>0 && OrderType()<2)
              {
              lot=0.01;
              }
           }
        }

e qui penso che sia la stessa ragione per cui non funziona

 
wishmast:

Spiegare perché la funzione OrderProfit()<0 non funziona?

   for(int q=OrdersHistoryTotal()-1; q>=0; q--)
      {
      if(OrderSelect(q,SELECT_BY_POS,MODE_HISTORY))
         {
         if(OrderType()<2 && OrderMagicNumber()==magic)
            {
            if (OrderProfit()<0)
               {
               if (DayOfWeek()==1)
                  {
                  day1++;
                  Print ("Понедельник SL=",day1);
                  }
               if (DayOfWeek()==2)
                  {
                  day2++;
                  Print ("Вторник SL=",day2);
                  }
               }
            }
         }
      
      }

Voglio vedere quanti stoploss per giorno della settimana

for(int l=OrdersHistoryTotal()-1; l>=0; l--)
        {
        if(OrderSelect(l,SELECT_BY_POS,MODE_HISTORY))
           {
           if(OrderProfit()<0 && OrderType()<2)
              {
              oldticket=OrderTicket();
              }
           if (oldticket>=ticket)
              {
              ticket=oldticket;
              lot=OrderLots()*4;
              }
           if (OrderProfit()<0 && OrderType()<2)
              {
              lot=0.01;
              }
           }
        }

e qui mi sembra che sia la stessa ragione per cui non funziona

Perché DayOfWeek() restituisce il numero d'ordine del giorno della settimana dell'ultima ora conosciuta del server.

E avete bisogno del giorno della settimana dell'ora di chiusura dell'ordine: TimeDayOfWeek(OrderCloseTime());

 
Artyom Trishkin:

Perché DayOfWeek() restituisce il numero d'ordine del giorno della settimana dell'ultima ora conosciuta del server.

E avete bisogno del giorno della settimana dell'ora di chiusura dell'ordine: TimeDayOfWeek(OrderCloseTime());

Ma il risultato è lo stesso, come se ignorandoif(OrderProfit()<0) e c'è un ciclo, le variabili ottengono grandi valori.

2017.01.19 00:42:47.883 2014.02.20 23:59:48   EURUSD,H1: Вторник SL=1430208
2017.01.19 00:42:47.883 2014.02.20 23:59:48   EURUSD,H1: Понедельник SL=963666
2017.01.19 00:42:47.883 2014.02.20 23:59:48   EURUSD,H1: Вторник SL=1430207
2017.01.19 00:42:47.883 2014.02.20 23:59:48   EURUSD,H1: Понедельник SL=963665

E il ciclo con un lotto? L'ho copiato male qui, ho corretto il segnoif(OrderProfit()>0&&OrderType()<2), ma non cambia l'essenza, il ciclo funziona correttamente senza questa condizione.

 
wishmast:

Ma il risultato è lo stesso, come sese(OrderProfit()<0) viene ignorato e c'è un ciclo, le variabili hanno grandi valori.

2017.01.19 00:42:47.883 2014.02.20 23:59:48   EURUSD,H1: Вторник SL=1430208
2017.01.19 00:42:47.883 2014.02.20 23:59:48   EURUSD,H1: Понедельник SL=963666
2017.01.19 00:42:47.883 2014.02.20 23:59:48   EURUSD,H1: Вторник SL=1430207
2017.01.19 00:42:47.883 2014.02.20 23:59:48   EURUSD,H1: Понедельник SL=963665

E il ciclo con un lotto? L'ho copiato male qui, ho corretto il segnoif(OrderProfit()>0&&OrderType()<2), ma non cambia l'essenza, il ciclo funziona correttamente senza questa condizione.

Dove sono dichiarati day1 e day2?
 
Artyom Trishkin:
Dove sono dichiarati day1 e day2?
come globale, all'inizio, prima di OnTick () e prima di tutte le funzioni
 
Artyom Trishkin:
Dove sono dichiarati day1 e day2?

Ho il sospetto che sto selezionando l'ordine in modo errato, non funziona(OrderProfit()<0), devo essere più specifico su quale ordine ho bisogno. Non so perché salta un ordine quando l'ultimo si è chiuso al Take-Point e non ce ne sono altri. Forse, se voglio cercare nella storia, il ciclo dovrebbe essere costruito diversamente?

for(int w=OrdersHistoryTotal()-1; w>=0; w--)
      {
      if(OrderSelect(w,SELECT_BY_POS,MODE_HISTORY))

La ragione è che gli Expert Advisors costruiscono cicli con condizioni simili e funzionano come richiesto, ma lavorano usandoOrdersTotal().

for(int n=OrdersTotal()-1;n>=0;n--)            
         {                                          
         if(OrderSelect(n,SELECT_BY_POS))            
            {                                        
            if(OrderMagicNumber()==magic)                  
               {
               if(OrderType()>OP_SELL)
 
sile:
Grazie.

Aiutami a risolvere un problema.
Ci sono 3 posizioni di acquisto, è apparsa una posizione di vendita, dobbiamo chiudere la posizione di vendita e la posizione di acquisto più vecchia. Due posizioni di acquisto dovrebbero rimanere.
Sono tutti chiusi.

void OnTick()
  {
//---
int b_STOP,s_STOP,b=0,s=0;

  for (int i=0; i<OrdersTotal(); i++)
    {
     if (OrderSelect(i, SELECT_BY_POS)==true)
      {  
        if (OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic) continue;
        if (OrderType()==OP_BUY) b++;
        if (OrderType()==OP_SELL) s++;
        if (OrderType()==OP_BUYSTOP) b_STOP++;
        if (OrderType()==OP_SELLSTOP) s_STOP++;      
      }  
     if (OrderType()==OP_BUY)
     {
     if(b>=1&&s==1)//бай позиций больше или 1 и появилась SELL позиция
     {
      OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),3,CLR_NONE);
      CLOSEORDER(OP_SELL);
     }
     }
    }
  }

Questo non può essere risolto in un solo ciclo. In questo ciclo, dovreste memorizzare i ticker degli ordini da cancellare nell'array, nel prossimo ciclo, dovreste cancellarli per ticker.

Inoltre, hai un pasticcio con le parentesi graffe, stai lavorando con gli ordini al di fuori del bloccoOrderSelect{}, questo non è corretto.