Sari la conținut

Featured Replies

Postat

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;

  • 3 luni mai târziu...
  • Răspunsuri 5
  • Citiri 3,6k
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

Postat
  • Autor

E posibil sa fie nevoie sa-i spui ca cifrele sunt numere reale. Teoretic vorbind, ar trebui sa fie pe-acolo 10.0 , 100.0 etc. Pe broker cu 4 zecimale l-am facut, distreaza-te daca vrei pentru 5. :)

Postat

//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

  • 3 luni mai târziu...
Postat

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

  • 1 an mai târziu...
Postat
  • Autor

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

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...

Navigare recentă 0

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

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.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.