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

 
Бахром Балтабаев telefona bildirim gönderen bir komut dosyası veya göstergeyi nerede bulabilirim söyleyin. böylece sürekli terminali izlemek zorunda kalmazsınız.

Yakın zamanda bir uyarı yayınladı: . Ancak SendNotification ekleyerek geliştirilebilir:

 // использовать алерт
input bool alert = true ;
// использовать push-уведомления
input bool notification = true ;
// уровень срабатывания
input double trigLv = 0.0 ;
// отклонение от trigLv в пунктах
input int deviation = 30 ; 


// функция взята из https://www.mql5.com/ru/docs/basis/types/double
bool EqualDoubles( double d1, double d2, double epsilon)
  {
   if (epsilon< 0 ) 
      epsilon=-epsilon;
//---
   if (d1-d2>epsilon) 
       return false ;
   if (d1-d2<-epsilon) 
       return false ;
//---
   return true ;
  }

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit () {
   return ( INIT_SUCCEEDED );
}

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[]
) {
   static bool triggered = false ;
   static datetime time_ = 0 ;
   if (!alert && !notification )
     return rates_total;
   if (EqualDoubles(trigLv, close[ rates_total - 1 ], deviation * SymbolInfoDouble ( NULL , SYMBOL_POINT ))) { // сравнение цены Close с trigLv
     if (time_ != time[rates_total - 1 ])
      time_ = time[rates_total - 1 ];
     else
       return rates_total;
     if (!triggered) {
       if (alert)
         Alert ( "Level " , NormalizeDouble (trigLv, ( int ) SymbolInfoInteger ( NULL , SYMBOL_DIGITS )), " triggered!" );
       if (notification)
         SendNotification ( "Level " + ( string ) NormalizeDouble (trigLv, ( int ) SymbolInfoInteger ( NULL , SYMBOL_DIGITS )) + " triggered!" );
    }
    triggered = true ;
  }
   else
    triggered = false ;
  
   return rates_total;
}

Seçtiğim satırları kaynak koda eklemeli, Göstergeler klasörüne atmalı ve derlemelisin. Bu gösterge çizelgeye herhangi bir sayıda eklenebilir ve farklı seviyeler aşıldığında sinyal alabilir. Kod çevrimiçi olarak sonuçlandırıldı. Sonuç kontrol edilmedi.

Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам
Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам
  • www.mql5.com
В этой ветке я хочу начать свою помощь тем, кто действительно хочет разобраться и научиться программированию на новом MQL4 и желает легко перейти н...
 

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

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

GlaVredFX , 2022.01.17 18:59

Bana sorunun ne olduğunu söyle, kod siparişleri kapatmalı ve eğer yoksa yeni bir tane aç.

Ama nedense sadece 1 emri kapatıyor ve bir sonraki sinyale kadar duruyor.

2022.01.17 16:22:08.389 2022.01.04 08:00:00 e: Sinyal 1.1322 < kapa 1.1304 VarPosSat 0
2022.01.17 16:22:08.389 2022.01.04 08:00:00 e: Sinyal 1.1322 > kapanış 1.1304 VarPosSatın Al 1
2022.01.17 16:22:08.366 2022.01.04 04:00:00 e: Sinyal 1.1325 < kapa 1.1306 VarPosSat 0
2022.01.17 16:22:08.366 2022.01.04 04:00:00 e: Sinyal 1.1325 > kapa 1.1306 VarPosSatın Al 1
2022.01.17 16:22:08.327 2022.01.04 00:00:00 e: Sinyal 1.1326 < kapa 1.1296 VarPosSat 0
2022.01.17 16:22:08.327 2022.01.04 00:00:00 e: Sinyal 1.1326 > kapa 1.1296 VarPosSatın Al 1
2022.01.17 16:22:08.298 2022.01.03 20:00:00 e: Sinyal 1.1328 < kapa 1.1283 VarPosSat 0
2022.01.17 16:22:08.298 2022.01.03 20:00:00 e: kapanış #1 0.01 EURUSD 1.13598'den 1.12831 fiyatından satın alın

2022.01.17 16:22:08.298 2022.01.03 20:00:00 e: Sinyal 1.1328 > kapanış 1.1283 VarPosSatın Al 1
2022.01.17 16:22:08.190 2022.01.03 16:00:00 e: #4 açık 1.13512'den 0.01 EURUSD satın al tamam
2022.01.17 16:22:08.190 2022.01.03 16:00:00 e: Sinyal 1.134 < kapa 1.135 VarPosSat 0
2022.01.17 16:22:08.190 2022.01.03 16:00:00 e: Sinyal 1.134 > kapa 1.135 VarPosSatın Al 1

 if (isNewBar()== true ) {  
if (Signal > clos ) {   //--------------------- МА выше цены закрытия предыдущего бара.
     if (ExistPositions( NULL , OP_BUY, Magic) == true ) //---------------- Если есть позиция BUY то
ClosePosWithMaxProfitInCurrency(); //--------   закрытие одной позиции с максимальным профитом в валюте депозита.
         if (ExistPositions( NULL , OP_BUY, Magic) == False) //----------- если позиции BUY отсутствуют то
   ticket=OpenPosition( NULL ,OP_SELL, NDLot(Lot), 0 , 0 , Magic, Com);} //------------ открываем позицию SELL

if (Signal < clos ) { //--------------------- МА ниже цены закрытия предыдущего бара.
     if (ExistPositions( NULL , OP_SELL, Magic) == true ) //---------------- Если есть позиция SELL то
 ClosePosWithMaxProfitInCurrency(); //--------------------- закрытие одной позиции с максимальным профитом в валюте депозита.
         if (ExistPositions( NULL , OP_SELL, Magic) == False)  //----------- если позиции SELL отсутствуют то
  ticket=OpenPosition( NULL ,OP_BUY, NDLot(Lot), 0 , 0 , Magic, Com);} //------------ открываем позицию BUY

} return ; 
Sorunuza ve kodunuza biraz daha dikkat ederseniz sorunun ne olduğunu anlayacaksınız.
 
Mihail Matkovskij # :

Sorunuza ve kodunuza biraz daha dikkat ederseniz, her şeyi kendiniz anlayacaksınız.

Bir soru var - en karlı 1 sipariş 1 barda kapatılmalı, sonra yeni bir bar bekliyoruz ve 1 karlı siparişi tekrar kapatıyoruz. Ve hepsi birden değil.

Ve ilk çubukta kapanır ve sonraki çubukta hiçbir şey olmaz.

 
GlaVredFX # :

Bir soru var - en karlı 1 sipariş 1 barda kapatılmalı, sonra yeni bir bar bekliyoruz ve 1 karlı siparişi tekrar kapatıyoruz. Ve hepsi birden değil.

O zaman doğru soruları formüle etmeniz gerekir. Sadece 1 sinyal alırsınız. Ve sonra yeni bir barın açılışında. Ve sadece 1 sinyal varsa, kaç sipariş kapatılacak?... Ve sadece sinyal yeni bir çubukta belirirse. Ve görünmezse, siparişler aşağıdaki çubuklarda kapatılacaktır. Ve yine, eğer bir sinyal varsa.

 
Mihail Matkovskij # :

O zaman doğru soruları sormalısın. Sadece 1 sinyal alırsınız. Ve sonra yeni bir barın açılışında. Ve sadece 1 sinyal varsa, kaç sipariş kapatılacak?... Ve sadece sinyal yeni bir çubukta belirirse. Ve görünmezse, siparişler aşağıdaki çubuklarda kapatılacaktır. Ve yine, eğer bir sinyal varsa.

Bu gibi durumlarda, genellikle bir akış şeması yardımcı olur. Veya algoritmayı nokta nokta bir kağıt parçası veya bir metin dosyasında ayrıntılı olarak açıklamanız gerekir. Ve ancak o zaman kodunuzu nasıl yazacağınızı anlayacaksınız.

 

Mevcut olanlardan ilki tarafından açılan 1 siparişi kapatma işlevine ihtiyacımız var. Kim paylaşabilir.

 
GlaVredFX # :

Yani fark ederseniz , algoritma koda yazılır .

1) Yeni bir çubuğun görünümü

2) MA, önceki çubuğun kapanış fiyatından yüksekse 3. adıma gidin; MA kapanış fiyatından düşükse 4. adıma gidin.

3) Bir AL pozisyonu varsa , mevduat para biriminde maksimum kârlı bir pozisyonu kapatıyoruz.

3.1) Açık emir yoksa   SATIN ALMAK   SATIŞ pozisyonu açın.

4) Bir SATIŞ pozisyonu varsa, mevduat para biriminde maksimum kârlı bir pozisyonu kapatıyoruz.

4.1) Açık emir yoksa   SATMAK   SATIN AL pozisyonu açın.


Ve şimdi yine soru, yukarıdaki yazılmamış algoritmadan bu kodda doğru bir şekilde yazılmayan şey:

Kod bir dizi komut içerir. Terminal neye ihtiyacınız olduğunu bilmiyor, sadece kodda ne yazdığını biliyor!

...

if (isNewBar()) {  
   if (Signal > clos ) {   //--------------------- МА выше цены закрытия предыдущего бара.
     if (ExistPositions( NULL , OP_BUY, Magic)) //---------------- Если есть позиция BUY то
      ClosePosWithMaxProfitInCurrency(); //--------  закрытие одной позиции с максимальным профитом в валюте депозита.
     if(!ExistPositions( NULL, OP_BUY, Magic)) //----------- если позиции BUY отсутствуют то
       sellSignal  = true ;
  } 

 // и аналогично для п.4.

} 
return ; 

...

void OnTimer () {
   if ( sellSignal ) {
    ticket=OpenPosition( NULL ,OP_SELL, NDLot(Lot), 0 , 0 , Magic, Com); //------------ открываем позицию SELL
     sellSignal  = false ;
  }
   // и аналогично для buy
}
buySignal ve sellSignal değişkenlerini global düzeyde yazın.
 
Mihail Matkovskij # :

Kod bir dizi komut içerir. Terminal neye ihtiyacınız olduğunu bilmiyor, sadece kodda ne yazdığını biliyor!

Sorun bulunduğundan bu mesajı sildim, çünkü siparişleri kârla değil, zamanla kapatmak gerekiyor.

Çünkü kar her zaman ve ihtiyaç duyulan yerde değildir.

Bu nedenle, " Mevcut olanlardan ilki tarafından açılan bir pozisyonu kapatmak " işlevine ihtiyacımız var.

 
GlaVredFX # :

Sorun bulunduğundan bu mesajı sildim, çünkü siparişleri kârla değil, zamanla kapatmak gerekiyor.

Çünkü kâr her zaman ve ihtiyaç duyulan yerde değildir.

Bu nedenle, " Mevcut olanlardan ilki tarafından açılan bir pozisyonu kapatmak " işlevine ihtiyacımız var.

Bir önceki gönderiye zamanlayıcıda açılış pozisyonları ile bir örnek eklendi. Pozisyonun açılmasını sağlamak için. Orada kendi işlevinizi değiştirebilirsiniz.

 
Mihail Matkovskij # :

Bir önceki gönderiye zamanlayıcıda açılış pozisyonları ile bir örnek eklendi. Pozisyonun açılmasını sağlamak için. Orada kendi işlevinizi değiştirebilirsiniz.

Öyle olmasa da. İlerlemeyi izlemek gerekiyor

ClosePosWithMaxProfitInCurrency

veya OnTradeTransaction'daki yeni işleviniz. Ve pozisyon yoksa, girin. Veya buySignal veya sellSignal için bir sinyal yazın ve örnekte gösterdiğim gibi OnTimer'da işleyin.

Neden: