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

 
artmedia70:

Non voglio avere a che fare con il tuo codice (malvagio, ma onesto :)). Dimmi esattamente cosa vuoi ottenere alla fine e ti scriverò la funzione di cui hai bisogno. Onestamente - sarà più facile per me. Dovrei risolvere il mio codice... :)

... Oppure vai a letto, dormi un po', e l'indomani tutti i tuoi puzzle si metteranno insieme... :) Ecco cosa faccio quando non capisco... A proposito, vado a letto - sono già le 5 e mezza del mattino...


Dopo che l'ordine è stato impostato, le variabili che servivano come criteri per l'ordine dovrebbero essere impostate di nuovo a "0",

 
Chi lo sa. Come posso ottenere il rapporto del movimento dell'indicatore (sulla sua scala), per esempio RSI, con il rapporto dei tick di valuta passati? Per esempio, se l'RSI è passato da 0 a 50, a quanti tick corrisponde?
 
Infinity:
Chi lo sa. Come posso ottenere il rapporto del movimento dell'indicatore (sulla sua scala), per esempio RSI, con il rapporto dei tick passati della valuta? Per esempio, se l'RSI è passato da 0 a 50 - a quanti punti sarà uguale?

Cattura l'ultimo valore dell'indicatore RSI su una candela zero. Aspettiamo il prossimo tick. Il tic è arrivato. Lasciate che il prezzo spunti esattamente 1 punto. Guarda quanto è cambiato l'RSI. Questo è quanto - le probabilità sono in tasca.
 
drknn:

Cattura l'ultimo valore dell'indicatore RSI sulla candela zero. Aspettiamo il prossimo tick. La zecca è qui. Supponiamo che il prezzo sia sceso esattamente di 1 punto. Guarda quanto è cambiato l'RSI. Questo è tutto - il coefficiente è nella nostra tasca.

Ma allora come è possibile, per esempio, ho preso il coefficiente di 1 punto, RSI è passato sulla sua scala di 50, si scopre che ha superato 50 punti, ma in realtà era un piatto. E la candela ha 2 punti. Quindi come determinare in questo caso
 
cyclik33:

Caro Anatoly. Grazie mille per questo codice. Un'altra domanda, come farlo funzionare sempre ma fare solo 1 affare per barra?

Boris, beh, è ancora più semplice di così. Tu lasci cadere questa linea:

datetime new;

All'inizio del codice (separatamente, non in nessuna funzione).
E poi, in quei posti dove c'è una chiamata della funzione OrderSend(...), basta racchiuderla in un ulteriore abbraccio dell'operatore if

if(new != Time[0]){
   new = Time[0];
   // здесь функция OrderSend(...);
}

Ora, prima di aprire un'altra posizione, controllerà se la barra corrente contiene o meno dei trade. Se ci fosse, la barra corrente sarà memorizzata nella variabile new e se la barra corrente è la stessa di quella memorizzata, il trade non sarà aperto. Di conseguenza, se la barra è nuova, allora il suo tempo di apertura non coinciderà con i dati della variabile new, l'affare sarà aperto e la variabile new avrà un nuovo valore.

Non conosco esattamente l'architettura del tuo Expert Advisor, ma questo metodo dovrebbe funzionare nella maggior parte dei casi.

 
FoxUA:

Dopo che l'ordine è stato impostato, le variabili che erano i criteri per l'ordine dovrebbero essere impostate di nuovo a "0",


Ho provato a compilare il tuo codice, ha generato degli errori.
Dovete usare le variabili che sono state usate come criterio per piazzare un ordine in due metodi(start() e NewOrder1()), dichiarandole fuori da tutte le funzioni:

bool b,s, //соответственно бай или селл  
bs,// если закрытие по стоплоссу ордера бай
ss,// если закрытие по стоплоссу ордера sell
bt,
st;//      то же по ТП
double bl,sl; // лоты соответсвенно для бай и селл
poi nel ciclo for
for(int cnt=OrdersHistoryTotal();cnt>0;cnt--)
     {
OrderSelect(cnt, SELECT_BY_POS, MODE_HISTORY);
{if(OrderMagicNumber()== mag &&
OrderSymbol()==Symbol()) 
{ if (OrderType() == OP_BUY )  {b=1; if (OrderClosePrice()==OrderTakeProfit()) bt=1; if (OrderClosePrice()==OrderStopLoss()) bs=1; bl=OrderLots()*10; break;}
if (OrderType() == OP_SELL)  {s=1; if (OrderClosePrice()==OrderTakeProfit()) st=1; if (OrderClosePrice()==OrderStopLoss()) ss=1; sl=OrderLots()*10; break;}
            }
         }
      }


}//end

Dovrebbero essere assegnati i valori necessari, e dopo che l'ordine è stato aperto con successo nella funzione NewOrder1(), dovrebbero essere azzerati anche lì.

int NewOrder1(int Cmd,double Lot)
{double TP=0; //тейкпрофит
double SL=0; //стоплосс
double PR=0; //Цена
double LT=0; //Лот
while(!IsTradeAllowed()) Sleep(100);
if(Cmd==OP_BUYLIMIT)
   {PR=Ask-Point*h;
    if(TakeProfit>0) TP=PR+TakeProfit*Point;
    if(StopLoss>0) SL=PR-StopLoss*Point;
    if(Lot>0) LT=3*Lot;}
int tic1=OrderSend(Symbol(),Cmd,LT,PR,3,SL,TP,0,mag,0,CLR_NONE);
//-----------
if(tic1<0){
   Print(GetLastError());
}else{
b=0;
s=0; 
bs=0;
ss=0;
bt=0;
st=0;
bl=0;
sl=0;
}
//-----------
return(0);}

Qualcosa del genere.

 
Infinity:

Chi lo sa. Come si può ottenere il rapporto del movimento dell'indicatore (sulla sua scala) per esempio RSI, con il rapporto dei tick attraversati dalla valuta? Per chiarire, se RSI è andato per esempio da 0 a 50 - quanti tick sarà uguale.

Una volta ho avuto un obiettivo simile, così ho scritto un "righello" come questo, forse potrebbe funzionare anche per te.

//+------------------------------------------------------------------+
int get_pips_RSI_path(int home_shift, int end_shift){
   double home_index, end_index;
   double home_price, end_price;
   int path;
   
   home_index = iRSI(NULL,0,14,PRICE_CLOSE,home_shift);
   home_price = Close[home_shift];
   end_index = iRSI(NULL,0,14,PRICE_CLOSE,end_shift);
   end_price = Close[end_shift];
   
   if(end_price > home_price)path = (end_price - home_price)/Point; else path = (home_price - end_price)/Point;
   
   Alert("Между значениями RSI ", home_index, " и ", end_index, " было пройденно ", path, " пунктов.");
   return(path);
}
//+------------------------------------------------------------------+

Come parametri si inviano turni di barre con i valori RSI desiderati, in risposta si ottiene la distanza tra loro in pip.

 
ToLik_SRGV:

Una volta ho avuto un obiettivo simile, così ho scritto un "righello" come questo, forse potrebbe funzionare anche per te.

Come parametri si inviano gli spostamenti delle barre in cui si trovano i valori RSI desiderati, in risposta si ottiene la distanza tra loro in pip.


Grazie, lo controllerò stasera

Ho la forte sensazione che il test sulla storia dell'Expert Advisor non darà un buon risultato a causa dell'incompletezza della storia delle citazioni. Capisco che la cronologia delle quotazioni è formata dall'archiviazione del mercato attuale (quotazioni a candela), ma come si può fare affidamento sul risultato, se le quotazioni reali (almeno nel mio caso) volano attraverso, a volte per 40 minuti solo senza candele, il grafico sta, poi vola tutta la stessa candela.

 
ToLik_SRGV:

Forse non sei riuscito a trovare una combinazione di parametri vantaggiosa, prova a deselezionare l'opzione "Ignora risultati inutili".

E non dimenticare di controllare le caselle di controllo nelle impostazioni di Expert Advisor per i parametri che vuoi ottimizzare, così come impostare i limiti di passo e di ottimizzazione.

Grazie, è vero, "Salta i risultati inutili" è spuntato.
 
artmedia70:


Amici, non riesco a capire come sbarazzarmi dei segnali inutili che appaiono quando la linea di tendenza è invertita. La linea di tendenza (discendente nell'esempio) è tracciata dall'estremo più grande all'estremo più piccolo, trovato entro un determinato intervallo di barre. Il problema è che non appena appare un nuovo estremo inferiore, la linea di tendenza salta a quell'estremo (è progettata così).

Ma, anche sulla prima barra la linea di tendenza costruisce livelli con il valore della linea di tendenza, il cui attraversamento da parte della linea dell'indicatore dà un segnale. Se la linea dell'indicatore sulla prima barra è sotto questo livello e sulla seconda barra è sopra questo livello, allora abbiamo un crossover top-down.

Quindi... Quando la linea di tendenza salta ad un nuovo estremo inferiore, si crea una situazione in cui la linea dell'indicatore sulla seconda barra è sopra la linea di tendenza e sotto il livello tracciato e sulla prima barra, cioè un segnale di vendita non necessario (in questo caso):


Possiamo vedere nell'immagine che il trend si è spostato verso un nuovo estremo (la posizione è segnata da una freccia verso il basso) e il livello di prezzo del nuovo trend sulla prima barra (linea orizzontale rossa)
è diventato inferiore alla linea AD sulla seconda barra e la linea AD sulla prima barra è inferiore al livello di prezzo...
Di conseguenza, spostando la linea di tendenza ad un estremo inferiore è stato simulato un segnale indesiderato... Lo stesso segnale inutile si è verificato prima -
L'ho segnato con una linea azzurra verticale...

Da qui la domanda: come evitare questa situazione? Sono esausto nel cercare di pensare a qualcosa...
Qualche pensiero? Grazie... :)



Mi sembra di capire che il segnale di trading dovrebbe verificarsi quando la linea dell'indicatore incrocia la linea di tendenza, e non viceversa, e uas in entrambi i modi. Mantieni i valori precedenti della posizione della linea di tendenza nelle variabili statiche e se non sono cambiati, controlla un crossover, se la linea di tendenza ha cambiato posizione - resetta...

Motivazione: