Yeni başlayanlardan sorular MQL4 MT4 MetaTrader 4 - sayfa 121

 
Ihor Herasko :

En az bir blok yazın ve gösterin. Daha fazla burada bu durumda istemi.

Dizilere göre: burada küresel düzeyde 4 dizi ilan ettim:

 // массивы, в которых будут храниться характеристики ордеров:
int _OrderTicket[],_OrderType[];
double _OrderOpenPrice[];
datetime _OrderOpenTime[];

Ardından, pozisyon açma fonksiyonunda onları sıfırladım:

   // обнуляем массивы
   ArrayInitialize (_OrderTicket, 0 );
   ArrayInitialize (_OrderType, 0 );
   ArrayInitialize (_OrderOpenPrice, 0 );
   ArrayInitialize (_OrderOpenTime, 0 );

Şimdi onları nasıl dolduruyorsun? Bunu yapmaya çalıştığım örnekte, ek bir değişken uygulanıyor, ancak nasıl kullanılacağını anlamıyorum:

 // переменная, которая будет хранить количество ордеров, 
// принадлежащих эксперту:
int _ExpertOrdersTotal= 0 ;

Tüm bu dizilere neden ihtiyaç duyulduğu tam olarak belli olmasa da ilgili fonksiyonu kullanarak bilet, pozisyon tipi, açılış fiyatı ve açılış zamanı değerlerini alabildiğimde.

 
novichok2018 :

Dizilere göre: burada küresel düzeyde 4 dizi ilan ettim:

Ardından pozisyon açma fonksiyonunda onları sıfırladım:

Şimdi onları nasıl dolduruyorsun? Bunu yapmaya çalıştığım örnekte, ek bir değişken uygulanıyor, ancak nasıl kullanılacağını anlamıyorum:

Tüm bu dizilere neden ihtiyaç duyulduğu tam olarak belli olmasa da ilgili fonksiyonu kullanarak bilet, pozisyon tipi, açılış fiyatı ve açılış zamanı değerlerini alabildiğimde.

Uyarı işlevini kullanarak tüm ara verileri görüntüleyerek sıfırdan yazmayı deneyin (. Örneğin

 int ord= OrdersTotal ();
if ! ord )
{
   Alert ( "Ордера отсутствуют. Выход" );
   return ;
} else    Alert ( "Всего ордеров = " , ord);

// Посмотрев, что получилось, добавляете:
int n;
int Ords[ 10 ];
for (n= 0 ; n<ord && n< 10 ; n++)
{
   OrderSelect (...
}

Ve eğer birinin örneğini alırsanız, onu tamamen alın ve inceleyin. Kim bilir, örneğin yazarı neden diziler ekledi?

 
novichok2018 :

Dizilere göre: burada küresel düzeyde 4 dizi ilan ettim:

Bir dizi yapı kullanın. Onunla anlaşmak çok daha kolay olacak. Statik dizili bir değişken veriyorum. Anlamak daha kolay. Kendim dinamik diziler kullanmama rağmen. Ancak onlarla, kod biraz daha ortaya çıkacak.

 #define MAX_ORDERS_CNT   int(500)
struct OrderInfo
{
   int       nTicket;
   int       nType;
   double    fOpenPrice;
   double    fSL;
   double    fTP;
   datetime dtOpenTime;
};

OrderInfo  arrstOrderInfo[MAX_ORDERS_CNT];

Ardından, pozisyon açma fonksiyonunda onları sıfırladım:

Hayır, iptal etmediler. Sonuçta, varsayılan olarak sıfır boyutuna sahip olan dinamik diziler bildirilir. Yani bu durumda, bu dört kod satırı hiçbir şey yapmaz.

Şimdi onları nasıl dolduruyorsun? Bunu yapmaya çalıştığım örnekte, ek bir değişken uygulanıyor, ancak nasıl kullanılacağını anlamıyorum:

Daha sonra, her "kendi" siparişin bir dizide saklandığı bir sipariş döngüsü düzenlenir:

g_nOrderCnt = 0 ;
for ( int i = OrdersTotal () - 1 ; i >= 0 ; --i)
{
   if (! OrderSelect (i, SELECT_BY_POS ))
       continue ;

   if ( OrderSymbol () != Symbol ())   // Если нужны ордера только по текущему символу, к графику которого прикреплен советник
       continue ;

   if ( OrderMagicNumber != i_nMagicNumber)   // Если имеется входной параметр советника i_nMagicNumber, в котором указан ID ордеров советника
       continue ;

   if (g_nOrderCnt < MAX_ORDERS_CNT)
       continue ;

   g_arrstOrderInfo[g_nOrdersCnt].nTicket = OrderTicket ();
   g_arrstOrderInfo[g_nOrdersCnt].nType = OrderType ();
   g_arrstOrderInfo[g_nOrdersCnt].fOpenPrice = OrderOpenPrice ();
   g_arrstOrderInfo[g_nOrdersCnt].fSL = OrderStopLoss ();
   g_arrstOrderInfo[g_nOrdersCnt].fTP = OrderTakeProfit ();

   ++g_nOrdersCnt;
}

Tüm bu dizilere neden ihtiyaç duyulduğu tam olarak belli olmasa da ilgili fonksiyonu kullanarak bilet, pozisyon tipi, açılış fiyatı ve açılış zamanı değerlerini alabildiğimde.

Dizilerle çalışmak daha uygun ve daha hızlıdır, çünkü genel durumda, hesaptaki tüm siparişlerin bu Uzman Danışman tarafından işlenmesi gerekmez. Sonuç olarak, zamandan ve paradan tasarruf ediyoruz.

Ayrıca yine genel durumu verdim. Ve elbette evrenselcilik her zaman gerekli değildir. Tipik olarak, bu tür diziler, stratejinin gereksinimlerine göre derlenir. Örneğin, emirleri hemen türlere ayırabilirsiniz: Buy, Sell, BuyStop, SellStop, BuyLimit, SellLimit. O zaman böyle dört diziye ihtiyacımız var. Ancak daha sonra, alım satım kararları verirken, tüm açık emirler listesini tekrar gözden geçirmeniz gerekmeyecektir. Belirli bir türdeki siparişlerin sayısını bulmak ve gerekli diziye başvurmak yeterlidir.

Dikkate alınması gereken bir diğer önemli nokta, bir onayın işlenmesi sürecinde siparişlerin bileşimindeki değişikliktir. OnTick'in girişinde bir sipariş listesi ve ortada bir yerde - bir başkası alınmış olabilir. Bulması zor bir program hatası alıyoruz. Ve OnTick'e girerken derlenen emir dizisi değişmeyecektir (tabii ki, programın yürütülmesi sırasında kendiniz değiştirmediğiniz sürece).

 
STARIJ :

string s=FileReadString(F1); // Bir metin dosyasının sonraki satırını okuma
StringSplit(s, "," , a); // Virgülle ayrılmış dize öğelerini bir diziye ayıklayın
tarihsaat T1=StrToTime(a[4]); // Sonra dönüşümlerim var ...
int ord=StrToInteger(a[8]);
double Fiyat=StrToDouble(a[12]);

Teşekkür ederim, ne istedim



Ayrıca, 5 ürünün üretildiği ortaya çıktı.

uyarıya göstergeler atarız (herhangi bir)

ör. seviye "200"

ve uyarı tetiklendiğinde, bir şey pozu açar, bir şey kendini kaldırır, bir şey başka eylemler yapar. Bu şekilde bir sinyal mekanizması uygulamak istiyorum


ZY

İstediğimi ekledim, değerlendirmek için atabilirim. Harika sızıyor. Ama burada buna izin verilmiyor.

 
Ihor Herasko :

Örneğin, emirleri hemen türlere ayırabilirsiniz: Buy, Sell, BuyStop, SellStop, BuyLimit, SellLimit. O zaman böyle dört diziye ihtiyacımız var. Ancak daha sonra, alım satım kararları verirken, tüm açık emirler listesini tekrar gözden geçirmeniz gerekmeyecektir. Belirli bir türdeki siparişlerin sayısını bulmak ve gerekli diziye başvurmak yeterlidir.

Tam olarak ihtiyacım olan şey bu, daha doğrusu sadece Al ve Sat için. Basit stratejim için asıl mesele, açık pozisyonların kapanma koşullarını görmek için birbirine müdahale etmemesidir. Belki hala diziler olmadan yapabilirsiniz? Şey, onları anlamıyorum: nasıl yaratılır, nasıl çevrilir - karanlık bir orman. Belki ekrandan benim durumumu anlarsın:

Görünüşe göre koddaki her şey basit ve net bir şekilde çalışıyor, sadece bu yanlış anlaşılmanın tek örneği.

 
novichok2018 :

Tam olarak ihtiyacım olan şey bu, daha doğrusu sadece Al ve Sat için. Basit stratejim için asıl mesele, açık pozisyonların kapanma koşullarını görmek için birbirine müdahale etmemesidir. Belki hala diziler olmadan yapabilirsiniz? Şey, onları anlamıyorum: nasıl yaratılır, nasıl çevrilir - karanlık bir orman. Belki ekrandan benim durumumu anlarsın:

Görünüşe göre koddaki her şey basit ve net bir şekilde çalışıyor, sadece bu yanlış anlaşılmanın tek örneği.

Tabii ki, diziler olmadan en basit (ve hatta orta karmaşıklıkta) daha uygundur. İşte o zaman yüzlerce emri kullanmaya başlarsınız - o zaman ... Ve emirleri ayırt etmek kolaydır. Örneğin, OrderType()'a göre - biri 0 almak için, diğeri 1 satmak için. Ve stratejiniz iyi - 1 günde on artırabilir veya yarım günde boşaltabilirsiniz. Tek ihtiyacınız olan bu okları nasıl yakalayacağınız. Ve evet, genellikle incinirler. Önce sinyal vermeyi öğrenmek mantıklıdır: Al ve Sat
 
LRA :
Tabii ki, diziler olmadan en basit (ve hatta orta karmaşıklıkta) daha uygundur. İşte o zaman yüzlerce siparişin kullanımına ulaşırsınız - o zaman ...

Ve günlüğün şunu yazması benim durumumun nedeni olamaz: 2018.01.25 20:22:12 2018_WPR14_AMarkets EURUSD,M5: OrderClose hatası 138 ve sonuna kadar tekrarlıyor

2018.01.26 16:38:12 2018_WPR14_AMarkets EURUSD,M5: Uyarı: Toplam siparişler = 3 ? Ekran görüntüsü, bu sürenin SATIŞ'ı kapatmak için iki koşulu kapsadığını gösteriyor.

Ve bir pozisyon açma sinyalleri, birkaç göstergenin bir kombinasyonu ile verilir ve birer birer kapatılır. Ve çok sık çalışmıyorlar: beş dakikalık seansta birkaç gün sessiz kalıyorlar. Örneğin, bu yılın 1 Şubat'ından itibaren. sadece 14 pozisyon çalıştı.


 
novichok2018 :

Ve günlüğün şunu yazması benim durumumun nedeni olamaz: 2018.01.25 20:22:12 2018_WPR14_AMarkets EURUSD,M5: OrderClose hatası 138 ve sonuna kadar tekrarlıyor

2018.01.26 16:38:12 2018_WPR14_AMarkets EURUSD,M5: Uyarı: Toplam siparişler = 3 ? Ekran görüntüsü, bu sürenin SATIŞ'ı kapatmak için iki koşulu kapsadığını gösteriyor

nasıl bir durum yaşadın Terminalin hataya neden olan günlüğe yazdığını mı söylüyorsunuz? ... ve 138 ne anlama geliyor? nereye bakacağını biliyor musun? Bunu nasıl başardınız - bu çok nadir bir hatadır. ekranda görebilecekleriniz savaşın yarısıdır. Bunu bir danışmana nasıl açıklayacağınız aşağıda açıklanmıştır? bir tür matematiksel koşul yazmanız gerekiyor - danışman ekrana bakmak yerine sayılarla çalışıyor

 
LRA :

Terminalin hataya neden olan günlüğe yazdığını mı söylüyorsunuz? ... ve 138 ne anlama geliyor? nereye bakacağını biliyor musun?

Hayır, tarihin bu döneminde test cihazında sinyallerin doğru çalışmasına izin vermeyen bir arıza oluştuğunu söylemek istiyorum. Çünkü alıntılar günlerce süremez .

 
novichok2018 :

Hayır, tarihin bu döneminde test cihazında sinyallerin doğru çalışmasına izin vermeyen bir arıza oluştuğunu söylemek istiyorum. Çünkü alıntılar günlerce süremez.

Test cihazındaki alıntılar? ilk kez duyuyorum ... Test cihazı ideal - kayması bile yok

...bir şey göstergeyi zorluyor - trend yükseliyor. Satın alacağım ... ortaya çıktı ... yeterli olmasa da, TP'yi yukarı taşımak istedim - zaten işe yaradı ...

Bu yüzden danışmana, eğer öyleyse çıkın ve bir sonraki onay işaretine devam edin. Ve demoda deneyin

Neden: