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

 
forexman77:

L'ho provato su un altro DC e sembra andare bene. La domanda è perché la chiamata:

emette 0,01, ma stampa 131 sul bot?

I lotti devono essere normalizzati quando vengono passati alla funzione.

 
Artyom Trishkin:

I lotti devono essere normalizzati quando vengono trasferiti alla funzione.


In realtà, ho scritto che stavo normalizzando. C'è un limite al numero di lotti nell'auto-trading.

Non c'è bisogno di essere Capitan Ovvio qui.
 
forexman77:

In realtà, ho scritto che stavo normalizzando. C'è una sorta di limite al numero di lotti nell'auto trading.

Non fare il Capitan Ovvio qui.

Beh, cercate voi stessi, se è così che volete comunicare.

 
rabanik:

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 attraverso la 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);
se (Type==0) CL=Blu;
se (Type==1) CL=Red;
if (Type==2 || Type==4) CL=DarkTurquoise;
se (Type==3 || Type==5) CL=Orange;
//verifica del volume
se(MarketInfo(Symb,MODE_LOTSTEP)==0.01) DG=2; altrimenti DG=1;
se (Lotto<MarketInfo(Symb,MODE_MINLOT)) Lot=MarketInfo(Symb,MODE_MINLOT);
se (Lotto>MarketInfo(Symb,MODE_MAXLOT)) Lot=MarketInfo(Symb,MODE_MAXLOT);
se (Lot*MarketInfo(Symb,MODE_MARGINREQUIRED)>AccountEquity()) {
PnC(StringConcatenate("Not enough money to open the trade",Type," volume: ",DoubleToStr(Lot,DG)),0);
ritorno;
}
// controlla gli ordini in sospeso
/*
double Slv = MarketInfo(Symb,MODE_STOPLEVEL)*Pp;
se (Tipo>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;
if (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 pip. Distanza minima
double Tek_Ask = MarketInfo(Symb,MODE_ASK); //L'ultimo prezzo di scambio ricevuto. È memorizzato nella variabile predefinita Ask per il simbolo corrente
double Tek_Bid = MarketInfo(Symb,MODE_BID); //l'ultimo prezzo di offerta ricevuto. È 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 per il simbolo corrente
int Tek_Digits = MarketInfo(Symb,MODE_DIGITS);//Il numero di cifre dopo il punto decimale nel prezzo del simbolo. Per il simbolo corrente è memorizzato nella variabile predefinita Digits

double Slv = NormalizeDouble(Min_Dist*Tek_Point,Tek_Digits);
se (Tipo>1) {
if (Type==2 && Tek_Ask - OP < Slv) OP = Tek_Ask - Slv;
if (Type==3 && OP - Tek_Bid < Slv) OP = Tek_Bid + Slv;
if (Type==4 && OP - Tek_Ask < Slv) OP = Tek_Ask + Slv;
if (Type==5 && Tek_Bid - OP < Slv) OP = Tek_Bid - Slv;
}
// controllare le fermate
se (SL!=0 || TP!=0) {
se (Mode==0) {
se (MathAbs(OP-SL)<Slv && SL!=0) {
se (Type==0 || Type==2 || Type==4) SL=OP-Slv; altrimenti SL=OP+Slv;
}
se (MathAbs(OP-TP)<Slv && TP!=0) {
se (Tipo==0 || Tipo==2 || Tipo==4) TP=OP+Slv; altrimenti TP=OP-Slv;
}
}else{
se (SL*Pp<Slv && SL!=0) SL=Slv/Pp;
se (TP*Pp<Slv && TP!=0) TP=Slv/Pp;
}
}
//apertura
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("Attempting to open an order, type:",Type," volume:",Lot," price:",OP),0);
se (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());
se (LastError==0) {
RefreshRates(); Sleep(WaitTime);
se (k==TryToTrade) return(false); }
se (LastError==1) return(false);
if (LastError==2) { Work=false; return(false); }
}
// impostare 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 order: ",Ticket," s/l: ",SL," t/p: ",TP),0);
se (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("Cannot modify order ",k),0); Sleep(3000); continue; }
if (TickeT == true) { PnC(StringConcatenate("Ordine modificato ",Ticket),0); break; }
LastError=Fun_Error(GetLastError());
se (LastError==0) {
RefreshRates(); Sleep(WaitTime);
se (k==TryToTrade) return(false); }
se (LastError==1) return(false);
if (LastError==2) { Work=false; return(false); }
}
return(true);

}

Ora il prossimo errore sulla lineaif (Type==0 || Type==2 || Type==4) SL=OrderOpenPrice()-SL*Pp;. La funzione OrderOpenPrice() restituisce lo stesso errore - Expression could not be evaluated. Che casino!!!
 
rabanik:
Ora ecco il prossimo errore sulla lineaif (Type==0 || Type==2 || Type==4) SL=OrderOpenPrice()-SL*Pp;. La funzione OrderOpenPrice() restituisce lo stesso errore - Expression could not be evaluated. Che casino!!!

È tutto risolto. Scusa per la domanda stupida. Ho una variabile principale SL di tipo int.

E sto cercando di tornare a SL con il tipo doppio. Ma il sistema restituisce 1.

Grazie.

 

Qualcuno può suggerire come far funzionare un EA da un certo punto fino al suo inizio, senza continuare ad eseguire altri operatori.

 

Salve. La domanda è la seguente: l'EA non apre un trade di vendita. Puoi dargli un'occhiata?

 if (Digits==3||Digits==5) {sl=SL*10*Point;}
         else if (Digits==4||Digits==2) {sl=SL*Point;}
            if (OrdersTotal()==0)
              {
                if (Close[1]>TD2)
                OrderSend (Symbol(),OP_BUY,Lot,Ask,10,Ask-sl,0,NULL,Magic,0,clrBlue);
                else if (Close[1]<TD1)
                OrderSend (Symbol(),OP_SELL,Lot,Bid,10,Bid+sl,0,NULL,Magic,0,clrRed);
              }
 
6737998:

Qualcuno può suggerire come far funzionare un EA da un certo punto fino al suo inizio, senza continuare ad eseguire altri operatori.

Оператор возврата return - Операторы - Основы языка - Справочник MQL4
Оператор возврата return - Операторы - Основы языка - Справочник MQL4
  • docs.mql4.com
Оператор возврата return - Операторы - Основы языка - Справочник MQL4
 
danil77783:

Salve. La domanda è la seguente: l'EA non apre un trade di vendita. Puoi dargli un'occhiata?

Cos'è TD1 e dove gli viene assegnato un valore?
 

Amici, come uscire correttamente da questa situazione... L'indicatore disegna due linee orizzontali da CSV (Rosso - dall'inizio della giornata alla fine della giornata) Blu - Fascio proveniente dai giorni passati, a diversi livelli di prezzo. Ma ci sono giorni in cui questi livelli hanno lo stesso valore/prezzo. Qual è il modo giusto per uscire da questa situazione, in modo che quando le linee coincidono, il Raggio (Blu) sia visualizzato, e la linea Rossa non sia visibile sul grafico, ma fisicamente presente...cioè, sia trasparente.

Ora - Draw_Level("Red", red, DRAW_NONE, STYLE_SOLID,0); smette di disegnare la linea, ma il Ray non è visibile nemmeno da sotto. Grazie.