[Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate. Non posso andare da nessuna parte senza di te. - pagina 660

 
Craft:


Anatoly, grazie mille, è un peccato che non si possa inserire un'icona qui, come in Skype con un arco. Tutto è semplice ed elegante. Capisco dalla comunicazione con altri programmi di analisi tecnica che dovrebbe essere così, ma sono ancora fuori allenamento nel lavorare con mql. Grazie per il suggerimento sulla marcatura nel metodo - lo scoprirò.

Per il mio ultimo suggerimento, come evitare il piazzamento di più ordini su una barra da parte di questo EA? Ho già ricevuto consigli da persone gentili ma non mi hanno aiutato.

Ho provato a risolvere il tuo problema e questo è ciò che ho ottenuto. Ma prima le cose importanti.

Chi è colpevole e cosa fare? O da dove vengono le gambe...

Nel tuo Expert Advisor, diverse impostazioni dell'indicatore CCI sono utilizzate per aprire una posizione (e rispettivamente per chiudere la precedente). Avete diverse impostazioni per comprare e diverse impostazioni per vendere. Per quanto ho capito, questo è il trucco. Per esempio nei trend rialzisti, è più redditizio usare impostazioni meno sensibili per comprare, per permettere ai profitti di "crescere" (cioè ha senso tenere la posizione (cioè ha senso mantenere una posizione in un trend più a lungo). Mentre la vendita (up-trend) richiede impostazioni più sensibili per consentire entrate/uscite rapide, ad esempio quando si cerca di prendere una correzione (e quindi rimanere sul mercato con una posizione controtendenza per meno tempo). Tutto è molto logico e l'idea ha senso, ma c'è un punto sottile su questo sistema - cosa fare se due segnali opposti si verificano contemporaneamente a causa di differenze nelle impostazioni (infatti, per il terminale sono due indicatori)?

A proposito delle frecce blu...

L'Expert Advisor su una barra riceve un segnale di acquisto e di vendita allo stesso tempo, e come ho scritto sopra, quando si apre una posizione quella opposta dovrebbe essere chiusa. In questo caso, il segnale di acquisto viene dato e il segnale di vendita viene chiuso; se non c'è vendita entro quel momento, il consulente apre ACQUISTA. Al prossimo tick, viene generato il segnale opposto, per vendere, e quindi l'acquisto appena aperto viene chiuso. Un'altra osservazione, avete notato che solo l'acquisto (molte frecce blu) "traballa"? L'implementazione dei metodi di acquisto/vendita, per quanto ho capito, è presa dal tutorial, ma c'è una caratteristica, che dopo il completamento dell'operazione, l'uscita dal metodo start() da operatore return, cioè per un tick ci può essere solo un'apertura/chiusura. Così, quando ricevo un "doppio segnale", tutte le operazioni vengono chiuse (il blocco di chiusura viene descritto per primo), poi il blocco di apertura delle operazioni, e in esso l'acquisto viene descritto per primo!!!, e dopo l'acquisto, uscire da start(), in modo che l'advisor non abbia il tempo di arrivare alle vendite :))) e fare un loop fino a quando non riceve un ordine singolo "normale".

Sui metodi di soluzione...

Ci sono diversi modi per risolvere questo problema.
1. Quello vecchio stile.
Per cominciare si può "uccidere" l'idea, e semplicemente impostare gli stessi parametri per gli acquisti e le vendite e il problema sparirà da solo.

2. Complicato.
L'algoritmo di determinazione della tendenza principale dovrebbe essere scritto nell'Expert Advisor e, di conseguenza, dovrebbero essere impostati diversi "pesi" dei trade. Quindi, quando arrivano segnali opposti, la preferenza va data a quello che ha un "peso" maggiore (cioè quello che è in tendenza).

3. senza titolo.
Quando si ricevono segnali multidirezionali...
Non fare nulla.

if(Opn_B && Opn_S)return;

Questa è esattamente l'opzione nel file allegato qui sotto.
Spero di aver spiegato tutto chiaramente.
Buona fortuna :)))

File:
11_3_1.mq4  13 kb
 

Il post di Volfram è stato cancellato per essersi moltiplicato in diversi thread.

Volfram, hai creato il tuo thread appositamente per questo scopo. Le è già stata data una risposta; non è abbastanza?

P.S. Lascia che ti dica un segreto, Volfram: l'assenza di interesse evidente per la tua idea suggerisce implicitamente che non è degna di attenzione. Di conseguenza, nessuno era disposto ad implementarlo "a pagamento".

 
ToLik_SRGV:

2. Complicato.
Dovremmo integrare l'algoritmo di determinazione della tendenza principale nell'Expert Advisor e quindi dare diversi "pesi" ai trade. Quindi, quando arrivano segnali opposti, la preferenza va data a quello che ha un "peso" maggiore (cioè quello che è in tendenza).

3. senza titolo.
Al ricevimento di segnali diversamente diretti ...
Non fare nulla.

Questa è esattamente l'opzione nel file allegato qui sotto.
Spero di aver spiegato tutto chiaramente.
Buona fortuna :)))

Posso aggiungere anche la mia pietra miliare... :)

Ho anche iniziato da un libro di testo. Si può semplificare: è sufficiente rimuovere la chiusura di acquisto su un segnale di vendita e la chiusura di vendita su un segnale di acquisto, cioè non usare lo swing trading, che è stato implementato nel tutorial di Sergey Kovalev... Il tracciamento delle posizioni non dovrebbe essere fatto dal biglietto, ma dal mago. All'inizio l'ho fatto e ho testato tranquillamente le mie idee. Poi ho scritto le mie funzioni per lavoro...

ZS. Non ho guardato il codice, quindi potrei sbagliarmi su questo EA...

 

Non riesco a capire come trovare gli estremi di una funzione

Ho un array di dati che memorizza valori:

come trovare le fratture - estremi utilizzando un array di dati di 250 elementi e memorizzare solo i numeri degli elementi in cui si trovano questi estremi

 

Ragazzi, ho questa domanda:

La funzione di rilevamento della tendenza afferma esplicitamente che se l'AC sulla prima barra è maggiore dell'AC sulla seconda barra (cioè in aumento), ma la tendenza è al ribasso (altri indici mostrano giù), allora in questo caso restituisce zero, cioè nessuna tendenza al ribasso... Ma l'EA lo ignora ostinatamente, quale può essere la ragione?


La funzione dell'inversione di tendenza:

int Trend_BBOsMA (string sy, int tf)
{
   if (sy=="" || sy=="0") sy=Symbol();
double
   BB    =iCustom(sy,tf,"BB_MA",13,13,0,1),
   OsMA  =iOsMA  (sy,tf,9,21,5,PRICE_CLOSE,1),
   AC1   =iAC(sy,tf,1),
   AC2   =iAC(sy,tf,2),
   AC3   =iAC(sy,tf,3);
   
   if (BB>0 && OsMA>0 && AC1>AC2) return(1);
   if (BB<0 && OsMA<0 && AC1<AC2) return(-1);
   else return(0);
}

Controllo delle azioni di apertura (all'inizio, controllo del trend, al quale non reagisce: trH1 e trM15 ) - ulteriori esperimenti con le condizioni, non importa, ma il codice funziona...

//============================================================================================== 
   // Доливка 1
//==============================================================================================  
//------------------------- Покупка 1 ------------------------   
   if (AddPose1 &&
         trH1==1 &&                  // Если часовой и 
         trM15==1 &&                 // пятнадцатиминутный тренды восходящие
         Mom5_1>Mom5_2 &&              // найден разворот
         Mom5_2<=Mom5_3 &&             // Моментума
//         Mom5_2<=100.0 &&
//         DeM5_1<=0.6 &&                  // и Демаркер в зоне перепроданности
//         AC1>AC2 &&                    // Ускорение вверх ----------------------- ВОТ ЗДЕСЬ УБРАЛ
         SecondsAfterOpenLastPos(NULL, OP_BUY, 511)>=4*60
      )
         {
            Magic=511;          // Задаём магик... 
            Lots=GetSizeLot();
            divider=1;
//            if (trH1==10 || trM15==10) divider=2;
            Lots_New=NormalizeLot(Lots/divider, true, NULL);
            New_Comm="Buy_M5_Стратегия_1_Доливка1";   // Задаём комментарий для позиции
            OpenPosition(NULL, OP_BUY, Lots_New, 0, 0, Magic, New_Comm);
         }
//------------------------- Продажа 1 ------------------------   
   if (AddPose1 && 
         trH1==-1 &&                 // Если часовой и 
         trM15==-1 &&                // пятнадцатиминутный тренды нисходящие
         Mom5_1<Mom5_2 &&              // найден разворот
         Mom5_2>=Mom5_3 &&             // Моментума
//         Mom5_2>=100.0 &&
//         DeM5_1>=0.4 &&                  // и Демаркер в зоне перекупленности
//         AC1<AC2 &&                    // Ускорение вниз ------------------------ ВОТ ЗДЕСЬ УБРАЛ
         SecondsAfterOpenLastPos(NULL, OP_SELL, 511)>=4*60
      )
         {
            Magic=511;          // Задаём магик... 
            Lots=GetSizeLot();
            divider=1;
//            if (trH1==-10 || trM15==-10) divider=2;
            Lots_New=NormalizeLot(Lots/divider, true, NULL);
            New_Comm="Sell_M5_Стратегия_1_Доливка1";   // Задаём комментарий для позиции
            OpenPosition(NULL,OP_SELL,Lots_New,0,0,Magic,New_Comm);
         }
//==============================================================================================

Forse qualcuno vedrà qualcosa che io non vedo? Grazie.

 
Lo screenshot non mostra l'indicatore BB_MA. E non ci sono controlli sulla direzione della tendenza nel codice superiore. La variabile BB conterrà sempre un valore. Per quanto ho capito, l'indicatore BB_MA è una media mobile. Per determinare la direzione della media mobile si dovrebbero avere 2 valori su candele diverse, per esempio sulla prima e sulla seconda candela e confrontare questi valori tra loro. Quindi possiamo dire che il codice superiore svolge il suo compito solo parzialmente.
 
IgorM:

Non riesco a capire come trovare gli estremi di una funzione

Ho un array di dati che memorizza valori:

come trovare le fratture - estremi utilizzando un array di dati di 250 elementi e memorizzare solo i numeri degli elementi in cui si trovano questi estremi


Creiamo un ciclo in cui scorriamo i valori dell'array. Il valore nella cella precedente della matrice viene confrontato con il valore nella cella corrente. Se è superiore, passiamo alla prossima iterazione del ciclo. In breve, continuiamo il ciclo finché il valore in ogni cella successiva dell'array viene incrementato. Non appena il valore diventa più piccolo del precedente, memorizziamo il numero della cella precedente in un array pre-dichiarato, perché si è verificata una rottura di tendenza - abbiamo trovato il picco. Ora la tendenza va verso il basso. Ora si esegue la ricerca fino a quando la cella successiva trova un valore più alto del precedente. Una volta che questo accade, il numero della cella precedente viene memorizzato in un array predefinito, perché si è verificata un'inversione di tendenza - abbiamo trovato il fondo della depressione. Puoi mettere i numeri in diverse matrici, per filtrare i picchi dalle depressioni. In breve, dopo aver esaminato tutti i valori dell'array, otteniamo dati ordinati (cercando i numeri delle celle in uno/due altri array)
 
drknn:

Impostiamo un ciclo in cui scorriamo i valori dell'array. Il valore nella cella precedente della matrice viene confrontato con il valore nella cella corrente. Se è superiore, passiamo alla prossima iterazione del ciclo. In breve, continuiamo a iterare fino a quando il valore in ogni cella successiva dell'array viene incrementato. Non appena il valore diventa più piccolo del precedente, memorizziamo il numero della cella precedente in un array pre-dichiarato, perché si è verificata una rottura di tendenza - abbiamo trovato il picco. Ora la tendenza va verso il basso. Ora si esegue la ricerca fino a quando la cella successiva trova un valore superiore a quello precedente. Una volta che questo accade, il numero della cella precedente viene memorizzato in un array predefinito, perché si è verificata un'inversione di tendenza - abbiamo trovato il fondo della depressione. Puoi mettere i numeri in diverse matrici, per filtrare i picchi dalle depressioni. In breve, dopo aver esaminato tutti i valori dell'array, otteniamo dati ordinati (cercando i numeri delle celle in uno/due altri array)

Sì, quindi dobbiamo provare mentre - che è fino al primo picco, e poi ........ - Non riesco a capirlo.
 
drknn:
Lo screenshot non mostra l'indicatore BB_MA. E non ci sono controlli sulla direzione della tendenza nel codice superiore. La variabile BB conterrà sempre un valore. Per quanto ho capito l'indicatore BB_MA è una media mobile. Per determinare la direzione della media mobile si dovrebbero avere 2 valori su candele diverse, per esempio sulla prima e sulla seconda candela e confrontare questi valori tra loro. Quindi possiamo dire che il codice superiore soddisfa solo in parte il suo scopo.

No, BB_MA è la Bears&Bulls_MA, che somma i valori dei tori e degli orsi e li visualizza come un istogramma, qualcosa come McDuck o qualcosa di simile. Sempre quando l'istogramma è sopra lo zero è in tendenza verso l'alto, quando è sotto è in tendenza verso il basso...

Pertanto, controllare la direzione della tendenza è:

if (BB>0 && OsMA>0 && AC1>AC2) return(1);

per UP e

if (BB<0 && OsMA<0 && AC1<AC2) return(-1);

per DOWN, bene e

 else return(0);

per Flat.

Cioè la funzione restituisce 1 se Bears&Bulls_MA è sopra lo zero, OsMA è sopra lo zero e il valore della prima barra AC è maggiore del valore della seconda barra AC,

e viceversa per la tendenza al ribasso. Bene, per il piano, tutte le altre differenze nei grafici (per ora..., più tardi, quando l'avrò sistemato, collegherò il controllo del movimento con l'accelerazione/decelerazione e l'inversione).

Leposizioni dovrebbero essereaperte solo quando c'è un inequivocabile "trend up" o "trend down"... Fondamentalmente, tutto funzionava, fino a quando ho aggiunto AC per controllare la velocità del movimento delle valute, in modo da escludere (parzialmente) l'apertura di posizioni alla fine del movimento, all'esaurimento del trend o alla correzione.

Finora non funziona... ed esattamente AC.

 
IgorM:

Sì, quindi dobbiamo provare per un po' - che è fino al primo picco e poi ........ - Non riesco a capirlo.

No - il ciclo dovrebbe essere fatto attraverso for. Cercherò di inventare una sceneggiatura. L'idea è effettivamente fattibile.
Motivazione: