come calcolare la size di un ordine

Sezione dedicata a metatrader (ed altre piattaforme) ed al suo linguaggio di programmazione per il trading automatico

Moderatore: Dainesi

come calcolare la size di un ordine

Messaggioda andream1977 » 05/01/2017, 15:24

Ciao a tutti
sto scrivendo un ea per la mt4, volevo far aprire un ordine con una size dimensionata al 2% del rischio rispetto al capitale
ho scritto il seguente codice, quando vado a calcolare la size, mi restituisce una size di 14 lotti, usando un conto demo da 5.000 euro ed uno stop di 50 pips. Ovviamente è sbagliata, mi sapete dire come si fa a calcolare la size corretta?
il codice sbagliato è quello della funzione getSize()

grazie

Codice: Seleziona tutto
//+------------------------------------------------------------------+
//|                                                   TestSizeEA.mq4 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict



int OnInit()
  {
   openBuy() ;
   return(INIT_SUCCEEDED);
  }

void OnDeinit(const int reason)
  {

   
  }

void OnTick()
  {

   
  }

void openBuy()
   {
   double stopLossInPips = 50;
   double takeProfitInPips = 75;

   int slippage = 3;
   int magicNumber = 1;

   double pairPipScale = 0.0001;
   if (Digits() == 2 || Digits() == 3) pairPipScale = 0.01;
   
   double stopLossInPipsScaled = stopLossInPips*pairPipScale;
   double size = getSize(stopLossInPips);

   double stopLossPrice = NormalizeDouble(Ask-stopLossInPipsScaled,Digits);

   double takeProfitInPipsScaled = takeProfitInPips*pairPipScale;
   double takeProfitPrice= NormalizeDouble(Ask+takeProfitInPipsScaled,Digits);

   Print("buy Ask: ",Ask," - stopLossPrice: ",stopLossPrice," - takeProfitPrice: ",takeProfitPrice);
   
   double orderTicket = OrderSend(NULL,OP_BUY,size,Ask,slippage,stopLossPrice,takeProfitPrice,"pos1",magicNumber,0,clrGreen);
   if(orderTicket<0)   
      {
      Print("OrderSend buy failed with error: ",GetLastError());

      }
   }
   
double getSize(double stopLossInPips) {
   double maxLossPercent = 2;//rischio per operazione impostato al 2 % dell'equity
   double pipValue = MarketInfo(Symbol(),MODE_TICKVALUE);
   if (Digits==3 || Digits==5) pipValue *= 10;
   double orderSize = NormalizeDouble(AccountEquity() * maxLossPercent / stopLossInPips * pipValue / 100, Digits);
   Print("orderSize ",orderSize);
   return orderSize;
}

andream1977
 
Messaggi: 2
Iscritto il: 05/01/2017, 12:52


Re: come calcolare la size di un ordine

Messaggioda IntoTheWild1990 » 06/01/2017, 22:47

Vediamo se riesco a darti una risposta.

Ogni sottostante ha un valore intrinseco, ad esempio comprare 1 lotto di euro/dollaro equivale a impegnare 100.000€ circa, quindi se hai un conto da 100.000€ e apri un lotto sei a leva 1:1. Nel caso hai 10.000€ per entrare a leva 1:1 dovresti aprire una posizione di 0,10 circa. In particolare se vuoi conoscere effettivamente quanto capitale impegni all'acquisto dovresti fare il seguente ragionamento:

apri su un conto demo una posizione, determini quanto vale un pip, calcoli da quanti pips è composto il sottostante e moltiplichi il valore del pip per il numero di pips che compongono il sottostante e conosci quanto capitale hai impegnato nella transazione; per conoscere la leva devi dividere il valore precedente per il tuo saldo e saprai con che leva sei esposto. Ti faccio un esempio per rendere chiaro il ragionamento.

Ammettiamo che tu abbia aperto una posizione da un lotto su eur/usd e noti che per ogni pip la tua posizione varia di 10€, questo è il valore del pip.
Determini il prezzo dell'eur/usd, adesso è 1,0530, dividi il prezzo per il pip che è uguale a 0,0001, quindi il tuo sottostante è composto da 10.530 pips, moltiplichi il numero di pips per il valore del singolo pip e ottieni 105.300€, cioè per una posizione di un lotto a leva 1:1 devi impegnare 105.300€.

quindi con questo strumento attraverso una semplice formula puoi determinare la leva operativa che più preferisci.

Ammettiamo per semplicità che tu abbia un conto da 10.000€ che tu voglia lavorare con leva 1:10, quindi vuoi impegnare 100.000€ per ogni posizione, allora il tuo bot dovrà aprire una posizione da 1 lotto, supponiamo inoltre che tu voglia mettere a rischio solo il 2% del capitale cioè 10.000*0.02=200€ e che un pip valga 10€ quindi il tuo stop loss deve essere di 200/10=20 pips...

Questo può essere un ragionamento carino per calcolare il rischio al 2%, come hai potuto notare però è stato necessario effettuare una scelta, ovvero con che leva operare.
se ti piace questa interpretazione del problema sono disposto ad automatizzartela...

saluti
However there are reason believe that the Lagrangian are more foundamental.
Cit[ prof. G.Giaquinta]
IntoTheWild1990
 
Messaggi: 46
Iscritto il: 12/10/2016, 17:44

Re: come calcolare la size di un ordine

Messaggioda Jeckle92 » 07/01/2017, 12:24

Ciao a tutti pure io è da un po cerco di scrivere questa riga di codice ma non riesco a farlo se tu riuscissi a crearla ti sarei pure io immensamente grato :)
Jeckle92
 
Messaggi: 1
Iscritto il: 05/01/2017, 11:44

Re: come calcolare la size di un ordine

Messaggioda andream1977 » 07/01/2017, 14:47

IntoTheWild1990 mi piace questa questa interpretazione del problema, sono interessato al codice, ti ringrazio in anticipo
andream1977
 
Messaggi: 2
Iscritto il: 05/01/2017, 12:52


Torna a Metatrader - Expert Advisor - MQL

 


  • Discussioni correlate
    Risposte
    Visite
    Ultimo messaggio

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite