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

 
Merhaba.
Forumda ilk defa, forumda çarpık bir şey yaparsam şimdiden özür dilerim.
Uzun zamandır göstergeli grafiklere bakıyorum. Son zamanlarda birleştirilmiş 2 mevduat. Yeni bir hesap açmadan önce stratejinin karlılığını geçmişten kontrol etmek istiyorum. MT4'teki bir demo hesabında.
Ben hiç programcı değilim. MT4'e yalnızca üçüncü taraf göstergeleri kurabilir ve belki de MetaEditor'da gösterge çizgisi kalınlığını değiştirebilirim (büyük olasılıkla gösterge kodundaki rengi değiştiremeyeceğim - yalnızca terminalde).
Lütfen söyle bana, anlaşılır bir şekilde ifade edilen bir yer var mı? bilgim olan bir kişi için, adım adım teste nereden başlamalı (halk dilinde "siyahlar için tuvaleti nasıl kullanacakları talimatı")? Stratejide 3 gösterge vardır: MA (3 adet basit), standart seviyeli Stokastik ve 5 seviyeli CCI. Gösterge seviyelerini yukarıdan aşağıya geçtikten sonra kısa işlemler açmak, uzun işlemler - tam tersi (muhtemelen anlaşılabilir ..). Take ve moose kurulumu.
Hem otomatik modda stratejinin çalışmasını görsel olarak izleyebilmek hem de göstergelerin ve siparişlerin parametrelerini seçmek için görselleştirme olmadan yapabilmek istiyorum.
 
ZebStamp :
Merhaba.
Forumda ilk defa, eğer forumda çarpık bir şey yaparsam - şimdiden özür dilerim.
Uzun zamandır göstergeli grafiklere bakıyorum. Son zamanlarda birleştirilmiş 2 mevduat. Yeni bir hesap açmadan önce stratejinin karlılığını geçmişten kontrol etmek istiyorum. MT4'teki bir demo hesabında.
Ben hiç programcı değilim. MT4'e yalnızca üçüncü taraf göstergeleri kurabilir ve belki de MetaEditor'da gösterge çizgisi kalınlığını değiştirebilirim (büyük olasılıkla gösterge kodundaki rengi değiştiremeyeceğim - yalnızca terminalde).
Lütfen söyle bana, anlaşılır bir şekilde ifade edilen bir yer var mı? bilgim olan bir kişi için, adım adım teste nereden başlamalı (halk dilinde "siyahlar için tuvaleti nasıl kullanacakları talimatı")? Stratejide 3 gösterge vardır: MA (3 adet basit), standart seviyeli Stokastik ve 5 seviyeli CCI. Gösterge seviyelerini yukarıdan aşağıya geçtikten sonra kısa işlemler açmak, uzun işlemler - tam tersi (muhtemelen anlaşılabilir ..). Take ve moose kurulumu.
Hem otomatik modda stratejinin çalışmasını görsel olarak izleyebilmek hem de göstergelerin ve siparişlerin parametrelerini seçmek için görselleştirme olmadan yapabilmek istiyorum.

TrendLine gibi bir grafik nesnesi (GO) oluştururken bir renk seçin. TrendLine yeniden oluşturulurken aynı renkle oluşturulur. Hline için - bir renk seçtiler - ve bir sonraki böyle. Sarı, mavi, al...

GO bir danışman, gösterge, komut dosyası oluşturursa - programda nasıl yazılır. Bazen parametre seçimi

 
STARIJ :

Kodunuza bakan birinin bir hatayı çabucak bulabileceğini düşünüyorsanız - yanılıyorsunuz. Derleyici hataları arar. Programın metni biçimlendirilmelidir - MetaEditor bunun için bir şekillendiriciye sahiptir. Farklı bir stilden hoşlanıyorsanız - örneğin, AStyle.exe programını kullanın. Şekillendirmeden sonra, 1) programının ekstra bir kapatma ayracı olduğunu hemen göreceksiniz. 2) Değişken bildirildi: datetime date_Buf_1; // bir dizi gösterge tarihleri - onu bir dizi yapmak için, dinamik bir dizi için [size] veya []'ye ihtiyacınız var ve ardından göründüğü gibi ArrayResize boyutunu ayarlayın. Ve bu, diziyi kullanmadan önce yapılmalıdır - bununla ilgili yukarıdaki gönderilere bakın. 3) FileOpen(InpDirectoryName+"//"+InpFileName - çubukların diğer yöne eğilmesi gerekiyor gibi görünüyor. Ve InpDirectoryName+"//" olmadan yapmak daha iyi - dosyayı Dosyalar klasöründe bulacaksınız.

satır başına: int kopyalanmış=CopyTime(NULL,0,0,0,date_Buf_1); Derleyici kızgın, başlangıç=bitiş=0 sayı=0


Teşekkür ederim. Bir şeyin düzeltildiği ortaya çıktı, ancak anlamaktan daha sezgisel. Ancak, yine de diziyle ilgili olarak 3 hata tırmanıyor:

'Buf_1' - dizi gerekli 111.mq4 93 21

'date_Buf_1' - dizi gerekli 111.mq4 94 21

'Buf_1' - dizi gerekli 111.mq4 100 on altı


 //+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
input string              InpFileName= "111.csv" ;       // Имя файла 
input string              InpDirectoryName= "Data" ;     // Имя каталога 

datetime Время= 0 ;   // Время прошлого бара
double Bid1;
double    Buf_1[];
// double ExtBuffer;
long V1; // объем для текущего тика вверх
long V2; // накопленный объем для всех тиков вверх текущего бара
long V3; // объем текущего тика вниз
long V4; // накопленный объем для всех тиков вниз для текущего бара
long V5;   // отрицательные и положительные iVolume нарастающим итогом
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnInit ()
  {
   IndicatorDigits ( 0 );
   SetIndexBuffer ( 0 ,Buf_1);
//SetIndexBuffer(1,Buf_2);
   Bid1= Bid ;
   V5= 0 ;

  }
//+------------------------------------------------------------------+
//| 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[])
  {
   datetime Вр= Time [ 0 ];   // Время текущего бара
   if (Вр>Время)           // Если новый бар
     {
      Время=Вр;           // Запомнить
                           //      Buf_1[0]=0;         // и обнулить последний элемент буфера
     }

   datetime date_Buf_1[]; // массив дат индикатора 
   datetime time_Buf_1[]; // массив времени 
                           // --- считаю объем для положительных и отрицательных тиков      
   if ( Bid >=Bid1)
     {
       if ( Bid >Bid1) // если тик положительный..
        {
         V1= iVolume ( NULL , 0 , 0 ); // если повышающий цену тик, то находим его объем
         V2= V1 + V2;
        }
       else
        {
         V1= 0 ;                 // если Bid1 = Bid2, т.е. изменение цены = 0, то iVolume этого тика присваиваем 0;
         V2= V1 + V2;
        }
     }
   else
     {
      V3 = iVolume ( NULL , 0 , 0 ); // если понижающий цену тик 
      V4 = V3 + V4;             // то находим его объем  
     }

   V5=V2-V4;               // определяем разницу (дельту) между объемами положительных и отрицательных тиков
   Bid1= Bid ;
   Buf_1[ 0 ]=V5; // в буфер сгружаем  дельту

                 //   ExtBuffer = Buf_1 [0];
//   double macurrent=iMAOnArray(ExtBuffer,0,5,0,MODE_LWMA,0); 

// запись в файл данных буфера


//--- установим для массивов признак таймсерии 
   ArraySetAsSeries (Buf_1[ 0 ], true );
   ArraySetAsSeries (date_Buf_1[ 0 ], true );

//--- скопируем таймсерию 
   int copied= CopyTime ( NULL , 0 , 10000 , 0 ,date_Buf_1);

//--- подготовим массив Buf_1 
   ArrayResize (Buf_1[ 0 ],copied);

//--- скопируем значения линии индикатора  
   for ( int i= 0 ;i<copied;i++)
     {
      Buf_1[i]=V5;
     }
//--- откроем файл для записи значений индикатора 
   ResetLastError ();
   int file_handle= FileOpen (InpDirectoryName+ "//" +InpFileName, FILE_READ | FILE_WRITE | FILE_CSV );
   if (file_handle!= INVALID_HANDLE )
     {
       PrintFormat ( "Файл %s открыт для записи" ,InpFileName);
       PrintFormat ( "Путь к файлу: %s\\Files\\" , TerminalInfoString ( TERMINAL_DATA_PATH ));
       //--- сначала запишем значения индикатора 
       FileWrite (file_handle,Buf_1[ 0 ]);
       //--- запишем время и значения в файл 
       for ( int i= 0 ;i<Buf_1[ 0 ];i++)
         FileWrite (file_handle,time_Buf_1[ 0 ],Buf_1[ 0 ]);
       //--- закрываем файл 
       FileClose (file_handle);
       PrintFormat ( "Данные записаны, файл %s закрыт" ,InpFileName);
     }
   else
       PrintFormat ( "Не удалось открыть файл %s, Код ошибки = %d" ,InpFileName, GetLastError ());

   return (rates_total);
  }
//+------------------------------------------------------------------+


Yorumlarınızı nasıl uygulayacağımı anlamadım. Ama fazladan bir parantez buldum :)
 
YarTrade :

Teşekkür ederim. Bir şeyin düzeltildiği ortaya çıktı, ancak anlamaktan daha sezgisel. Ancak, yine de diziyle ilgili olarak 3 hata tırmanıyor:

'Buf_1' - dizi gerekli 111.mq4 93 21

'date_Buf_1' - dizi gerekli 111.mq4 94 21

'Buf_1' - dizi gerekli 111.mq4 100 on altı



Yorumlarınızı nasıl uygulayacağımı anlamadım. Ama fazladan bir parantez buldum :)
Yalnızca dizi değişkenlerinin adlarını bırakın. Derleyicinin size gösterdiği kod satırlarındaki "[]" işaretini kaldırın.
 
Artyom Trishkin :
Yalnızca dizi değişkenlerinin adlarını bırakın. Derleyicinin size gösterdiği kod satırlarındaki "[]" işaretini kaldırın.

Teşekkür ederim. Bakalım hayatımda neler olacak. Dosyaya bir şey yazılacağına dair büyük şüphelerim var :)

 

Bir takım sorular oluşturuldu, gerçekten yardım etmeyi umuyorum. Test sırasında ve gerçek zamanlı olarak danışmanın çalışmasının çok farklı olduğu konusunda çok üzücü bir şey buldum, bu yüzden en yaygın ve tipik hataları analiz etmek istiyorum. Öncelikle karşılaştığımı yazayım, bilgili arkadaşlar da tecrübelerini paylaşırlarsa çok iyi olur unutulmaması gerekenler ve kodda olması gerekenler.

1. Gerçek ticaret modunda, bir sıfıra bölme hatası ortaya çıktı, ancak elbette kodda sıfıra bölme yoktu ve bu, geriye dönük testler sırasında görünmedi. Her böleni NormalizeDouble(x,Digits); şeklinde yazarak sorunu çözdüm.

2. İşlem açılmadı. Cuma günü, anlaşmayı geriye dönük testten çıkardıktan sonra anlaşma açıldı, ancak gerçek ticaret sırasında değil. Danışmanın günlüğünde herhangi bir hata vermedi. Burada sorunun ne olabileceğini bilmiyorum, ama birkaç şeyde günah işliyorum. Öncelikle "ordersend'in dönüş değeri kontrol edilmeli" gibi uyarılar alıyorum ama doğru anladıysam bu kodun çalışmasını etkilemez mi? Yoksa her şey kaymayla mı ilgili? Çok küçük olmayan 1 tane var. Ve girişin açılması gereken çubuk boşluk olmadan açıldı.

3. Standart kaydırıcı örneğinden "if(Volume[0]>1) return;" satırını aldım. ve kodun başına yapıştırılır. Yani, kodum yalnızca yeni bir çubuk göründüğünde ilk onay sırasında yürütülür. Çubuk hacimle birlikte hemen açılıyor ve kodum yürütülmüyor olabilir mi?

4. Tarih ve gerçek zamanlı bir danışmanla çalışırken dikkat edilmesi gereken noktalar veya tipik hatalar hakkında bilgi verin, lütfen


 
LuckySith :

Bir takım sorular oluşturuldu, gerçekten yardım etmeyi umuyorum. Test sırasında ve gerçek zamanlı olarak danışmanın çalışmasının çok farklı olduğu konusunda çok üzücü bir şey buldum, bu yüzden en yaygın ve tipik hataları analiz etmek istiyorum. Öncelikle karşılaştığımı yazayım, bilgili arkadaşlar da tecrübelerini paylaşırlarsa çok iyi olur unutulmaması gerekenler ve kodda olması gerekenler.

1. Gerçek ticaret modunda, bir sıfıra bölme hatası ortaya çıktı, ancak elbette kodda sıfıra bölme yoktu ve bu, geriye dönük testler sırasında görünmedi. Her böleni NormalizeDouble(x,Digits); şeklinde yazarak sorunu çözdüm.

2. İşlem açılmadı. Cuma günü, anlaşmayı geriye dönük testten çıkardıktan sonra anlaşma açıldı, ancak gerçek ticaret sırasında değil. Danışmanın günlüğünde herhangi bir hata vermedi. Burada sorunun ne olabileceğini bilmiyorum, ama birkaç şeyde günah işliyorum. Öncelikle "ordersend'in dönüş değeri kontrol edilmeli" gibi uyarılar alıyorum ama doğru anladıysam bu kodun çalışmasını etkilemez mi? Yoksa her şey kaymayla mı ilgili? Çok küçük olmayan 1 tane var. Ve girişin açılması gereken çubuk boşluk olmadan açıldı.

3. Standart kaydırıcı örneğinden "if(Volume[0]>1) return;" satırını aldım. ve kodun başına yapıştırılır. Yani, kodum yalnızca yeni bir çubuk göründüğünde ilk onay sırasında yürütülür. Çubuk hacimle birlikte hemen açılıyor ve kodum yürütülmüyor olabilir mi?

4. Tarih ve gerçek zamanlı bir danışmanla çalışırken dikkat edilmesi gereken noktalar veya tipik hatalar hakkında tavsiyelerde bulunun, lütfen

Bu tür vahşi yapıları değiştirin "if(Volume[0]>1) return;" "Yeni Çubuğun" normal bir kontrolü için, burada forumda birçoğu var.

"Sipariş gönderiminin dönüş değeri kontrol edilmelidir" gibi uyarılar henüz bir bug değil, gelecek için potansiyel bir bug. Kodda hiçbir uyarı olmamalı ve hatta çevrimiçi çalışırken daha da fazlası.

"Çok küçük değil gibi görünen 1'im var" - bu, yeni bir barın açılışında çok küçük olabilir ve hatta daha fazla yarım saatlik ve saatlik olabilir, şu anda yayılma büyük ölçüde genişler.

Neye ihtiyacınız var: Yeni bir çubuk olup olmadığını kontrol edin ve eğer yeniyse, giriş koşullarına bakın, eşleşirse bir anlaşma yapın. Ondan sonra, çubuğun çalıştığını yazın ve yenisini bekliyoruz.

Şimdi ne var: if(Volume[0]>1) return; = yeni bir çubuk varsa, o zaman koşullara bakın, koşul sığmadı == geniş yayılma = OnTick()'te tekrar çıkın, bir sonraki tıklamada if(Volume[0]>1) return; artık daha fazlasını kaçırmaz, bu nedenle spread 0.0001 olsa bile ticaret atlanır

 

Merhaba. Lütfen bana aşağıdaki kodu kullanarak nasıl tarif edebileceğimi söyleyin: Bir daire var, üst ve alt yatay çizgilerle sınırlı. Danışmanları kendisi belirler ve kurar.

Danışmanın düz bölgeden fiyat çıkışını belirlemesi ve ardından bu bölgeye dönmesi gerekir. Ve ancak bundan sonra bir pozisyon açtı.

Gürültüyü filtrelemek için 2 veya 3 parametreli hareketli bir ortalama kullanıyorum

 
Vitaly Muzichenko :

Bu tür vahşi yapıları değiştirin "if(Volume[0]>1) return;" "Yeni Çubuğun" normal bir kontrolü için, burada forumda birçoğu var.

"Sipariş gönderiminin dönüş değeri kontrol edilmelidir" gibi uyarılar henüz bir bug değil, gelecek için potansiyel bir bug. Kodda hiçbir uyarı olmamalı ve hatta çevrimiçi çalışırken daha da fazlası.

"Çok küçük değil gibi görünen 1'im var" - bu, yeni bir barın açılışında çok küçük olabilir ve hatta daha fazla yarım saatlik ve saatlik olabilir, şu anda yayılma büyük ölçüde genişler.

Neye ihtiyacınız var: Yeni bir çubuk olup olmadığını kontrol edin ve eğer yeniyse, giriş koşullarına bakın, eşleşirse bir anlaşma yapın. Ondan sonra, çubuğun çalıştığını yazın ve yenisini bekliyoruz.

Şimdi ne var: if(Volume[0]>1) return; = yeni bir çubuk varsa, o zaman koşullara bakın, koşul sığmadı == geniş yayılma = OnTick()'te tekrar çıkın, bir sonraki tıklamada if(Volume[0]>1) return; artık daha fazlasını kaçırmaz, bu nedenle spread 0.0001 olsa bile ticaret atlanır


Yeni bir bar açma hakkında. Bu iyi bir seçenek olabilir mi? :

 datetime counted_bar = 0 ;

int OnInit ()
{
   counted_bar = 0 ; // если нужно, чтоб при перезапуске последний бар был проанализирован
   ...

void OnTick ()
{
   // Если появился новый бар
   if ( iTime ( _Symbol , _Period , 0 ) > counted_bar )
   {
      counted_bar = iTime ( _Symbol , _Period , 0 );

       // Анализируем индикаторы
      ...
   }
 
LuckySith :

Yeni bir bar açma hakkında. Bu iyi bir seçenek olabilir mi? :

Başlangıçta böyle olsun.

Ardından, çubuğun çalıştığına dair doğru bir tespit yapmanız gerekir, ancak burada TK'ye olan tüm yaklaşımı hesaplamanız gerekir.

Şimdiye kadar, yazınızdan gördüğüm kadarıyla, bunu yapmanız gerekiyor:

 void OnTick ()
{
   // Если появился новый бар
   if ( iTime ( _Symbol , _Period , 0 ) > counted_bar )
   {
       // Анализируем индикаторы
       if (SpreadMax > текущий спред) return ;

      counted_bar = iTime ( _Symbol , _Period , 0 );
      ...
   }

Sonuç olarak, yayılma normdan daha büyükse, o zaman OnTick'e geri dönüyoruz ve yeni bir kene üzerinde yayılmayı kontrol ediyoruz, eğer normalse, bir sipariş gönderiyoruz ve bu çubukta bir anlaşma olduğunu hatırlıyoruz. .

Ayrıca ikinci bir yol var:

 void OnTick ()
{
   // Если появился новый бар
   if ( iTime ( _Symbol , _Period , 0 ) > counted_bar )
   {
       if (SpreadMax > текущий спред) return ;
       // Анализируем индикаторы
      ...
      result = OrderSend (...);
       // если открылась позиция, то result будет тикет позиции
       if (result> 0 ) counted_bar = iTime ( _Symbol , _Period , 0 );
   }

Genel olarak, mantığa ne zaman kaydedilmesi gerektiğine karar vermeniz ve "Yeni Çubuk" oluşumundan önce artık kontrol etmemeniz gerekir.