Forumu kirletmemek için herhangi bir acemi sorusu. Profesyonel, kaçırmayın. Sensiz, hiçbir yerde - 6. - sayfa 640

 

Merhaba yoldaşlar!

MT5'te benim için çok harika ve çok gerekli araçlar var, " Elliott Impulse Wave " ve "Elliott Corrective Wave".

Soru şu: Bu araçları MT5'ten MT4'e bir şekilde entegre etmek mümkün mü?

MT4'te işlem yapıyorum, bir analiz yapmak için MT5'e geçmek çok uygun değil.

Veya: Sorunu çözmenin başka yolları nelerdir?

 
İyi günler, dilin MarketInfo( Symbol() , MODE_TICKVALUE ) gibi bir piyasa parametresi var. Bu değerin nasıl hesaplandığını genel hatlarıyla anlatabilir misiniz?
 
mql_writer :
İyi günler, dilin MarketInfo(Symbol(), MODE_TICKVALUE ) gibi bir piyasa parametresi var. Bu değerin nasıl hesaplandığını genel hatlarıyla anlatabilir misiniz?

Bu, 1,00 lot ile mevduat para birimindeki minimum fiyat değişikliğinin (1 pip) maliyetidir! Çok basit bir şekilde hesaplanır: 1.00(lot)/ 1.36030(şu anda eurodolar kotasyonu) = 0.7351 euro.
 
borilunad :

Bu, 1,00 lot ile mevduat para birimindeki minimum fiyat değişikliğinin (1 pip) maliyetidir! Çok basit bir şekilde hesaplanır: 1.00(lot)/ 1.36030(şu anda eurodolar kotasyonu) = 0.7351 euro.

sadece burada, pazarlama bilgisi yoluyla bir istek üzerine, yen olanlar hariç tüm çiftler için 10 döndürür)))


Bu formülü nereden aldınız?

 
evillive :

sadece burada, pazarlama bilgisi yoluyla bir istek üzerine, yen olanlar hariç tüm çiftler için 10 döndürür)))


Bu formülü nereden aldınız?


Tüm formülleri kendim yapıyorum ve şimdi grafiğimden aldım.

Bu da Doki'den:

MODE_TICKVALUE

on altı

Mevduat para birimi cinsinden enstrümanın fiyatındaki minimum değişikliğin tutarı

Hesaplar paylaşılmaz.

 
borilunad :


Tüm formülleri kendim yapıyorum ve şimdi programımdan aldım.

Bu da Doki'den:

MODE_TICKVALUE

on altı

Mevduat para birimi cinsinden enstrümanın fiyatındaki minimum değişikliğin tutarı

Hesaplar paylaşılmaz.


Senaryo ile tam olarak bunu ayarladım ve her zaman 10 döndürür ) 1 Eurodollar lotu için 1 puan gerçekten 10 dolara mal oluyor, yani her şey doğru.

Ve sadece onlara göstermekten utananlar hesaplamaları paylaşmazlar, matematik - Afrika'da matematik

Ve evet, bu durumda formül yeniden yapılmalı, doğru olacak MODE_TICKVALUE = MODE_LOTSIZE * MODE_TICKSIZE - eurodollar için, haçlar ve yen için formül biraz farklı

 
Top2n :


Dürüst olmak gerekirse, nasıl başvuracağımı anlamadım. Milimetrenin sonuna kadar kalıyor, neredeyse her şey bittiğinde durmak ayıp.

Görev, nesnenin zamanı (2. parametre+3600sn>akım)||(1. parametrenin zamanı - 2. parametrenin zamanı)<3600sn ise fiyatı diziye yazmak değildir.

Neden bir hatayı taklit edelim?

Hata - sistemin sınırlamaları/arızaları ile ilgili herhangi bir nedenle, algoritmayı çalıştırmanın ve sonucu bazı (elbette sınırlı, ancak - ) garantilerle almanın mümkün olmadığını bildirmek içindir. FillAndPrint() işlevi sadece anlamlıdır ve hatalı bir durumun ne anlama geldiğini ve ne olmadığını gösterir. Bir hata oluştuğunda, bir sonuç üretmeye bile çalışmaz. Herhangi bir hata oluşmazsa, sonuca güvenilebilir. "Hata/hata değil" mantığı bu şekilde oluşturulmalıdır.

Burada algoritmada bir değişiklik de gereklidir: ayrıca ek bir filtre uygulamak da gereklidir.

Bunu şu şekilde yapmalısınız:

 /******************************************************************************/
bool AddValueIfFiltered( double &array[], const string name) {
#define MIN_SECS_BETWEEN_PRICE1_AND_PRICE2 3600
#define MAX_SECS_AFTER_PRICE2               3600

   const datetime dt1 = ( datetime )ObjectGet(name, OBJPROP_TIME1);
   const datetime dt2 = ( datetime )ObjectGet(name, OBJPROP_TIME2);
   const datetime dt = TimeCurrent ();

   Print ( "name = " , name, ", dt = " , dt, ", dt1 = " , dt1, ", dt2 = " , dt2);

   if (dt <= dt2 + MAX_SECS_AFTER_PRICE2 && dt1 + MIN_SECS_BETWEEN_PRICE1_AND_PRICE2 <= dt2) { // Фильтруем, прежде чем попытаться добавить
     if (!AddValue(array, ObjectGetValueByShift(name, 1 ))) { // Пытаемся добавить
       return false ; // Ошибка, значение не добавлено
    }
  }

   return true ; // Нет ошибки, значение, если удовлетворило условию фильтра, добавлено к массиву
}

/******************************************************************************/
bool AddValueIfFound( double &array[], const string name) {
   const int type = ObjectType(name);

   if (type == OBJ_TREND ) {
     switch (( color )ObjectGet(name, OBJPROP_COLOR )) { // Тип color допустимо использовать в switch
     case Goldenrod:
     case Gainsboro:
     case White:
       if (!AddValueIfFiltered(array, name)) { // Пропускаем через фильтр
         return false ;
      }
    }
  }

   return true ; // Нет ошибки, значение, если найдено, добавлено к массиву
}

İlk önce, nesnelerin türlerine ve parametrelerine göre "filtreledik", mevcut tüm nesnelerden yalnızca ihtiyacımız olanları seçtik ve ardından ek bir filtre uyguladık. Bir insanın bunu nasıl yapacağı hakkında. Bir insan böyle bir şey yapar, değil mi?

Bu tür her küçük alt görev için ayrı bir işlev kendini önerir.

Çok özel durumlar dışında, örneğin ikiye katlamanız gerekiyorsa, ifadelerde sayı olmamalıdır ve bu ikiye katlama algoritmanın doğasında vardır. Ardından 2 sayısını doğrudan ifadelerde kullanabilirsiniz. Ve diğer benzer çok nadir durumlarda.

Aksi takdirde, anımsatıcılar kullanılmalıdır. İlk olarak, belirli bir yerde neler olduğunun anlaşılmasını büyük ölçüde geliştirirler ve bu nedenle hata yapma olasılığının azaltılmasına katkıda bulunurlar. İkincisi, değerin kendisi tek bir yerde ayarlanır ve gerekirse değiştirmek kolaydır ve sayının algoritmada tekrar tekrar kullanıldığı ve anımsatıcı kullanılmadan kullanıldığı duruma kıyasla hata yapmak imkansız olacaktır. , algoritmanın çeşitli yerlerindeki sayıları düzenlemeniz gerekir.

Çalıştır sonucu:

 02 : 08 : 46 Script 2 EURUSDm,H1: loaded successfully
02 : 08 : 46 2 EURUSDm,H1: initialized
02 : 08 : 46 2 EURUSDm,H1: Sell:
02 : 08 : 46 2 EURUSDm,H1: name = downtrendline1, dt = 2014.06 . 24 22 : 09 : 02 , dt1 = 2014.06 . 24 10 : 00 : 00 , dt2 = 2014.06 . 24 17 : 00 : 00
02 : 08 : 46 2 EURUSDm,H1: Найдено объектов: 0
02 : 08 : 46 2 EURUSDm,H1: Buy:
02 : 08 : 46 2 EURUSDm,H1: name = uptrendline0, dt = 2014.06 . 24 22 : 09 : 02 , dt1 = 2014.06 . 23 09 : 00 : 00 , dt2 = 2014.06 . 24 16 : 00 : 00
02 : 08 : 46 2 EURUSDm,H1: Найдено объектов: 0
02 : 08 : 46 2 EURUSDm,H1: uninit reason 0
02 : 08 : 46 Script 2 EURUSDm,H1: removed

Hiçbir nesne bulunamadı. Her iki anımsatıcının değerlerini 10 kat artırarak 36000'e (10 saat) çıkaralım ve tekrar çalıştıralım:

 02 : 09 : 03 Script 2 EURUSDm,H1: loaded successfully
02 : 09 : 03 2 EURUSDm,H1: initialized
02 : 09 : 03 2 EURUSDm,H1: Sell:
02 : 09 : 03 2 EURUSDm,H1: name = downtrendline1, dt = 2014.06 . 24 22 : 09 : 14 , dt1 = 2014.06 . 24 10 : 00 : 00 , dt2 = 2014.06 . 24 17 : 00 : 00
02 : 09 : 03 2 EURUSDm,H1: Найдено объектов: 0
02 : 09 : 03 2 EURUSDm,H1: Buy:
02 : 09 : 03 2 EURUSDm,H1: name = uptrendline0, dt = 2014.06 . 24 22 : 09 : 14 , dt1 = 2014.06 . 23 09 : 00 : 00 , dt2 = 2014.06 . 24 16 : 00 : 00
02 : 09 : 03 2 EURUSDm,H1: Найдено объектов: 1
02 : 09 : 03 2 EURUSDm,H1: Price[ 0 ] = 1.35869
02 : 09 : 03 2 EURUSDm,H1: uninit reason 0
02 : 09 : 03 Script 2 EURUSDm,H1: removed

Bir eğilim çizgisi filtrelemeyi zaten "geçti". Şimdi ilk anımsatıcının değerini 3600'e geri yükleyelim ve çalıştıralım:

 02 : 09 : 12 Script 2 EURUSDm,H1: loaded successfully
02 : 09 : 12 2 EURUSDm,H1: initialized
02 : 09 : 12 2 EURUSDm,H1: Sell:
02 : 09 : 12 2 EURUSDm,H1: name = downtrendline1, dt = 2014.06 . 24 22 : 09 : 26 , dt1 = 2014.06 . 24 10 : 00 : 00 , dt2 = 2014.06 . 24 17 : 00 : 00
02 : 09 : 12 2 EURUSDm,H1: Найдено объектов: 1
02 : 09 : 12 2 EURUSDm,H1: Price[ 0 ] = 1.36152
02 : 09 : 12 2 EURUSDm,H1: Buy:
02 : 09 : 12 2 EURUSDm,H1: name = uptrendline0, dt = 2014.06 . 24 22 : 09 : 26 , dt1 = 2014.06 . 23 09 : 00 : 00 , dt2 = 2014.06 . 24 16 : 00 : 00
02 : 09 : 12 2 EURUSDm,H1: Найдено объектов: 1
02 : 09 : 12 2 EURUSDm,H1: Price[ 0 ] = 1.35869
02 : 09 : 12 2 EURUSDm,H1: uninit reason 0
02 : 09 : 12 Script 2 EURUSDm,H1: removed

Artık her iki trend çizgisinin de filtrelemeyi "geçtiği" görülebilir. Bu arada, programın sadece bir dalını değil, tüm dallarını (parçalarını) bu şekilde ayıklamanızı tavsiye ederim.

Bir şekilde resmileştirmeye yardımcı olmak için, bunu bu şekilde açıklamaya çalışacağım. Program plana benzer görünüyor.

Planın her bir ana noktası, daha küçük bir alt planın noktalarına bölünebilir. Küçük - daha da küçük. En küçük alt planların öğeleri doğrudan yürütülür.

Her plan, alt plan ve hatta en küçük alt planların öğeleri, programdaki işlevlere karşılık gelir. En küçük alt planlardaki öğeler, yalnızca sistem işlevlerini çağıran veya hatta onları çağırmayan "son" işlevlerine karşılık gelir, örneğin yukarıda tartışılanlarda AddValue() veya DiffInSecs() örnek olarak kullanılabilir. Yukarıdaki alt planların öğeleri, aşağıdaki alt planların öğelerini uygulayan işlevleri çağıran işlevlere karşılık gelir. Yukarıda tartışılanlarda bunlar MassTrendNumber(), AddValueIfFound(), AddValueIfFiltered()'dir. "Düşük seviyeli" fonksiyonlar "yüksek seviyeli" fonksiyonları çağırmamalı ve "yüksek seviyeli" fonksiyonlar genellikle birkaç seviye aşağı atlamamalı, yani fonksiyonları çağırmalı, temelde sadece bir seviye aşağıda olmalıdır. "Düşük seviye" için bu kural "yüksek seviye" için olduğundan çok daha katıdır.

Programlarınızı, bu şekilde bir ağaç yapısında birbirine bağlanan (kısa) işlevler şeklinde, içindeki eylemleri, kimin kimi çağırdığı anlamında düzenleyerek oluşturmaya çalışın.

Bu programda, dejenere bir ağaç ortaya çıktı: bir dal birkaç kez "dallanıyor". Ve iki küçük dala değil, bire "dallanır". Ancak mesele şu ki, "üst düzey" işlevler sürekli olarak "düşük düzeyli" işlevler olarak adlandırılır. Bu modifikasyonda, bu yapıya bir seviye daha ekledim, bir tane daha "dallanmamış dal" - AddValueIfFiltered().

 
pardon konuyu görmemişim
https://www.mql5.com/en/forum/152102 Bir sorum var
 
borilunad :

Her şey doğru! 4 basamaklı bir alıntı ile her zaman 1 gösterdi ve 5 basamaklı bir alıntı ile şimdi 10 gösteriyor, çünkü pipler 10 kat daha fazla (ve daha küçük) oldu. Ve bir min.tick'in maliyeti mevcut fiyattan hesaplanmalıdır!

Şimdi 4 işaretim var, eurodolar'da 1 lot 1 puan maliyeti 10 dolar ve bu her zaman böyle olmuştur. Haçlar için maliyet, formülün biraz daha karmaşık olduğu 8 ila 16 arasında olacaktır.

Örneğin, euro sterlin için pazarlama bilgisi 16.984 döndürdü, sterlin döviz kuru dolara = 1.6984, yani 1 euro sterlin puan maliyeti 1 sterlin dolar ile bir sterlin dolar noktasının maliyetinin çarpımıdır, bu her zaman 10.0'dır (100000). *0.0001=10.0 veya 100000 * 0.00010 \u003d 10.0 - istediğiniz gibi).


Tüm bu hesaplamalar, yalnızca hesabınız dolar cinsinden ise doğrudur:

Bu durumda xUSD (EURUSD, GBPUSD vb.) için tickvalue = lot*point = 100000*0.0001 = 10.0

USDx (USDCHF, USDJPY vb.) için tick değeri = lot*puan/Teklif = 100000*0.01/101.93=9.8107

çapraz kurlar için xUSD/yUSD (EURGBP) tick değeri = Bid(yUSD)*lot*puan = 1.6980*100000*0.0001 = 16.98

xUSD/USDy (EURJPY) için tickvalue = lot*point/Bid(USDy) = 100000*0.01/101.91=9.8126 kesişir

 
evillive :

Şimdi 4 işaretim var, eurodolar'da 1 lot 1 puan maliyeti 10 dolar ve bu her zaman böyle olmuştur. Haçlar için maliyet, formülün biraz daha karmaşık olduğu 8 ila 16 arasında olacaktır.

Örneğin, euro sterlin için pazarlama bilgisi 16.984, eurodolar kuru = 1.3604, sterlin dolar karşısında = 1.6984 döndürdü, yani 1 euro sterlin pip maliyeti 1 sterlin dolar ile bir sterlin dolar pipinin maliyetinin çarpımıdır, bu her zaman 10.0 (100000 * 0 ,0001=10.0 veya 100000*0.000010=10.0 - ne istersen).




Her şey basit ve pratik! Ve 4 haneli bir alıntı olduğu zaman, henüz program yazmadım, o yüzden yargılayamam. :)

İyi geceler!