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

 
Questo è oro. Mi ha risparmiato ore di lavoro. Sei un uomo!
 

Divertitevi... ma non privatevi della fiducia che deriva dal costruire il vostro codice e quindi sapere esattamente come funziona. Usare codice preesistente è un buon modo per migliorare la vostra conoscenza in un modo di "tirarsi su con le proprie forze", non sarei qui se non avessi avuto del codice da usare come esempio nei miei primi giorni, ma assicuratevi di costringervi ad imparare a pescare. C'è del valore da trarne in tutto il resto che farete.

 

@Phillip

Cosa ne pensi di questo?

tradeVolume = AccountFreeMargin() * risk/100 / ( stopLossPoints * MarketInfo( Symbol(), MODE_TICKVALUE ) );

if(tradeVolume<MarketInfo(Symbol(),MODE_MINLOT)) tradeVolume=MarketInfo(Symbol(),MODE_MINLOT);

if(tradeVolume>MarketInfo(Symbol(),MODE_MAXLOT)) tradeVolume=MarketInfo(Symbol(),MODE_MAXLOT);

res=OrderSend(Symbol(),OP_BUY,tradeVolume,Ask,3,Ask - 0.2,Ask + 0.4,"",MAGICID,0,Red);

 
Ricotter:

tradeVolume = AccountFreeMargin() * risk/100 / ( stopLossPoints * MarketInfo( Symbol(), MODE_TICKVALUE ) );


Senza testarlo personalmente per confermare la matematica, ma supponendo che la matematica sia corretta, questo sembra corretto a condizione di applicarlo esclusivamente alle coppie di valute per le quali la contro valuta è anche la denominazione del conto.

Ad esempio, se il tuo conto è basato sul dollaro USA, allora devi cercare di applicare questo metodo di calcolo del tradevolume solo alle coppie di valute con il dollaro USA come contro - EURUSD, GBPUSD, ecc.

Nei miei codici questo tipo di coppia di valute è designato come "Tipo 2".

Il calcolo sarà in errore se lo applichi a un simbolo che ha come base la denominazione del conto (USDJPY quando il conto è basato su USD, per esempio). E allo stesso modo sarà in errore se applicato a qualsiasi cross.

Esaminate la funzione di chiamata SymboType() nell'include file "Analyze Currency Symbol" che si trovava nell'altro mio post, la sezione dell'intestazione commentata spiega la base dei diversi symboltypes e perché dovete calcolare l'equity at risk e la volumesize (lotsize) in modo diverso a seconda del symboltype.

Ma se il tuo piano è quello di negoziare solo le coppie di tipo EURUSD e GBPUSD, allora il tuo codice sembra a posto!
 

Ciao di nuovo Phillip... potresti ricordare che in uno dei miei post precedenti avevo detto "Sembra che il codice abbia avuto qualche problema con le coppie JPY. È stato risolto?". Bene, penso che questo problema possa essersi ripresentato con me. Ho aggiunto la tua routine correttamente (sono abbastanza sicuro) nel mio EA e ho impostato il mio MaxPercentEquityAtRisk= 1.0 (1 per cento). Il capitale del mio conto demo è di circa 2300 dollari, quindi sono disposto a rischiare circa 23 dollari su qualsiasi trade. Il mio EA usa stop loss e obiettivi di profitto di uguale dimensione - quindi se sto rischiando $23 su un trade, sto puntando a un guadagno di $23. Comunque, il mio EA ha generato 2 operazioni ieri sera:

(1) COMPRA EUR/JPY, 9,8 pip di stoploss e 9,8 pip di obiettivo di profitto. La tua routine ha calcolato una dimensione del lotto di 0,80 lotti (decisamente troppo grande) e l'operazione ha prodotto un profitto di 10 pip di $96,91

(2) COMPRA NZDJPY, 16.3 pip stoploss e 16.3 pip profit target. La tua routine ha calcolato una dimensione del lotto di 0,28 lotti e l'operazione ha prodotto una perdita di -56,56$.


Mi sembra che entrambi questi trade avrebbero dovuto darmi circa 23$ di vittoria o 23$ di perdita, dato che sto rischiando solo l'1% del mio capitale di 2300$, no?


Grazie!

Shawn

 

Questo potrebbe aiutare Phillp - ecco il log delle istruzioni di stampa dal tuo codice subito dopo aver calcolato le dimensioni dei lotti per entrambi gli ordini che ho menzionato sopra:


05:14:56 EURJPY,H1: BUY - EURJPY Max EquityAtRisk = $21.99 e Max Lotsize = 0.8085
05:14:56 EURJPY,H1: BUY - EURJPY Current EquityAtRisk = $21.76 e Current Lotsize = 0.8
05:14:56 EURJPY,H1: BUY - EURJPY MarketInfo(MODE_STOPLEVEL) = 30.00000
05:14:56 LibOrderReliable EURJPY,H1: caricato con successo
05:14:56 LibOrderReliable EURJPY,H1: OrderSendReliable v3.1:
05:14:56 LibOrderReliable EURJPY,H1: OrderSendReliable v3.1: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
05:14:56 LibOrderReliable EURJPY,H1: OrderSendReliable v3.1: Tentato BUY STOP 0.80000000 lotti @114.78700000 sl:114.68900000 tp:114.88500000



09:02:36 NZDJPY,H1: BUY - NZDJPY Max EquityAtRisk = $23.29 e Max Lotsize = 0.2814
09:02:36 NZDJPY,H1: BUY - NZDJPY Current EquityAtRisk = $23.18 e Current Lotsize = 0.28
09:02:36 NZDJPY,H1: BUY - NZDJPY MarketInfo(MODE_STOPLEVEL) = 70.00000
09:02:36 LibOrderReliable NZDJPY,H1: caricato con successo
09:02:36 LibOrderReliable NZDJPY,H1: OrderSendReliable v3.1:
09:02:36 LibOrderReliable NZDJPY,H1: OrderSendReliable v3.1: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
09:02:36 LibOrderReliable NZDJPY,H1: OrderSendReliable v3.1: Tentativo di BUY STOP 0,28000000 lots @64.29700000 sl:64.13400000 tp:64.46000000
09:02:37 LibOrderReliable NZDJPY,H1: aperto #155492665 buy stop 0,28 NZDJPY a 64.297 sl: 64.134 tp: 64.460 ok
09:02:37 LibOrderReliable NZDJPY,H1: OrderSendReliable v3.1: Biglietto #155492665: Ordine BUY STOP piazzato con successo, seguono i dettagli.
09:02:37 LibOrderReliable NZDJPY,H1: #155492665 2010.11.04 13:02 buy stop 0,28 NZDJPY 64,297 64,134 64,460 64,197 0,00 0,00 0,00 NZDJPY73650016 73650016
09:02:37 LibOrderReliable NZDJPY,H1: OrderSendReliable v3.1: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

09:02:37 LibOrderReliable NZDJPY,H1: OrderSendReliable v3.1:


... sembra che stia calcolando bene la cifra di Max EquityAtRisk... ma quei lotti risultano in profitti/perdite molto più grandi del mio 1% di rischio desiderato.


Grazie

Shawn

 

Qual è il tuo broker?

Su FXDD quando inserisco questi ordini stop ottengo un lotsize di 0.15 per la EURJPY (@25.66 EaR)

2010.11.04 16:05:39 Assisted_Order_Script_2010.11.01 EURJPY,Daily: open #95896902 buy stop 0,15 EURJPY a 114,827 sl: 114,689 tp: 114,885 ok<br / translate="no"> 2010.11.04 16:05:38 Assisted_Order_Script_2010.11.01 EURJPY,Daily: tentato OP_BUYSTOP 0,15000000 lotti @114.82700000 sl:114.68900000 tp:114.88500000
2010.11.04 16:05:38 Assisted_Order_Script_2010.11.01 EURJPY,Daily: Current EquityAtRisk = $25.66 e Current Lotsize = 0.15 e Profit Target = $10.78 per un rapporto Profit:Loss di 0.4:1
2010.11.04 16:05:38 Assisted_Order_Script_2010.11.01 EURJPY,Daily: Massimo consentito EquityAtRisk = $25.84 e Max computed Lotsize = 0.1511
2010.11.04 16:05:38 Assisted_Order_Script_2010.11.01 EURJPY,Daily input: Order_Type="BUY STOP"; OpenBidPrice=114.787; StopLossBidPrice=114.689; TakeProfitBidPrice=114.885; MaxPercentEquityAtRisk=0.5; MinLotOverRide=false;

Su IBFX ottengo una dimensione del lotto di 0,16 con un EaR di 26,77 dollari (maggiore capitale iniziale nel conto)

2010.11.04 16:09:34 Assisted_Order_Script_2010.11.01 EURJPY,H4: aperto #94468219 comprare stop 0,16 EURJPY a 114,824 sl: 114,689 tp: 114,885 ok
2010.11.04 16:09:34 Assisted_Order_Script_2010.11.01 EURJPY,H4: tentato OP_BUYSTOP 0,16000000 lotti @114.82400000 sl:114.68900000 tp:114.88500000
2010.11.04 16:09:34 Assisted_Order_Script_2010.11.01 EURJPY,H4: Current EquityAtRisk = $26.77 e Current Lotsize = 0.16 e Profit Target = $12.10 per un rapporto Profit:Loss di 0.5:1
2010.11.04 16:09:33 Assisted_Order_Script_2010.11.01 EURJPY,H4: Max allowed EquityAtRisk = $27.19 e Max computed Lotsize = 0.1625
2010.11.04 16:09:33 Assisted_Order_Script_2010.11.01 EURJPY,H4 input: Order_Type="BUY STOP"; OpenBidPrice=114.787; StopLossBidPrice=114.689; TakeProfitBidPrice=114.885; MaxPercentEquityAtRisk=0.5; MinLotOverRide=false;

Con NZDJPY ottengo una dimensione del lotto di 0,09 lotti e un EaR di 24,53 su IBFX:

2010.11.04 16:11:59 Assisted_Order_Script_2010.11.01 NZDJPY,H4: open #94468343 buy stop 0.09 NZDJPY a 64.354 sl: 64.134 tp: 64.460 ok
2010.11.04 16:11:59 Assisted_Order_Script_2010.11.01 NZDJPY,H4: tentato OP_BUYSTOP 0.09000000 lotti @64.35400000 sl:64.13400000 tp:64.46000000
2010.11.04 16:11:59 Assisted_Order_Script_2010.11.01 NZDJPY,H4: Current EquityAtRisk = $24.53 e Current Lotsize = 0.09 e Profit Target = $11.82 per un rapporto Profit:Loss 0.5:1
2010.11.04 16:11:59 Assisted_Order_Script_2010.11.01 NZDJPY,H4: Max allowed EquityAtRisk = $27.19 e Max computed Lotsize = 0.0998
2010.11.04 16:11:59 Assisted_Order_Script_2010.11.01 NZDJPY,H4 input: Order_Type="BUY STOP"; OpenBidPrice=64.297; StopLossBidPrice=64.134; TakeProfitBidPrice=64.46; MaxPercentEquityAtRisk=0.5; MinLotOverRide=false;

Ci sono nove broker con cui verifico la compatibilità, questi codici sono noti per funzionare su Alpari(US), CitiFXPro, CMS, Forex.com (Gain Capital), FXCM, FXDD, IBFX, MIG Bank, e ODL.

Questi broker differiscono abbastanza che sono stato soddisfatto fino ad ora che i codici sono broker agnostic basato su loro abilmente gestire le differenze nei parametri di mercato broker spanning questi broker.

Ma stiamo assumendo che la tua implementazione del codice non sia rotta, quindi eliminiamo prima questo. Prova lo script allegato, trascina su EURJPY e inserisci i parametri del tuo BUY STOP come ho fatto sopra e fammi sapere i risultati. (utilizzare solo su un conto demo ovviamente)

 

Grazie Phillip... Sto usando una demo Alpari UK, con un conto di 2272,85 dollari. Ok, ho aggiunto lo script a un grafico orario EURJPY (proprio come il mio EA). Non ha fatto nulla e non ha piazzato alcun ordine pendente, quindi ho controllato la scheda "Experts" per eventuali messaggi di errore... ecco cosa dice:


2010.11.04 20:39:15 Assisted_Order_Script_2010.11.01 EURJPY,H1: rimosso
2010.11.04 20:38:38 Assisted_Order_Script_2010.11.01 EURJPY,H1: caricato con successo
2010.11.04 20:37:54 Assisted_Order_Script_2010.11.01 EURJPY,H1: rimosso
2010.11.04 20:37:54 Assisted_Order_Script_2010.11.01 EURJPY,H1: uninit reason 0
2010.11.04 20:37:54 Assisted_Order_Script_2010.11.01 EURJPY,H1: zero divide
2010.11.04 20:37:53 Assisted_Order_Script_2010.11.01 EURJPY,H1: Max allowed EquityAtRisk = $22.73 and Max computed Lotsize = 0
2010.11.04 20:37:53 Assisted_Order_Script_2010.11.01 EURJPY,H1 input: Order_Type="BUY"; OpenBidPrice=115.827; StopLossBidPrice=115.689; TakeProfitBidPrice=115.885; MaxPercentEquityAtRisk=1; MinLotOverRide=false;


Grazie!

Shawn

 

Nota: ho provato di nuovo lo script proprio ora Phillip, stessi numeri ma impostando MinLotOverride a true... ha lanciato un ordine MARKET immediato (anche se il mio prezzo di acquisto era 115.827 e il mercato era solo a 114.945. Lotsize = 0.01 e nessun ordine stoploss o profit target - entrambi erano 0.0000

Grazie

Shawn

 

Solo per confermare, la denominazione del tuo conto è USD, giusto?

Sto scaricando Alpari UK ora per controllare.

L'apertura dell'ordine come mercato invece di buy stop è interamente controllata dalla routine orderreliable... molto strano. Dovrò indagare anche su questo allora.

Una cosa che attira la mia attenzione è questo avviso:
"La leva di un conto demo è impostata automaticamente alla leva massima di 1:500."

Non che il leverage dovrebbe influenzare un calcolo di lotsize, dovrebbe solo influenzare i calcoli di freemargin IIRC.

Edit: non importa, vedo che la piattaforma in realtà non è impostata di default su questo valore, è una leva massima di 1:100