Domande dai principianti MQL4 MT4 MetaTrader 4 - pagina 71

 
Vitalie Postolache:

Da quando un periodo è un tipo Double?

È quello che sto dicendo, stringa+int è un errore

Ma se lo fai come ho scritto sopra, non ci sarà nessun errore.

 
Renat Akhtyamov:

È quello che sto dicendo: stringa+int è un errore.

Ma se lo fai come ho scritto sopra, non ci sarà nessun errore.


IntegerToString? No, non ho sentito ;)
 
Vitalie Postolache:

IntegerToString? No, non ho sentito ;)
Entrambi i modi funzionano bene, non vedo il problema
 

ciao a tutti

Sono nuovo della programmazione, ma sto cercando di imparare)

Ho un piccolo problema con la chiusura dell'ordine secondo le letture dell'indicatore

Posso capire subito le condizioni di apertura e chiusura di una posizione dalle letture dell'indicatore e chiudere l'ordine nella direzione opposta senza alcuno stop e profitto

se(r > 50 && p > m) //condizioni per l'apertura di un ordine di acquisto

{

ticketB = OrderSend(Symbol(),OP_BUY,0.1,Ask,5,0,0,",111,0,Green); //aprire ordine di acquisto

}

Sto scrivendo correttamente la condizione di chiusura dell'ordine?

if(r < 50 && p < m) --- questa è una condizione di vendita e una condizione di chiusura

{

OrderClose(ticketB,0.1,Bid,5,Red);

}

e stampa il possibile uso della variabile non inizializzata 'ticketB' e il valore di ritorno di 'OrderClose' dovrebbe essere controllato

Potete dirmi dove ho scritto male?



 
funnyrain8:

ciao a tutti

Sono nuovo della programmazione, ma sto cercando di imparare)

Ho un piccolo problema con la chiusura dell'ordine secondo le letture dell'indicatore

Posso capire subito le condizioni di apertura e chiusura di una posizione dalle letture dell'indicatore e chiudere l'ordine nella direzione opposta senza alcuno stop e profitto

se(r > 50 && p > m) //condizioni per l'apertura di un ordine di acquisto

{

ticketB = OrderSend(Symbol(),OP_BUY,0.1,Ask,5,0,0,",111,0,Green); //aprire ordine di acquisto

}

Sto scrivendo correttamente la condizione di chiusura dell'ordine?

if(r < 50 && p < m) --- questa è una condizione di vendita e una condizione di chiusura

{

OrderClose(ticketB,0.1,Bid,5,Red);

}

e stampa il possibile uso della variabile non inizializzata 'ticketB' e il valore di ritorno di 'OrderClose' dovrebbe essere controllato

Potreste dirmi dove ho scritto male?



La variabile ticketB non è inizializzata, cioè il suo tipo non è noto. In questo caso è Int

Il secondo errore è che dobbiamo controllare il risultato della chiusura dell'ordine per gli errori. Cerca "funzione di gestione degli errori" nel forum

 
Renat Akhtyamov:

la variabile ticketB non è inizializzata, cioè il tipo non è noto. In questo caso è Int.

Il secondo errore riguarda il controllo del risultato della chiusura dell'ordine per gli errori. Cerca "funzione di gestione degli errori" nel forum

Non riesco a capire bene la logica o sono rimbambito), ma come faccio? All'inizio ho provato a farlo usando OrderSelect ma era sbagliato)

Ho bisogno di alcune informazioni su questo.

 
funnyrain8:

è GetLastError? non riesco a capire la logica o sono un po' tonto) ma come impostarlo? all'inizio ho provato a fare tutto con OrderSelect, ma non è lo stesso)

Ho bisogno di alcune informazioni su questo.

Sì.

Guardate nel codebase - un sacco di esempi di implementazione.

 
Ciao, sono un venditore di segnali, vorrei sapere come puoi promuovere i tuoi segnali in modo che la gente si iscriva a loro?
 
Vitalie Postolache:


Dov'è la logica? Si imposta il lotto massimo consentito per il primo ordine e poi lo si aumenta per ogni ordine successivo. Non pensate che questo sia, per usare un eufemismo, poco sensato?

Inoltre, si diminuisce il lotto del primo ordine nel ciclo usando qualche metodo totalmente incomprensibile, mentre i lotti degli altri ordini, che sono stati "calcolati" prima, rimangono invariati, e questi valori non vanno oltre i limiti di questa funzione in nessun modo. Cosa fanno allora?

Senza contare che il ciclo di incremento non può essere un numero reale, deve essere un contatore, un intero. Ma voi impostate il valore del lotto come contatore e sottraete uno da esso ad ogni iterazione. Questo è un grande errore, un errore molto grave.

Chiarite prima la logica nella vostra mente e poi cercate di implementarla nel vostro codice.

I valori che non vengono tolti per determinare il lotto finale dopo la moltiplicazione, dovrebbe essere il massimo lotto possibile da aprire, infatti, gli ordini con questi lotti potrebbero non aprirsi perché l'EA apre gli ordini in un piccolo intervallo, ma c'è una possibilità, quindi voglio calcolare il massimo lotto iniziale possibile. Ho ascoltato i vostri consigli e questo è quello che ho ottenuto. Cosa pensi di questa funzione? Credo di essermi perso qualcosa o di averlo prescritto male; il tester si blocca un po' e ottiene un piccolo lotto in uscita.
//Функция расчета торгового лота
double GetLots()
{
 double lots = 0.0;
 double L9 = MarketInfo(Symbol(),MODE_MAXLOT);
 double L8 = L9 / Multipler;
 double L7 = L8 / Multipler;
 double L6 = L7 / Multipler;
 double L5 = L6 / Multipler;
 double L4 = L5 / Multipler;
 double L3 = L4 / Multipler;
 double L2 = L3 / Multipler;
 double cl = L2 / Multipler;
 double balance = AccountFreeMarginCheck(Symbol(),OP_BUY,L9);
 
 if(balance <= AccountFreeMargin())
 {
  for(int risk = 100;balance > 0 && risk > 0;risk--)
  {
   if(!IsStopped())
   {
    if(risk >= 1)
    {
     lots = (cl/100)*risk;
    }
    if(risk < 1)
    {
     for(int risk2 = 100;balance > 0 && risk2 >= 1;risk2--)
     {
      lots = (cl/100)*(risk2*0.01);
     }
    }
   }
  }
 }
 double clots = NormalizeDouble(MathMax(lots,MarketInfo(Symbol(),MODE_MINLOT)),2);
 return(clots);
}
 
Arseniy Barudkin:

Cosa ne pensate?


Io dirò lo stesso. Non sei bravo in logica. Qual è il problema per calcolare immediatamente il lotto iniziale, in base ai fondi disponibili e al valore del rischio (credo che sia stato scritto circa il 3%)? Perché devi fare tutto in un solo posto?

Prendete il valore del margine libero, moltiplicate per il rischio, dividete per 100 e il valore del margine per 1 lotto - ecco la formula più semplice per calcolare il lotto con una determinata percentuale del margine libero. Inoltre, è necessario prendere in considerazione il passo del cambio di lotto ed evitare di superare la dimensione del lotto min/max consentita dalle società di brokeraggio:

input double risk = 3; //процент свободной маржи для расчёта лота
double GetLots()
{
  double margin = MarketInfo(Symbol(),MODE_MARGINREQUIRED);
  double lotstep = MarketInfo(Symbol(),MODE_LOTSTEP);
  double rsk = MathMin(100.0,risk);
  double lotmax = MarketInfo(Symbol(), MODE_MAXLOT);
  double lotmin = MarketInfo(Symbol(), MODE_MINLOT);

  double clots = NormalizeDouble(lotstep*MathRound(AccountFreeMargin()*rsk/100/margin/lotstep),2);
  if(clots < lotmin) clots = lotmin;
  if(clots > lotmax) clots = lotmax;

return(clots);
}