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

 
qwert2 :
Bunu yazdım, eğer script sadece uzmanlarla birlikte klasöre aktarılırsa ne olur. Çalışıyor ama olması gerektiği gibi değil. Komut dosyası bekleyen 8 sipariş oluşturur ve bunu uzmanlarla birlikte bir klasöre kaydederseniz, her onaydan sonra 8 bekleyen sipariş oluşturur. Ve yeni 8 siparişi ancak eskileri kapandıktan sonra ertelemem gerekiyor.

Senaryonuza sadece "erteleme" mi yazdınız? O zaman sadece erteleyecek: kaç kene gelecek - bu yüzden vergilendirecek ... oh ... erteleyecek.

Oraya başka bir dama pankartı sokman gerekiyor ...

 
qwert2 :
Bunu yazdım, eğer script sadece uzmanlarla birlikte klasöre aktarılırsa ne olur. Çalışıyor ama olması gerektiği gibi değil. Komut dosyası bekleyen 8 sipariş oluşturur ve bunu uzmanlarla birlikte bir klasöre kaydederseniz, her onaydan sonra 8 bekleyen sipariş oluşturur. Ve yeni 8 siparişi ancak eskileri kapandıktan sonra ertelemem gerekiyor.
Soruda yoktu. Bu artık bir uzmana dönüştürülecek bir komut dosyası olarak görülmemektedir. Bu, programın farklı bir uygulamasıdır.
 
Roger :

Bir hata bulundu. Bu işlev için kitaplıkta satırda

13, 14 ve 15. sayılarda sıfır ile çıkarılmalıdır.


şimdi doğru



Merhaba kütüphane fonksiyonları.
 
Roger:

Нашел ошибку. В библиотеке для данной функции в строке
надо удалить по нулю в 13, 14 и 15 числе.

Теперь правильно
tara :
Merhaba kütüphane fonksiyonları.
Değil! Standart kütüphaneden fonksiyonlara dokunamazsınız! Dima yasaklandı :-))
 
artmedia70 :

Senaryonuza sadece "erteleme" mi yazdınız? O zaman sadece erteleyecek: kaç kene gelecek - bu yüzden vergilendirecek ... oh ... erteleyecek.

Oraya başka bir dama afişi sokman gerekiyor ...


))))) Dayanamadım)))))

Tamam, şimdi konuya. İkinci TF'nin kodunu optimize etmeye çalışıyorum, RateInfo yapısını tek bir blokta yazmak için double'ı int[2]'ye dönüştürmek için yola çıktım. Düşündüm ve düşündüm, mümkün olan her şeyi boyamaya karar verdim, dahil. birinin hata yapmasını önlemenin gerçekleştirilemez yolları.

1. WinAPI (msdn). Genel olarak, kedi orada dönüştürme işlevlerine ağladı. Bunun nedeni, dönüştürme sırasında C tipi çevirinin yaygın olarak kullanılmasıdır.

 char s1;
char s2= "g" ; //код ANSI 0x67
int i1= 1357 ; //0x54D в шестн. представлении
int i2;

s1=( char )i1; //0x4D, "M", старший разряд (5) был усечён по границе байта (две шестн. цифры), остался один байт (0x4D, десятичное 77)
i2=( int )s2; //0x00 0x00 0x00 0x67, десятичное 103

sondan bir önceki satırda, int i1 char'a dönüştürülür ve son satırda char s2, int'ye dönüştürülür. Sonuç olarak, tüm bu ekonomi sözde birlikte kullanılır. Aslında herhangi bir WinAPI dll'sinde olmayan "dönüştürme işlevleri" ve bunlar yalnızca üstbilgi .h dosyalarında aşağıdaki gibi makrolar tarafından bildirilir:

 #define _dtoi64(d)     (*((int64_t *)&(d)))
#define _dtoui64(d)     (*((uint64_t *)&(d)))

bunlar derleme sırasında önişlemci tarafından ilk kod gibi bir dizgeye genişletilir. Ve başlık .h dosyaları dll değildir ve yalnızca geliştirme ortamında (Studio, Borland, gcc, vb.) kullanılır. MQL4 için neden hava ne soğuk ne de sıcak. Ancak, işlevin gerçekten yalnızca başlık .h dosyasında mı yoksa dışa aktarılan işlevlerde bir yerde, System32'deki bazı dll'lerde meraklı gözlerden gizlenmiş mi olduğunu her zaman iki kez kontrol edebilirsiniz, şimdi nasıl olduğunu açıklayacağım.

2. WinAPI (dll CRT). Bu dll'ler msvcp*, msvcr*, msvcrt*, msvci*, msvcirt olarak adlandırılır. Burada seçim daha geniştir: _atodbl, _atoi64, _atoldbl, _ftol, _i64toa, _itoa, _ltoa, _strtoi64, _strtoui64 _ui64toa, _ultoa, atof, atoi, atol, strtod, strtol. İsimdeki semboller şu anlama gelir:

a, str, w - string
f, l, i, ui, ul - int ( 4 байта)
d, dbl, i64 - double , int [ 2 ] ( 8 байт)
ldbl - int [ 2.5 ] (шучу) - 10 байт.

Ancak beklenen _dtoi64 / _dtoui64 mevcut değildi ve mevcut değil. msvcrt*, msvci*, msvcirt.dll içinde tanımlananları kullanın

istream:: operator >>( double &)
ostream:: operator <<( double )

atlatmak için bile, yalnızca dosya işlemleri olarak mümkündür (bunlar konsoldur).

Bu sitede msdn dışında arama yapabilirsiniz , işte sitedeki arama çubuğu. Benzer bir "uygun" msdn arama dizesi burada . Fark ne? msdn'de işlevlerin iyi bir açıklaması vardır, ancak bazıları hiç değildir (örneğin, NativeAPI). Alternatif olarak, sistem dll'lerini dışa aktarmak için herhangi bir tablo var, ancak açıklama yok. Prensip olarak, sitedeki bir dizi dışa aktarma tablosu, bir dll'den dışa aktarma tablolarını kendiniz çıkarmaktan daha kolaydır (IDA, PE Explorer, vb.).

3. Birleştirici ekler (daha doğrusu, makine koduna ekler). Şimdi açıklayacağım çünkü. Bu konudaki resmi belgeler çok belirsizdir. MQL4 C++ üzerinde

asm{ //или _asm{
   //
   //какой-либо ассемблерный код
   //
}

gerçekleştirilemez, çünkü asm/_asm bir işlev değil, bir önişlemci yönergesidir ve system32/*.dll'de herhangi bir yerde tanımlanmamıştır (o sitede aramaya bakın). Başka bir deyişle, böyle bir şey yok

 #import "/Windows/system32/superpuper.dll"
   asm( string & item[]); //в строковый массив заносим команы ассемблера
#import

Saf yerel kodda, MQL4'te yazabilirsiniz, ancak yalnızca bir durumda: msdn'deki bir WinAPI işlevinin tanımına göre, lpTimerFunc türünde bir işlev/prosedür için bir işaretçi kendisine iletilmesi gerektiğinde (tam bir örnek burada forumda), msdn'de şu şekilde bildirilir:

UINT_PTR SetTimer(

    HWND hWnd,
    UINT_PTR nIDEvent,
    UINT uElapse,
    TIMERPROC lpTimerFunc //<-
);

veya lpfnWndProc (burada forumda bitmemiş bir örnek , msdn bildirimi ve mql4 yapı bildirimi girişimi). Aksi takdirde hiçbir yolu yoktur: MQL4 bir yorumlayıcıdır, işlevin adresi yoktur, aktarılacak bir şey yoktur, ancak makine kodlarında yazılırsa. Daha sonra bir int dizisine paketlenirler ve dizi, işleve başvurularak iletilir.

Bu nedenle derlenmiş derleyici ekleri (yani makine kodu) bu görev için geçerli değildir - tamamen farklı bir kapsamları vardır. Bundan çıkarılabilecek maksimum değer, böyle bir int dizisini, cmd'de Shell32.dll aracılığıyla hata ayıklama yoluyla çalıştırmaktır. Oradaki komut satırını transfer etmek imkansız görünüyor ama keybd_event üzerinden sanal tuşlar ile yazabilirsiniz.

4. Ekler olmadan saf MQL4'te double'ı int[2]'ye dönüştürmek için kendi işlevinizi yazma. Ama kod miktarını ve performansının hızını anladım, sadece reddettim. Modülün kendisini bile yazmadım, ancak anladığım kadarıyla algoritma şöyle:

 1 . Объявляем bool [ 64 ].
2 . bool [ 0 ] равен 0 , если плюс, и 1 , если минус (отрицательное число то есть).
3 . Находим значение выражения целая_часть(log_2(число))+ 1023 . В цикле находим остатки от деления его на 2 , заносим их в bool [ 11 ]- bool [ 1 ]
        в обратном порядке.
4 . Разделяем целую и дробную чсти, сохраняем их в разные переменные.
5 . Для целой части в цикле находим остаток от деления её на 2 , пока не останется остаток от деления 1 или 0 , заносим в этом же цикле значения
        в массив с bool [ 13 +log_2(целая_часть)] до bool [ 12 ], в обратном порядке.
6 . Для дробной части в цикле находим целую часть числа при циклическом умножении на 2 . Целую часть запоминаем и отбрасываем, дробную умножаем дальше.
        Цикл до тех пор, пока при умножении в результате не получится 1 . Заносим в прямом порядке, т.е. с начала (а начало на следующей ячейке после
        окончания пред. записи).
7 . Теперь в цикле собираем в int [ 2 ] с конца bool [ 64 ], помня, что в int [ 0 ] идёт bool [ 0 ]- bool [ 31 ], а в int [ 1 ] идёт bool [ 32 ]- bool [ 63 ].
8 . Ах, да, ещё BigEndian забыл.

tamamlanması çok uzun zaman alacak. Böylece en bariz ve en basit çözüme ulaştım.

5. C++'da kendi kendine yazılmış bir dll kullanmak. Kod şu şekilde çıktı:

 #include "stdafx.h"

BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
                                         )
{
     return TRUE;
}

__declspec(dllexport) void __stdcall dtoi(unsigned _int64 Dbl, int iDbl[2])
 {
        iDbl[0]=static_cast<unsigned int >(Dbl);
        iDbl[1]=static_cast<unsigned int >(Dbl>>32);
         return ;
 }

komut dosyasında

#property show_inputs //для вывода окна с настройкой параметров

#import "double.dll"//самонаписанная dll
   void dtoi(double Dbl, int& iDbl[]);
#import

extern double Dbl=96.578;//в параметрах передаём любую double-переменную
int iDbl[2];//и выходной double->int[2] массив
int handle;//хэндл тестового файла

int start(){
   handle=FileOpen("test.txt",FILE_BIN|FILE_WRITE);//открываем тестовый файл как бинарный "только на запись"
   FileWriteDouble(handle, Dbl);//записываем в тестовый файл double-переменную (8 байт)
   dtoi(Dbl, iDbl);//вызываем функцию конвертации; в iDbl помещается разпарсенный double
   FileWriteArray(handle, iDbl, 0, 2);//записываем в тестовый файл int[2]-переменную (8 байт)
   FileClose(handle);//сначала идут 8 байт double, затем 4+4=8 байт сконвертированных int
   return(0);//Получаем перезаписываемый \experts\files\test.txt в 16 байт.
  }

int'de üst[0 ], referans olarak ilettiğimiz için geri değişir. Alırız:

... işe yaradı, çöplükteki satırlar aynı. Bir klasör ekliyorum, kütüphanelerde double.dll var, örneklerde - dll kaynakları, komut dosyalarında - bir komut dosyası var.

Akşam: Arşivi yeniden yükledim ve script kodunu ve biraz dll'yi taklit ettim.

Dosyalar:
ftdqcs.zip  57 kb
 

Neyi yanlış yaptığımı anlamıyorum. Nedense bir pozisyonu kapatmak planladığım gibi olmuyor?

İşte pozisyon açma kriteri

         if (Ask > iBands ( NULL , 0 ,M, 2 , 0 ,N,MODE_LOWER, 0 )&& Low [ 1 ] < iBands ( NULL , 0 ,M, 2 , 0 ,N,MODE_LOWER, 1 ) && Hour()>= 23 || Hour()< 4 )
         if ( iStochastic ( NULL , 0 ,K,D,L, MODE_SMA , 0 ,MODE_MAIN, 0 )> 20 && iStochastic ( NULL , 0 ,K,D,L, MODE_SMA , 0 ,MODE_MAIN, 1 ) < 20 )
           {     
            Opn_B  =   true ;     // Критерий открs. Buy
            OpenFunction ( Opn_B,  Opn_S, Lots);     //окрываем позицию
            
           }
         
         if (Bid < iBands ( NULL , 0 ,M, 2 , 0 ,N,MODE_UPPER, 0 )&& High [ 1 ] > iBands ( NULL , 0 ,M, 2 , 0 ,N,MODE_UPPER, 1 ) && Hour()>= 23 || Hour()< 4 )
         if ( iStochastic ( NULL , 0 ,K,D,L, MODE_SMA , 0 ,MODE_MAIN, 0 )> 80 && iStochastic ( NULL , 0 ,K,D,L, MODE_SMA , 0 ,MODE_MAIN, 1 ) < 80 )
       
           {   
            Opn_S  =   true ;     // Критерий откр. Sell
            OpenFunction ( Opn_B,  Opn_S,  Lots);     //окрываем позицию 
            
           }

İşte bir pozisyonu kapatmanın kriteri

 if (Bid >= iBands ( NULL , 0 ,M, 2 , 0 ,N,MODE_UPPER, 0 ))    
         {                                                                      
         Cls_B  =   true ;     // ... получаем критерий для закрытия позиции Buy
         CloseFunction ();     //исполняем функцию закрытия ордеров
         return ;
         }
       
       if (Ask <= iBands ( NULL , 0 ,M, 2 , 0 ,N,MODE_LOWER, 0 ))       
         {                                                                      
         Cls_S  =   true ;
         CloseFunction ();     //исполняем функцию закрытия ордеров
         return ;
         }

ve işte elde ettiğimiz şey:

 
Zhunko :
Değil! Standart kitaplıktan işlevlere dokunamazsınız! Dima yasaklandı :-))


Ne yapıyorsun burada palyaçoluk yapıyorsun? Bir hata varsa, bunu servis masasına bildirmeli veya dosyanın kendi kopyasını oluşturmalısınız.
 
GaNDarM :

Neyi yanlış yaptığımı anlamıyorum. Nedense bir pozisyonu kapatmak planladığım gibi olmuyor?

İşte pozisyon açma kriteri

İşte bir pozisyonu kapatmanın kriteri

ve işte elde ettiğimiz şey:


Ve kapanış kriteri ne sıklıkla kontrol ediliyor? Barlarda olmama ihtimali var mı?
 
ilunga :

Ve kapanış kriteri ne sıklıkla kontrol ediliyor? Barlarda olmama ihtimali var mı?

Sorunun özünü tam anlayamadım. Modeli açık fiyatlarla test etme (şekillendirilmiş çubuklarda hızlı yöntem)
 
WMZ'den QIWI'ye para çekmek gerekiyor. işbirliği yapacak insanlar arıyor. Yaklaşık %5 komisyon almaya hazır