[Arşivle!] Forumu kirletmemek için herhangi bir acemi sorusu. Profesyonel, kaçırmayın. Sensiz hiçbir yerde - 2. - sayfa 82

 
nemo811 :
Yardım için teşekkürler. Bayrağı ayarlamanın mantığını ve sipariş sayısını döndürme işlevini anladım. Ama aynı zamanda siparişin kapandığı an da ilgileniyorum. Bayrak koşulunun tekrar bir emir vermeyi amaçladığı ortaya çıktı ve iade fonksiyonu 1 daha az emir olduğunu söylüyor ve ayrıca bir pozisyon açmayı başlatıyor. Bir şey kaçırdıysam düzeltin.


sağladığınız koddan, koşul tek bir yerde geçerli duruma değer (BUY=true) ve bayrak değişene kadar yeniden açma gerçekleşmez..çünkü. bir pozisyon açmak için işlev çağrısı, koşulun bu bloğundan gelir.Ve bu koddaki bayrak, yalnızca EA'yı yeniden başlattıktan sonra , değişken true değeriyle başlatıldığında değişebilir .

Ya ben soruyu anlamadım :)

 
NameLess :


sağladığınız koddan, koşul tek bir yerde geçerli duruma değer (BUY=true) ve bayrak değişene kadar yeniden açma gerçekleşmez..çünkü. bir pozisyon açmak için işlev çağrısı, koşulun bu bloğundan gelir.Ve bu koddaki bayrak, yalnızca EA'yı yeniden başlattıktan sonra, değişken true değeriyle başlatıldığında değişebilir.

Ya ben soruyu anlamadım :)


Teşekkürler, doğru anladım. şimdi uyguluyorum.
 
NameLess :


Bu sürüm çalışıyor. Size ve IgorM'e çok teşekkürler:

 extern bool BUY = true;
extern int Magic = 0 ;
extern double Lot = 0.1 ;
extern int takeprofit = 0 ;
extern int stoploss = 0 ;
extern int slippage = 3 ; 
double SL,TP;
int init(){
return ( 0 );
}
int start()
{
if (BUY)
{
if (takeprofit!= 0 ) TP = NormalizeDouble (Ask + takeprofit* Point , Digits ); else TP= 0 ;
if (stoploss!= 0 ) SL = NormalizeDouble (Ask - stoploss* Point , Digits ); else SL= 0 ; 
OPENORDER ( "Buy" );

BUY=false;
}

return ( 0 );
}
void OPENORDER( string ord)
{
int ticket = - 1 ;
while (ticket< 0 )
{
if (ord== "Buy" ) ticket= OrderSend ( Symbol (),OP_BUY, Lot, NormalizeDouble (Ask, Digits ),slippage,SL,TP, "" ,Magic, 0 );
Sleep ( 500 );
}
return ;
}
 

string Val="";
Val = iBands(NULL,0,50,2,0,PRICE_CLOSE,MODE_LOWER,0);
string substr=StringSubstr(Val,0,1);
point_low=StrToDouble(substr);
substr=StringSubstr(Val,2,1);
point_low+=StrToDouble(substr)/10;
substr=StringSubstr(Val,3,1);
point_low+=StrToDouble(substr)/100;
substr=StringSubstr(Val,4,1);
point_low+=StrToDouble(substr)/1000;
substr=StringSubstr(Val,5,1);
point_low+=StrToDouble(substr)/10000;
substr=StringSubstr(Val,6,1);
point_low+=StrToDouble(substr)/100000;

substr=StringSubstr(Val,7,1);
point_low+=StrToDouble(substr)/1000000; //тут плюсуем 6-ю цифру после запятой.

İnsanlar, HİÇBİR ŞEY yardımcı olmaz! Pekala, 5 ondalık basamaklı bir değer elde edemiyorum. Aklıma gelen tüm seçenekleri , bir dizenin sayıya çevrilmesi ve bir alt dizenin sayıya çevrilmesi ve sayıları (yukarıdaki örnek) çıkardım ve 4. basamaktan sonra aptalca birer birer ekledim. sadece toplamaz, ancak 4. basamağa yuvarlamaya başlar. 6. ondalık basamağın eklenmesi bile sıkışmış. hala bok(

Alert 4. karakterden sonra double değişken göstermiyor olabilir mi? (Satırı tam gösteriyor) Artık ne düşüneceğimi bilemiyorum .. bir nevi mistisizm (

 

İnsanlar, lütfen yardım edin: Birbirine bağlı iki Uzman Danışman yazdım (ticaret yapmıyorlar, ancak yalnızca GlobalVars oluşturuyorlar) ve bunların temelinde, normal bir fiyat tablosuna benzer eşdeğer hacim çizelgeleri göstergesi yapmanın mümkün olacağını düşünüyorum. MT4, ancak tüm bunların "indicator_separate_window" da nasıl çizilmesi gerektiğini anlayamıyorum. Veya birisi zaten benzer bir şey kullanıyorsa - kodu paylaşın :)

Dosyalar:
eqvol.rar  3 kb
 
NameLess :

Alert 4. karakterden sonra double değişken göstermiyor olabilir mi? (Satırı tam gösteriyor) Artık ne düşüneceğimi bilemiyorum .. bir nevi mistisizm (

Evet. ( Baskı gibi), yalnızca bir sayı çıktıysa standart 4 karakteri görüntüler.

daha fazla hassasiyet için DoubleToStr kullanın

 

RRRRRRRRRRRR. Kesin olarak, Alert'teki Terminal 4 karakterden fazla göstermiyor .. çifti çizgiye geri attı ve her şeyin doğru olduğunu görmek için ekrana çıkardı.

Yarım günümü bu aptal şeye harcadım. teneke, ama her şey başlangıçta çalışıyordu (

 
NameLess :

İnsanlar, HİÇBİR ŞEY yardımcı olmaz! Pekala, 5 ondalık basamaklı bir değer elde edemiyorum. Aklıma gelen tüm seçenekleri, bir dizginin sayıya çevrilmesi ve bir alt dizginin sayıya dönüştürülmesini yendim ve sayıları (yukarıdaki örnek) çıkardım ve 4. basamaktan sonra aptalca birer birer ekledim. sadece toplamaz, ancak 4. basamağa yuvarlamaya başlar. 6. ondalık basamağın eklenmesi bile sıkışmış. hala bok(

Alert 4. karakterden sonra double değişken göstermiyor olabilir mi? (Satırı tam gösteriyor) Artık ne düşüneceğimi bilemiyorum .. bir nevi mistisizm (

Her zaman olduğu gibi, her şey deneye dayanır. Bir komut dosyası yazıyoruz:

 #property copyright ""
#property link       ""
#include <Basic_dll.mqh>

//+------------------------------------------------------------------+
//|                 Старт работы скрипта                             |
//+------------------------------------------------------------------+
int start(){
   string Stroka,Podstroka,SMB;
         int DGS,BezDrobi;
         double Rezult;
        SMB= Symbol ();
         //DGS=MarketInfo(SMB,MODE_DIGITS);
        DGS= 5 ; // дигитс задаём принудительно, чтоб можно было проверить на любой валюте
         // передаём левое значение в переменную
        Rezult= 1.252546987 ;
         // возводим число в степень
         for ( int i= 1 ;i<=DGS;i++){
                Rezult=Rezult* 10 ;
        }
         // В степень возвели. Теперь отбрасываем дробную часть.
        BezDrobi=OtbrosDrobnChasti(Rezult); // функция отбрасывает дробную часть числа
         Alert ( "BezDrobi = " ,BezDrobi);
         // теперь ставим на место запятую
        Rezult=BezDrobi* 1.0 ;
         for (i= 1 ;i<=DGS;i++){
                Rezult=Rezult/ 10 ;
                 Alert ( "Rezult = " ,Rezult);
        }
         Alert ( "----------- " ,SMB, " -----------" );
         return ( 0 );
}

Gördüğünüz gibi, komut dosyasına bir dll bağlı. Sayının kesirli kısmını atan tek bir işlevi vardır. Dll'yi bu gönderiye ekledim. Şimdi betiği 2 döviz çifti için sırayla atıyoruz. Pound ve Euro-Japon'a attım. Pound üzerinde 4 ondalık basamağım var. Avrupa-Japonca - iki. İşte betiğin çıktısı:

Pound için virgülün sırayla nasıl hareket ettiğini görüyoruz. Ayrıca kesirli kısımdaki son bölmede 4 rakam olduğu da açıktır. Basamak = 4 olduğundan, ondalık noktadan sonraki beşinci basamağın kesildiği varsayılabilir. Bu, sonuç olarak Avrupa-Japonca'da ondalık noktadan sonraki yalnızca 2 hanenin kalması gerektiği anlamına gelir, çünkü üzerindeki haneler = 2'dir. Bununla birlikte, deney ondalık noktadan sonra 4 hane ile sonuçlandığını göstermektedir. Bu, varsayımımızın doğru olmadığı ve yuvarlama olabileceği anlamına gelir. Son 4'ü 7 ile değiştirmeye çalışalım. Sonuç:

Ve ne görüyoruz? Şimdi ortaya çıkan beş, altıya dönüşüyor. Bu nedenle, otomatik yuvarlama gerçekleşir.

Senaryonun beş basamakta nasıl davranacağını bilmiyorum, ancak dört ve iki basamakta çalışmak beni tatmin etmedi - terminal araya girdi ve kimsenin istemediği bir yuvarlama yaptı. Yani geliştiricilere sorular sormanız gerekiyor. Veya - seçenek 2 - gösterge okumalarını alıyoruz, onları bir dizgeye sürüyoruz, dizgiyi bir dll'ye aktarıyoruz, oradaki verileri ihtiyacımız olduğu gibi işliyoruz, dll'den bir ticaret talebi döndürüyoruz.

Dosyalar:
experts.rar  42 kb
 

Yardımdan gelen bilgiler (uyarı ile):

Данные типа double выводятся с 4 десятичными цифрами после точки. Для вывода чисел с большей точностью используйте функцию DoubleToStr() .

Öyleyse gidin ve geliştiricilerin bunu neden yaptığını anlayın ...

 
drknn :


teşekkürler, kodu inceledim, çok ilginç. Yukarıda açıkladığım gibi her şeyin daha basit olduğu ortaya çıktı: terminal, pencerede 4. basamağın ötesinde görüntülenmiyor. ve tüm fikirler işe yaradı, sadece dönüşüm sorununu farklı şekillerde çözdüler :)

not Tüm sorunların mantıklı bir şekilde çözüldüğüne bir kez daha ikna oldum, ancak burada durum başlangıçta mantıksızdı, bu yüzden yanlış yerde bir fiş arıyorlardı :)