Yeni başlayanlardan sorular MQL5 MT5 MetaTrader 5 - sayfa 829

 
MT5'te, gerçek keneler üzerinde test yaptığınızda, komisyon dikkate alınır mı yoksa sadece spread mi?
 

Bir döngüdeki çoklu para birimi uzmanı , verileri sembollerle ister. Bu snippet var:

       int gtc1 = GetTickCount ();
      res_copy_buf = CopyBuffer (handle, 0 , 0 , bars_calc, Buf_01); 
       int gtc2 = GetTickCount ();

Tüm karakterler iyi çalışıyor. İlk geçiş sırasında, süre yaklaşık 120 ms'dir, çünkü gösterge tamponları dolduruluyor. İkinci geçişten başlayarak, mevcut çubuktaki hesaplama süresi 1 ms'den azdır.

Tuhaflık, iyi bilinen bir komisyoncunun hiçbir verisi olmayan bir EURRUR sembolüne sahip olmasıdır ("Güncellemeleri bekleyin"). Böylece hesaplamalar 51 saniye boyunca o satırda takılıp kalıyor. Hata 4806. 51 saniye, döngüden bahsetmemek için bir (ilk) kez bile kabul edilemez.

Soru. Belirli bir karakter için veri olmadığı gerçeğini nasıl hızlı bir şekilde öğrenebilirim? Daha sonra onu hatırlardım ve sonraki yinelemelerde üzerine basar ve hızımı kaybetmeden devam ederdim.

 

Meslektaşlarım - bana double türündeki bir diziyi dizeye nasıl dönüştüreceğimi söyleyin. Bir dosyaya yazmak gereklidir. İşte genel eğitim kodu.

 void OnStart ()
{

double ar[];               // Массив
ArrayResize (ar, 2 );         // Подготовка массива
int i, Size= ArraySize (ar); // стартовое количество элементов

ar[ 0 ]= 1 ;                   // Установка значений 2-х элементов массива
ar[ 1 ]= 2 ; 

ArrayResize (ar, 3 ); // Увеличение размера массива
ar[ 2 ]= 3 ;           // Установка значения новому элементу массива
ArrayResize (ar, 4 ); // Увеличение размера массива
ar[ 3 ]= 4 ;           // Установка значения новому элементу массива
ArrayResize (ar, 5 ); // Увеличение размера массива
ar[ 4 ]= 5 ;           // Установка значения новому элементу массива
ArrayResize (ar, 6 ); // Увеличение размера массива
ar[ 5 ]= 6 ;           // Установка значения новому элементу массив
ArrayResize (ar, 7 ); // Увеличение размера массива
ar[ 6 ]= 7 ;           // Установка значения новому элементу массив
Size= ArraySize (ar); // новое количество элементов
ArraySetAsSeries (ar, true ); // Смена направления индексации


//--- запись в файл


SaveArrayToFile ( "s_ar" , ar);
return ;
}


bool SaveArrayToFile( string FileName, string   &Array[])
  {
//--- Открытие файла
   int h= FileOpen (FileName, FILE_WRITE | FILE_ANSI | FILE_TXT );
   if (h==- 1 ){ Alert ( " ошибка открытия файла в ф-ии " ); return ( false );} // Ошибка открытия файла
   
//--- Запись в файл
   FileWriteInteger (h, ArraySize (Array), INT_VALUE ); // Запись размера массива
   FileWriteArray (h,Array); // Запись массива
//--- Закрытие файла
   FileClose (h);
   return ( true ); // Сохранение выполнено
 

makaleden alınan bilgi

Dizileri bir dosyadan kaydetme ve yükleme

Bir diziyi bir dosyadan kaydederken ve yüklerken, ilk boyut boyunca dizi boyutunun değerlerindeki fark ve dizi öğelerinin toplam sayısı dikkate alınmalıdır. Bir diziyi kaydederken, önce dizinin boyutunu dosyaya (ArraySize() işlevi tarafından belirlenen toplam öğe sayısı), ardından dizinin tamamını yazın:

 bool SaveArrayToFile( string FileName, string &Array[])
  {
//--- Открытие файла
   int h= FileOpen (FileName, FILE_TXT | FILE_WRITE );
   if (h==- 1 ) return ( false ); // Ошибка открытия файла
//--- Запись в файл
   FileWriteInteger (h, ArraySize (Array),INT_VALUE); // Запись размера массива
   FileWriteArray (h,Array); // Запись массива
//--- Закрытие файла
   FileClose (h);
   return ( true ); // Сохранение выполнено
  }
 

Merhaba, bu sorunla karşılaştım.

Bir enstrüman için sırasıyla farklı büyülere sahip iki danışman vardır. Sihri CTrade üzerinden kurarım, sırasıyla CTrade üzerinden de pozisyon açarım. İlk danışmanın pozisyonu açık olduğunda, sihri ikinci danışmana atanır (bir pozisyon açtıktan sonra kontrolü ayarlayın, aşağıya bakın), bu nedenle açık pozisyonları kontrol etmek sihrini görmez, bir yönde birçok pozisyonu daha fazla açar . Hesap demoda, bunu test cihazında tespit etmek imkansız. Sihirli değer sınıfta saklanıyorsa, sıfırlanması gerekebilir ama nasıl olduğunu bilmiyorum.

 int OnInit ()
  {    
   // выставляем магик  
  m_trade.SetExpertMagicNumber(Magic);
   return ( INIT_SUCCEEDED );
}
открываю позицию соответственно тоже через CTrade:
 if (SellCount()> 0 || BuyCount()> 0 )
           {
             Print ( "Уже есть позиция на продажу !!!" );
             return ; // не добавлять к открытой позиции на покупку
           }
         SL= NormalizeDouble (latest_price.bid + STP* _Point , _Digits );
         TP= NormalizeDouble (latest_price.bid - TKP* _Point , _Digits );
         
         m_trade.Sell(lots1, _Symbol , 0 ,SL,TP, "LaquerreOSC_MA_2.5.6.7 + 2" );
         m_position.Select( _Symbol );
           {
             ulong myMagic=m_position.Magic();
             Print ( " Открыта поза Селл с магиком № " ,myMagic, ", И спредом " , SymbolInfoInteger ( _Symbol , SYMBOL_SPREAD ));
           }
//+------------------------------------------------------------------+
int SellCount() //проверка рыночных ордеров на продажу
  {
   int count= 0 ;
   for ( int i= PositionsTotal ()- 1 ; i>= 0 ;i--)
     {
       if ( PositionSelect ( _Symbol )== true )
        {
         if ( PositionGetInteger ( POSITION_MAGIC )==Magic && PositionGetInteger ( POSITION_TYPE )== POSITION_TYPE_SELL )
            count++;
        }
     }
   return (count);
  }
//+------------------------------------------------------------------+

 
Pavel Nikiforov :

Merhaba, bu sorunla karşılaştım.

Bir enstrüman için sırasıyla farklı büyülere sahip iki danışman vardır. Sihri CTrade üzerinden kurarım, sırasıyla CTrade üzerinden de pozisyon açarım. İlk danışmanın pozisyonu açık olduğunda, sihri ikinci danışmana atanır (bir pozisyon açtıktan sonra kontrolü ayarlayın, aşağıya bakın), bu nedenle açık pozisyonları kontrol etmek sihrini görmez, bir yönde birçok pozisyonu daha fazla açar . Hesap demoda, bunu test cihazında tespit etmek imkansız. Sihirli değer sınıfta saklanıyorsa, sıfırlanması gerekebilir ama nasıl olduğunu bilmiyorum.

Lütfen kodu bir metin sayfası olarak değil doğru şekilde yapıştırın.


Kodla: Her danışman için giriş parametrelerinde kendi sihrinizi ayarlayın. Diyelim ki 10001'i birinciye, ardından 10002'yi ikinciye ayarladınız.

 
Vladimir Karputov :

Lütfen kodu bir metin sayfası olarak değil doğru şekilde yapıştırın.


Kodla: Her danışman için giriş parametrelerinde kendi sihrinizi ayarlayın. Diyelim ki 10001'i birinciye, ardından 10002'yi ikinciye ayarladınız.

Hızlı cevabınız için teşekkür ederim. Ama işin aslı, sihirbazların farklı olmasıdır. Böylece ikinci robotun konumlarının ilkinin büyüsü ile açıldığını belirledim. Nasıl olduğunu ve ilk danışmanın sihirli numarasını nereye kaydettiğini bilmiyorum, ama bunu çözmek istiyorum.

 
Pavel Nikiforov :

Hızlı cevabınız için teşekkür ederim. Ama işin aslı, sihirbazların farklı olmasıdır. Böylece ikinci robotun konumlarının ilkinin büyüsü ile açıldığını belirledim. Nasıl olduğunu ve ilk danışmanın sihirli numarasını nereye kaydettiğini bilmiyorum, ama bunu çözmek istiyorum.

Bu durumda, sihri ayarlamak daha iyidir

   // выставляем магик  
  m_trade.SetExpertMagicNumber(Magic);
OnInit'te değil, her pozisyon/sipariş açılışından önce.
 
Alexey Viktorov :

Bu durumda, sihri ayarlamak daha iyidir

OnInit'te değil, her pozisyon/sipariş açılışından önce.

Bu durumda, "daha iyi" değil, tam olarak ihtiyaç duyulan şey - bu, standart ticaret işlevleri için bir sarmalayıcı sınıftır. Birden fazla büyü saklamaz. Bu nedenle, her seferinde yeni bir büyü ile pozisyon açması gerektiğinde sihri ayarlaması gerekiyor.

Genel olarak sıralama şöyledir:

  • sihir 1 ile pozisyon açmanız gerekiyor - sihir 1'i ayarlayın, sonraki pozisyonlar sihir 1'e sahip olacak,
  • sihir 2 ile pozisyon açmanız gerekiyor - sihir 2'yi ayarlayın, sonraki pozisyonlar sihir 2'ye sahip olacak,
  • sihir 3 ile pozisyon açmanız gerekiyor - sihir 3'ü ayarlayın, sonraki pozisyonlar sihir 3'e sahip olacak,

vb. ...

 
Alexey Viktorov :

Bu durumda, sihri ayarlamak daha iyidir

OnInit'te değil, her pozisyon/sipariş açılışından önce.

Başlangıçta böyleydi, yardımcı olmuyor. Ancak örneklerde genellikle OnInit'te duruyor, bu yüzden onu taşıdım. Uzun zamandır bununla uğraşıyorum, testte baykuşlar var, her şey yolunda gidiyor gibi görünüyor, bir anda serveri açıyorsunuz ve tek yönde 20 pozisyon var. Açık pozisyonların sınıflar aracılığıyla kontrol edilmemesi gerçeği etkileyebilir mi?

 
Pavel Nikiforov :

Hızlı cevabınız için teşekkür ederim. Ama işin aslı, sihirbazların farklı olmasıdır. Böylece ikinci robotun konumlarının ilkinin büyüsü ile açıldığını belirledim. Nasıl olduğunu ve ilk danışmanın sihirli numarasını nereye kaydettiğini bilmiyorum, ama bunu çözmek istiyorum.

CTrade sınıfında Get ExpertMagicNumber yöntemi olmadığından, bir ticaret işleminden sonra bu kodu yazdırın:

 Print ( "Expert name: " , __FILE__ , ", magic: " , IntegerToString (m_trade.RequestMagic());

bu yüzden her iki EA'nın da farklı büyüleri olup olmadığını kontrol edin.