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

 
giannis1386 :

tamamen kafam karıştı.

double blevel= OrderStopLoss ()< Teklif - Puan *TS; benim için çalışıyor. SL fiyatı sadece kârda takip eder.

double slevel= OrderStopLoss ()> Sor + Point *TS; ama bunu diğerine nasıl ekleyeceğimi bilmiyorum

Onlara bool gibi sahip değilim.

Bool değil, ama buna örtük dönüştürme denir

Ne yapıyorsun? Trol?

 
Artyom Trishkin :

Bool değil, ama buna örtük dönüştürme denir

Ne yapıyorsun? Trol?

Evet, trol yapmaya çalıştım. orijinal komut dosyası, siparişten elde edilen kâra ulaşıldığında kapanacaktı
 
giannis1386 :
Evet, trol yapmaya çalıştım. orijinal komut dosyası, siparişte kâr elde edildiğinde kapanacaktı
Senaryo değil - bir danışman. Programları karıştırıyorsunuz. Komut dosyası, grafiğe yüklendikten sonra bir kez yürütülür ve ardından silinir. Eğer takıntılı değilse. Birinin pozisyonları kapatmak için döngülü bir komut dosyası oluşturması pek olası değildir.
 
giannis1386 :
Evet, trol yapmaya çalıştım. orijinal komut dosyası, siparişten elde edilen kâra ulaşıldığında kapanacaktı

mantık:

Döngüde seçilen mevcut emrin karı belirtilenden daha büyükse, stop zararı hesaplanan takip eden stop loss seviyesinden daha az (Al için)/daha büyük (Sat için) ise, stop'u yeni bir stopa kaydırın değer.

Bu çok kısaca.

 
Artyom Trishkin :
Önerdiğim bu değil miydi?

Evet ... Kodunuza o kadar dikkatsizce baktım ki hiç bakmadım demek daha doğru olur. Ama bu kat. sıkıntılar, sonra neredeyse utandığım o kadar saçma sapan şeyleri dondurdum. Nedense birdenbire ArrayMaximum()'un bir dizi yapıya, hatta bu dizinin ayrı bir alanına uygulanabileceği gibi çılgınca bir fikir edindim.

İtiraf ediyorum kimseye böyle düşünmesini tavsiye etmiyorum, olmuyor... :)

 
Alexey Viktorov :

Evet ... Kodunuza o kadar dikkatsizce baktım ki hiç bakmadım demek daha doğru olur. Ama bu kat. sıkıntılar, sonra neredeyse utandığım o kadar saçma sapan şeyleri dondurdum. Nedense birdenbire ArrayMaximum()'un bir dizi yapıya, hatta bu dizinin ayrı bir alanına uygulanabileceği gibi çılgınca bir fikir edindim.

İtiraf ediyorum kimseye böyle düşünmesini tavsiye etmiyorum, olmuyor... :)

Peki öyleyse... Ya ben? Aynı şekilde, minnettarlıkla eğilen kodunuzu gözden kaçırdım - gerçekten daha kısa olduğunu söylüyorlar ...

Kısacası - ikisi de şakaya değer ...

 
Artyom Trishkin :
Senaryo değil - bir danışman. Programları karıştırıyorsunuz. Komut dosyası, grafiğe yüklendikten sonra bir kez yürütülür ve ardından silinir. Eğer takıntılı değilse. Birinin pozisyonları kapatmak için döngülü bir komut dosyası oluşturması pek olası değildir.

yazara göre:

İşte biraz değiştirilmiş standart MT4 betiği close.mq4

Dosyayı MetaTrader\experts\Scripts klasörüne yerleştirin,

 
Artyom Trishkin :

Peki öyleyse... Ya ben? Aynı şekilde, minnettarlıkla eğilen kodunuzu gözden kaçırdım - gerçekten daha kısa olduğunu söylüyorlar ...

Kısacası - ikisi de şakaya değer ...

Hayır, katılmıyorum. bu kod

   double openCandle[], closeCandle[];
   CopyOpen ( _Symbol , PERIOD_CURRENT , 1 , 15 , openCandle);
   CopyClose ( _Symbol , PERIOD_CURRENT , 1 , 15 , closeCandle);
   double maxCandle = fmax (openCandle[ ArrayMaximum (openCandle)], closeCandle[ ArrayMaximum (closeCandle)]);
   double minCandle = fmin (openCandle[ ArrayMinimum (openCandle)], closeCandle[ ArrayMinimum (closeCandle)]);

test edildi ve çalışıyor. İşte basit özel çift diziler ve CopyRates() bir dizi yapıyı doldurur ve bu nedenle dizi işlevlerini kullanarak maksimum ve minimumu seçemezsiniz.

 
giannis1386 :

yazara göre:

İşte biraz değiştirilmiş standart MT4 betiği close.mq4

Dosyayı MetaTrader\experts\Scripts klasörüne yerleştirin,

Bu, senaryosunun bir kerelik çalıştığı anlamına gelir - grafiğe koydu - komut dosyası çalıştı ( kapalı pozisyonlar ) ve yüklenmedi.

Ve bir senaryoya değil, bir danışmana ihtiyacınız var.

 
Alexey Viktorov :

Hayır, katılmıyorum. bu kod

   double openCandle[], closeCandle[];
   CopyOpen ( _Symbol , PERIOD_CURRENT , 1 , 15 , openCandle);
   CopyClose ( _Symbol , PERIOD_CURRENT , 1 , 15 , closeCandle);
   double maxCandle = fmax (openCandle[ ArrayMaximum (openCandle)], closeCandle[ ArrayMaximum (closeCandle)]);
   double minCandle = fmin (openCandle[ ArrayMinimum (openCandle)], closeCandle[ ArrayMinimum (closeCandle)]);

test edildi ve çalışıyor. İşte basit özel çift diziler ve CopyRates() bir dizi yapıyı doldurur ve bu nedenle dizi işlevlerini kullanarak maksimum ve minimumu seçemezsiniz.

Pekala, sana söylüyorum - koduna da çok dikkatli baktım. Yani - benim hakkımda bir şaka

not. Doğru, kodum dört değer döndürüyor: Yüksek / Düşük / En Yüksek / En Düşük ve yalnızca sizinki Yüksek ve Düşük ve benimki verileri kopyalamanın başarısını kontrol ediyor (hepsi olmasa da), ancak sizinki değil ...

Kodum, istenen verilerin tam bir kopyasını şu şekilde kontrol eder:

//+------------------------------------------------------------------+
//|                                      sFindRangeByCandlesBody.mq4 |
//|              Copyright 2016, Artem A. Trishkin, Skype artmedia70 |
//|                       https://login.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Artem A. Trishkin, Skype artmedia70"
#property link        "https://login.mql5.com/ru/users/artmedia70"
#property version    "1.00"
#property strict
#property script_show_inputs
//--- input parameters
input int       Begin= 1 ;       // Бар начала диапазона поиска
input int       RangeBars= 20 ;   // Диапазон поиска
//---
int bars= Bars ( Symbol (), PERIOD_CURRENT );
int begin=(Begin< 0 ? 0 :Begin>bars- 3 ?bars- 3 :Begin);
int rangeBars=(RangeBars< 2 ? 2 :
               RangeBars>bars-begin?bars-begin:
               RangeBars); // Диапазон поиска
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ()
  {
//---
   MqlRates array[];
   double    high= 0 , low= 0 ;
   int       highest=- 1 , lowest=- 1 ;
   if ( CopyRates ( Symbol (), PERIOD_CURRENT ,begin,rangeBars,array)==rangeBars) {
       ArraySetAsSeries (array, true );
      high=GetHighestValue(begin,array,highest);
      low=GetLowestValue(begin,array,lowest);
      }
   Print ( "High=" , DoubleToString (high, Digits ()), ", Highest=" ,highest, ", Low=" , DoubleToString (low, Digits ()), ", Lowest=" ,lowest);
  }
//+------------------------------------------------------------------+
double GetHighestValue( int bar_begin, MqlRates &array[], int &bar_highest){
   int       sz= ArraySize (array);
   if (sz== 0 ) return (- 1 );
   double    high= DBL_MIN ;
   bar_highest=- 1 ;
   for ( int i= 0 ; i<sz; i++) {
       double value= fmax (array[i].open,array[i].close);
       if (value>high) {
         high=value;
         bar_highest=bar_begin+i;
         }
      }
   return (high);
}
//+------------------------------------------------------------------+
double GetLowestValue( int bar_begin, MqlRates &array[], int &bar_lowest){
   int       sz= ArraySize (array);
   if (sz== 0 ) return (- 1 );
   double    low= DBL_MAX ;
   bar_lowest=- 1 ;
   for ( int i= 0 ; i<sz; i++) {
       double value= fmin (array[i].open,array[i].close);
       if (value<low) {
         low=value;
         bar_lowest=bar_begin+i;
         }
      }
   return (low);
}
//+------------------------------------------------------------------+