funzione di calcolo automatico della dimensione del lotto? - pagina 5

 

Ciao Phillip, Shawn qui di nuovo. Ho apportato le piccole modifiche di cui abbiamo discusso l'ultima volta (non ho ancora implementato la tua ultima versione) e i problemi con i lotti delle coppie JPY si stanno ancora manifestando. Ho fatto girare il mio EA ieri sera e ha generato 3 trade (il saldo del mio conto era di 2550 dollari, il rischio è dell'1%, quindi circa 25 dollari di rischio per trade):


(1) Vendere NZDJPY, 0,89 lotti

(2) Vendere AUDJPY, 0,23 lotti

(3) Vendi CADJPY, 0,94 lotti


La dimensione del lotto per il trade AUDJPY sembra a posto, ma non per gli altri due. Avevo alcune dichiarazioni di stampa incorporate intorno alle chiamate alle tue cose. Per prima cosa, ecco il codice del mio EA per questa parte:


if(Bid > SellPrice && SellPrice != 0.00)
         {       
          CurrentOrderType=OP_SELL;
          CurrentStopLossPrice= FinalSellStopPrice;
          CurrentEquityAtRisk=(MaxPercentEquityAtRisk/100.0)*AccountBalance();
          CurrentLotSize=LotSize(CurrentEquityAtRisk,CurrentStopLossPrice,CurrentOrderType,CurrentSymbolType,CurrentCounterPairForCross);
          Print("SELL - ", Symbol(), "AccountBalance = ", DoubleToStr(AccountBalance(),2), " Max EquityAtRisk = $",DoubleToStr(CurrentEquityAtRisk,2)," and Max Lotsize = ",DoubleToStr(CurrentLotSize,4));
          CurrentLotSize=NormalizeLotSize(CurrentLotSize);
          Print("SELL - ", Symbol(), "Normalized LotSize is now = ", DoubleToStr(CurrentLotSize,4));
          if(CurrentLotSize<MarketInfo(Symbol(),MODE_MINLOT)) CurrentLotSize=MarketInfo(Symbol(),MODE_MINLOT);
          if(CurrentLotSize>MarketInfo(Symbol(),MODE_MAXLOT)) CurrentLotSize=MarketInfo(Symbol(),MODE_MAXLOT);
          CurrentEquityAtRisk=EquityAtRisk(CurrentLotSize,CurrentStopLossPrice,CurrentOrderType,CurrentSymbolType,CurrentCounterPairForCross);
          Print("SELL - ", Symbol(), "Current EquityAtRisk = $",DoubleToStr(CurrentEquityAtRisk,2)," and Current Lotsize = ",DoubleToStr(CurrentLotSize,4));
          Print("SELL - ", Symbol(), " MarketInfo(MODE_STOPLEVEL) = ",DoubleToStr(MarketInfo(Symbol(),MODE_STOPLEVEL),5));
          
          //Check free margin
          if (AccountFreeMargin() < (1000 * CurrentLotSize)) 
          {
             Print("We have no money. Free Margin = ", AccountFreeMargin());
             return(0);
          }
         
          Ticket=OrderSendReliable2Step(Symbol(),OP_SELLSTOP,CurrentLotSize,FinalSellPrice,Slippage,CurrentStopLossPrice,FinalSellProfTarg,Symbol()+DoubleToStr(MagicNumber,0),MagicNumber,0,Red);
          if(Ticket<=0) Print("Error = ",GetLastError());
          else 
          { 


Ed ecco l'output delle istruzioni di stampa prese dal log, per ciascuno dei 3 trade di cui sopra:


05:16:10 DelphiEA NZDJPY,H1: SELL - NZDJPYAccountBalance = 2550.90 Max EquityAtRisk = $25.51 e Max Lotsize = 0.8988
05:16:10 DelphiEA NZDJPY,H1: SELL - NZDJPYNormalized LotSize è ora = 0.8900
05:16:10 DelphiEA NZDJPY,H1: SELL - NZDJPYCurrent EquityAtRisk = $25.26 e Current Lotsize = 0.8900
05:16:10 DelphiEA NZDJPY,H1: SELL - NZDJPY MarketInfo(MODE_STOPLEVEL) = 70.00000


05:16:56 DelphiEA AUDJPY,H1: VENDERE - AUDJPYAccountBalance = 2550.90 Max EquityAtRisk = $25.51 e Max Lotsize = 0.2376
05:16:56 DelphiEA AUDJPY,H1: SELL - AUDJPYNormalized LotSize è ora = 0.2300
05:16:56 DelphiEA AUDJPY,H1: SELL - AUDJPYCurrent EquityAtRisk = $24.69 e Current Lotsize = 0.2300
05:16:56 DelphiEA AUDJPY,H1: VENDERE - AUDJPY MarketInfo(MODE_STOPLEVEL) = 50.00000


07:13:53 DelphiEA CADJPY,H1: SELL - CADJPYAccountBalance = 2550.90 Max EquityAtRisk = $25.51 e Max Lotsize = 0.9408
07:13:53 DelphiEA CADJPY,H1: SELL - CADJPYNormalized LotSize è ora = 0.9400
07:13:53 DelphiEA CADJPY,H1: SELL - CADJPYCurrent EquityAtRisk = $25.49 e Current Lotsize = 0.9400

07:13:53 DelphiEA CADJPY,H1: SELL - CADJPY MarketInfo(MODE_STOPLEVEL) = 60.00000


Spero che questo aiuti!

Oh Phillip, un'altra cosa - penso di aver trovato un piccolo bug in OrderSendReliable2Step. Sai a chi dovrei segnalarlo?


Grazie!

Shawn

 
Ricotter:

Questo tizio lo fa usando la cronologia dei file.

https://www.mql5.com/en/articles/1493

Dato che sei nuovo qui, vale la pena ricordare che questa limitazione non esiste in MT5 Tester. PER TUA INFORMAZIONE.

 
gordon:

Dato che sei nuovo qui, vale la pena ricordare che questa limitazione non esiste in MT5 Tester. PER TUA INFORMAZIONE.

Grazie per il suggerimento. C'è qualche motivo per cui NON dovrei usare MT5?

 
Ricotter:

Grazie per il suggerimento. C'è qualche motivo per cui NON dovrei usare MT5?

Se vuoi fare trading dal vivo immediatamente, allora è meglio che tu rimanga su MT4, ma se hai intenzione di imparare e fare demo per alcuni mesi prima di andare dal vivo, allora potresti considerarla. È una nuova piattaforma con molti miglioramenti rispetto alla MT4, ma è anche molto più complicata e ancora non supportata da molti broker. Qui ci sono alcune buone informazioni -> http://www.100forexbrokers.com/mt5-metatrader5. Inoltre, potresti voler controllare MQL5.com.
 
shawnh:

Ciao Phillip, Shawn qui di nuovo. Ho fatto le modifiche minori di cui abbiamo discusso l'ultima volta (non ho ancora implementato la tua ultima versione) e i problemi con i lotti delle coppie JPY sono ancora presenti.

Tutto "sembra" ok nel tuo codice, ancora non ho idea del perché stia succedendo a te.

Ti consiglio di passare al codice più recente. A questo punto devi cambiare qualcosa, dato che quello che hai ora non funziona correttamente.

Non so a chi dovresti segnalare i bug per quanto riguarda i problemi di orderlib, mi dispiace.
 
1005phillip:

Passo 1: Metti tutti i file allegati da questo post nel tuo percorso include (...\experts\include\*.mqh)

Passo 2: Aggiungi quanto segue all'inizio del tuo EA in modo che abbia accesso alle funzioni di chiamata contenute nei file allegati

Passo 3: Per calcolare la dimensione del lotto sulla base di un importo di capitale a rischio preventivato, aggiungere quanto segue

Assumendo che tu abbia definito MaxPercentEquityAtRisk da qualche parte nel tuo EA per essere il capitale massimo consentito da mettere a rischio di perdita completa per trade nel caso in cui gli stop vengano colpiti, questa porzione di codice determinerà prima la dimensione massima del lotto basata su openprice e stoplossprice (non pips ma il prezzo effettivo di mercato, la stessa cosa che mandi nel tuo ordine al broker) e poi determinerà la dimensione massima della posizione che il broker accetterà pur non superando la tua equity di rischio preventivata.

Passo 4: Se vi piace avere i risultati dei calcoli stampati nel vostro registro o aggiunti alla negoziazione come commento all'ordine, potete anche aggiungere quanto segue

Passo 5: Piazzare l'ordine (usando il metodo ordersendreliable)

https://c.mql5.com/mql4/forum/2010/10/OrderReliable_2010.10.12.mqh


Ciao 1005phillip,


Hai una versione dei 2 mqh (analyze..., e tradepositionmanage...) che non ha importazioni del sottostante? Questo perché i due hanno entrambi quelle importazioni, e quindi non è consentito dal compilatore.

//#include <stderror.mqh>
//#include <stdlib.mqh>


...in modo da non modificare i file e tenerli in sola lettura. O posso modificarli e rimuovere quelle importazioni?

 
jcadong5:

...in modo da non modificare i file e tenerli in sola lettura. O posso modificarli e rimuovere quelle importazioni?


Vai avanti e modificali a tuo piacimento. La duplicità non impedisce la compilazione per me, il compilatore registra una nota riguardante la duplicità ma questo è tutto ciò che fa.
 
Grazie.
 
1005phillip:
Tutto "sembra" ok nel tuo codice, ancora non ho idea del perché ti stia succedendo.

Ti consiglio di passare al codice più recente. A questo punto devi cambiare qualcosa, dato che quello che hai ora non funziona correttamente.

Non so a chi dovresti segnalare i bug per quanto riguarda i problemi di orderlib, mi dispiace.


Ciao Phillip, sono di nuovo Shawn. Dopo aver installato la tua ultima versione qualche settimana fa, sono felice di riferire che ora tutto sembra a posto e le dimensioni calcolate dei lotti sembrano perfette. Immagino che avevo solo bisogno dell'ultima versione!


Grazie ancora per tutto il tuo aiuto, sei un brav'uomo!


Saluti

Shawn

 

Il piacere è mio! E grazie per avermi fatto sapere che funziona per te, apprezzo il feedback. Non sono sicuro di cosa sia andato storto con il codice precedente. Potrebbe anche essere stato un bug di qualche tipo che ho involontariamente corretto tra le revisioni.

Probabilmente avrò una versione aggiornata entro una settimana o due che avrà alcune caratteristiche di fallback per l'uso con il backtesting in MT4 sucoppie di valute incrociate. In questo momento, se provate a fare il backtest di una coppia incrociata mentre usate il mio codice di dimensione del lotto, il vostro backtest sarà una bomba perché il backtester non può accedere ai prezzi di mercato per le coppie di base e il contatore richiesti. (questo non è un problema nei test dal vivo o in avanti, è solo una limitazione del backtester di MT4)

Posterò il codice quando avrò attraversato quel ponte, forse tu o altri lo troveranno utile.

Buon fine settimana,
- Phil