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

 
Konstantin Seredkin :

Alım satımı örnek olarak verdim, bu butona başlamak fena olmayacak bir sürü algoritma var, spread genişledi, butona basıldı, telefona robotun durdurulduğuna veya takas edildiğine dair SMS geldi. 4 robot hesabında, 5.si hesap marjını kontrol ediyor, marj ayarlanan değere düştüğünde otomatik ticareti kesiyoruz ve ben gelip düşüşün nereye ve nereye tırmandığını görene kadar tüm robotlar pençelerini emiyor... ancak robotun tablodan çıkarılması serçe tabancasıdır... butonu tüm robotları belirli bir algoritmaya göre kesmenizi sağlayacak kapsamlı bir çözümdür.

Bir yerde mql5 için bir çözüm gördüm ama bulamıyorum

Ben de öyle söyledim - bu radikal bir çözüm. Doğru karar, danışmanın kodunu, belirli durumlarda ticari işlemler ve bunlarla bağlantılı her şeyi gerçekleştirmemesi için değiştirmektir. Örneğin, yayılma kontrolü temeldir:

 void OnTick ()
{
     double fPoint = Point ();
     if (fPoint <= 0.0 )
       return ;

     int nSpread = int ( MathRound (( Ask - Bid ) / fPoint));
     if (nSpread > 50 )
       return ;

   ... Действия советника при нормальном спреде
}
 

Peki, Ctrl+E tuşlarına öykünerek Autotrade düğmesine basabilir/basmayı kaldırabilirsiniz. Ama dediğim gibi, bu zaten WinAPI kullanıyor:

 #include <WinUser32.mqh>

#define VK_CONTROL 0x11 
#define KEY_CODE   'E'


void PressOrReleaseAutotrade()
{
   keybd_event(VK_CONTROL, 0 , 0 , 0 );
   keybd_event(KEY_CODE, 0 , 0 , 0 );
   keybd_event(KEY_CODE, 0 , 2 , 0 );
   keybd_event(VK_CONTROL, 0 , 2 , 0 );   
}
 
Ihor Herasko :

Peki, Ctrl+E tuşlarına öykünerek Autotrade düğmesine basabilir/basmayı kaldırabilirsiniz. Ama dediğim gibi, bu zaten WinAPI kullanıyor:

Teşekkür ederim! Ve bir gülen yüzü nasıl üzebilirsin?)

 
Ihor Herasko :

Peki, Ctrl+E tuşlarına basarak taklit ederek Autotrade düğmesine basabilir/basmayı kaldırabilirsiniz. Ama dediğim gibi, bu zaten WinAPI kullanıyor:

Aynen ama bence pankek çok basit bir yöntem ama ben bu kütüphaneyi tamamen unutmuşum. Teşekkürler, şimdi istediğimizi yapacağız

 

Dikdörtgenler çizen bir MQL4 betiği (aşağıdaki kod) yaptım (aşağıdaki şekil), ama görev bu değil. Kesikli bir STYLE_DOT çizgisi için, yalnızca genişlik 1 çalışır, 2 veya daha fazla ise düz bir çizgi çizer. Söyle bana, nerede hatam var yoksa bizden bir şey mi saklıyorlar?

 #property strict
void OnStart ()
  {
//---
   RectCreate( "rect1" , Time [ 1 ], Low [ 1 ], Time [ 10 ], High [ 10 ], clrYellow , STYLE_DOT ,   1 ,   false );
   RectCreate( "rect2" , Time [ 11 ], Low [ 11 ], Time [ 20 ], High [ 20 ], clrRed , STYLE_DOT ,   2 ,   false );
//---
   Sleep ( 20 * 1000 );
   ObjectsDeleteAll ( 0 );
  }
//--- Function creates rectangle
void RectCreate( const string            f_name,     // rectangle name
                 datetime                f_time1,     // first point time
                 double                  f_price1,   // first point price
                 datetime                f_time2,     // second point time
                 double                  f_price2,   // second point price
                 const color             f_color,     // rectangle color
                 const ENUM_LINE_STYLE   f_style,     // style of rectangle lines
                 const int               f_width,     // width of rectangle lines
                 const bool              f_fill)     // filling rectangle with color

  {
   if ( ObjectCreate ( 0 ,f_name, OBJ_RECTANGLE , 0 ,f_time1,f_price1,f_time2,f_price2))
     {
       ObjectSetInteger ( 0 ,f_name, OBJPROP_COLOR ,f_color);
       ObjectSetInteger ( 0 ,f_name, OBJPROP_STYLE ,f_style);
       ObjectSetInteger ( 0 ,f_name, OBJPROP_WIDTH ,f_width);
       ObjectSetInteger ( 0 ,f_name, OBJPROP_FILL ,f_fill);
       ObjectSetInteger ( 0 ,f_name, OBJPROP_BACK , false );
       ObjectSetInteger ( 0 ,f_name, OBJPROP_SELECTABLE , false );
       ObjectSetInteger ( 0 ,f_name, OBJPROP_SELECTED , false );
     }
  }

 
Maxim Khrolenko :

Dikdörtgenler çizen bir MQL4 betiği (aşağıdaki kod) yaptım (aşağıdaki şekil), ama görev bu değil. Kesikli bir STYLE_DOT çizgisi için, yalnızca genişlik 1 çalışır, 2 veya daha fazla ise düz bir çizgi çizer. Söyle bana, nerede hatam var yoksa bizden bir şey mi saklıyorlar?

Stili ve kalınlığı manuel olarak çizmeyi ve değiştirmeyi denediniz mi? Ve bu deneylerden nasıl bir sonuç çıkarılabilir?
 
Artyom Trishkin :
Stili ve kalınlığı manuel olarak çizmeyi ve değiştirmeyi denediniz mi? Ve bu deneylerden nasıl bir sonuç çıkarılabilir?

Cevabı buldum. Burada "Çizgi stili. Yalnızca çizgi genişliği 0 veya 1 olduğunda kullanılır" yazıyor. Görünüşe göre, 2 veya daha fazla kalınlıkta, katı bir çizgi hariç diğer çizgilerin çalışmamasının nedeni burada yatıyor.

 
Maxim Khrolenko :

Cevabı buldum. "Çizgi stili. Yalnızca çizgi ağırlığı 0 veya 1 olduğunda kullanılır" diyor. Görünüşe göre, 2 veya daha fazla kalınlıkta, katı bir çizgi hariç diğer çizgilerin çalışmamasının nedeni burada yatıyor.

Oldukça doğru. Ayrıca bu tırmık üzerine bastı.

 

Beyler, söyleyin bana, Kim'den son pozisyonun açılış bar numarasını veya -1'i döndüren bir fonksiyon aldım.

 int NumberOfBarOpenLastPos( string sym= "" , int tf= 0 , int op=- 1 , int mn=- 1 )
  {
   datetime oot;
   int       i,k= OrdersTotal ();

   if (sym== "" ) sym= Symbol ();
   for (i= 0 ; i<k; i++)
     {
       if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES ))
        {
         if ( OrderSymbol ()==sym)
           {
             if ( OrderType ()== OP_BUY || OrderType ()== OP_SELL || OrderType ()== OP_BUYLIMIT || OrderType ()== OP_SELLLIMIT )
              {
               if (op< 0 || OrderType ()==op)
                 {
                   if (mn< 0 || OrderMagicNumber ()==mn)
                    {
                     if (oot< OrderOpenTime ()) oot= OrderOpenTime ();
                    }
                 }
              }
           }
        }
     }
   return ( iBarShift (sym, tf, oot, True ));
  }

bu işlevi çağırdı ve koşulu yazdı

 if ( Open [ 2 ]> Close [ 2 ] && Open [ 1 ]> Close [ 1 ] && Close [ 1 ]< Low [ 2 ])
     {

       Comment ( "цена входа = " , DoubleToStr ( Low [ 2 ], Digits ));
       if (NumberOfBarOpenLastPos( "" , 0 ,- 1 ,- 1 )!= 0 ) //вызвал здесь

         ticket= OrderSend ( Symbol (), OP_SELLLIMIT , 0.1 , Low [ 2 ], 2 , 0 , 0 ,magic, 0 );
       if ( OrderSelect (ticket, SELECT_BY_TICKET , MODE_TRADES ))

         TP= NormalizeDouble ( OrderOpenPrice ()-tp* Point , Digits );
      SL= NormalizeDouble ( OrderOpenPrice ()+sl* Point , Digits );
      modify= OrderModify (ticket, OrderOpenPrice (),SL,TP, 0 );
      }

sonuç olarak bir emir açılıyor ama bara bir stop ile vurulursa ve poz girmek için yukarıdaki koşul yine de kaydedilirse anlaşma bu barda açılır, Print üzerinden fonksiyonun -1 döndürdüğüne baktım , ilk başta hiç emir olmadığı için düşündüm, ama sonra emirler ortaya çıktı ve hepsi aynı, durduktan sonra aynı barda, anlaşma açılıyor, yardım et, neyi yanlış yaptım?

 
Tünaydın. Söyleyin bana, MT4 ve MT5'te aynı enstrümanın farklı zaman dilimlerine sahip çizelgelerini ve bu zaman dilimleri için göstergeleri üst üste bindirmek mümkün mü? Örneğin, bir pencerede gün, 4 saat ve saat zaman dilimleriyle birlikte EUR/USD çiftinin 3 grafiğini ve ayrıca bu verilerden hareketli zaman dilimlerini bindirmek istiyorum. Mümkün mü? Herhangi bir yardım için mutlu olacağım.