% mevduattan doğru lot hesaplaması - sayfa 5

 
EverAlex :

Bu nedenle, lSL, SL'ye kaç puan

Puan = 0.00001 (5 basamaklı tırnak için)

dLotAdım = 0.01


Formül (lSL*dLotCost* dLotStep ))*dLotStep yanlış

(lSL*dLotCost* Point ))*dLotStep gibi bir şey olmalı


Hiçbir şey icat etmek zorunda değilsin. Her DC'deki parti büyüklüğü farklıdır ve istediğiniz boyuta getirmeniz gerekir. Noktalar burada önemsizdir.
 
Vinin :

Hiçbir şey icat etmek zorunda değilsin. Her DC'deki parti büyüklüğü farklıdır ve istediğiniz boyuta getirmeniz gerekir. Noktalar burada önemsizdir.


Sorunun koşullarına göre, lSL , lot puanlarında değil, kotasyon puanlarındaki düşüşün boyutudur.

Onlar. Burada sadece bununla ilgili noktalar var.

Bu, hesaplama formülünde (parantez içindekileri) dLotStep ile değil, Point ile çarpmanız gerektiği anlamına gelir.

Başka bir şey de, bunun zaten dLotCost pahasına gerçekleşmesidir ( depozito para birimine dönüşümle birlikte)...

Onlar. ilk biz

 MathRound ( AccountFreeMargin ()*lRisk* 0.01 / (lSL*dLotCost*dLotStep))

bir tamsayı alın ve ardından dLotStep ile çarparak doğru lot birimlerine yeniden hesaplayın.

 
double lotSize( double deposSize= 1000.0 , string currName= "USDCHF" , double proc= 2.0 , int pipsLoss= 1000 ) // функция лота
{  
   //проверка достаточности средств 
   if (deposSize < 
   MarketInfo (currName, MODE_MARGINREQUIRED )* MarketInfo (currName, MODE_MINLOT ))
   //для проведения торговли
   {
       Alert ( "Величина вашего депозита недостаточна \nдля торговли на инструменте\"" +currName+ "\" \nc минимальнодопустимым лотом" );
       return 0.0 ;
   }
   //проверка, на стоп-аут
   ENUM_ACCOUNT_STOPOUT_MODE stopOutMode=(ENUM_ACCOUNT_STOPOUT_MODE) AccountInfoInteger ( ACCOUNT_MARGIN_SO_MODE );
   double procUsed;
   if (stopOutMode==ACCOUNT_STOPOUT_MODE_PERCENT) //если стоп-аут в процентах
     {
         if (proc > AccountInfoDouble ( ACCOUNT_MARGIN_SO_SO ))
           {
               Alert ( "Потеря выше уровня STOPOUT!\nРасчет лота производиться по величине STOPOUT." );
               procUsed= AccountInfoDouble ( ACCOUNT_MARGIN_SO_SO )/ 100 ;
               //Print(MarketInfo(currName,MODE_MARGINREQUIRED)," ",procUsed);
               return deposSize/(pipsLoss+procUsed* MarketInfo (currName, MODE_MARGINREQUIRED ));               
           }
     }
     //а вот здесь нужна доработка, для платформ, где стоп-аут в пунктах
     //как сказал один наш товарищ "у кого идеи ростут из нужного места".. доделает
     
   double currMove=deposSize*proc/ 100 ; // расчет процента от величины депозита
   double lotCount=currMove/(pipsLoss* MarketInfo (currName, MODE_TICKVALUE )); //ну а тут и ведеться сам расчет лота

   if (lotCount< MarketInfo (currName, MODE_MINLOT ))
   {
       return MarketInfo (currName, MODE_MINLOT );
   }
   if (lotCount> MarketInfo (currName, MODE_MAXLOT ))
   {
       return MarketInfo (currName, MODE_MAXLOT );  
   }
   return NormalizeDouble (lotCount, 2 );
   //return lotCount;
}

Bir çift "EURUSD" ticareti yapmak ve bir kayıp için %30 ayarlamak için 3 dolarlık bir depozito ile başka bir seçenek daha var.. ama bu zaten bir dizi sapıklıktan kaynaklanıyor

 
EverAlex :


Sorunun koşullarına göre, lSL , lot puanlarında değil, kotasyon puanlarındaki düşüşün boyutudur.

Onlar. Burada sadece bununla ilgili noktalar var.

Bu, hesaplama formülünde (parantez içindekileri) dLotStep ile değil, Point ile çarpmanın da gerekli olduğu anlamına gelir.

Başka bir şey de, bunun zaten dLotCost pahasına gerçekleşmesidir (mevduat para birimine dönüşümle birlikte)...

Onlar. ilk biz

bir tamsayı alın ve ardından dLotStep ile çarparak doğru lot birimlerine yeniden hesaplayın.




Evet
 
Vinin :


Her neyse, formül yanlış ( iSL>0 bloğu için).

TICKVALUE , TICKSIZE için fiyat verir.

Ve lSL , POINT noktalarında belirtilir.

NOKTA her zaman TICKSIZE ile aynı değildir (bkz. Alpari'nin 3 haneli XAUUSD çifti ).

Yani - lSL'yi POINT'den TICKSIZE'a yeniden hesaplamanız gerekiyor.

Aksi takdirde, 10 kat fazla fiyatlanacağız (yeniden hesaplama ekleyene kadar XAUUSD çiftinde gözlemledim).

if (lSL>0){

lSL= (int)(MarketInfo(lSymbol,MODE_TICKSIZE) / MarketInfo(lSymbol,MODE_POINT) )* lSL; // TICKSIZE/POINT bir tamsayı (1 veya 10) verir, böylece lSL benzeri int kullanabilirsiniz

// olduğu gibi devam et

 double dLotCost= MarketInfo (lSymbol, MODE_TICKVALUE );
 dLot= MathRound ( AccountFreeMargin ()*lRisk* 0.01 /(lSL*dLotCost*dLotStep))*dLotStep;
}

Not: birçok geçişte (>10 milyon) optimize edilmiş araçlar için, tüm değişmez sembol parametreleri ( TICKSIZE , POINT , TICKVALUE , LOTSTEP , MINLOT , MAXLOT , vb.) i nit() işlevindeki değişkenlere atanmalıdır ve hesaplamalarda bu değişkenlerin değerleri kullanılmalıdır.

dahil TickSize/Point değerini bir değişkene taşıyın.

 
EverAlex :

Her neyse, formül yanlış ( iSL>0 bloğu için).

TICKVALUE , TICKSIZE için fiyat verir.

Ve lSL , POINT noktalarında belirtilir.

NOKTA her zaman TICKSIZE ile aynı değildir (bkz. Alpari'nin 3 haneli XAUUSD çifti).

Yani - lSL'yi POINT'den TICKSIZE'a yeniden hesaplamanız gerekiyor.

Aksi takdirde, 10 kat fazla fiyatlanacağız (yeniden hesaplama ekleyene kadar XAUUSD çiftinde gözlemledim).

if (lSL>0){

lSL= (int)(MarketInfo(lSymbol,MODE_TICKSIZE) / MarketInfo(lSymbol,MODE_POINT) )* lSL; // TICKSIZE/POINT bir tamsayı (1 veya 10) verir, böylece lSL benzeri int kullanabilirsiniz

// olduğu gibi devam et

Not: birçok geçişte (>10 milyon) optimize edilmiş TS için, değiştirilemeyen tüm sembol parametreleri ( TICKSIZE , POINT , TICKVALUE , LOTSTEP , MINLOT , MAXLOT , vb.) i nit() işlevindeki değişkenlere atanmalı ve kullanılmalıdır hesaplamalarda.

dahil TickSize/Point değerini bir değişkene taşıyın.




teşekkürler
 
Vinin :

teşekkürler

Topikstarter saygılarını ilk sayfada yolladı ve bir daha görünmedi.

Birkaç yıl önce forumda bir yerde bu konu tartışılmıştı. Hafızadan tekrar anlatacağım, ancak formüller olmadan.

Diyelim ki AUDCHF çifti ile işlem yapıyoruz. Bir pozisyonda bir kâr veya zararın nasıl oluştuğunu açıklamak için oldukça keyfi olarak alınır. Yaklaşık olarak aynı konu https://www.mql5.com/ru/forum/150912 başlığında gündeme getirildi.

100.000 AUD'lik bir lot işlem yaparsak, (beş basamaklı olarak) her pip 1 CHF (çiftin paydası) kar veya zarar (çeliğin hangi yöne ve fiyatın nereye gittiğine bağlı olarak) getirir.

Buna göre her an ne kadar CHF kazandığımızı/kaybettiğimizi biliyoruz. Kazanç/kayıp, mevduat para birimi USD ise mevcut USDCHF kuru üzerinden mevduat para birimine, mevduat para birimi EUR ise EURCHF'ye dönüştürülür. Benzetme yoluyla, tüm çiftler ve mevduat para birimleri için.

Dolayısıyla cevap: her zaman tam olarak doğru parti büyüklüğünü tahmin edemeyiz. Referans, MODE_TICKVALUE sorgu parametresiyle MarketInfo() olabilir.

 
Mislaid :

Dolayısıyla cevap: her zaman tam olarak doğru parti büyüklüğünü tahmin edemeyiz. Referans, MODE_TICKVALUE sorgu parametresiyle MarketInfo() olabilir.


Bu yüzden uzun süre dikkate alındı. En azından - Vinin'in güzelce tasarlanmış gönderilerinde ( eşleşmeyen TICKSIZE c POINT için yanlış lot hesaplaması ile) ve Martingeil'in eski gönderisinde (doğru lot hesaplamasıyla, ancak düşüş ayarlama yeteneği olmadan ==0).

Ana şey, doğru TICKVALUE değerinin DC'den gelmesidir (veya MT'de hesaplanıyorsa istemcide doğru şekilde hesaplanır).


Bu konu başladığında, TICKVALUE'un henüz var olmadığını anladım.

Ve görünüşü ile her şey basitleştirildi ve bu konu bir süreliğine soldu.

Not: Sürümümü yakında yayınlayacağım - Vinin'in varyantı (daha basit bir formüle sahiptir ve iSL==0 sağlar) ve Martingeil'in (minimum lot için bile para sıkıntısı kontrolü) melezi.

Özellikler: 1) AccountFreeMargin()'den bakiye hesaplaması, AccountBalance()'dan değil.

2) Ve (değişkenler için) SL tarafından açık işlem kapatıldığında bakiyenin belirli bir miktar azalacağı dikkate alınır.

Min için bile yeterli fon yoksa. bakiye - lot büyüklüğü -134 verecek (hata 134 - bir ticaret açmak için fon eksikliği)

Bu bağlamda, Vinin'e (ve diğer deneyimli yoldaşlara) bir soru: kod kendi kendine mi renklendiriyor yoksa siz mi renklendiriyorsunuz? Parça stilini "kod" olarak ayarlamaya çalıştım ama renklendirmedi. Yoksa sadece gönderiyi gönderdikten sonra mı boyanıyor?

 
EverAlex :

Bu bağlamda, Vinin'e (ve diğer deneyimli yoldaşlara) bir soru: kod kendi kendine mi renklendiriyor yoksa siz mi renklendiriyorsunuz? Parça stilini "kod" olarak ayarlamaya çalıştım ama renklendirmedi. Yoksa sadece gönderiyi gönderdikten sonra mı boyanıyor?

Kendini renklendirir. Ama her zaman değil.
 

fikrimi sonuçlandırdım (stop-out yüzdesi olan platformlar için) .. kodu paylaşmak .. yapıcı eleştiri kabul edilir

double lotSize(double deposSize=1000.0, string currName="USDCHF", double proc=2.0, int pipsLoss=1000)
{  
   double lotCount=0;
   //1) проверка достаточности средств для проведения торговли
   if(deposSize < 
   MarketInfo(currName,MODE_MARGINREQUIRED)*MarketInfo(currName,MODE_MINLOT))
   {
      //Alert("Величина вашего депозита недостаточна \nдля торговли на инструменте\""+currName+"\" \nc минимальнодопустимым лотом");
      return 0.0;
   }
   
   double currMove=deposSize*proc/100;// расчет процента от величины депозита
   
  
   //расчивываем максимально допустимый лот, до стоп-аута
   double SOlot = deposSize/(pipsLoss*MarketInfo(currName,MODE_TICKVALUE)+
   MarketInfo(currName,MODE_MARGINREQUIRED)*AccountInfoDouble(ACCOUNT_MARGIN_SO_SO)/100);     
   //расчет величины депозита, при котором сработает стоп-аут
   double SOval = SOlot*pipsLoss*MarketInfo(currName,MODE_TICKVALUE);
   
   
   ENUM_ACCOUNT_STOPOUT_MODE stopOutMode=(ENUM_ACCOUNT_STOPOUT_MODE)AccountInfoInteger(ACCOUNT_MARGIN_SO_MODE);
   
   if(stopOutMode==ACCOUNT_STOPOUT_MODE_PERCENT)//если стоп-аут в процентах
   {  
     
     if((deposSize-currMove)<SOval)//проверяем остаток на депозите на превышение значения стоп-аут
     {     
         if(SOlot<MarketInfo(currName,MODE_MINLOT))//если лот стоп-аута меньше минимального лота
         {
             lotCount = MarketInfo(currName,MODE_MINLOT);
             //находим количесвто пунктов до вылета по стоп-ауту и выбрасываем предупреждение
             int pipsSO=(int)round((deposSize - SOval)/(lotCount * MarketInfo(currName,MODE_TICKVALUE)));
             Print("При прохождении ценой больше ", pipsSO," пп.- \nторговля будет прекращена по STOP OUT!");             
             
             
         }
         else//если наш стоп-аут лот больше равно минимального
         {
              lotCount = SOlot;              
              int pipsSO=(int)round((deposSize - SOval)/(lotCount * MarketInfo(currName,MODE_TICKVALUE)));
              Print("Достижение STOP OUT, произойдет через ", pipsSO, " и работа будет проведена с максимальнодоступимым лотом до STOP OUT");
                           
         }
     }
     else//если же остаток на депозите будет меньше стоп-аута
     {     
     lotCount = currMove/(pipsLoss*MarketInfo(currName,MODE_TICKVALUE));
         if(lotCount<MarketInfo(currName,MODE_MINLOT))//если лот меньше минимального лота
         {            
            int pipsProc=(int)round(currMove/(MarketInfo(currName,MODE_MINLOT)*MarketInfo(currName,MODE_TICKVALUE)));
            Print(proc,"%-й уровень депозита будет достигнут, з минимальнолопустимым лотом, за ",pipsProc," пп.");
            lotCount=MarketInfo(currName,MODE_MINLOT);      
         }         
     }     
     
   }
   else{
   //а вот здесь нужна доработка, для платформ, где стоп-аут в пунктах
   //как сказал один наш товарищ "у кого идеи ростут из нужного места".. доделает
   /*
   */}      
  
   //"прическа" для лота   
   lotCount = MathFloor(lotCount/MarketInfo(currName,MODE_MINLOT))*MarketInfo(currName,MODE_MINLOT);   

   if(lotCount<MarketInfo(currName,MODE_MINLOT))
   {
      return MarketInfo(currName,MODE_MINLOT);
   }
   if(lotCount>MarketInfo(currName,MODE_MAXLOT))
   {
      return MarketInfo(currName,MODE_MAXLOT);  
   }   
   return lotCount;
}
Neden: