[ARŞİV] Forumu kirletmemek için herhangi bir acemi sorusu. Profesyonel, kaçırmayın. Sensiz hiçbir yerde - 5. - sayfa 299

 
palomnik :

//------------------------------------------------ ------------------------------+
// Kim Saygı ve saygı !!! |
//+------------------------------------------- ------------------------------+

Bu kuşkusuz kodun en stresli kısmıydı))))

Böyle. Burada hiçbir şey anlamıyorum. Aklıma ikinci TF geldi. Her şey saat gibi çalışmalı. Ama çalışmıyor. Hayır, işe yarıyor ama beklendiği gibi değil. Her şeyi binlerce kez kontrol ettim. Kendimde herhangi bir sözdizimsel veya algoritmik hata görmüyorum. Açıklamaya çalışacağım, tam kodu ekliyorum. Böyle:

Δtime= TimeCurrent ()-time; //перестраховка на случай, если TimeCurrent() во время выполнения цикла изменится
switch (Δtime){
   case 0 : //если секунда не прошла
    AccumulatorOfTicks( false ); //заносим в массив-накопитель
     break ;
   case 1 : //если прошла ОДНА секунда после последнего тика
    WriteBar(); //по предыдущему тику рисуем свечу
    AccumulatorOfTicks( true ); //и ловим текущий тик
     break ;
   default : //если прошло НЕСКОЛЬКО секунд после последнего тика
    WriteBar(); //по предыдущему тику рисуем свечу
    Δtime--; time++; //уменьшаем разницу на единицу, т.к. свечу уже нарисовали
     while (Δtime!= 0 ) WriteDash(); //и рисуем прочерки по кол-ву пропущ. сек. минус один
    AccumulatorOfTicks( true ); //ловим текущий тик
}

Burada, start()'ın başlangıcında, işleyiciyi son start() çalışmasından bu yana geçen saniye sayısına göre ayarladım. Yinelenen bölümler özel işlevlere taşındı. Yeni değer time=TimeCurrent(), kullanıcı tanımlı işlevlerde aynı yere atanır.

 void AccumulatorOfTicks( bool AtFirst){
         if (AtFirst){
                 ArrayResize (bid, 1 ); //урезаем использованные массивы
                 ArrayResize (ask, 1 );
                i= 0 ; //обнуляем счётчик тиков в секунду
                time= TimeCurrent (); //приводим счётчик времени к текущему
        } else {
                 ArrayResize (bid, i+ 1 );
                 ArrayResize (ask, i+ 1 );
                i++;
        }
        bid[i]=MarketInfo(symbol, MODE_BID);
        ask[i]=MarketInfo(symbol, MODE_ASK);
         if (bid[i]==ask[i]) Alert ( "from accumulator: bid=ask" );
}

İşlev iki modda çalışır: ilk dalda, AtFirst=true, akümülatör dizilerinin ön sıfırlanmasıyla yalnızca bir onay işareti yakalar ve ikinci dalda, AtFirst=false, tam olarak bir onay akümülatörü olarak çalışır. Yani ya akümülatörü sıfırlayıp kesip sıfır hücresinde alış-satış yakalarız ya da akümülatörü uzatıp alış-satışı yakalarız. Uyarı yalnızca hata ayıklama için ayarlandı. Sürücüyü daha fazla sıfırlama koşulunu yazacağım.

 void WriteBar(){
         if ( FileSeek (hand1e, fpos, SEEK_SET ) == false ){ //перемещаем указатель на новую позицию, которую мы запомнили в FileTell
                 //проверяем, переместилось-не переместилось, это я убрал, т.к. к вопросу не относится.
        } else {
                 FileWriteInteger (hand1e,  time,   LONG_VALUE); //TimeCurrent()
                 FileWriteDouble (hand1e,  bid[ 0 ], DOUBLE_VALUE); //Open[]
                 FileWriteDouble (hand1e,  bid[ ArrayMaximum (bid)], DOUBLE_VALUE); //High[]
                 FileWriteDouble (hand1e,  ask[ ArrayMinimum (ask)], DOUBLE_VALUE); //Low[]
                 FileWriteDouble (hand1e,  ask[ ArraySize (ask)- 1 ], DOUBLE_VALUE); //Close[]
                 FileWriteDouble (hand1e,   ArraySize (ask), DOUBLE_VALUE); //Volume[]
                 FileFlush        (hand1e);
                fpos = FileTell (hand1e); //запоминаем позицию записи в файле
                 if ( ArraySize (ask)== 2 ) Alert ( StringConcatenate (TimeToStr( TimeCurrent (), TIME_SECONDS), " - volume = " , ArraySize (ask)));
                 if (bid[ 0 ]==ask[ ArraySize (ask)- 1 ]) Alert ( StringConcatenate (TimeToStr( TimeCurrent (), TIME_SECONDS), " - bid=ask, Ticks = " , ArraySize (ask)));
                 /*Необходимое пояснение. Хотя код рассчитан в т.ч. на тени свечей (т.е. независимыми от Open и Close
                 High и Low), в реальности их на чарте не будет, т.к. в секунде максимум 2 тика, три тика в секунде
                я ещё не встречал. Поэтому в массиве из двух элементов (т.е. двух тиков)
                один будет максимумом, другой минимумом, - и невольно совпадать с Open и Close.*/
        }
}

