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

 
Alexey Belyakov:

Mettilo dentro. Non l'ho fatto. Si apre in pacchi. La magia - la ignora.



Quando scrivi del codice, traduci la sua logica in russo. All'inizio, c'è un ciclo in cui vengono fatti dei confronti e se l'ordine selezionato non è un ordine a mercato, allora alla prossima iterazione; se il simbolo non è EURUSD, allora alla prossima iterazione e se il magik non è uguale al vostro magik, allora alla prossima iterazione. Alla fine del ciclo si conta il numero di iterazioni passate prima della fine del ciclo. Il ciclo finisce e il programma inizia ad aprire gli ordini secondo le condizioni. Considerando che una delle condizioni è sempre vera, viene aperto un ordine. E questo accade ad ogni tick.

 
Valeriy Yastremskiy:

Quando scrivi il codice, traduci la sua logica in russo. Si ha prima un ciclo in cui si fanno dei confronti; se l'ordine selezionato non è un ordine di mercato, allora alla prossima iterazione; se lo strumento non è l'Eurobucks, allora alla prossima iterazione; e se il magik non è uguale al tuo magik, allora alla prossima iterazione. Alla fine del ciclo si conta il numero di iterazioni passate prima della fine del ciclo. Il ciclo finisce e il programma inizia ad aprire gli ordini secondo le condizioni. Considerando che una delle condizioni è sempre vera, viene aperto un ordine. E questo accade ad ogni tick.

Capisco. Ma in questo caso, se(OrderMagicNumber() == MagicNumber)continua, l'ordine che è stato piazzato viene accettato per un ordine piazzato da Magic(o). Ciò significa che l'ordine piazzato manualmente su EUROBAX deve essere ignorato e un altro ordine deve essere aperto da un Expert Advisor con Magic.

OrdersTotal() - questo è il problema che mette fine a qualsiasi manipolazione con Magic.
 
Alexey Belyakov:

Ho capito. Ma in questo caso: if(OrderMagicNumber() == MagicNumber)continua; Gli ordini piazzati sono presi per ordini piazzati da Magic(s). Cioè, un ordine piazzato manualmente su Eurobucks dovrebbe essere ignorato, e un altro dovrebbe essere aperto da un EA con Magic.

OrdersTotal() - questa è l'infestazione che mette fine a qualsiasi manipolazione del mago.

Il codice viene eseguito dall'alto verso il basso. Dopo il ciclo si ha il piazzamento degli ordini. if(OrderMagicNumber() == MagicNumber)continue; Questo interrompe l'esecuzione del corpo del ciclo e inizia una nuova iterazione del ciclo. Il ciclo terminerà e inizierà l'inserimento dell'ordine. Questo è il modo in cui l'avete scritto. Il numero totale di ordini non ha niente a che vedere con questo. Se vuoi fare una condizione che se non ci sono ordini piazzati con il tuo magik e il tuo strumento, allora il Codice di immissione degli ordini dovrebbe essere diverso.

Scorrere i numeri d'ordine. Se un ordine viene trovato con il nostro magik e sul nostro strumento, allora return - exit from start. O una bandiera che il tuo ordine è lì e all'inizio ontik o inizio controllo sulla bandiera.

Ed è meglio creare un EA da un modello per creare uno script EA, un indicatore. I campi del codice principale saranno più corretti.

datetime some_time=TimeCurrent();
//extern string Symbol3 = ""; //Инструмент (""текущий по умолчанию)
extern int P=1;          //Таймфрейм
extern int MagicNumber = 100500;


int start()
{

int send;
                                     
double SL=200;                                   
double TP=200;                       
double Lots=1;       

for(int i = OrdersTotal(); i >= 0; i--) 
{
      OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
      if(OrderSymbol() == "EURUSD" && OrderMagicNumber() == MagicNumber)return(0);
}
          

             
if ((Close[0]>High[1])&&(n==0))
{
send=OrderSend("EURUSD",OP_BUY,Lots,Ask,3,Bid-SL*Point,Bid+TP*Point,MagicNumber);
}

if ((Close[0]<Low[1])&&(n==0))  
{
send=OrderSend("EURUSD",OP_SELL,Lots,Bid,3,Ask+SL*Point,Ask-TP*Point,MagicNumber);
}

return(0);
}
 
Valeriy Yastremskiy:

Il codice viene eseguito dall'alto verso il basso. in un ciclo secondo le regole del ciclo. Dopo il ciclo si hanno ordini di piazzamento. if(OrderMagicNumber() == MagicNumber)continue; Questo interrompe l'esecuzione del corpo del ciclo e inizia una nuova iterazione del ciclo. Il ciclo terminerà e inizierà l'inserimento dell'ordine. Questo è il modo in cui l'avete scritto. Il numero totale di ordini non ha niente a che vedere con questo. Se vuoi fare una condizione che se non ci sono ordini piazzati con il tuo magik e il tuo strumento, allora il Codice di immissione degli ordini dovrebbe essere diverso.

Scorrere i numeri d'ordine. Se un ordine viene trovato con il nostro magik e sul nostro strumento, allora return - exit from start. O una bandiera che il tuo ordine è lì e all'inizio ontik o inizio controllo sulla bandiera.

Ed è meglio creare un EA da un modello per creare uno script EA, un indicatore. I campi del codice principale saranno più corretti.

