Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 6. - pagina 740

 
evillive:
Sto parlando del campo, non del lotto minimo, ma va bene, lascia perdere.
Oh, sì, certo, se non stai scrivendo per te stesso, devi tenerne conto.
 
evillive:

Grazie, mi è già stato spiegato :D

È chiaro che per me stesso scrivo con tutti i controlli, come dovrebbe essere, c'era solo un abbozzo di come portare il lotto al rapporto equilibrio/10, ma l'idea non ha avuto successo...

Ma hai molto testo, potrebbe essere più semplice:

  lotstep= MarketInfo(Symbol(),MODE_LOTSTEP);
  lotmax=MarketInfo(Symbol(), MODE_MAXLOT);
  lotmin=MarketInfo(Symbol(), MODE_MINLOT);

lot=lotstep*MathRound(AccountBalance()*0.001/lotstep);
if(lot < lotmin) lot = lotmin;
if(lot > lotmax) lot = lotmax;

Potrebbe essere più semplice. Solo, cosa succederà se MarketInfo() per lotstep restituisce 0? Quali saranno le conseguenze? L'Expert Advisor sarà fermato e le posizioni saranno abbandonate?

E se MINLOT è impostato dal broker a 0,03 e LOTSTEP a 0,02, cioè i primi due valori di lotto consentiti sono 0,03 e 0,05, e il saldo corrente è 41 - quale sarà il valore del lotto calcolato nel vostro codice?

Perché, se il lotto è inferiore al valore minimo - per esempio, con un saldo uguale a 1, sarà uguale a 0 dopo che l'espressione è completamente calcolata - perché in questo caso il tuo codice prende il lotto uguale a MINLOT, che può essere 0,03, cioè 30 volte più del valore "grezzo" di "AccountBalance()*0,001", che in questo caso è uguale a 0,001?

Non si può sempre ottenere un valore di lotto valido, perché le condizioni possono essere tali che NESSUNO dei valori di lotto validi corrisponde ad esse. Le situazioni errate devono essere tutte programmate, e bisogna ricordare che questo è almeno il 90% del lavoro.

Il modello applicato da MetaQuotes è che lotto = MINLOT + N * LOTSTEP, dove N = 0, 1, 2... M. E M è tale che MINLOT + M * LOTSTEP <= MAXLOT e MINLOT + (M + 1) * LOTSTEP > MAXLOT. Di conseguenza, si dovrebbe anche calcolare all'interno del modello impostato, cioè, lotto = MINLOT + N * LOTSTEP. Allora tutte le combinazioni scomode di MINLOT e LOTSTEP diventano irrilevanti, perché la formula funziona in modo generale. Una volta che l'hai scritto bene, debuggato bene e ti sei concentrato su qualcos'altro di interessante e divertente. E con piacere - perché non devi tornare costantemente al codice scritto male perché ancora una volta questo codice non funziona, ma solo glitch...

 
simpleton:

Potrebbe essere più semplice. Ma cosa succederà se MarketInfo() restituisce 0 per il lotto? Quali saranno le conseguenze? L'Expert Advisor sarà fermato e le posizioni saranno abbandonate?

Se il valore di MINLOT è impostato da un broker a 0,03, e LOTSTEP a 0,02, cioè i primi due valori di lotto sono 0,03 e 0,05, e il saldo attuale è 41, qual è il valore del lotto calcolato nel vostro codice?

Perché, se il lotto è inferiore al valore minimo - per esempio, con un saldo uguale a 1, dopo il calcolo completo sarà uguale a 0? Perché in questo caso il vostro codice prende il lotto uguale a MINLOT, che può essere, per esempio, 0,03, che è 30 volte più del valore "grezzo" "AccountBalance()*0,001", che in questo caso è uguale a 0,001?

Non si può sempre ottenere un valore di lotto valido, perché le condizioni possono essere tali che NESSUNO dei valori di lotto validi corrisponde ad esse. Le situazioni errate devono essere tutte programmate, e bisogna ricordare che questo è almeno il 90% del lavoro.

Il modello applicato impostato da MetaQuotes è che lotto = MINLOT + N * LOTSTEP, dove N = 0, 1, 2... M. E M è tale che MINLOT + M * LOTSTEP <= MAXLOT e MINLOT + (M + 1) * LOTSTEP > MAXLOT. Di conseguenza, si dovrebbe anche calcolare all'interno del modello impostato, cioè, lotto = MINLOT + N * LOTSTEP. Allora tutte le combinazioni scomode di MINLOT e LOTSTEP diventano irrilevanti, perché la formula funziona in modo generale. Una volta che l'hai scritto bene, debuggato bene e ti sei concentrato su qualcos'altro di interessante e divertente. E con piacere - perché non devi tornare costantemente al codice scritto male perché ancora una volta questo codice non funziona, ma solo glitch...

Per tali orrori, c'è anche una verifica della sufficienza dei fondi per aprire con un tale lotto. Nessuno sano di mente permetterebbe a un robot di depositare 10 sterline sapendo che il min/lot è 0,1 e il passo è 0,1, per esempio.

E se si trovasse uno così intelligente, il robot gli direbbe "dammi i soldi e addio nel frattempo" :D.

E non ho mai visto o letto da nessuna parte che il passo del lotto è zero, è una fantasia...

 
evillive:

Per tali orrori, c'è anche un controllo sulla sufficienza dei fondi per aprire con un tale lotto. Nessuno sano di mente permetterebbe a un robot di depositare 10 sterline, sapendo che il lotto minimo è 0,1 e il passo è 0,1, per esempio.

E se si trova uno così intelligente, il robot gli dirà "dammi i soldi, ma intanto salutami" :D

Per evitare gli zeri di MarketInfo nel tester, faccio così:

  double AFM = AccountFreeMargin(); 
  double StopLevel,FreezeLevel,spr,prot;
  if(IsOptimization() || IsTesting() || IsVisualMode())
  {
    MinLot = 0.1;
    LotStep = 0.01;
    spr = Point*10;
    StopLevel = spr*2;
    FreezeLevel = spr*2;
  }
  else
  {
    MinLot = MarketInfo(Symbol(),MODE_MINLOT);
    LotStep = MarketInfo(Symbol(),MODE_LOTSTEP);
    spr = MarketInfo(Symbol(),MODE_SPREAD)*Point;
    StopLevel = MarketInfo(Symbol(),MODE_STOPLEVEL)*Point;
    FreezeLevel = MarketInfo(Symbol(),MODE_FREEZELEVEL)*Point;
  }
  if(MM == 1) 
  lot = MinLot+MathMax(LotStep*MathFloor((AFM-initdepo)*risk/100),0); 
  else if(MM == 0) lot = MinLot;
 
evillive:

Per tali orrori, c'è anche un controllo sulla sufficienza dei fondi per aprire con un tale lotto. Nessuno sano di mente permetterebbe a un robot di depositare 10 sterline sapendo che il lotto minimo è 0,1 e l'incremento è 0,1, per esempio.

E se si trovasse uno così intelligente, il robot gli direbbe "Dammi i soldi e addio" :D

E non ho mai visto o letto da nessuna parte che il passo del lotto è zero, è un'immaginazione...

Perché è terribile? Perché non rientra nel modello semplificato?

Intendevo dire che con MINLOT = 0,03 e LOTSTEP = 0,02, i primi due valori di lotto consentiti sono 0,03 e 0,05. Detto questo, se il saldo è, diciamo, 41, allora il vostro codice:

lot=lotstep*MathRound(AccountBalance()*0.001/lotstep);

Darà un valore di lotto di 0,04, che non è consentito. Il robot dirà qualcosa come "il server ha detto che la dimensione del mio lotto è sbagliata".

E la dimensione del lotto zero può essere ottenuta quando si verifica un errore nel richiedere il suo valore attraverso MarketInfo(). Vi ho dato il codice su come causare un errore artificialmente:

Print("MarketInfo(\"Фигня\", MODE_LOTSTEP) = ", MarketInfo("Фигня", MODE_LOTSTEP));

Restituisce 0. Che razza di fantasia è questa?

 
simpleton:

Perché questo orrore? Perché non rientra nel modello semplificato?

Intendevo dire che con MINLOT = 0,03 e LOTSTEP = 0,02, i primi due valori di lotto consentiti sono 0,03 e 0,05. Detto questo, se il saldo è, diciamo, 41, allora il vostro codice:

Darà un valore di lotto di 0,04, che non è consentito. Il robot dirà qualcosa come "il server ha detto che la dimensione del mio lotto è sbagliata".

E la dimensione del lotto zero può essere ottenuta quando si verifica un errore nel richiedere il suo valore attraverso MarketInfo(). Vi ho dato il codice di cui sopra su come indurre artificialmente questo errore:

Restituirà 0. Allora qual è la fantasia?

lot=lotstep*MathRound(AccountBalance()*0.001/lotstep);

Questa formula è facilmente correggibile per soddisfare i requisiti. Bisogna solo considerare il lotto minimo

Sembrerà un po' diverso

lot=Min_Lot+lotstep*MathRound((AccountBalance()-X)*0.001/lotstep);

Dove X - Saldo per l'apertura del lotto minimo,

Ma l'assegno per il lotto minimo sarà ancora necessario.

 

Buon pomeriggio!

Aiuta un ignorante) Nel tester nessun ordine apre l 'errore 10013 Richiesta errata, guarda il codice dove si trova l'errore.

Tutti i numeri del giornale appaiono sull'ordine e l'ordine non si apre.

2014.10.19 12:14:34.984 2014.02.03 00:06:00 richiesta fallita comprare 0.10 a 102.31100 sl: 102.27200 tp: 102.33600 [Richiesta non valida]

2014.10.19 12:22:17.928 2014.02.03 00:06:00 ticket =0 retcode =10013

MqlTradeRequest Req;
MqlTradeResult  Res;
   string TradeSmb;
   if(TradeSmb=="") TradeSmb=_Symbol;
   Req.action=TRADE_ACTION_DEAL;
   Req.symbol=TradeSmb;
   Req.volume=0.1;
   Req.type=ORDER_TYPE_BUY;
   Req.type_filling=ORDER_FILLING_IOC;
   Req.price = SymbolInfoDouble(_Symbol,SYMBOL_ASK);
   Req.sl= NormalizeDouble(sym_bid - (StopLoss*sym_point),sym_digits);
   Req.tp= NormalizeDouble(sym_ask + (TakeProfit*sym_point),sym_digits);
   Req.deviation=3;
   Req.comment="777";
if(OrderSend(Req,Res))
{
      Print("Sent...");
}
      Print("ticket =",Res.order,"   retcode =",Res.retcode);
      if(Res.order!=0)
     {
      datetime tm=TimeCurrent();
      //--- request all history
      HistorySelect(0,tm);
      string comment;
      bool result=HistoryOrderGetString(Res.order,ORDER_COMMENT,comment);
      if(result)
        {
         Print("ticket:",Res.order,"    Comment:",comment);
        }
Drummer ha corretto il tuo messaggio
 

Dove lo vedi?!

if(OrderSend(Req,Res))

Vedere la documentazione! E usa il pulsante SRC per inserire il codice!

Se sei troppo pigro, vedi la prima e l'ultima volta:

int  OrderSend(
   string   symbol,              // символ
   int      cmd,                 // торговая операция
   double   volume,              // количество лотов
   double   price,               // цена
   int      slippage,            // проскальзывание
   double   stoploss,            // stop loss
   double   takeprofit,          // take profit
   string   comment=NULL,        // комментарий
   int      magic=0,             // идентификатор
   datetime expiration=0,        // срок истечения ордера
   color    arrow_color=clrNONE  // цвет
   );

Non è mai una brutta cosa imparare!

 

Cari signori!

Si prega di consigliare.....

Ecco una funzione

OrdineProfitto( )

Questa funzione restituisce il valore del profitto netto per l'ordine selezionato.

DOMANDA

La quale funzione, in modo simile alla funzione di cui sopra, restituisce il valore di perdita per l'ordine selezionato invece del valore di profitto.

Cioè se un ordine ha chiuso su SL con una perdita di 150$, ho bisogno che la funzione restituiscauna perdita di 150$.

Grazie.

 
solnce600:

Cari signori!

Si prega di consigliare.....

Ecco una funzione

OrdineProfitto( )

Questa funzione restituisce il valore del profitto netto per l'ordine selezionato.

DOMANDA

La quale funzione, in modo simile alla funzione di cui sopra, restituisce il valore della perdita per l'ordine selezionato invece del profitto.

Cioè se un ordine ha chiuso su SL con una perdita di 150$, ho bisogno che la funzione restituiscauna perdita di 150$.

Grazie.

È lo stesso! Solo l'importo uscirà con un meno.
Motivazione: