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

 
Alexey Viktorov:

E non può esserci altro. Nessun computer conosce un anno in meno del 1970. Inizia con l'anno che appare nelle quotazioni del broker.

Capisco) Grazie.
 
Aleksey Vyazmikin:

Codice in MT5

Risultato:


SZZY: Ho cambiato il codice - era da ME sbagliato.

Non ho capito subito l'idea. Non l'ho fatto in mql5, dovrò capirlo. Ma potete farlo in mql4 nel modo seguente:

Creare due buffer aggiuntivi.

Impostare un offset per N barre e riempire queste N barre con l'ultimo valore dei buffer principali.

E naturalmente l'indice N+1 di questi buffer aggiuntivi si riempie di valore vuoto.

 
Alexey Viktorov:

Non ho capito subito l'idea. Non l'ho fatto in mql5, dovrò capirlo. Ma in mql4 si può fare nel modo seguente:

Creare due buffer aggiuntivi.

Impostate un offset per loro di N barre e riempite queste N barre con l'ultimo valore dei buffer principali.

E naturalmente l'indice N+1 di questi buffer aggiuntivi si riempie di valore vuoto.


Grazie per l'idea - inizialmente l'ho fatto in MT5, poi l'ho ottimizzato.

Comunque, sono andato a letto alle 4 del mattino (il codice pubblico non è completo, ovviamente), ma ho fatto quello che volevo con due buffer.

Il problema era che in MT5 il riempimento è da sinistra a destra, e in MT4 è viceversa. La funzioneArraySetAsSeries non ha aiutato - ho riscritto tutta la logica in effetti.

 

Buon pomeriggio, Artem!

Vorrei chiedere aiuto per la mia rielaborazione di TrExp_Nik ver. Voglio aggiungere la possibilità di spostarlo a Breakeven, ma le mie limitate capacità di programmazione non mi permettono di farlo. Ho deciso di utilizzare e-MovingInWL il cui codice sto cercando di integrare nel mio EA, ma non riesco a combinare correttamente le variabili o non capisco correttamente il codice del secondo Breakeven Expert Advisor. Forse questa non è la variante ottimale. Vorrei chiedervi un consiglio su come renderlo migliore o più facile.

 
niktach:

Buon pomeriggio, Artem!

Vorrei chiedere aiuto per la mia rielaborazione di TrExp_Nik ver. Voglio aggiungere la possibilità di spostarlo a Breakeven, ma le mie limitate capacità di programmazione non mi permettono di farlo. Ho deciso di utilizzare e-MovingInWL il cui codice sto cercando di integrare nel mio EA, ma non riesco a combinare correttamente le variabili o non capisco correttamente il codice del secondo Breakeven Expert Advisor. Forse questa non è la variante ottimale. Vorrei chiedervi un consiglio su come migliorarlo o semplificarlo.

Buona giornata. Cosa avete cercato di fare esattamente? Vedo solo due codici allegati. Se hai bisogno di qualcuno che faccia tutto per te, è a questo che serve il freelance.

E se stai cercando di farlo da solo, allora mostrami esattamente cosa stai facendo e dove non capisci.

 

Salve,

C'è un modo per arrivare programmaticamente alle proprietà dell'oggetto grafico "triangolo" posto sul grafico? Intendo le coordinate di tempo e di prezzo dei vertici, che sono visualizzate nella scheda "Parametri" quando il modulo delle proprietà è aperto in modo interattivo. Ho provato a usare le funzioniObjectGetInteger e ObjectGetDouble, ma possono ottenere dati solo su un vertice.

Grazie.

 
oddball:

Salve,

C'è un modo per arrivare programmaticamente alle proprietà dell'oggetto grafico "triangolo" posto sul grafico? Intendo le coordinate di tempo e di prezzo dei vertici, che sono visualizzate nella scheda "Parametri" quando il modulo delle proprietà è aperto in modo interattivo. Ho provato a usare le funzioni ObjectGetInteger e ObjectGetDouble, ma possono ottenere dati solo su un vertice.

Grazie.

Sì, è possibile. E la direzione del pensiero è corretta. Puoi mostrarmi come hai cercato di ottenere i parametri?

 
Artyom Trishkin:

Quando l'ordine è selezionato per ticket, non c'è bisogno di specificare pool - MODE_TRADES è ridondante qui - questo parametro è ignorato quando si seleziona per ticket e l'ordine è selezionato da una delle due liste - dalla lista delle posizioni chiuse o dalla lista delle posizioni di mercato - dipende se la posizione è chiusa o non ancora.

Dopo aver selezionato con successo un ordine in base al ticket, per capire da quale delle due liste l'ordine è stato selezionato, è necessario controllare il tempo di chiusura della posizione - se è superiore a zero, allora l'ordine è già stato chiuso ed è stato selezionato dalla lista degli ordini storici, altrimenti - l'ordine è ancora sul mercato.

Ma per capire dove hai un errore, devi allegare il codice - dare più informazioni, perché non c'è nessun errore in questa linea in linea di principio (tranne che non controlli il risultato di ritorno della funzione, usi un modificatore che è ignorato in questo caso e non c'è ";" dopo la parentesi di chiusura).


Grazie mille per la risposta.

Ecco l'intera funzione, il punto è che apre un ordine e poi aggiunge valori costanti di stop loss e take profit tramite modifica.

L'ordine è aperto ma stop loss e take profit non sono impostati (la funzione di calcolo in rosso, in cuiOrderSelect(Ticket,SELECT_BY_TICKET,MODE_TRADES) dà un errore ((() )

/Funzione ordine aperto, variabili: simbolo, tipo di ordine, lotto, prezzo aperto, metodo di calcolo TP e SL (0 - impostato nel prezzo, 1 - impostato in punti che dovrebbero essere calcolati dal prezzo aperto), stop loss, take profit)

//Symbol/Pair, tipo di ordine aperto - in sospeso, prezzo aperto, switch = 1, SL B TP - i valori di Stop Loss e Take Profit sono costanti!

bool SendOrder(string Symb,int Type, double OP,int Mode) {
colore CL;
double Pp = MarketInfo(Symb, MODE_POINT);
if (Type==0) CL=Blue;
if (Type==1) CL=Red;
if (Type==2 || Type==4) CL=DarkTurquoise;
if (Type==3 || Type==5) CL=Orange;
//verview volume
if(MarketInfo(Symb,MODE_LOTSTEP)==0.01) DG=2; altrimenti DG=1;
if (Lot<MarketInfo(Symb,MODE_MINLOT)) Lot=MarketInfo(Symb,MODE_MINLOT);
if (Lot>MarketInfo(Symb,MODE_MAXLOT)) Lot=MarketInfo(Symb,MODE_MAXLOT);
if (Lot*MarketInfo(Symb,MODE_MARGINREQUIRED)>AccountEquity()) {
PnC(StringConcatenate("Non ci sono abbastanza soldi per aprire il trade",Tipo," ",DoubleToStr(Lot,DG)),0);
return;
}
// controlla gli ordini in sospeso
/*
double Slv = MarketInfo(Symb,MODE_STOPLEVEL)*Pp;
if (Type>1) {
if (Type==2 && MarketInfo(Symb,MODE_ASK)-OP<Slv) OP=MarketInfo(Symb,MODE_ASK)-Slv;
if (Type==3 && OP-MarketInfo(Symb,MODE_BID)<Slv) OP=MarketInfo(Symb,MODE_BID)+Slv;
se (Type==4 && OP-MarketInfo(Symb,MODE_ASK)<Slv) OP=MarketInfo(Symb,MODE_ASK)+Slv;
if (Type==5 && MarketInfo(Symb,MODE_BID)-OP<Slv) OP=MarketInfo(Symb,MODE_BID)-Slv;
}
*/
RefreshRates();
int Min_Dist = MarketInfo(Symb,MODE_STOPLEVEL); //Limite livello di stop loss/stake profit in punti. Distanza minima
double Tek_Ask = MarketInfo(Symb,MODE_ASK); //L'ultimo prezzo di vendita ricevuto. Viene memorizzato nella variabile predefinita Ask per il simbolo corrente
double Tek_Bid = MarketInfo(Symb,MODE_BID); //l'ultimo prezzo di offerta ricevuto. Viene memorizzato nella variabile predefinita Bid per il simbolo corrente
double Tek_Point = MarketInfo(Symb,MODE_POINT); //Dimensione del punto nella valuta della quotazione. È memorizzato nella variabile predefinita Point
int Tek_Digits = MarketInfo(Symb,MODE_DIGITS);//Il numero di cifre dopo il punto decimale nel prezzo del simbolo. È memorizzato nella variabile predefinita Digits

double Slv = NormalizeDouble(Min_Dist*Tek_Point,Tek_Digits);
if (Type>1) {
if (Type==2 && Tek_Ask - OP < Slv) OP = Tek_Ask - Slv;
se (Tipo==3 && OP - Tek_Bid < Slv) OP = Tek_Bid + Slv;
se (Tipo==4 && OP - Tek_Ask < Slv) OP = Tek_Ask + Slv
if (Type==5 && Tek_Bid - OP < Slv) OP = Tek_Bid - Slv;
}
// controlla gli stop
if (SL!=0 || TP!=0) {
if (Mode==0) {
if (MathAbs(OP-SL)<Slv && SL!=0) {
if (Type==0 || Type==2 || Type==4) SL=OP-Slv; else SL=OP+Slv;
}
if (MathAbs(OP-TP)<Slv && TP!=0) {
if (Type==0 || Type==2 || Type==4) TP=OP+Slv; else TP=OP-Slv;
}
}else{
if (SL*Pp<Slv && SL!=0) SL=Slv/Pp;
if (TP*Pp<Slv && TP!=0) TP=Slv/Pp;
}
}
// ottobre
for(int k=0;k<=TryToTrade;k++) {
if (Type==0) OP=MarketInfo(Symb,MODE_ASK);
if (Type==1) OP=MarketInfo(Symb,MODE_BID);
PnC(StringConcatenate("Trying to open an order, type: ",Tipo," volume: ",Lotto," prezzo: ",OP),0);
if (IsTradeAllowed()) {
int Ticket=OrderSend(Symb,Type,Lot,NormalizeDouble(OP,MarketInfo(Symb,MODE_DIGITS)),3,0,0,NULL,Tek_Magic,0,CL);
}else{ PnC(StringConcatenate("Cannot open order ",k),0;) Sleep(3000); continua; }
if (Ticket >= 0) { PnC(StringConcatenate("Ordine aperto ",Ticket),0); break; }
LastError=Fun_Error(GetLastError());
if (LastError==0) {
RefreshRates(); Sleep(WaitTime);
if (k==TryToTrade) return(false); }
if (LastError==1) return(false);
if (LastError==2) { Work=false; return(false); }
}
// imposta gli stop
OrderSelect(Ticket,SELECT_BY_TICKET,MODE_TRADES);
if (SL==0 && TP==0) return;
if (Mode==1) {
if (SL!=0) {
if (Type==0 || Type==2 || Type==4) SL=OrderOpenPrice()-SL*Pp;
if (Type==1 || Type==3 || Type==5) SL=OrderOpenPrice()+SL*Pp;
}
if (TP!=0) {
if (Type==0 || Type==2 || Type==4) TP=OrderOpenPrice()+TP*Pp;
if (Type==1 || Type==3 || Type==5) TP=OrderOpenPrice()-TP*Pp;
}
}

for(k=0;k<=TryToTrade;k++) {
PnC(StringConcatenate("Trying to set stops on an order: ",Ticket," s/l: ",SL," t/p: ",TP),0);
if (IsTradeAllowed()) {
//TickeT=OrderModify(Ticket,NormalizeDouble(OrderOpenPrice(),MarketInfo(Symb,MODE_DIGITS)),NormalizeDouble(Symb,MarketInfo(Symb,MODE_DIGITS)),NormalizeDouble(TP,MarketInfo(Symb,MODE_DIGITS)),0,CLR_NONE);
TickeT=OrderModify(Ticket,NormalizeDouble(OrderOpenPrice(),MarketInfo(Symb,MODE_DIGITS)),NormalizeDouble(SL,MarketInfo(Symb,MODE_DIGITS)),NormalizeDouble(TP,MarketInfo(Symb,MODE_DIGITS)),0,CLR_NONE)
}else{ PnC(StringConcatenate("Impossibile modificare l'ordine ",k),0); Sleep(3000); continue; }
if (TickeT == true) { PnC(StringConcatenate("Order Modified ",Ticket),0); break; }
LastError=Fun_Error(GetLastError());
if (LastError==0) {
RefreshRates(); Sleep(WaitTime);
if (k==TryToTrade) return(false); }
if (LastError==1) return(false);
if (LastError==2) { Work=false; return(false); }
}
return(true);

}

 

Qualcuno può spiegare perché esce l'errore 131"volume sbagliato" quando si modifica un ordine?

Il pendente si apre normalmente, il lotto è normalizzato, quando esce in stampa il lotto minimo è 0,01, che non è inferiore al mio volume (conto demo)

Ho riletto tutto sul forum e non ho trovato il problema!

Mi sto ancora chiedendo cosa succede dietro le quinte e cosa non viene descritto.
 
forexman77:

Qualcuno può spiegare perché esce l'errore 131"volume sbagliato" quando si modifica un ordine?

Il pendente si apre normalmente, il lotto è normalizzato, quando esce in stampa il lotto minimo è 0,01, che non è inferiore al mio volume (conto demo)

Ho riletto tutto sul mio forum ma non ho trovato il problema!

Basta non smettere di essere sorpresi da bug nascosti che emergono e non descritti.

Ho provato con un'altra società di intermediazione e non mi ha fatto cambiare idea. La domanda è perché quando si chiama:

double MinLot = MarketInfo(Symbol(),MODE_MINLOT);
double MaxLot = MarketInfo(Symbol(),MODE_MAXLOT);
Alert("MinLot=",MinLot,"MaxLot=",MaxLot);  

detrae 0,01, e il bot stampa 131?

Motivazione: