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

 

Merhaba, söyle bana, pliz, neden çalışmıyor. Hata yoktur, ancak test cihazında siparişler açılmaz. Eğitim olarak günlük bir mumun yüksek, düşük kırılımı için bir danışman yazmaya çalışıyorum.


 extern int       TimeCandle   = 1440 ;       //таймфрейм свечи, которую пробиваем 
extern int       HourStart= 10 ; // час начала торговли
extern double    Lots= 0.1 ;     // лот торговли   
extern int       StopLoss= 100 ; // стоплосс
extern int       TakeProfit= 100 ; // тайкпрофит
extern int       znak= 5 ;     // количество знаков котировки
extern int       magik= 54321 ;     // магик 

double minprice; // минимальная цена
double maxprice; // максимальная цена


void OnTick ()
  {
   double SL, TP;
   int ticket;
 
   minprice = iLow ( Symbol (),TimeCandle, 1 );
   maxprice = iHigh ( Symbol (),TimeCandle, 1 );   
   
   if (TimeHour( TimeCurrent ()==HourStart))
   { 
     if (BuyLimitCount()== 0 && BuyCount()== 0 ) //если нет ордера то пытаться открыть
    { 
    SL = NormalizeDouble (maxprice - StopLoss* Point ,znak);
    TP = NormalizeDouble (maxprice + TakeProfit* Point ,znak);
    ticket = OrderSend ( Symbol (), OP_BUYLIMIT,Lots,maxprice, 10 , SL,TP, "" , magik, 0 ,Blue);
    
     if (ticket < 0 )
     Print ( "Не удалось открыть ордер на покупку" );
    }
    
    
     if (SellLimitCount()== 0 && SellCount()== 0 ) //если нет ордера то пытаться открыть
    { 
    SL = NormalizeDouble (minprice + StopLoss* Point ,znak);
    TP = NormalizeDouble (minprice - TakeProfit* Point ,znak);
    ticket = OrderSend ( Symbol (), OP_SELLLIMIT,Lots,minprice, 10 , SL,TP, "" , magik, 0 ,Red);
        
     if (ticket < 0 )
     Print ( "Не удалось открыть ордер на продажу" );
    }
    
    }
     Comment ( "Минимальная цена:" + DoubleToStr(minprice,znak) + "\n" + "Максимальная цена:" + DoubleToStr(maxprice, znak)); 
  }
   
   // проверяем есть ли байлимит ордера с конца
   int BuyLimitCount()
  {
   int count = 0 ;
   for ( int i= OrdersTotal ()- 1 ;i>= 0 ;i--)
  {
     if ( OrderSelect (i, SELECT_BY_POS,MODE_TRADES) == true && 
        OrderMagicNumber()== magik &&                        
        OrderType() == OP_BUYLIMIT )                        
        {
        count ++;
        }
    }
     return (count);  
    
  }
   // проверяем есть ли селллимит ордера с конца
   int SellLimitCount()
  {
   int count = 0 ;
   for ( int i= OrdersTotal ()- 1 ;i>= 0 ;i--)
  {
     if ( OrderSelect (i, SELECT_BY_POS,MODE_TRADES) == true && 
        OrderMagicNumber()== magik &&                        
        OrderType() == OP_SELLLIMIT )                        
        {
        count ++;
        }
    }
     return (count);      
  }
  
   // проверяем есть ли бай ордера с конца
   int BuyCount()
  {
   int count = 0 ;
   for ( int i= OrdersTotal ()- 1 ;i>= 0 ;i--)
  {
     if ( OrderSelect (i, SELECT_BY_POS,MODE_TRADES) == true && 
        OrderMagicNumber()== magik &&                        
        OrderType() == OP_BUY )                        
        {
        count ++;
        }
    }
     return (count);      
  }
  
   // проверяем есть ли селл ордера с конца
   int SellCount()
  {
   int count = 0 ;
   for ( int i= OrdersTotal ()- 1 ;i>= 0 ;i--)
  {
     if ( OrderSelect (i, SELECT_BY_POS,MODE_TRADES) == true &&         
        OrderMagicNumber()== magik &&                        
        OrderType() == OP_SELL )                        
        {
        count ++;
        }
    }
     return (count);      
  }
Как самому создать советника или индикатор - Алгоритмический трейдинг, торговые роботы - MetaTrader 5
Как самому создать советника или индикатор - Алгоритмический трейдинг, торговые роботы - MetaTrader 5
  • www.metatrader5.com
Для разработки торговых систем в платформу встроен собственный язык программирования MetaQuotes Language 5 (MQL5), среда разработки MetaEditor и инструменты тестирования стратегий. Любую информацию о разработке торговых стратегий на языке MQL5 можно найти на официальном сайте MQL5.community. На этом же сайте в разделе Code Base могут быть...
 
nelenaby :

Merhaba, söyle bana, pliz, neden çalışmıyor. Hata yoktur, ancak test cihazında siparişler açılmaz. Eğitim olarak günlük bir mumun yüksek, düşük kırılımı için bir danışman yazmaya çalışıyorum.


Açılmıyor - anlamda ve denemiyor veya deniyor ama çalışmıyor mu? Dergide ne yazıyorlar?

 
nelenaby :

Merhaba, söyle bana, pliz, neden çalışmıyor. Hata yoktur, ancak test cihazında siparişler açılmaz. Eğitim olarak günlük bir mumun yüksek, düşük kırılımı için bir danışman yazmaya çalışıyorum.


Bu ifadeyi analiz et

 if (TimeHour( TimeCurrent ()==HourStart))
        {
          ........
        }

Bu ifadenin anlamını anlamak benim için zor, belki yanılıyorum ama en azından "( TimeCurrent ()==HourStart) " ifadesini "( TimeCurrent () - HourStart) " ile değiştirin.

 

Ayrıca eğer sizi doğru anladıysam BuyLimitOrder ve BuyPosition yoksa BuyLimit emri vermeye çalışıyorsunuz. "ve" ye dikkat edin. Yani, bunlardan herhangi birinin varlığı size ayrı ayrı uygundur, bu nedenle, mevcut fiyatın istediğiniz pozisyonu ile, en az biri çalışana ve ilk pozisyon olana kadar, her bir tıklamada bir tane olmak üzere sonsuz sayıda ByLimit alacaksınız. açıldı. Ayrıca - fiyatın şimdi nerede olduğu umurunuzda değil. Garip zaman koşulu yerine getirilir getirilmez (yazının hemen üstünde), bir hata olduğunu düşünüyorum ama neyse. Dolayısıyla, bunu hesaba katmazsanız, sipariş vermek için fiyat olarak Dünün en yüksek değerini kullandığınızdan, danışman ilk tıklamadan fiyat dünün en yüksek seviyesinin üzerine çıkana kadar hatalı siparişler vermeye başlayacaktır. BuyLimit, mevcut fiyatın altına ayarlanır, bu, mevcut fiyatın dünün en yüksek değerinden daha yüksek olması gerektiği ve o zamana kadar yürütmeyi reddetme olacağı anlamına gelir.

Bu nedenle, fiyat dünün zirvesinin üzerine çıktığında, Satın Alma Limiti olmadığında ve açık alım olmadığında sadece durum sizin için uygundur. Oldukça nadir bir kombinasyon. Ayrıca, kırılmaz, ancak kırılmadan sonra geri döner (çünkü ByLIMIT) ve ayrıca, ilk tikten başlayarak, dünün en yüksek fiyatının üzerine uzun bir süre boyunca size hatalar atar (bu başka bir hatadır) . Koşul zaten karşılandı, danışman bir emir gönderir, ancak hala bir yayılma, piyasadan izin verilen minimum mesafe vb.

 
Sergey Voytsekhovsky :

Bu ifadenin anlamını anlamak benim için zor, belki yanılıyorum ama en azından "( TimeCurrent ()==HourStart) " ifadesini "( TimeCurrent () - HourStart) " ile değiştirin.

Doğru, burada bir hata var. Gerekiyor if (TimeHour( TimeCurrent() )==HourStart)

Şimdi bazen işlemleri açar, ancak daha fazla hata verir (OrderSend hatası 130).

Limit emirlerine gelince, bu doğru değil.

 
nelenaby :

Doğru, burada bir hata var. Gerekiyor if (TimeHour(TimeCurrent())==HourStart)

Şimdi bazen işlemleri açar, ancak daha fazla hata verir (OrderSend hatası 130).

Limit emirlerine gelince, bu doğru değil.

İşte zamanla çalışmanız için bir komut dosyası.

Eski ama düzgün çalışıyor.

Dosyalar:
 

Merhaba.

Senden dosyalarla nasıl çalışacağımı anlamama yardım etmeni istiyorum.

Program çalışırken, alınan verileri bir dosyaya kaydedip CSV'yi okuyorum.

Dosya büyüyor. hız düşer. Satırlardaki bazı öğeleri güncellemeye (yeniden yazmaya) çalıştı. İşe yaramadı!

Seçilen satırı silmek imkansız! Eski dizeye yeni öğe eklenemiyor!

Çok ilginç! Bir dosyayı, grafik nesnesini vb. kolayca silebilirsiniz . Ve oluşturulan dosyayla çalışmaya gelince, tam bir çıkmaz sokak!

Forumlarda sadece bir öneri var: "Dosyayı hafızaya oku, satırı değiştir ya da sil ve yeni dosyayı eski isimle kaydet."

Bunun doğru bir karar olduğunu düşünmüyorum. Muhtemelen bir şeyi kaçırdım. Lütfen çözmeme yardım et.

 
im-zvv :

Bunun doğru bir karar olduğunu düşünmüyorum. Muhtemelen bir şeyi kaçırdım. Lütfen çözmeme yardım et.

Dosyalarla çalışma konusundaki bu "yanlış kararı" nihayet düzeltmeleri için Microsoft tarafından acilen işe alınmanız gerekiyor.


Dosyalarla çalışmak, bir dosya düzenleyicide bir dosyayı düzenlemekle aynı şey değildir, daha çok tek tek harflerle küplerden bir kelime oluşturmaya benzer.
Yeni bir harf eklemeniz gerekiyorsa, onu takip eden tüm küpler sağa kaydırılmalıdır.
Eski harfi kaldırmak istiyorsanız, onu takip eden tüm küpler sola taşınmalıdır.
Bu nedenle, dosya büyük değilse ve çalışmanın bir parçası olarak dosyaya paylaşılan erişim gerekli değilse, o zaman gerçekten de yeni bir dosyaya veri yazmak, eskisini silmek, yeni dosyayı isimle yeniden adlandırmak daha kolaydır. eskisinden.

Yanılmıyorsam, dosyalarla çalışırken MQL'de eksik olan tek şey dosya uzunluğunu gerekli boyuta kesebilme yeteneğidir.


 
Alekseu Fedotov :

İşte zamanla çalışmanız için bir komut dosyası.

Eski ama düzgün çalışıyor.

Daha önce Kimovskaya fonksiyonunu da kullandım, sonra kendime şöyle yazmaya vakit buldum:

 //_______________________________________________________________________
class CWorkTime
  {
private :
   int                mday,mstarthour,mstophour,mstartmin,mstopmin;
   datetime           mstarttime,mstoptime;
   bool               UseThisSession;
   void inittime()
     {
      mday=Day();
       MqlDateTime dtstart,dtstop;
       TimeToStruct ( TimeCurrent (),dtstart);
      dtstop=dtstart;
      dtstart.hour= mstarthour;
      dtstart.min = mstartmin;
      dtstop.hour = mstophour;
      dtstop.min = mstopmin;
      mstarttime = StructToTime (dtstart);
      mstoptime= StructToTime (dtstop);
     }
public :
   void               CWorkTime( void ){};
   void               ~CWorkTime( void ){};
   void               CWorkTime( int hstart, int mstart, int hstop, int mstop)
     {
      mstarthour=hstart;
      mstartmin = mstart;
      mstophour=hstop;
      mstopmin=mstop;
      UseThisSession=(mstarthour< 0 || mstophour< 0 || mstarthour> 23 || mstophour> 23 ) ? false : true ;
      UseThisSession=(mstartmin< 0 || mstopmin< 0 || mstartmin> 59 || mstopmin> 59 ) ? false : true ;
       if (UseThisSession) inittime(); else Print ( "Время работы советника не используется" );
     };

   bool               Disable()
     {
       bool result= false ;
       if (UseThisSession)
        {
         if (mday!=Day()) inittime();
         datetime t= TimeCurrent ();
         result=t>=mstarttime && t<=mstoptime ? false : true ;
        }
       return (result);
     };
  }
*Work;


.....

int OnInit ()
{
   Work= new CWorkTime(StartHour,StartMinute,StopHour,StopMinute);
}

.....


void OnTick ()
  {

if (Work.Disable())
{
 Comment ( "Не торговое время!!! Сопровождение открытых ордеров" );
 }
else
{......
çalışma süresini devre dışı bırak - yapıcıyı başlatırken yanlış veri girmeniz gerekir, örneğin 25 saat veya 70 dakika
 
Sergey Dzyublik :

Dosyalarla çalışma konusundaki bu "yanlış kararı" nihayet düzeltmeleri için Microsoft tarafından acilen işe alınmanız gerekiyor.


Dosyalarla çalışmak, bir dosya düzenleyicide bir dosyayı düzenlemekle aynı şey değildir, daha çok tek tek harflerle küplerden bir kelime oluşturmaya benzer.
Yeni bir harf eklemeniz gerekiyorsa, onu takip eden tüm küpler sağa kaydırılmalıdır.
Eski harfi kaldırmak istiyorsanız, onu takip eden tüm küpler sola taşınmalıdır.
Bu nedenle, dosya büyük değilse ve çalışmanın bir parçası olarak dosyaya paylaşılan erişim gerekli değilse, o zaman gerçekten de yeni bir dosyaya veri yazmak, eskisini silmek, yeni dosyayı isimle yeniden adlandırmak daha kolaydır. eskisinden.

Yanılmıyorsam, dosyalarla çalışırken MQL'de eksik olan tek şey dosya uzunluğunu gerekli boyuta kesebilme yeteneğidir.


Teşekkür ederim. İyi açıklama. Maalesef dosyam çok büyük ve bu nedenle "küpler" ile çalışmak zorundayım.