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

 
Sergey Likho :

Bir işlem için marjın nasıl hesaplanacağını söyleyebilir misiniz?


İki yaklaşım denedi

(0.1 * Ask*MarketInfo(Symbol(),MODE_LOTSIZE))/AccountInfoInteger(ACCOUNT_LEVERAGE)


Ve bunun gibi

FreeMarginCheck=AccountFreeMarginCheck(Symbol(),OP_BUY,0.1);

 double val=AccountFreeMargin()-FreeMarginCheck;



Birincisi, mevduat para birimi USD ise EURJPY'de garip sonuçlar verir. Formüle bir şey eklemeniz mi gerekiyor?

İkincisi de her seferinde çalışır, sonra doğru değerleri verir, sonra biraz saçmalık (depozitoya bağlıdır)

ikinci seçenek, marjı hesaplamanın doğru yoludur veya daha doğrusu, sipariş verildikten sonra val değişkeninde serbest marjın değerini alırsınız ve FreeMarginCheck değişkeni, marjin değerini içerir.

 
Igor Makanu :

ikinci seçenek, marjı hesaplamanın doğru yoludur veya daha doğrusu, sipariş verildikten sonra val değişkeninde serbest marjın değerini alırsınız ve FreeMarginCheck değişkeni, marjin değerini içerir.

Elbette?

HesapSerbestMarjKontrol

Cari hesapta cari fiyattan belirtilen emir açıldıktan sonra kalacak serbest teminat tutarını döndürür.


Ayrıca bir nüans var:

Karşı işlemler açıksa, yani. hesapta tam veya eksik bir kilit varsa, işlev yanlış değerler verebilir.


 
Sergey Likho :

Elbette?

evet haklısın aynen şöyle:

Cari hesapta cari fiyattan belirtilen emir açıldıktan sonra kalacak serbest teminat tutarını döndürür .

açık anlaşmalar hakkında, kontrol etmeniz gerekiyor, hatırlamıyorum, ancak büyük olasılıkla terminalin yazdıklarının hesaplanan verilerle birleşmesi gerekir: tüm semboller için her bir anlaşma yönündeki (AL / SAT) toplam lot sayısı, ardından arayın her sembol

AccountFreeMarginCheck() her yönde lotları geçiyor ve bu sonuçları topluyor

bugün piyasa çalışıyor, bunu kontrol etmek zor değil, bunun gibi bir şey:

 #property strict
//+------------------------------------------------------------------+
void OnStart ()
  {
   int i,ot,k= OrdersTotal ();
   double lot_buy= 0.0 ,lot_sell= 0.0 ;
   string sy= Symbol ();
   for (i= 0 ; i<k; i++)
     {
       if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES ))
        {
         ot= OrderType ();
         if ( OrderSymbol ()==sy)
           {
             if (ot== OP_BUY )  lot_buy+= OrderLots ();
             if (ot== OP_SELL ) lot_sell+= OrderLots ();
           }
        }
     }
   double MarginBUY  = AccountFreeMargin ()- AccountFreeMarginCheck (sy, OP_BUY ,lot_buy);
   double MarginSELL = AccountFreeMargin ()- AccountFreeMarginCheck (sy, OP_SELL ,lot_sell);
   double MarginALL = MarginBUY+MarginSELL;
   Print ( "Залог BUY = " ,MarginBUY);
   Print ( "Залог SELL = " ,MarginSELL);
   Print ( "Залог ALL = " ,MarginALL);
  }
 

Selamlar, işlevlerde neyin yanlış olduğunu söyle? İşlev, duraklama başlangıcı ve duraklama bitiş parametrelerinde zamana göre bir ticaret duraklaması gerçekleştirir.
Nedense, işlev, TimeCurrent belirtilmiş olmasına rağmen, aracının sunucusundan değil, bilgisayardan zamanı okur. Genel olarak, bir duraklama sırasında işlemler kapatılır, yani işlev çalışmaz.

 input  bool        p                 = true;    // Trading pause on/off
input  string      TimeStart         = "23:59"; // Start pause
input  string      TimeEnd           = "06:15"; // End of pause


int start() {

   //+----------------------------------------------------------------------------+
   datetime StartPause,EndPause;
   // ---
   StartPause = StrToTime (TimeStart);
   EndPause   = StrToTime (TimeEnd);
   // ---
   if ((p && StartPause > EndPause && ( TimeCurrent () > StartPause || TimeCurrent () < EndPause)))
   {
     Print ( " Pause the EA " );
     return ( 0 );
   }
   //+----------------------------------------------------------------------------+
 
Anatolij Anufriev :

Selamlar, işlevlerde neyin yanlış olduğunu söyle? İşlev, duraklatma başlangıcı ve duraklatma bitiş parametrelerinde zamana göre bir ticaret duraklaması gerçekleştirir.
Nedense, işlev, TimeCurrent belirtilmiş olmasına rağmen, aracının sunucusundan değil, bilgisayardan zamanı okur. Genel olarak, bir duraklama sırasında işlemler kapatılır, yani işlev çalışmaz.

TimeStart ve StrToTime'ı (TimeStart) yazdırın;

sonra TimeCurrent ( ) yazdırmasını kaldırın

TimeStart'ta tam tarih saat biçimine sahip değilsiniz , daha doğrusu, danışman başlatıldığında saat her zaman geçerli gün, ay ve yıl olacak ve sonra değişecek mi?

peki, küresel olarak... alım satım saat ve dakikalarını belirlemek için, saat ve dakikaları sunucu saatinin saat ve dakikalarıyla karşılaştırmanız gerekir, yalnızca sunucu zamanının belirtilenden daha büyük olduğu gerçeğini karşılaştırırsınız.

Not: Kafanızın karışmaması için, datetime'ı aslında olduğu gibi bir int olarak hayal edebilirsiniz ve 2 datetime'ı karşılaştırarak 2 int'yi karşılaştırırsınız.        

PSPS:

 if ((p && StartPause > EndPause && ( TimeCurrent () > StartPause || TimeCurrent () < EndPause)))

Belki kodunuz işe yarar, şunu denemeniz gerekir:

 if ((p && StartPause > EndPause && ( TimeCurrent () > StartPause && TimeCurrent () < EndPause)))


Genelde şöyle düşünürüm:

int h = TimeHour(TimeCurrent());

int m = TimeMinute(TimeCurrent());

ve ardından danışmanın ayarlarıyla karşılaştırın

 
Igor Makanu :

Teşekkür ederim, anlamaya çalışacağım, sadece acemiyim), || yerine && seçeneğiyle Henüz online bakmayı denemedim, bu arada bu kod test cihazında çalışıyor, terminalden zamanı okuyor, bir duraklama sırasında siparişlerin kapanması yok, ancak çevrimiçi olarak her şey farklı.

 

Merhaba! Terminal, strateji test cihazında başlamıyor. Tarihi ayarladım, örneğin (2017.04.01 - 2018.05.29), starta basıyorum, hemen stop veriyor. Günlük şunları söylüyor,

TestGenerator: 2017.04.01'den 2018.05.29'a kadar 'EURUSD30' geçmiş verisi yok. Ve böylece herhangi bir segmentte. Bilgisayar çalışıyor, biraz işlevsel olabileceğini düşündüm. Ev bilgisayarında, aynı şey, yeniden başlatma yardımcı olmuyor, ancak bir süre duracak, başlıyor. Danışman marketten indirildi, deneme sürümü. nedenini bilen varsa söylesin?


 
danil77783 :

Merhaba! Terminal, strateji test cihazında başlamıyor. Tarihi ayarladım, örneğin (2017.04.01 - 2018.05.29), starta basıyorum, hemen stop veriyor. Günlük şunları söylüyor,

TestGenerator: 2017.04.01'den 2018.05.29'a kadar 'EURUSD30' geçmiş verisi yok. Ve böylece herhangi bir segmentte. Bilgisayar çalışıyor, yeterli ajan olmayabileceğini düşündüm. Ev bilgisayarında, aynı şey, yeniden başlatma yardımcı olmuyor, ancak bir süre duracak, başlıyor. Danışman marketten indirildi, deneme sürümü. nedenini bilen varsa söylesin?


Bir testçi gibi görünüyorsunuz ve tarihsel veri olmadığını yazıyor, F2'ye basın ve geçmişi yükleyin, ardından terminali yeniden başlatın

 
danil77783 :

Merhaba! Terminal, strateji test cihazında başlamıyor. Tarihi ayarladım, örneğin (2017.04.01 - 2018.05.29), starta basıyorum, hemen stop veriyor. Günlük şunları söylüyor,

TestGenerator: 2017.04.01'den 2018.05.29'a kadar 'EURUSD30' geçmiş verisi yok. Ve böylece herhangi bir segmentte. Bilgisayar çalışıyor, yeterli ajan olmayabileceğini düşündüm. Ev bilgisayarında, aynı şey, yeniden başlatma yardımcı olmuyor, ancak bir süre duracak, başlıyor. Danışman marketten indirildi, deneme sürümü. nedenini bilen varsa söylesin?


hiçbir tarih verisi hiçbir şey söylemiyor mu?

 
Igor Makanu :

Bir testçi gibi görünüyorsunuz ve tarihsel veri olmadığını yazıyor, F2'ye basın ve geçmişi yükleyin, ardından terminali yeniden başlatın

Teşekkür ederim! Deneyeceğim. Ve terminali güncellemek bir şekilde etkileyebilir mi? Güncellenip güncellenmediği gerçeği, kendisi bu konuda rapor vermesine rağmen......