MQL4 ve MQL5 ile ilgili herhangi bir acemi sorusu, algoritmalar ve kodlar hakkında yardım ve tartışma - sayfa 565

 
PolarSeaman :

kodda değiştirmişsin

üzerinde

ama yardımcı olmadı)

Bunu sadece fark ettiğin için üzgünüm.

 
Alekseu Fedotov :

SEEK_END işaretli FileSeek() size yardımcı olacaktır.

<

Teşekkürler! Deneyeceğim!

 
YanSay :

İyi akşamlar!

Depozito yüzdesine dayalı bir anlaşma için lotu hesaplamak için evrensel (farklı enstrümanlar için) bir kodun nasıl ekleneceği konusunda beynimi zorluyorum.

Böyle mi yaptı:

Fiyat ( pozisyon açılış fiyatı) ve SL (zarar durdur) ayrı ayrı hesaplanır, buraya eklemedim.

Karşıt para biriminin dolar cinsinden olduğu çiftler için (örneğin EURUSD), SPX500 endeksi için ve altın için - her şey doğru hesaplanır, ancak teklifte doların ilk olduğu çiftler için (örneğin USDJPY) çalışmaz.

Lütfen bana neyi özlediğini söyle?

Normalleşmeye dikkat

_Digits değişkeni, mevcut grafik sembolü fiyat ölçümünün doğruluğunu belirleyen ondalık noktadan sonraki ondalık basamak sayısını saklar.

 
Alekseu Fedotov :

Normalleşmeye dikkat

_Digits değişkeni, mevcut grafik sembolü fiyat ölçümünün doğruluğunu belirleyen ondalık noktadan sonraki ondalık basamak sayısını saklar.

Sayesinde! Bunu şu şekilde değiştirdi:

 input double MaximumRisk= 0.02 ;                   //Риск в сделке от депозита

//1ый вариант
{Lots = NormalizeDouble ((( AccountBalance ()*MaximumRisk)/(( MathAbs (Price-SL))/ Point )/(( MarketInfo ( Symbol (), MODE_LOTSIZE )*( MarketInfo ( Symbol (), MODE_ASK )+ Point ))
-( MarketInfo ( Symbol (), MODE_LOTSIZE )* MarketInfo ( Symbol (), MODE_ASK )))),
int ( MathAbs ( log ( MarketInfo ( Symbol (), MODE_LOTSTEP )))));}

//2ой вариант
{Lots = NormalizeDouble (( AccountBalance ()*MaximumRisk)/(( MathAbs (Price-SL))/ Point )/(( MarketInfo ( Symbol (), MODE_TICKVALUE ))),
int ( MathAbs ( log ( MarketInfo ( Symbol (), MODE_LOTSTEP )))));}

1. seçenekte: EURUSD ve XAUUSD - her şey doğru; USDJPY - mevduatın %2'si yerine, mevduatın %0.2'lik riski; ve SPX500 ve BRN durumunda, OrderSend hatası 131'i verir (lot hesaplama hatası).

2. seçenekte: EURUSD, XAUUSD ve USDJPY - her şey doğru; SPX500 - mevduatın %2'si yerine mevduatın %20'sini riske atın; ve BRN durumunda genellikle OrderSend hatası 131 (lot hesaplama hatası) verir.

Başka bir yerde hata var, neresinde anlayamadım, söyleyin lütfen.

 
YanSay :

Sayesinde! Bunu şu şekilde değiştirdi:

1. seçenekte: EURUSD ve XAUUSD - her şey doğru; USDJPY - mevduatın %2'si yerine, mevduatın %0.2'lik riski; ve SPX500 ve BRN durumunda, OrderSend hatası 131'i verir (lot hesaplama hatası).

2. seçenekte: EURUSD, XAUUSD ve USDJPY - her şey doğru; SPX500 - mevduatın %2'si yerine mevduatın %20'sini riske atın; ve BRN durumunda genellikle OrderSend hatası 131 (lot hesaplama hatası) verir.

Başka bir yerde hata var, neresinde anlayamadım, söyleyin lütfen.

Noktayı MarketInfo ile değiştirin ( Symbol (), MODE_POINT )

 
Vitaly Muzichenko :

Noktayı MarketInfo ile değiştirin ( Symbol (), MODE_POINT )

Peki ya anlamı? Grafiğin sembolündeki her şey hesaplanırsa. Çoklu para birimi ve hesaplanan Sembolün mevcut tablodan farklı olması mantıklıdır.

 
Vitaly Muzichenko :

Noktayı MarketInfo ile değiştirin ( Symbol (), MODE_POINT )

Maalesef yardımcı olmadı

Ve MODE_POINT bilgisinde "Karşıt para biriminde puan boyutu. Mevcut enstrüman için önceden tanımlanmış değişken Noktada saklanır" yazıyor.

Açıklamaya bakılırsa, hangi seçeneğin kullanılacağı önemli değil. Ama denedim ve işe yaramadı.


 

Söyleyin bana, Expert Advisor'daki butona bir grafiksel araç "seçimi" koymak mümkün mü, böylece imlecin altındaki butona tıklayarak aracın simgesi görünecek ve çekilebilecek mi?

Ayrıca, zaten belirtilen özelliklere sahip olan kanal

 
Roman Sharanov :

Söyleyin bana, Expert Advisor'daki butona bir grafiksel araç "seçimi" koymak mümkün mü, böylece imlecin altındaki butona tıklayarak aracın simgesi görünecek ve çekilebilecek mi?

Ayrıca kanalın belirtilen özelliklere sahip olabilmesi için

Belki

 
YanSay :

Maalesef yardımcı olmadı

Ve MODE_POINT bilgisinde "Karşıt para biriminde puan boyutu. Mevcut enstrüman için önceden tanımlanmış değişken Noktada saklanır" yazıyor.

Açıklamaya bakılırsa, hangi seçeneğin kullanılacağı önemli değil. Ama denedim ve yardımcı olmadı.

İşlevi deneyin:

 //===============================================================================================
//------------------------------ Расчет лота по риску на StopLoss -------------------------------+
//===============================================================================================
double sLot( double Percent= 1 , double Stloss= 100 , string symb= "0" ) {
 if (symb== "0" ) symb= Symbol ();
 double TickValue   = SymbolInfoDouble (symb, SYMBOL_TRADE_TICK_VALUE ),
        TickSize    = SymbolInfoDouble (symb, SYMBOL_TRADE_TICK_SIZE ),
        ContractSize= SymbolInfoDouble (symb, SYMBOL_TRADE_CONTRACT_SIZE ),
        Min_Lot     = SymbolInfoDouble (symb, SYMBOL_VOLUME_MIN ),
        Max_Lot     = SymbolInfoDouble (symb, SYMBOL_VOLUME_MAX ),
        Step        = SymbolInfoDouble (symb, SYMBOL_VOLUME_STEP ),
        Free        = AccountInfoDouble ( ACCOUNT_FREEMARGIN ),
        Lots_New    = 0.0 ;
 int CalcMode=( int ) SymbolInfoInteger (symb, SYMBOL_TRADE_CALC_MODE );

   if (Percent > 100 ) Percent = 100 ;
   if (Stloss <= 0 ) return ( 0 );
   if (Percent == 0 ) Lots_New = Min_Lot;
   else {
     if (CalcMode== 0 || CalcMode== 4 )
      Lots_New = MathFloor ((((Free*Percent/ 100 )/Stloss)/TickValue)/Step)*Step;
     if (CalcMode== 1 ||CalcMode== 2 ||CalcMode== 3 )
      Lots_New = MathFloor (((((Free*Percent)/ 100 )/Stloss)/((TickSize*TickValue)*ContractSize/TickValue))/Step)*Step;
   }
   if (Lots_New > Max_Lot) Lots_New = Max_Lot;
   if (Lots_New < Min_Lot) return ( 0 );
   return ( NormalizeDouble (Lots_New, /*LotDigit()*/ 2 ));
 }