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

 
MakarFX :

cevap için teşekkürler, bir koltuk değneği ve iyi bir çözüm, ama benim bakış açımdan, biraz yanlış çalışıyor, terazi yüzdüğü için muhtemelen hemen yapmıyor ve bazı durumlarda siparişlerim kapanmaya başladı. nedense eksi. Ancak büyüme olması gerektiği gibi gitti, ancak bu eksilerle birlikte düşüş de arttı. Her şeye tükürdüm ve teklif sınırlarını manuel olarak belirlemeye karar verdim, her gün ayarlamam gerekecek.

 
Порт-моне тв :

cevap için teşekkürler, bir koltuk değneği ve iyi bir çözüm, ama benim bakış açımdan, biraz yanlış çalışıyor , terazi yüzdüğü için muhtemelen hemen yapmıyor ve bazı durumlarda siparişlerim kapanmaya başladı. nedense eksi. Ancak büyüme olması gerektiği gibi gitti, ancak bu eksilerle birlikte düşüş de arttı. Her şeye tükürdüm ve teklif sınırlarını manuel olarak belirlemeye karar verdim, her gün ayarlamam gerekecek.

İşlev doğru çalışıyor.

Bunu dene

 //+--------------------------------------------------------------------------------------------------------------------+

sb1 = StartBalance();
................

//+--------------------------------------------------------------------------------------------------------------------+
//|  Баланс на начало периода                                                                                          |
//+--------------------------------------------------------------------------------------------------------------------+
double StartBalance()
  { double b = 0 ;
   if (AccountBalance()> 0 ) {b = AccountBalance()-DayProfit();}
   return (b);
  }
//+--------------------------------------------------------------------------------------------------------------------+
//|  Суммарный профит на начало периода                                                                                |
//+--------------------------------------------------------------------------------------------------------------------+
double DayProfit()
  { double p = 0 ; datetime st= iTime ( _Symbol , PERIOD_D1 , 0 );
   for ( int pos=OrdersHistoryTotal()- 1 ;pos>= 0 ;pos--)
     {
       if ( OrderSelect (pos,SELECT_BY_POS,MODE_HISTORY)== true )
        {
         if (OrderSymbol() == _Symbol )
           { 
             if (OrderCloseTime()>=st){p+=OrderProfit()+OrderSwap()+OrderCommission();}
           }
        }
     }
   return (p);
  }
//+--------------------------------------------------------------------------------------------------------------------+

ve sipariş kapatma işlevine bir bakiye güncellemesi ekleyin

   if (OrderClose( бла бла бла ))
     {
       StartBalance(); Print ( "Order Close" );
     }
 
Maxim Kuznetsov :

günün değişimini yakalayın ve o andaki bakiyenin değerini hesaplayın .

boşuna değil, "uygun bir gösterge al" dediler - birkaç kod satırına sığmayacak. Oldukça geniş bir algoritma.

gün değişikliğini yakalamak kolaydır, "şimdiki günün bilinen sayısı önceki günün sayısına eşit değil", ancak daha karmaşık


Alg. " D anındaki bakiyeyi hesapla " (para çekme/para yatırma ve takas ve komisyonlarla ilgili bazı hatalar hariç)

Bakiye := cari hesap bakiyesi. AccountBalance() olan

Geçmişteki tüm kapalı piyasa emirleri için:

kapanış saati D ile geçerli an arasındaysa, Balance -= OrderProfit()+OrderSwap()+OrderCommision();

numaralandırma tamamlandıktan sonra , bakiye istenen değerdir ..

ANCAK, komisyon açılışta tahsil edilir (yani, bakiye çizgisini etkiler) ve kapanışta dikkate alacağız ve gün değişiminde takaslar alınacaktır ve yine sadece dikkate alacağız. kapanışta

ve büyük bir D derinliği ile, numaralandırmada gerekli tüm siparişleri alamama şansı vardır.

 
Порт-моне тв :

cevap için teşekkürler, bir koltuk değneği ve iyi bir çözüm, ama benim bakış açımdan, biraz yanlış çalışıyor, terazi yüzdüğü için muhtemelen hemen yapmıyor ve bazı durumlarda siparişlerim kapanmaya başladı. nedense eksi. Ancak büyüme olması gerektiği gibi gitti, ancak bu eksilerle birlikte düşüş de arttı. Her şeye tükürdüm ve teklif sınırlarını manuel olarak belirlemeye karar verdim, her gün ayarlamam gerekecek.

Dilek ve tavsiyeleriniz arasında kayboldum zaten... O yüzden belki de tavsiyem tamamen konu dışı, peki kusura bakmayın...

Anladığım kadarıyla, günün başında dengeyi sabitlemek ve gün içinde kar / zararı hesaplamak gerekiyor, buna göre ticarete devam etme kararı vermek gerekiyor ...

Yani çözüm burada

 datetime dayTime;
double dayBalance;
// Дальше в функции OnTick()
if (dayTime != iTime ( _Symbol , PERIOD_D1 , 0 );
 {
  dayBalance = AccountInfoDouble ( ACCOUNT_BALANCE ));
  dayTime = iTime ( _Symbol , PERIOD_D1 , 0 );
 }
// Дальше текущий баланс можно сравнивать с балансом на начало дня…
// В начале следующего дня в переменной dayBalance будет другое значение баланса…

Gün boyunca danışmanın yeniden başlatılması varsa, OnInit()'te, takas ve komisyonları dikkate alarak bugünün siparişlerinin kar / zararının hesaplanmasını sağlamak ve günün başında bakiyeyi hesaplamak gerekir. .

Makar'ın yeteneklerine inanıyorum, tüm bunları zaten kodda gösterebilir ...

 

Merhaba. Lütfen bana söyle.

Günün başlangıcından itibaren mevcut çubuğun sayısı nasıl belirlenir?

Teşekkür ederim.

 
prom18 :

Merhaba. Lütfen bana söyle.

Günün başlangıcından itibaren mevcut çubuğun sayısı nasıl belirlenir?

Teşekkür ederim.

       double BarNumber= NormalizeDouble (( TimeCurrent ()- iTime ( _Symbol , PERIOD_D1 , 0 ))/ 60 / Period () + 0.5 , 0 );

bu mevcut çubuktur, eğer son kapalıysa, o zaman -0.5

 
MakarFX :

bu mevcut çubuktur, eğer son kapalıysa, o zaman -0.5

Teşekkür ederim. Deneyeceğim.

 
MakarFX :

bu mevcut çubuktur, eğer son kapalıysa, o zaman -0.5

dakikalar ve egzotikler başarısız olur.

çubuk sayısı != number_of_counts

çubuklar yalnızca bir kez atlanır, 15 dakikada 12 dakikalık çubuklar olabilir

stok kullanmak daha iyi iBarShift()

 
Maxim Kuznetsov :

stok kullanmak daha iyi iBarShift()

Nasıl olduğunu bilmiyorum(

 
MakarFX :

Nasıl olduğunu bilmiyorum(

İşlev

 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                    |
//+----------------------------------------------------------------------------+
//|  Версия   : 26.02.2008                                                     |
//|  Описание : Возвращает реальный номер бара от начала суток.                |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (NULL или "" - текущий символ)          |
//|    tf - таймфрейм                  (          0 - текущий таймфрейм)       |
//|    dt - дата и время открытия бара (          0 - текущее время)           |
//+----------------------------------------------------------------------------+
int iBarOfDayReal( string sy= "" , int tf= 0 , datetime dt= 0 ) {
   if (sy== "" || sy== "0" ) sy= Symbol ();
   if (tf<= 0 ) tf= Period ();
   if (dt<= 0 ) dt= TimeCurrent ();
   if (tf> PERIOD_D1 ) {
     Print ( "iBarOfDayReal(): Таймфрейм должен быть меньше или равен D1" );
     return ( 0 );
  }

   int cd=TimeDay(dt);                       // текущий день месяца
   int nb= iBarShift (sy, tf, dt, False);       // номер текущего бара
   int bd= 0 ;                                 // номер бара от начала суток

   while (TimeDay( iTime (sy, tf, nb))==cd) {
    nb++;
    bd++;
  }

   return (bd);
}