Sari la conținut

Aflarea marimii unui lot


Postări Recomandate

M-am mai jucat azi putin in MQL si pentru ca nu am stiut unde sa o gasesc am incercat sa reproduc formula pentru a calcula marimea unui lot in functie de stoploss si procentul de risc. Sper sa scuteasca alti incepatori de vreun sfert de ora de minunat "cum pot sa-l fac mental dar nu ma prind cum vine matematic?".

 

double pozitie(double stoploss, int risc)

{

//stoploss=nr pipsi pana la stoploss

//risc=cat la suta risc exprimat in integer: 1 pt 1% risc pe tranzactie

double bani,lot,dolari,pip;

bani=AccountBalance();

dolari=bani/(100/risc);

pip=dolari/stoploss;

lot=pip/10;

return (lot);

}

//formula este:

//lot=((catibaniai/(100/risc))/stoploss)/10;

Link spre comentariu
Distribuie pe alte site-uri

  • 3 luni mai târziu...
  • Răspunsuri 5
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

//formula este:

//lot=((catibaniai/(100/risc))/stoploss)/10;

In forma asta nu functioneaza decat pentru perechi pt care 1pip = 0.0001.

Valorea 10 la care imparti presupun ca vine de la 100.000*0.0001, pip value pentru un lot.

 

Cred ca ar fi mai bine sa folosesti ceva de genul:

double pip_val=MarketInfo(Symbol(),MODE_TICKVALUE);

 

lot=((catibaniai/(100/risc))/stoploss)/pip_val;

 

Asta ar trebui sa rezove si problema pentru brokerii cu 5 zecimale.

Editat de Xtrdr
Link spre comentariu
Distribuie pe alte site-uri

  • 3 luni mai târziu...

Sunt cateva greseli in codul de mai sus.

Am scris si eu o functie care calculeaza Marimea lotului pe baza a 3 parametrii : perechea , riscul si sl-ul in pipsi.Functia arata cam asa:

//+--------------------------------------------------------------------------------------------------------------------------------------------+
//| Functia calculeaza marimea lotului pe baza riscului si a SL-ului in puncte.                                                                |
//+--------------------------------------------------------------------------------------------------------------------------------------------+
double LotSize(string symbol,int Risk,int SL)
 {
   //Parametrii: -symbol - Prerechea pe care vreau sa deschid lotul
   //            -Risk - valoarea in procente a riscului raportat la marimea contului
   //            -SL - Numarul in puncte a StopLossului 
   double Lots=0.0;                 //Marimea lotului (variabila retunata)
   double AvailableMargin=0.0;      //Magrinea disponibila in care pot deschide noile ordine
   double UsedSLMargin=0.0;         //Marginea folosita de ordinele care au SL
   double PipValuePerUnit=0.0;      //Valoarea unui pips pe o unitate
   double MinLot=0.0;               //Care este lotul minim cu care pot sa tranzactionez
   double aux=0.0;                  //O variabila in care mai fac niste calcule auxiliare
   double MarginRequired=0.0;       //Marginea necesara pentru a deschide lotul
   if(UsedSLMargin("$")==-1)
    {
      Print("<LotSize>: Nu pot calcula marimea unui lot deoarece sunt ordine neacoperite (fara SL)!");
      return(0.0);
    } 
   AvailableMargin=(AccountBalance()*Risk/100)-UsedSLMargin("$");
   PipValuePerUnit=MarketInfo(symbol,MODE_TICKVALUE)/(MarketInfo(symbol,MODE_TICKSIZE)/MarketInfo(symbol,MODE_POINT));
   Lots=MathSqrt(AvailableMargin/(SL*PipValuePerUnit));
   //Rotunjirea marimea lotului prin lipsa la un multiplu de marimea mimea nimina a lotului.(MODE_MINLOT);
   aux=MathRound(Lots/MarketInfo(symbol,MODE_MINLOT))*MarketInfo(symbol,MODE_MINLOT);
   if(aux<Lots)
    {
      Lots=aux;
    } else 
       {
         Lots=aux-MarketInfo(symbol,MODE_MINLOT);
       }  
   //Compararea lotului cu lotul minim acceptat
   MinLot=MarketInfo("EURUSD",MODE_MINLOT);
   if(MinLot>Lots)
    {
      Print("<LotSize>: Lotul calculat este mai mic ca lotul acceptat");
      return (0.0);
    }
   //Verificarea daca exista Margine si pot sa il deschid
   MarginRequired=MarketInfo(symbol,MODE_MARGININIT)+MarketInfo(symbol,MODE_MARGINREQUIRED);
   if(AccountFreeMargin()>MarginRequired)
    {
      Print("<LotSize>: Nu am suficienta margine sa deschid lotul.AccountFreeMargin=",AccountFreeMargin()," ; MarginRequired=",MarginRequired);
      return(0.0); 
    }
   return (Lots);
 }

si in functia asta folosesc o alta functie care imi intoarece ce margine mai e disponibila dar sa nu depaseasca 2%..care arata cam asa:

//+-----------------------------------------------------------------------------------------------------------------------------------------+
//| Functia returneaza marginea folosita de ordinele care au sl.Daca nu exista un ordin care nu are SL intorc 0                             |
//+-----------------------------------------------------------------------------------------------------------------------------------------+
double UsedSLMargin(string option)
 {
   //Parametrii: -option "$" daca intoarece margina folosita in bani si "%" daca intoarce margina folosita in procente
   int nr_o=0;                   //Numarul de ordine
   int ordTicket;                //Numarul ordinului
   double UsedSLMargin=0.0;      //
   double OrderSLValue=0.0;      //
   double PipsValue=0.0;         //Valoarea unui pips
   double SLInPoints=0.0;        //Diferenta intre OrderOpenPrice() si OrderStopLoss() exprimata in puncte
   double aux=0.0;               //O variabila auxiliara
   nr_o=OrdersTotal();
   if (nr_o!=0)
    {  
      for(int i=0;i<nr_o;i++)
       {
         OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
         if(OrderStopLoss()==0.0)
          {
            ordTicket=OrderTicket();
            Print("<UsedSLMarting>: Ordinul #",ordTicket," nu are stop loss.Nu pot calcula marginea ocupata cu stop loss.");
            return (-1.0);
          } else 
              {
                  PipsValue=OrderLots()*MarketInfo(OrderSymbol(),MODE_TICKVALUE)/(MarketInfo(OrderSymbol(),MODE_TICKSIZE)/MarketInfo(OrderSymbol(),MODE_POINT));
                  SLInPoints=MathAbs(OrderOpenPrice()-OrderStopLoss())/MarketInfo(OrderSymbol(),MODE_POINT);
                  OrderSLValue=PipsValue*SLInPoints;
                  UsedSLMargin=UsedSLMargin+OrderSLValue; 
              }
            
       }
    } else // Nu sunt ordine
        {
          return (0.0);
        }
   if (option=="%")     //Exprim UsedSLmargin in procente
    {
       aux=UsedSLMargin;
       UsedSLMargin=UsedSLMargin/AccountBalance()*100;
    }
   return (UsedSLMargin);   
 }
Have fun. Editat de Mangusta
Link spre comentariu
Distribuie pe alte site-uri

  • 1 an mai târziu...

Multumesc. Ma poti ajuta insa putin? Am inclus cele doua subprograme scrise de tine intr-un EA care ia tranzactii dupa o intersectie de medii mobile pe EURUSD M15 si la un apel de forma

 

volum=LotSize("EURUSD",2,300);

 

pierderile sunt0.75%, si nu pricep de ce. In principiu vroiam sa-l fac ca 30 de pips sa insemne 2% din cont.

 

La volum=LotSize("EURUSD",2,500); pierde 1%. Contul initial e de 100.000USD.

 

Singura modificare pe care am facut-o la ce ai scris tu e in functia LotSize()unde am schimbat semnul la

 

if(AccountFreeMargin()>MarginRequired)

 

Apropo, si de ce nu functioneaza ce am scris eu in primul post si pentru perechile cu 2/3 zecimale dupa virgula?

Editat de andrei_lint
Link spre comentariu
Distribuie pe alte site-uri

Alătură-te conversației

Poți posta acum și să te înregistrezi mai târziu. Dacă ai un cont, autentifică-te acum pentru a posta cu contul tău.

Vizitator
Răspunde la acest subiect...

×   Alipit ca text avansat.   Alipește ca text simplu

  Doar 75 emoji sunt permise.

×   Linkul tău a fost încorporat automat.   Afișează ca link în schimb

×   Conținutul tău precedent a fost resetat.   Curăță editor

×   Nu poți lipi imagini direct. Încarcă sau inserează imagini din URL.

  • Navigare recentă   0 membri

    • Nici un utilizator înregistrat nu vede această pagină.

×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.