for(int i = OrdersTotal(); i >= 0; i--) 
{
      OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
      if(OrderSymbol() == "EURUSD" && OrderMagicNumber() == MagicNumber)return(0);
}

Immagino che questa non sia la soluzione, ma in che direzione lavorare?

Ho provato un paio di dozzine di varianti. O apre un ordine, o senza alcuna interruzione, tuyvukuchu.

Qui, a proposito, su OrderSekect - una variabile di tipo bool dovrebbe essere impostata, altrimenti giurerà.

 
Alexey Belyakov:

Questa non è una soluzione, ma da che parte andare?

Ho già provato un paio di dozzine di varianti. O apre un solo ordine, o si apre senza alcuna interruzione.

Qui a proposito, su OrderSekect - una variabile di tipo bool dovrebbe essere impostata, altrimenti giurerà.

Sì, dovrebbe, ritorna al nulla.

for(int i = OrdersTotal(); i >= 0; i--) 
{
     bool sel = OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
      if(OrderSymbol() == "EURUSD" && OrderMagicNumber() == MagicNumber)return(0);
}

È meglio che tu scriva l'algoritmo, cosa che vuoi fare.

 
Alexey Belyakov:

Questa non è una soluzione, ma da che parte andare?

Ho già provato un paio di dozzine di varianti. O apre un solo ordine, o si apre senza alcuna interruzione.

Qui a proposito, su OrderSekect - una variabile di tipo bool dovrebbe essere impostata, altrimenti giurerà.

Invece di return(0) dovrebbe essere continue

 

Persone buone e competenti! Aiuto per implementare l'indicatore Envelopes in un EA MT5. L'EA stesso deve elaborare ogni tick (senza saltare). Ho provato alcune varianti, ho guardato nella documentazione, mi sembra che mi piaccia la variante, ma è per il gestore OnCalculate. Non ho ancora provato con la libreria standard... Bene, ecco la mia implementazione iniziale:

input int       Indicatorperiod         = 3;
input double    EnvelopesDeviation      = 0.07;
int    handle;                                          //--- переменная для хранения хэндла индикатора iEnvelopes
double upperEnv[3], lowerEnv[3];                        // динамические массивы для хранения численных значений Emvelopes
double local_envelopesupper, local_envelopeslower;      // в эти переменные пытаюсь получить значения верхней и нижней линии индикатора
...

int OnInit()
...
handle=iEnvelopes(_Symbol,_Period,Indicatorperiod,0,MODE_LWMA,PRICE_OPEN,EnvelopesDeviation);
...

void OnTick()
...
//--- Объявляем структуру, которая будут использоваться
   MqlRates mrate[3];           // Будет содержать цены, объемы и спред для каждого бара
   ArraySetAsSeries(mrate, true); 

      //--- Получить исторические данные последних 3-х баров
      if(CopyRates(_Symbol,_Period,0,3,mrate)!=3)
        {
         Alert("Ошибка копирования исторических данных - ошибка:",GetLastError(),"!!");
         return;
        }

      //--- Используя хэндлы индикаторов, копируем новые значения индикаторных буферов в массивы
      if(CopyBuffer(handle,0,0,3,upperEnv)<2 || CopyBuffer(handle,1,0,3,lowerEnv)<2)
        {
         Alert("Ошибка копирования буферов индикатора Envelopes - номер ошибки:",GetLastError(),"!!");
         return;
        }
...
local_envelopesupper = upperEnv[1];
local_envelopeslower = lowerEnv[1];
...

Nel tester visivo ottengo:


Puoi dirmi cosa c'è che non va e qual è il modo migliore per farlo?
Документация по MQL5: Стандартная библиотека
Документация по MQL5: Стандартная библиотека
  • www.mql5.com
Некорректное отображение индикатора
 
Valeriy Yastremskiy:

Sì, dovrebbe giurare, ritorna al nulla.

È meglio che tu scriva l'algoritmo che vuoi fare, non è chiaro cosa ti serve.

Nel primo messaggio c'è il codice. È facile: rompiamo il precedente massimo/basso - apriamo un accordo. Gli ordini aperti da questo EA non devono incrociare gli altri ordini aperti manualmente o da un altro EA, cioè l'EA deve lavorare in modo indipendente.

Ho cercato su Internet. È un argomento piuttosto banale, ma ci sono molte varianti. Sembra essere una cosa semplice, e non si trova da nessuna parte.

 
Alexey Belyakov:

Nel primo messaggio, il codice. È semplice: rompi il massimo/basso precedente - apri un trade. Gli ordini aperti da questo EA non devono sovrapporsi ad altri ordini aperti manualmente, o a quelli aperti da un altro EA, cioè l'EA deve lavorare indipendentemente.

Ho cercato su Internet. È un argomento piuttosto banale, ma ci sono molte varianti. Sembra essere una cosa semplice, e non si trova da nessuna parte.

Descrivere il lavoro dell'Expert Advisor in modo completo passo dopo passo. Il primo passo è controllare se ci sono ordini con la nostra magia sul simbolo selezionato. Se li abbiamo, allora finiamo il lavoro e se non li abbiamo, allora stabiliamo gli ordini. Cosa succede dopo che gli ordini sono stati effettuati? Funziona così
 
Maxim Kuznetsov:

invece di return(0) il significato dovrebbe essere continue

Lì se è uguale, quindi non andiamo oltre e finiamo... Non mi piace, se non è uguale allora vai avanti. È più difficile da capire.