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

 
PolarSeaman :

Ne bükülme!)))

Sıra 1 (hiçbirinden #2'ye kadar) --> Sıra2 (#1'den #3'e) -->Sıra3 (#2'den# hiçbirine)

Buna dayanarak, tüm zinciri bulabilirsiniz.

Açık yoruma bakarız ve #XXX'den varsa, daha önce kısmen kapatılmıştır - yorumdan XXX biletine bakarız ve geçmişte ararız. Oradaki yoruma bakarız - eğer #YYY'den varsa - o zaman daha önce de kısmen kapatılmıştır - yorumdan YYY biletine bakarız ve tarihte ararız. Oradaki yoruma bakıyoruz - eğer #ZZZ'den varsa - bu da daha önce kısmen kapatıldığı anlamına geliyor - aramayı tekrarlıyoruz. Eğer #...'den yoksa, bu tüm zincirin ilkidir.

 
Artyom Trishkin :

Sıra 1 (hiçbirinden #2'ye kadar) --> Sıra2 (#1'den #3'e) -->Sıra3 (#2'den# hiçbirine)

Buna dayanarak, tüm zinciri bulabilirsiniz.

Açık yoruma bakarız ve #XXX'den varsa, daha önce kısmen kapatılmıştır - yorumdan XXX biletine bakarız ve geçmişte ararız. Oradaki yoruma bakarız - eğer #YYY'den varsa - o zaman daha önce de kısmen kapatılmıştır - yorumdan YYY biletine bakarız ve tarihte ararız. Oradaki yoruma bakıyoruz - eğer #ZZZ'den varsa - bu da daha önce kısmen kapatıldığı anlamına geliyor - aramayı tekrarlıyoruz. #...'den yoksa, bu tüm zincirin ilkidir.

Teşekkür ederim ters yönde de bir sipariş olabilir benim de parçalayacağım. Kafam karışmaktan korkuyorum. Pozisyonun ne zaman açıldığını öğrenmek mümkünse tabiki belli bir tarihten itibaren Kar kapalı fonksiyonunu kullanmanın daha kolay olacağını düşünüyorum çünkü kısmi kapanma ile tarih değişir

 
Artyom Trishkin :

Sıra 1 (hiçbirden #2'ye kadar) --> Sıra2 (#1'den #3'e) -->Sıra3 (2'den#'ye kadar)

Buna dayanarak, tüm zinciri bulabilirsiniz.

Açık yoruma bakarız ve #XXX'den varsa, daha önce kısmen kapatılmıştır - yorumdan XXX biletine bakarız ve geçmişte ararız. Oradaki yoruma bakarız - eğer #YYY'den varsa - o zaman daha önce de kısmen kapatılmıştır - yorumdan YYY biletine bakarız ve tarihte ararız. Oradaki yoruma bakıyoruz - eğer #ZZZ'den varsa - bu da daha önce kısmen kapatıldığı anlamına geliyor - aramayı tekrarlıyoruz. #...'den yoksa, bu tüm zincirin ilkidir.

Artyom, bunun her zaman böyle olmadığını biliyorsun. Ve zinciri takip ederken terminale üç kez sormamak için tarih hala dizilerine ve yapılarına sürülür. Gereksiz işlemler dışında hiçbir şekilde kendi veritabanınızı korumaktan farkı yoktur.

Terminal ve API'si, mümkün olan en düşük düşük seviyedir. Ve robotun mantığını uygulamak için, kayıtları kendi terimleriyle (ticaret, zincir, grup, işlem - herkes farklı şekilde adlandırır) tutmak mantıklıdır. mantıksal olarak tamamlanmış bazı eylemler dizisi. Onu ayrı tutmak ve her hapşırmada (tik / çubuk) geri yüklemeye çalışmamak akıllıca olacaktır.

 
Maxim Kuznetsov :

Artyom, bunun her zaman böyle olmadığını biliyorsun. Ve zinciri takip ederken terminale üç kez sormamak için tarih hala dizilerine ve yapılarına sürülür. Gereksiz işlemler dışında hiçbir şekilde kendi veritabanınızı korumaktan farkı yoktur.

Terminal ve API'si, mümkün olan en düşük düşük seviyedir. Ve robotun mantığını uygulamak için, kayıtlarını kendi terimleriyle (ticaret, zincir, grup, işlem - herkes farklı şekilde adlandırır) tutmak mantıklıdır. mantıksal olarak tamamlanmış bir dizi eylem. Onu ayrı tutmak ve her hapşırmada (tik / çubuk) geri yüklemeye çalışmamak akıllıca olacaktır.

Bütün bunları uzun zamandır yapıyorum - hikayeyi her seferinde okumuyorum - ama her zaman güncel ve orada ihtiyacım olan her şeyi kolayca ve çok hızlı bir şekilde bulabiliyorum. Ancak bir kişiye aynısını yapmasını tavsiye etmek için en az birkaç makale yazmam gerekiyor. Ve böylece tüm zinciri aramanın mantığını çizdim.

 
PolarSeaman :

Teşekkür ederim ters yönde de bir sipariş olabilir benim de parçalayacağım. Kafam karışmaktan korkuyorum. Pozisyonun ne zaman açıldığını öğrenmek mümkünse tabiki belli bir tarihten itibaren Kar kapalı fonksiyonunu kullanmanın daha kolay olacağını düşünüyorum çünkü kısmi kapanma ile tarih değişir

Bir zincir aramak için, tüm zinciri bilmek istediğiniz siparişin biletini bilmek yeterlidir - bileti arama işlevine parametre olarak iletin ve çıktıda - doldurulmuş bir dizi veya bir dizi tüm zincirin her bir sırasının tüm verilerini içeren yapılar.

 
Artyom Trishkin :

dolu bir dizi veya tüm zincirin her bir sırasının tüm verilerini içeren bir yapı dizisi.

Az önce ne dediğini bile bilmiyorum.

En azından nasıl olması gerektiğine dair bir örnek gösterin.

 
PolarSeaman :

Az önce ne dediğini bile bilmiyorum.

En azından nasıl olması gerektiğine dair bir örnek gösterin.

Sorunu şu şekilde çözüyorum: Zincirleri tarihe göre ararım. Eh, tarihin açık bir şekilde erişilebilir olması için iki seçenek kullanıyorum:

  1. DLL yoksa, program açıklamasında kalın 24)))) Hesap geçmişinin her zaman tam olarak yüklenmesi gerektiğini belirtirim ("Terminal" penceresinin "Hesap geçmişi" sekmesi, bağlam menüsü - "Tüm geçmiş") .
  2. DLL ile, Uzman Danışman, herhangi bir kullanıcı eyleminden bağımsız olarak "Hesap Geçmişi" sekmesini güncel tutar.

Mevcut sipariş birincil değilse, üst siparişleri belirleme işlevleri:

 int GetSignOfPartialOrCloseByClose()
{
   string comment = OrderComment ();
   if (comment == "" )
       return 0 ;
   
   // Ордер образовался вследствии частичного закрытия
   int fromStart = StringFind (comment, "from #" );
   if (fromStart >= 0 )
       return GetTicketByPartialClose(comment, fromStart, OrderType (), OrderOpenTime ());
   
   // Ордер образовался вследствии встречного закрытия
   if ( StringFind (comment, "partial close" ) >= 0 )
   {
       datetime openTime = OrderOpenTime ();
       int type = OrderType ();
       for ( int i = OrdersHistoryTotal () - 1 ; i >= 0 ; i--)
      {
         if (! OrderSelect (i, SELECT_BY_POS , MODE_HISTORY ))
             continue ;
            
         if ( OrderOpenTime () != openTime)
             continue ;
            
         if ( OrderType () != type)
             continue ;
            
         if ( StringFind ( OrderComment (), "partial close" ) < 0 )
             continue ;
            
         return OrderTicket ();
      }
   }
   
   return 0 ;
}


int GetTicketByPartialClose( string comment, int fromStart, int orderType, datetime openTime)
{
   string sTicket = StringSubstr (comment, fromStart + 6 );
   int iTicket = ( int ) StringToInteger (sTicket);
   int type = OrderType ();
   if (! OrderSelect (iTicket, SELECT_BY_TICKET ))
       return 0 ;
      
   if ( OrderType () == type)                                                                         // Дочерний ордер указывает на родителя - уходим
       return iTicket;
      
   // Дочерний ордер указывает на противоположный ордер. Необходимо искать родительский
   for ( int i = OrdersHistoryTotal () - 1 ; i >= 0 ; i--)
   {
       if (! OrderSelect (i, SELECT_BY_POS , MODE_HISTORY ))
         continue ;
         
       if ( OrderType () != orderType || OrderOpenTime () != openTime)
         continue ;
         
       int iFind = StringFind ( OrderComment (), "close hedge by #" );
       if (iFind < 0 )
         continue ;
         
      sTicket = StringSubstr ( OrderComment (), iFind + 16 );
       int iNewTicket = ( int ) StringToInteger (sTicket);
       if (iNewTicket != iTicket)
         continue ;
         
       return OrderTicket ();
   }
   
   return 0 ;
}

Kullanımı basittir:

   for ( int i = OrdersTotal () - 1 ; i >= 0 ; i--)
   {
       if (! OrderSelect (i, SELECT_BY_POS ))
         continue ;

      ....         

       int nFromTicket = GetSignOfPartialOrCloseByClose();                 // Обязательно последней строкой в теле цикла, т. к. может измениться текущий выбранный ордер
   }


 
Ihor Herasko :

Buradaki en ciddi hata OrderDelete() fonksiyonunun argümanında bilet yerine 100 değerinin belirtilmesidir.

Ayrıca, hata o kadar kaba değildir, ancak hesaplanan Zarar Durdur değerinin gerçek değeri değil kontrol edilmesiyle ilgilidir.

Sipariş türü henüz kontrol edilmedi. Aniden bir piyasa emri mi seçtiniz? O zaman nasıl kaldırılır? Sipariş sembolü kontrol edilmedi.

Bu hataları dikkate alarak, fiyat Stop Loss'a ulaştığında bekleyen bir emri silmek için aşağıdaki kodu alırız:

Ayrıca kodunuzda, sipariş açıldıktan hemen sonra Zararı Durdur kontrol edilir. Bekleyen bir sipariş açtıktan sonra bu kod artık yürütülmüyor gibi görünüyor. Yani yürütme dallarını ayırmanız gerekir. Biri siparişi vermekten, ikincisi ise desteğinden sorumludur.

Ayrıntılı cevap için çok teşekkür ederim!

Tavsiyeniz üzerine şubeleri böldüm ve her şey ortaya çıktı.

Sonra aynı anda 10-15 bekleyen sipariş açan bir sorunla karşılaştım, kodunuzdan sonra ekleyerek sorunu çözdüm:

 if ( OrdersTotal ()> 0 ) return ;

Eminim daha akıllı bir yolu vardır.

Lütfen kodunuza göre 1'in ne anlama geldiğini açıklamayın; ben >=0; --i ?

 for ( int i = OrdersTotal () - 1 ; i >= 0 ; --i)
 

Lütfen bir göstergeyi nasıl yazacağımı bulmama yardım edin. Burada böyle bir boşluk çizdim, göstergenin grafiğe yerleştirildiği andan itibaren mevcut Teklifin üzerinde boyut noktaları çizilecek olan gösterge çizgisini uzun bir uzunlukta gösterecek şekilde nasıl yapılır? Belki de hata, bu diziyi yanlış yöne kaydırıyor olmamdır?

Bunun "kanona" göre olduğunu biliyorum, herhangi bir prev_calculated ve başka şeyler olmadan, ama buna böyle ihtiyacım var


#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property version    "1.00"
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots 1
//---- plot 
#property indicator_label1    "myInd"
#property indicator_type1    DRAW_LINE
#property indicator_color1   Blue
#property indicator_style1    STYLE_SOLID
#property indicator_width1    1

double buff[], Bid ;
input int lenght = 50 , size = 5 ;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- indicator buffers mapping

   ArrayResize (buff, 50 );
   ArrayInitialize (buff, 0 );
   SetIndexBuffer ( 0 , buff, INDICATOR_DATA );
   //--- установим метку для отображения в DataWindow
   PlotIndexSetString ( 0 , PLOT_LABEL , "myInd" );   
//--- установим имя для показа в отдельном подокне и во всплывающей подсказке
   IndicatorSetString ( INDICATOR_SHORTNAME , "myInd" );
//--- укажем точность отображения значений индикатора
   IndicatorSetInteger ( INDICATOR_DIGITS , _Point );
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate ( const int rates_total,
                 const int prev_calculated,
                 const datetime &time[],
                 const double &open[],
                 const double &high[],
                 const double &low[],
                 const double &close[],
                 const long &tick_volume[],
                 const long &volume[],
                 const int &spread[])
  {
//---
   Bid = SymbolInfoDouble ( _Symbol , SYMBOL_BID );
   for ( int i = lenght- 1 ; i> 0 ; i--){
      buff[i] = buff[i- 1 ];
   }
   buff[ 0 ] = Bid +size;
   


   
//--- return value of prev_calculated for next call
   return (rates_total);
  }
//+------------------------------------------------------------------+
 
Roman Sharanov :

Lütfen bir göstergeyi nasıl yazacağımı bulmama yardım edin. Burada böyle bir boşluk çizdim, göstergenin grafiğe yerleştirildiği andan itibaren mevcut Teklifin üzerinde boyut noktaları çizilecek olan gösterge çizgisini uzun bir uzunlukta gösterecek şekilde nasıl yapılır? Belki de hata, bu diziyi yanlış yöne kaydırıyor olmamdır?

Bunun "kanona" göre olduğunu biliyorum, herhangi bir prev_calculated ve başka şeyler olmadan, ama buna böyle ihtiyacım var


bu nasıl bir kanon? bir ofis belgesi var - tam olarak sizinki gibi .. her şey kötü olandan.

1. OnCalculate içinde kullanılan tüm dizilerin seriliğini ayarlayın

2. döngüye girmeden önce, buff[uzunluk]=Teklif+boyutu ayarlayın; - tam istediğiniz gibi olacak. Eğri çizgi ve "vizör"ün sonunda Teklif + boyut düzeyinde

3. Dizi sınırlarına dikkat edin. Tabii ki, pek Rate_total <uzunluk, ama ne şaka değil :-)

4.
buff[i] = buff[i+ 1 ]; // если тайм-серия (а вы подразумеваете их) то +