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

 
PolarSeaman:

Hai sostituito il codice

a

ma non ha aiutato).

Mi dispiace che sia l'unica cosa che hai notato)

 
Alekseu Fedotov:

FileSeek() con il flag SEEK_END vi aiuterà.

<

Grazie, farò una prova!

 
YanSay:

Buona sera!

Sono perplesso su come aggiungere un codice universale (per diversi strumenti) per calcolare il lotto di un'operazione basato sulla % del deposito.

L'ho fatto così:

Prezzo ( prezzo di apertura) e SL (Stop Loss) sono calcolati separatamente.

Per le coppie in cui la valuta di quotazione è in dollari (ad esempio EURUSD), per l'indice SPX500 e per l'oro - tutti calcolati correttamente, ma per le coppie in cui il dollaro è il primo in una quotazione (ad esempio USDJPY) non funziona.

Per favore consigliatemi cosa mi è sfuggito?

Prestare attenzione alla normalizzazione

La variabile _Digits memorizza il numero di decimali dopo il punto decimale che determina la precisione del prezzo del simbolo del grafico corrente.

 
Alekseu Fedotov:

Si noti la normalizzazione

La variabile _Digits memorizza il numero di posizioni decimali dopo il punto decimale che determina la precisione del prezzo del simbolo del grafico corrente.

Grazie! Ecco come è stato rifatto:

input double MaximumRisk=0.02;                  //Риск в сделке от депозита

//1ый вариант
{Lots = NormalizeDouble(((AccountBalance()*MaximumRisk)/((MathAbs(Price-SL))/Point)/((MarketInfo(Symbol(),MODE_LOTSIZE)*(MarketInfo(Symbol(),MODE_ASK)+Point))
-(MarketInfo(Symbol(),MODE_LOTSIZE)*MarketInfo(Symbol(),MODE_ASK)))),
int(MathAbs(log(MarketInfo(Symbol(), MODE_LOTSTEP)))));}

//2ой вариант
{Lots = NormalizeDouble((AccountBalance()*MaximumRisk)/((MathAbs(Price-SL))/Point)/((MarketInfo(Symbol(),MODE_TICKVALUE))),
int(MathAbs(log(MarketInfo(Symbol(), MODE_LOTSTEP)))));}

Nella 1a variante: EURUSD e XAUUSD - tutto è corretto; USDJPY - invece del 2% del deposito rischia lo 0,2% del deposito; nel caso di SPX500 e BRN genera OrderSend errore 131 (errore nel calcolo del lotto).

Nella 2a variante: EURUSD, XAUUSD e USDJPY - tutto è corretto; SPX500 rischia il 20% del deposito invece del 2%; per BRN, genera OrderSend errore 131 (un errore nel calcolo del lotto).

C'è un errore da qualche altra parte, non riesco a capire in quale posto, per favore consigliatemi.

 
YanSay:

Grazie! Ecco come viene rifatto:

La prima versione: EURUSD e XAUUSD - tutto è corretto; USDJPY - rischia lo 0,2% del deposito invece del 2% del deposito; il caso con SPX500 e BRN mostra addirittura OrderSend errore 131 (errore nel calcolo del lotto).

Nella 2a variante: EURUSD, XAUUSD e USDJPY - tutto è corretto; SPX500 rischia il 20% del deposito invece del 2%; per BRN, genera OrderSend errore 131 (un errore nel calcolo del lotto).

Da qualche altra parte c'è un errore, non riesco a capire in quale posto, per favore consigliatemi.

SostituirePoint conMarketInfo(Symbol(),MODE_POINT)

 
Vitaly Muzichenko:

SostituirePoint conMarketInfo(Symbol(),MODE_POINT)

Qual è il punto? Se tutto è calcolato dal simbolo del grafico. Ha senso se c'è una multivariabile e viene calcolato Symbol diverso dal grafico corrente.

 
Vitaly Muzichenko:

SostituirePoint conMarketInfo(Symbol(),MODE_POINT)

Sfortunatamente, non è servito (

L'informazione MODE_POINT dice "Dimensione del punto nella valuta della quotazione. È memorizzato nella variabile predefinita Point for the current symbol".

A giudicare dalla descrizione, non importa quale variante usare. Ma l'ho provato e non mi ha aiutato.


 

Potete dirmi se è possibile mettere una "selezione" di uno strumento grafico sul pulsante nell'Expert Advisor, in modo che cliccando sul pulsante l'icona dello strumento appaia sotto il cursore e sia possibile allungarlo?

E il canale dovrebbe già avere le proprietà specificate

 
Roman Sharanov:

Potete dirmi se è possibile mettere una "selezione" di uno strumento grafico sul pulsante nell'Expert Advisor, in modo che cliccando sul pulsante l'icona dello strumento appaia sotto il cursore e sia possibile allungarlo?

Inoltre, il canale può già avere proprietà specificate.

Forse

 
YanSay:

Sfortunatamente non è servito (

E nell'informazione MODE_POINT dice "Dimensione del punto in valuta di quotazione. Per il simbolo corrente è memorizzato nella variabile predefinita Point".

A giudicare dalla descrizione, non importa quale variante usare. Ma l'ho provato e non mi ha aiutato.

Prova la funzione:

//===============================================================================================
//------------------------------ Расчет лота по риску на StopLoss -------------------------------+
//===============================================================================================
double sLot(double Percent=1, double Stloss=100, string symb="0") {
 if(symb=="0") symb=Symbol();
 double TickValue   =SymbolInfoDouble(symb,SYMBOL_TRADE_TICK_VALUE),
        TickSize    =SymbolInfoDouble(symb,SYMBOL_TRADE_TICK_SIZE),
        ContractSize=SymbolInfoDouble(symb,SYMBOL_TRADE_CONTRACT_SIZE),
        Min_Lot     =SymbolInfoDouble(symb,SYMBOL_VOLUME_MIN),
        Max_Lot     =SymbolInfoDouble(symb,SYMBOL_VOLUME_MAX),
        Step        =SymbolInfoDouble(symb,SYMBOL_VOLUME_STEP),
        Free        =AccountInfoDouble(ACCOUNT_FREEMARGIN),
        Lots_New    =0.0;
 int CalcMode=(int)SymbolInfoInteger(symb,SYMBOL_TRADE_CALC_MODE);

  if(Percent > 100) Percent = 100;
  if(Stloss <=0) return(0);
  if(Percent == 0) Lots_New = Min_Lot;
   else {
    if(CalcMode==0 || CalcMode==4)
      Lots_New = MathFloor((((Free*Percent/100)/Stloss)/TickValue)/Step)*Step;
    if(CalcMode==1||CalcMode==2||CalcMode==3)
      Lots_New = MathFloor(((((Free*Percent)/100)/Stloss)/((TickSize*TickValue)*ContractSize/TickValue))/Step)*Step;
   }
   if(Lots_New > Max_Lot) Lots_New = Max_Lot;
   if(Lots_New < Min_Lot) return(0);
  return(NormalizeDouble(Lots_New,/*LotDigit()*/ 2));
 }