Bir mum "çizme" işlevi (.hst'ye bir mum koymak, çevrimdışı bir grafikte açılır). Benzer şekilde - hata ayıklama için uyarılar ayarlayın. İlk uyarı, bir saniyede yakalanan iki tikte bip sesi çıkarır (dizi boyutu ikidir ve teorik olarak ses ikiye eşit olmalıdır) ve ikinci uyarı, yakalanan tikteki sormaya eşittir (uyarıya benzer) sürücüde: ancak bir nedenden dolayı senkronize çalışmıyorlar) ve mumun hacmi. Bunların hepsi teoride, aslında, bir dosyaya girildiğinde (bir uyarıya göre), örneğin bir ikili (veya 0x00 00 00 00 00 00 00 40, çift 2.0), bir nedenden dolayı hala bir tane (0x00) var. 00 00 00 00 00 F0 3F, BigEndian formatında çift 1.0). Genelde sürücüdeki bu uyarıyı yorumluyorum, sık sık bip sesi çıkarıyor, bu ikisiyle çalışıyorum.

 void WriteDash(){
         if ( FileSeek (hand1e, fpos, SEEK_SET ) == false ){ //перемещаем указатель на новую позицию, которую мы запомнили в FileTell
                 //аналогично убрал, т.к. к вопросу не относится.
        } else { //ставим прочерк на Close[0]
                Δtime--; time++;
                 FileWriteInteger (hand1e,  time,   LONG_VALUE); //TimeCurrent()
                 FileWriteDouble (hand1e,  ask[ ArraySize (ask)- 1 ], DOUBLE_VALUE); //Open[]
                 FileWriteDouble (hand1e,  ask[ ArraySize (ask)- 1 ], DOUBLE_VALUE); //High[]
                 FileWriteDouble (hand1e,  ask[ ArraySize (ask)- 1 ], DOUBLE_VALUE); //Low[]
                 FileWriteDouble (hand1e,  ask[ ArraySize (ask)- 1 ], DOUBLE_VALUE); //Close[]
                 FileWriteDouble (hand1e,   0 , DOUBLE_VALUE); //Volume[]
                 FileFlush        (hand1e);
                fpos = FileTell (hand1e); //запоминаем позицию записи в файле
        }
}

Herhangi bir saniyede kene olmaması durumunda tire "çizme" işlevi. Her şey aşağıdaki algoritmaya göre çalışır:

Δtime=0: keneleri yakala (kopyala).

Δtime=1: Daha önce yakalanan kene temelinde bir mum çubuğu çizin, ardından keneyi yakalayın (akümülatörün ön sıfırlanmasıyla).

Δtime>1: Daha önce yakalanan kene üzerine bir mum çizin, Kapat[0] çizgisi boyunca Δtime-1 miktarında kısa çizgiler çizin, bir tik yakalayın (akümülatörün ön sıfırlanması ile). Her durumda, üzerine mum çizildiğinde sürücüyü sıfırlarız, bu da artık pile ihtiyacımız olmadığı anlamına gelir. Bu, Δzaman>0 olduğunda olur.

Biz süreriz:

Teklifin sözde sormaya eşit olduğu ve hacmin bire eşit olması gereken anları bir okla çizdim. Dipleri hacimlerle yakalamadım, hala görülecek bir şey yok, ince. Ama hepsi eşit durumda, yani ya sıfır ya da bir, hiçbiri ikiye çıkmıyor (uyarı bip sesi çıkarmasına rağmen). Saniyede iki tıklama - hepsi aynı, fareyi üzerine getirdiğinizde hacim=1 görüntülenir ve teklif sormaya eşittir, hacim=0 da görüntülenir. Niye ya? Bir yerde bir hata olduğunu anlıyorum ama büyük ihtimalle hatayı fark etmiyorum veya yanlış yere bakıyorum. Kodu ekliyorum, her şeyi iyi yorumladım, her yerde girintileri takip ettim, kapsayıcıları kaldırdım, sadece daha hızlı derlemek için kullanılan işlevleri seçtim. Tek açıklama çevrimdışı, yani. TimeLocal ile, orijinal kene toplayıcısının aksine, çalışmıyor, çünkü if(tickTimeLocal==true) içinde saçmalıktan yazdım (çünkü beni incitmedi). Taras'ın tavsiyesi üzerine bir danışmana aktarmaya çalıştım - daha sonra mumlar çevrimdışı grafikte görüntülenmiyor (mevcut teklifin satırı normal şekilde hareket etse de).

Dosyalar:
fif.ta.mq4  18 kb
 
artmedia70 :

senin ayak bezlerin.

Yönetimden bir spoiler çıkarmak gerekiyor. Yorumsuz ayak bezlerinin nedense daha az ayak örtüsü haline gelmediğini fark etmeye başladım))
 

Merhaba

Böyle bir soru vardı. Diyelim ki bugün Pazartesi. Cuma kapanış fiyatını öğrenmem gerekiyor. şöyle yazabilir miyim

iClose( NULL , Period_D1, 1 )
Bu soru, test cihazında Cumartesi ve Pazar çubuklarını gördüğüm için ortaya çıktı. Ama bu günlerde ticaret yok. Yukarıdaki satır Cuma mı Pazar mı kapanış fiyatını verir ?
 
gince :

Merhaba

Böyle bir soru vardı. Diyelim ki bugün Pazartesi. Cuma kapanış fiyatını öğrenmem gerekiyor. şöyle yazabilir miyim

Bu soru, test cihazında Cumartesi ve Pazar çubuklarını gördüğüm için ortaya çıktı. Ama bu günlerde ticaret yok. Yukarıdaki satır Cuma mı Pazar mı kapanış fiyatını verir ?

Cuma fiyatı verecek! Sunucu Cuma günü en geç 24.00'te kapanırsa ve Pazar'dan sonra 0.00'dan önce başlamazsa!

DailyPivotPoints göstergesini kullanın!

 

Hayır, gerçekten hiçbir şey anlamıyorum. Belli ki zaten yazıyor

                 switch ( ArraySize (ask)){
                 case 0 : FileWriteDouble (hand1e,   0.0 , DOUBLE_VALUE); Alert ( StringConcatenate (TimeToStr( TimeCurrent (), TIME_SECONDS), " 0" )); break ;
                 case 1 : FileWriteDouble (hand1e,   1.0 , DOUBLE_VALUE); Alert ( StringConcatenate (TimeToStr( TimeCurrent (), TIME_SECONDS), " 1" )); break ;
                 case 2 : FileWriteDouble (hand1e,   2.0 , DOUBLE_VALUE); Alert ( StringConcatenate (TimeToStr( TimeCurrent (), TIME_SECONDS), " 2" )); break ;
                 default : Alert ( "!!!!! - " , ArraySize (ask));
                }

2'ye eşit uyarıda, göstergeyi dakikalardan kaldırıyorum, fareyi mumun üzerine getiriyorum... Hacim=1.

FileInsight aracılığıyla hst'deki RateInfo'ya baktım (bir hata ayıklayıcı gibi), belki int var, Volume'de double değil - hayır, double ...

 

İyi akşamlar.

soruma cevap verdiğin için teşekkür ederim))

Lütfen bana söyleyin, eğer bir satın alma emri açarsanız, OrderSend (Symbol(), OP_BUY ,Lot, Ask ,3,0,0,"Buy",0,0,Green);

ve satılık ise OrderSend (Symbol(), OP_SELL ,Lot, Ask ,3,0,0,"Sale",0,0,Red);


mavi fark Yoksa kırmızıyı da mı değiştirmem gerekiyor? onlar. OP_BUY, Teklif fiyatıdır

OP_SELL, Satış fiyatıdır

ve her şey doğruysa ve hiçbir şeyin değiştirilmesi gerekmiyorsa, neden test cihazında her şey yolunda, deme'de her şey yolunda ve GERÇEK "Hata açma sırası 129" yardım plz.

 
ed3sss :

İyi akşamlar.

Soruma cevap verdiğin için teşekkür ederim))

Söyle lütfen, bir satın alma emri açarsanız, OrderSend (Symbol(), OP_BUY ,Lot, Ask ,3,0,0,"Buy",0,0,Green);

ve satılık ise OrderSend (Symbol(), OP_SELL ,Lot, Ask ,3,0,0,"Sale",0,0,Red);

mavi fark Yoksa yine de kırmızı rengi değiştirmem gerekiyor mu ??? onlar. OP_BUY, Teklif fiyatıdır

OP_SELL, Satış fiyatıdır

ve her şey doğruysa ve hiçbir şeyin değiştirilmesi gerekmiyorsa, neden test cihazında her şey yolunda, deme'de her şey yolunda ve GERÇEK "Hata açma sırası 129" yardım plz.

Al, Sor, Teklifle Sat'ı açarsanız! Ve tam tersini kapatın!
 
ed3sss :

İyi akşamlar.

Soruma cevap verdiğin için teşekkür ederim))

Lütfen söyle, bir satın alma emri açarsanız, OrderSend (Symbol(), OP_BUY ,Lot, Ask ,3,0,0,"Buy",0,0,Green);

ve satılık ise OrderSend (Symbol(), OP_SELL ,Lot, Ask ,3,0,0,"Sale",0,0,Red);

...
Satın almak:
 OrderSend ( Symbol (), OP_BUY ,Lot, Ask , 3 , 0 , 0 , "Покупка" , 0 , 0 ,Green);

Satılık:

 OrderSend ( Symbol (), OP_SELL ,Lot, Bid , 3 , 0 , 0 , "Продажа" , 0 , 0 ,Red);

Bir sipariş göndermeden önce teklifleri güncellemenizi öneririm:

RefreshRates();
OrderSend (...);
Ve kaymanız =3 olduğuna dikkat edin, 4 basamaklı alıntılar için =3 puan olacak ve 5 basamaklı alıntılar için 0,3 puan olarak hesaplanacaktır. Bu nedenle, danışman 5 basamaklı tırnak işaretleri ile çalışacaksa, kayma = 30 olarak ayarlayın.
 
gyfto :

Hayır, gerçekten hiçbir şey anlamıyorum. Belli ki zaten yazıyor

2'ye eşit uyarıda, göstergeyi dakikalardan kaldırıyorum, fareyi mumun üzerine getiriyorum... Hacim=1.

FileInsight aracılığıyla hst'deki RateInfo'ya baktım (bir hata ayıklayıcı gibi), belki int var, Volume'de double değil - hayır, double ...

Koduna baktım .... kafan çok karışık)))

Neden kene biriktirmemiz gerektiğini tam olarak anlamıyorum, çünkü bellekte saklamamız (veya hatta saklamamamız bile, çünkü mevcut çubuğun HST'de yazılması gerektiğinden - aksi takdirde grafik güncellenmeyecektir) parametrelerinin parametrelerini geçerli çubuk altı TOHLCV numarasıdır ve işaretler geldiğinde bunları gerektiği gibi güncelleyin ve belirtilen koşula göre ( TimeCurrent() -O>1) kesme çubukları.

Kodu bu şekilde yeniden işlemeye çalışın, 8 kat azalacaktır, garanti ederim (test edildi :)

 
İşte ilginç bir durum..Zaman çerçevesini değiştirdiğinizde değerler değişiyor ama geriye gitmeye değer ve rakamlar aynı, lütfen bana bunun nasıl düzeltilebileceğini söyleyin.
Dosyalar: