Errori, bug, domande - pagina 1521

 
Ilya Malev:
Inserire il testo nell'OnCalculate dell'indicatore predefinito creato nel redattore. Posizionatelo su qualsiasi grafico. Vedrete il funzionamento dell'indicatore nell'angolo superiore sinistro della finestra del grafico. Dopo aver selezionato "Elimina" dalla lista degli indicatori, non smetterà di funzionare, lo vedrete nell'angolo in alto a sinistra. Continuerà anche dopo la chiusura della finestra. Dopo aver aperto una nuova finestra, continuerà nella nuova finestra. Inoltre, questa finestra non ha necessariamente lo stesso simbolo di quella che avevi all'inizio :)
Il lavoro dell'indicatore si ferma solo quando il terminale è chiuso. E non so se si ferma o no - ho appena dovuto rimuovere manualmente il terminale tramite Task Manager per riavviarlo...

Allo stesso tempo, l'aiuto della funzione IsStopped dice che il funzionamento del programma viene terminato forzatamente dopo 3 secondi se c'è un comando per terminare il programma mql.

E se while(true) viene sostituito con while(!IsStopped()), l'indicatore si completa con successo quando viene rimosso dal grafico.

Tutto è chiaro. Abbiamo fatto un'indulgenza per la normale cancellazione.

Quando il terminale si chiude, sarà difficile. Non più di 3 secondi.

E non sono sicuro che lo scriveremo nella documentazione, 1. per non indulgere a scrivere indicatori così incauti (l'hai scritto per controllare?) 2. Come allentato, così stretto.

 
Alexandre:

Una causa divertente dell'errore interno del compilatore (funzione utilizzata nell'indicatore):

...

La cura è ovvia, ma sono d'accordo - glitch molto divertente. :)))

Grazie per il post!

Ti ho scritto un messaggio privato.
 
Salve. Non riesco a scrivere un codice che apra una posizione in n-numerodi barre dopo che la posizione precedente è stata aperta. Ho provato a usare Time[i], iBarShift, iTime. Non ho avuto fortuna con tutto questo. Sono alle prime armi con la programmazione. La ricerca non ha prodotto nulla.
 

Dmitri Custurov:
Здравствуйте. Не получается написать код, который открывал бы позицию через n-количество баров после открытия предыдущей позиции. Пробовал использовать Time[i], iBarShift, iTime. Все безуспешно. В программировании новичок. Поиск ничего не дал.

Saluti, affinché tu possa ricevere aiuto per trovare l'errore - devi allegare almeno il codice. Nessuno qui scriverà per voi - è consuetudine qui aiutare a trovare l'errore e correggerlo con dei consigli. Oppure - contatta un freelance.
 

Ecco il codice:

se ((OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==False)&&(Signal==1))
{int send1=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, 0, 0, NULL, 1, 0, Red);
z=1;

Timer=Time[0];}

TimerNull=iBarShift(NULL,0,Timer,false);

se ((TimerNull>=n)&&(z==1))

{int send2=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, 0, 0, NULL, 2, 0, Red);

z=2;}

Ho anche provato in questo modo:

se ((OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==False)&&(Signal==1))
{int send1=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, 0, 0, NULL, 1, 0, Red);
z=1;

Timer=Time[0];}

TimerNull=Time[0];

if ((TimerNull>=(Timer+2700))&&(z==1)) //come esempio qui, invece di n ho messo 2700 secondi, che nei test significava 3 candele da 15 minuti) {int send2=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, 0, NULL, 2, 0, Red);

z=2;}

E anche come questo:

se ((OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==False)&&(Signal==1))
{int send1=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, 0, 0, NULL, 1, 0, Red);
z=1;

Timer=Time[0];}

TimerNull=Time[0];

se ((CurrentTime()>=(Timer+2700))&&(z==1))

{int send2=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, 0, 0, NULL, 2, 0, Red); //In questo caso quando ho rimosso 2700 il secondo trade è stato aperto subito dopo il primo nella stessa barra, ha senso. E anche quando ho messo un valore qualsiasi fino a 600 invece di 2700, il secondo affare è stato aperto nella stessa barra. Con un valore superiore a 600 il secondo trade non si è mai aperto. Non riesco a capire quale sia il problema. Vi sarei molto grato per il vostro aiuto.

I parametri Timer e TimerNull sono in formato datetime.


 

nel tuo esempio non c'è un'enumerazione di posizioni ad esempio

se ((OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==False)&&(Signal==1))

quindi seleziona sempre la posizione 0.

 
Sto ancora scrivendo una bozza per far funzionare la logica di base. Dopo di che, lo perfezionerò. In questo caso, forse mi sbaglio, il problema è nella seconda parte del codice.
 
Slawa:

Tutto ha un senso. Fatto un'indulgenza per la cancellazione normale.

Quando si chiude il terminale, sarà difficile. Non più di 3 secondi.

E non sono sicuro che lo scriveremo nella documentazione, 1. per non indulgere a scrivere indicatori così incauti (l'hai scritto per controllare?) 2. Come si è allentato, così si stringe.

Quindi, stringi un po', o aggiusta il riferimento. Assecondare non assecondare non è un discorso serio. Quello che i programmatori si aspettano da voi non è "coccolare", ma un software chiaro e ben documentato.

Naturalmente questo codice non ha altro scopo che una dimostrazione, che voi stessi avete chiesto. Ed è abbastanza innocuo, innocuo ottenerlo, se si rimuove Sleep e si sostituisce Comment con Print. Non c'è protezione contro lo spamming di gigabyte di stampe nel registro né in Quartet né in Quartet 5.

 
Dmitri Custurov:

Ecco il codice:

se ((OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==False)&&(Signal==1))
{int send1=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, 0, 0, NULL, 1, 0, Red);
z=1;

Timer=Time[0];}

TimerNull=iBarShift(NULL,0,Timer,false);

se ((TimerNull>=n)&&(z==1))

{int send2=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, 0, 0, NULL, 2, 0, Red);

z=2;}

Ho anche provato in questo modo:

se ((OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==False)&&(Signal==1))
{int send1=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, 0, 0, NULL, 1, 0, Red);
z=1;

Timer=Time[0];}

TimerNull=Time[0];

if ((TimerNull>=(Timer+2700))&&(z==1)) //come esempio qui ho messo 2700 secondi invece di n, che nei test significava 3 candele da 15 minuti) {int send2=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, 0, NULL, 2, 0, Red);

z=2;}

E anche come questo:

se ((OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==False)&&(Signal==1))
{int send1=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, 0, 0, NULL, 1, 0, Red);
z=1;

Timer=Time[0];}

TimerNull=Time[0];

se ((CurrentTime()>=(Timer+2700))&&(z==1))

{int send2=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, 0, 0, NULL, 2, 0, Red); //In questo caso quando ho rimosso 2700 il secondo trade è stato aperto subito dopo il primo nella stessa barra, ha senso. E anche quando ho messo un valore qualsiasi fino a 600 invece di 2700, il secondo affare è stato aperto nella stessa barra. Con un valore superiore a 600 il secondo trade non si è mai aperto. Non riesco a capire quale sia il problema. Vi sarei molto grato per il vostro aiuto.

I parametri Timer e TimerNull sono in formato datetime.


Questa è una delle possibili implementazioni. Questo EA dovrebbe aprire un ordine dopo il numero di barre specificato. E imparare a inserire correttamente il codice EA, il pulsante SRC sulla barra dei messaggi.

//+------------------------------------------------------------------+
//|                                                          111.mq4 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

input int nymber_bar=10;
input double Volume_=0.01;
int send1;
int send2;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(Total_orders(_Symbol,OP_SELL)==0 && send1<=0)
     {
      send1=OrderSend(Symbol(),OP_SELL,Volume_,Bid,0,0,0,NULL,1,0,Red);
     }

   if(OrderSelect(send1,SELECT_BY_TICKET))
     {
      if(iBarShift(NULL,0,OrderOpenTime())>=nymber_bar)
        {
         send1=OrderSend(Symbol(),OP_SELL,Volume_,Bid,0,0,0,NULL,1,0,Red);
        }
     }

  }
//+------------------------------------------------------------------+
int Total_orders(string symbol,int type)
  {
   int n=0;
   int total=OrdersTotal();

   for(int i=0; i<total; i++)
     {
      if(OrderSelect(i,SELECT_BY_POS))
        {
         if(OrderType()!=type)continue;
         //if(OrderMagicNumber()!=Magic)continue;
         if(OrderSymbol()!=symbol)continue;
         n++;
        }
     }
   return(n);
  }
//+------------------------------------------------------------------+

111

 

La domanda è probabilmente per gli sviluppatori di siti web o gli amministratori di servizi freelance

---

Prima era: 568 lavori completati, 75% personale

Aggiunti 13 lavori (tutti personali) e diventato: completato 581, 75% personale

---

Quindi la domanda: decifrare per favore, cosa significa 75%?